Browse code

added appinfo/info.xml appinfo/signature.json CHANGELOG.txt css/style.css js/settings.js js/adminsettings.js lib/Controller/AuthorApiController.php lib/Controller/SmsrelentlessController.php lib/Service/SmsrelentlessService.php templates/settings/personal.php templates/settings/admin.php lib/Migration/Version135Date20240420221527.php lib/Migration/Version136Date20240502081941.php

DoubleBastionAdmin authored on 02/05/2024 04:12:37
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,884 @@
1
+/**
2
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
+ *
4
+ * @author Double Bastion LLC
5
+ *
6
+ * @license GNU AGPL version 3 or any later version
7
+ *
8
+ * This program is free software; you can redistribute it and/or
9
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
+ * License as published by the Free Software Foundation; either
11
+ * version 3 of the License, or any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
+ *
18
+ * You should have received a copy of the GNU Affero General Public
19
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+$(document).ready(function() {
24
+
25
+  var userid = "<?php p($userId); ?>";
26
+  var ctappdir = 'apps';
27
+
28
+  // Get app directory
29
+  var getappdirurl = OC.generateUrl('/apps/sms_relentless/user/getappdirectory');
30
+
31
+  $.ajax({
32
+     method: 'GET',
33
+     url: getappdirurl + '/' + userid,
34
+     contentType: 'application/json',
35
+     success: function(appdirfdb) {
36
+
37
+                   ctappdir = appdirfdb;
38
+
39
+		  // Get admin settings
40
+		  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
41
+
42
+		  $.ajax({
43
+		     method: 'GET',
44
+		     url: baseUrlget + '/' + userid,
45
+		     contentType: 'application/json',
46
+		     success: function(settingsadm) {
47
+
48
+			  $("#telapi_key").val(settingsadm.telapi_key);
49
+			  $("#tel_pub_key").val(settingsadm.tel_pub_key);
50
+			  $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
51
+			  $("#telapi_url").val(settingsadm.telapi_url);
52
+			  $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
53
+			  $("#nexapi_key").val(settingsadm.nexapi_key);
54
+			  $("#nexapi_secret").val(settingsadm.nexapi_secret);
55
+			  $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
56
+			  $("#nexapi_url").val(settingsadm.nexapi_url);
57
+			  $("#twilapi_key").val(settingsadm.twilapi_key);
58
+			  $("#twilapi_secret").val(settingsadm.twilapi_secret);
59
+			  $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
60
+			  $("#twilapi_url").val(settingsadm.twilapi_url);
61
+			  $("#flowapi_key").val(settingsadm.flowapi_key);
62
+			  $("#flowapi_secret").val(settingsadm.flowapi_secret);
63
+			  $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
64
+			  $("#flowapi_url").val(settingsadm.flowapi_url);
65
+			  $("#tel_sender_name").val(settingsadm.tel_sender_name);
66
+			  $("#nex_sender_name").val(settingsadm.nex_sender_name);
67
+			  $("#twil_sender_name").val(settingsadm.twil_sender_name);
68
+
69
+			  var crntadmDispName = settingsadm.admdisplayname;
70
+			  var allRestrictions = settingsadm.restrictions;
71
+			  var allGroups = settingsadm.allgroups;
72
+			  var allUsers = settingsadm.allusers;
73
+			  var allGroupswadm = settingsadm.allgroupswadm;
74
+			  var allUserswadm = settingsadm.alluserswadm;
75
+			  var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
76
+			  var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
77
+			  var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
78
+			  var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
79
+			  var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
80
+			  var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
81
+			  var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
82
+			  var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
83
+
84
+			  var tnxallowedgrpdel = settingsadm.allowedkeysuse.tnx_groups_del;
85
+			  var tnxallowedusrdel = settingsadm.allowedkeysuse.tnx_users_del;
86
+			  var plvallowedgrpdel = settingsadm.allowedkeysuse.plv_groups_del;
87
+			  var plvallowedusrdel = settingsadm.allowedkeysuse.plv_users_del;
88
+			  var twlallowedgrpdel = settingsadm.allowedkeysuse.twl_groups_del;
89
+			  var twlallowedusrdel = settingsadm.allowedkeysuse.twl_users_del;
90
+			  var flrallowedgrpdel = settingsadm.allowedkeysuse.flr_groups_del;
91
+			  var flrallowedusrdel = settingsadm.allowedkeysuse.flr_users_del;
92
+
93
+			  if (tnxallowedgrpdel == 1) { $("#alwDelGrps-tnx").attr("checked", true); } else { $("#alwDelGrps-tnx").attr("checked", false); }
94
+			  if (tnxallowedusrdel == 1) { $("#alwDelUsrs-tnx").attr("checked", true); } else { $("#alwDelUsrs-tnx").attr("checked", false); }
95
+			  if (plvallowedgrpdel == 1) { $("#alwDelGrps-plv").attr("checked", true); } else { $("#alwDelGrps-plv").attr("checked", false); }
96
+			  if (plvallowedusrdel == 1) { $("#alwDelUsrs-plv").attr("checked", true); } else { $("#alwDelUsrs-plv").attr("checked", false); }
97
+			  if (twlallowedgrpdel == 1) { $("#alwDelGrps-twl").attr("checked", true); } else { $("#alwDelGrps-twl").attr("checked", false); }
98
+			  if (twlallowedusrdel == 1) { $("#alwDelUsrs-twl").attr("checked", true); } else { $("#alwDelUsrs-twl").attr("checked", false); }
99
+			  if (flrallowedgrpdel == 1) { $("#alwDelGrps-flr").attr("checked", true); } else { $("#alwDelGrps-flr").attr("checked", false); }
100
+			  if (flrallowedusrdel == 1) { $("#alwDelUsrs-flr").attr("checked", true); } else { $("#alwDelUsrs-flr").attr("checked", false); }
101
+
102
+			  if (settingsadm.show_all_messages == 1) { $("#showallmessages").attr("checked", true); } else { $("#showallmessages").attr("checked", false); }
103
+
104
+			  // List all the groups and users allowed to access the API keys, for each provider
105
+			  if (tnxallowedgrp) {
106
+			      var tnxallowedgrparr = tnxallowedgrp.split("|");
107
+			      for (var g = 0; g < tnxallowedgrparr.length; g++) {
108
+				   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
109
+			      }
110
+			  }
111
+
112
+			  if (tnxallowedusr) {
113
+			      var tnxallowedusrarr = tnxallowedusr.split("|");
114
+			      for (var g = 0; g < tnxallowedusrarr.length; g++) {
115
+				   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
116
+			      }
117
+			  }
118
+
119
+			  if (plvallowedgrp) {
120
+			      var plvallowedgrparr = plvallowedgrp.split("|");
121
+			      for (var g = 0; g < plvallowedgrparr.length; g++) {
122
+				   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
123
+			      }
124
+			  }
125
+
126
+			  if (plvallowedusr) {
127
+			      var plvallowedusrarr = plvallowedusr.split("|");
128
+			      for (var g = 0; g < plvallowedusrarr.length; g++) {
129
+				   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
130
+			      }
131
+			  }
132
+
133
+			  if (twlallowedgrp) {
134
+			      var twlallowedgrparr = twlallowedgrp.split("|");
135
+			      for (var g = 0; g < twlallowedgrparr.length; g++) {
136
+				   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
137
+			      }
138
+			  }
139
+
140
+			  if (twlallowedusr) {
141
+			      var twlallowedusrarr = twlallowedusr.split("|");
142
+			      for (var g = 0; g < twlallowedusrarr.length; g++) {
143
+				   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
144
+			      }
145
+			  }
146
+
147
+			  if (flrallowedgrp) {
148
+			      var flrallowedgrparr = flrallowedgrp.split("|");
149
+			      for (var g = 0; g < flrallowedgrparr.length; g++) {
150
+				   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
151
+			      }
152
+			  }
153
+
154
+			  if (flrallowedusr) {
155
+			      var flrallowedusrarr = flrallowedusr.split("|");
156
+			      for (var g = 0; g < flrallowedusrarr.length; g++) {
157
+				   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
158
+			      }
159
+			  }
160
+
161
+
162
+			  // Create a list with all the available groups, excluding the admin group
163
+			  var grpsListItemswadm = "";
164
+			  $.each(allGroupswadm, function(key, value) {
165
+				 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
166
+			  });
167
+
168
+			  // Create a list with all the available users, excluding the admins
169
+			  var usersListItemswadm = "";
170
+			  $.each(allUserswadm, function(key, usrval) {
171
+				 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
172
+			  });
173
+			  
174
+
175
+			  function showListsalwdk() {
176
+
177
+			      // Append the list of available groups to the table of groups and users allowed to use the API keys
178
+			      $('[id^="showakeyGrps-"]').click(function() {
179
+				 var crtid = $(this).attr("id").split("-")[1];
180
+				 $("#grpsadapik-"+ crtid).remove();
181
+				 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
182
+				 $("#adminOverlay").remove();
183
+				 $("#app-content").append("<div id='adminOverlay'></div>");
184
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
185
+
186
+				 $("#adminOverlay").click(function() { 
187
+				    $("#adminOverlay").remove();
188
+				    $("#grpsadapik-"+ crtid).remove();
189
+				    $("#usrsadapik-"+ crtid).remove();
190
+				 });
191
+
192
+				 // Select a group
193
+				 $(".groupsList").click(function() {
194
+				    var slctdGrp = $(this).text();
195
+				    $("#grpsadapik-"+ crtid).remove();
196
+				    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
197
+
198
+				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
199
+					$("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
200
+				    } else { showAlert("That group has already been added!"); }
201
+
202
+				    // Remove a group from list
203
+				    $('[id^="rmvGrp-"]').click(function() {
204
+				       $(this).closest(".selectedGrps").remove();
205
+				    });
206
+				 });
207
+
208
+			      });
209
+
210
+			      // Append the list of available users to the table of groups and users allowed to use the API keys
211
+			      $('[id^="showakeyUsrs-"]').click(function() {
212
+
213
+				 var crtidusr = $(this).attr("id").split("-")[1];
214
+				 $("#usrsadapik-"+ crtidusr).remove();
215
+				 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
216
+				 $("#adminOverlay").remove();
217
+				 $("#app-content").append("<div id='adminOverlay'></div>");
218
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
219
+
220
+				 $("#adminOverlay").click(function() { 
221
+				    $("#adminOverlay").remove(); 
222
+				    $("#grpsadapik-"+ crtidusr).remove();
223
+				    $("#usrsadapik-"+ crtidusr).remove();
224
+				 });
225
+
226
+				 // Select a user
227
+				 $(".usersList").click(function() {
228
+				    var slctdUsr = $(this).text();
229
+				    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
230
+
231
+				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
232
+					$("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
233
+				    } else { showAlert("That user has already been added!"); }
234
+
235
+				    // Remove a user from list
236
+				    $('[id^="rmvUsr-"]').click(function() {
237
+				       $(this).closest(".selectedUsrs").remove();
238
+				    });
239
+				 });
240
+
241
+			      });
242
+
243
+			      // Remove a group from the list 
244
+			      $('[id^="rmvGrp-"]').click(function() {
245
+				 $(this).closest(".selectedGrps").remove();
246
+			      });
247
+
248
+			      // Remove a user from the list
249
+			      $('[id^="rmvUsr-"]').click(function() {
250
+				 $(this).closest(".selectedUsrs").remove();
251
+			      });
252
+
253
+			  }
254
+			  showListsalwdk();
255
+
256
+
257
+			  // Save the data
258
+			  function saveAlwdRow() {
259
+			     $('[id^="alwdrstsave-"]').unbind("click");
260
+			     $('[id^="alwdrstsave-"]').click(function(event) {
261
+
262
+				 event.preventDefault();
263
+				 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
264
+				 
265
+				 if ($(this).attr("value") == "Save") {
266
+
267
+				     var selGroups = [];
268
+				     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
269
+					selGroups.push($(this).text());
270
+				     });
271
+				     if (selGroups.length == 0) { selGroups.push(""); }
272
+
273
+				     var selUsers = [];
274
+				     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
275
+					selUsers.push($(this).text());
276
+				     });
277
+				     if (selUsers.length == 0) { selUsers.push(""); }
278
+
279
+				     // Check if the access key fields have been left empty
280
+				     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
281
+					 showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
282
+					 return;
283
+				     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
284
+					 showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
285
+					 return;
286
+				     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
287
+					 showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
288
+					 return;
289
+				     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
290
+					 showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
291
+					 return;
292
+				     }
293
+
294
+		                     if ($("#alwDelGrps-"+ crntprov +"").is(':checked')) { var delGroups = 1; } else { var delGroups = 0; }
295
+
296
+		                     if ($("#alwDelUsrs-"+ crntprov +"").is(':checked')) { var delUsers = 1; } else { var delUsers = 0; }
297
+
298
+				     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
299
+
300
+				     var alwddatatosend = { 
301
+					      userId: userid,
302
+					      groups: selGroups,
303
+					      users: selUsers,
304
+                                              groupsdel: delGroups,
305
+                                              usersdel: delUsers,
306
+					      provider: crntprov
307
+				     };
308
+
309
+				     $.ajax({
310
+					   method: 'PUT',
311
+					   url: saveAlwdUrl + '/' + userid,
312
+					   contentType: 'application/json',
313
+					   data: JSON.stringify(alwddatatosend),
314
+					   success: function(messagesent) {
315
+					                if (messagesent == 'success') {
316
+					                    showAlert('The allowed groups and users have been successfully saved to the database! However, to be able to send and receive messages using the shared keys from above, the allowed users have to generate and save the 2 webhook URLs corresponding to this SMS provider, on their own Settings page.');
317
+					                } else if (messagesent != 'success' && messagesent != 'failure') {
318
+					                    showAlert(messagesent);
319
+					                } else if (messagesent == 'failure') {
320
+					                    showAlert('Error while trying to save the allowed groups and users!');
321
+					                }
322
+					   },
323
+					   error: function() {
324
+							showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
325
+					   }
326
+				     });
327
+
328
+				     $(this).attr("value", "Edit");
329
+
330
+				} else { $("#alwdrstsave-"+ crntprov).attr("value", "Save"); }
331
+
332
+			     });
333
+			  }
334
+			  saveAlwdRow();
335
+
336
+
337
+
338
+			  // Phone number restrictions
339
+
340
+			  // Create a list with all the available groups
341
+			  var grpsListItems = "";
342
+			  $.each(allGroups, function(key, value) {
343
+				 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
344
+			  });
345
+
346
+			  // Create a list with all the available users
347
+			  var usersListItems = "";
348
+			  $.each(allUsers, function(key, usrval) {
349
+				 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
350
+			  });
351
+
352
+
353
+			  if (allRestrictions.length > 0) {
354
+			      var restrNmb = allRestrictions.length;
355
+			  } else {
356
+			      var restrNmb = 0;
357
+			  }
358
+
359
+
360
+			  // List the access restrictions for groups and users
361
+			  if (restrNmb == 0) {
362
+
363
+			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
364
+			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
365
+
366
+			  } else {
367
+
368
+			      for (k = 0; k < restrNmb; k++) {
369
+
370
+				   if (allRestrictions[k].groups) {
371
+				       var groupsfdbpre = allRestrictions[k].groups.split("|");
372
+				       var groupsfdb = "";
373
+				       for (var g = 0; g < groupsfdbpre.length; g++) {
374
+					    groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
375
+				       }
376
+				   } else { var groupsfdb = ""; }
377
+
378
+				   if (allRestrictions[k].users) {
379
+				       var usersfdbpre = allRestrictions[k].users.split("|");
380
+				       var usersfdb = "";
381
+				       for (var u = 0; u < usersfdbpre.length; u++) {
382
+					    usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
383
+				       }
384
+				   } else { var usersfdb = ""; }
385
+
386
+				   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
387
+			      }
388
+			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
389
+			  }
390
+
391
+
392
+			  // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
393
+			  $("#phoneNumberTh").addClass('icon-loading');
394
+			  var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
395
+			  var numbersListItems = '';
396
+
397
+			  $.ajax({
398
+				  url: getnumbersUrl + '/' + userid,
399
+				  type: "POST",
400
+				  cache: false,
401
+				  processData: false,
402
+				  contentType: false,
403
+				  success: function(currentnmbrs) {
404
+
405
+					            $("#phoneNumberTh").removeClass('icon-loading');
406
+
407
+						    // Create a list with all the available phone numbers
408
+					            numbersListItems = "<option value='' selected>Select phone number</option>";
409
+
410
+						    $.each(currentnmbrs, function(key, indsmsnmb) {
411
+							   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
412
+						    });
413
+
414
+						    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
415
+
416
+						    // Append the list of available phone numbers
417
+						    $("#rstphn-"+ indRow).empty();
418
+						    $("#rstphn-"+ indRow).append(numbersListItems);
419
+			
420
+				  },
421
+				  error: function() {
422
+					            $("#phoneNumberTh").removeClass('icon-loading'); 
423
+					            showAlert("Error while attempting to retrieve the available phone numbers!");
424
+				  }
425
+			  });
426
+
427
+
428
+			  function showLists() {
429
+
430
+			      // Append the list of available groups to the restrictions table
431
+			      $('[id^="showGrps-"]').click(function() {
432
+				 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
433
+				 $("#grpL-"+ crtnmbr).remove();
434
+				 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
435
+				 $("#adminOverlay").remove();
436
+				 $("#app-content").append("<div id='adminOverlay'></div>");
437
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
438
+
439
+				 $("#adminOverlay").click(function() { 
440
+				    $("#adminOverlay").remove(); 
441
+				    $("#grpL-"+ crtnmbr).remove(); 
442
+				    $("#usrL-"+ crtnmbr).remove();
443
+				 });
444
+
445
+				 // Select a group
446
+				 $(".groupsList").click(function() {
447
+				    var slctdGrp = $(this).text();
448
+				    $("#grpL-"+ crtnmbr).remove();
449
+				    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
450
+
451
+				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
452
+					$("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
453
+				    } else { showAlert("That group has already been added!"); }
454
+
455
+				    // Remove a group from list
456
+				    $('[id^="rmvGrp-"]').click(function() {
457
+				       $(this).closest(".selectedGrps").remove();
458
+				    });
459
+				 });
460
+
461
+			      });
462
+
463
+			      // Append the list of available users to the restrictions table
464
+			      $('[id^="showUsr-"]').click(function() {
465
+
466
+				 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
467
+				 $("#usrL-"+ ctusrnmbr).remove();
468
+				 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
469
+				 $("#adminOverlay").remove();
470
+				 $("#app-content").append("<div id='adminOverlay'></div>");
471
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
472
+
473
+				 $("#adminOverlay").click(function() { 
474
+				    $("#adminOverlay").remove(); 
475
+				    $("#grpL-"+ ctusrnmbr).remove(); 
476
+				    $("#usrL-"+ ctusrnmbr).remove();
477
+				 });
478
+
479
+				 // Select a user
480
+				 $(".usersList").click(function() {
481
+				    var slctdUsr = $(this).text();
482
+				    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
483
+
484
+				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
485
+					$("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
486
+				    } else { showAlert("That user has already been added!"); }
487
+
488
+				    // Remove a user from list
489
+				    $('[id^="rmvUsr-"]').click(function() {
490
+				       $(this).closest(".selectedUsrs").remove();
491
+				    });
492
+				 });
493
+
494
+			      });
495
+
496
+			      // Remove a group from the list 
497
+			      $('[id^="rmvGrp-"]').click(function() {
498
+				 $(this).closest(".selectedGrps").remove();
499
+			      });
500
+
501
+			      // Remove a user from the list
502
+			      $('[id^="rmvUsr-"]').click(function() {
503
+				 $(this).closest(".selectedUsrs").remove();
504
+			      });
505
+
506
+			  }
507
+			  showLists();
508
+
509
+
510
+			  // Save the data
511
+			  function saveRestrRow() {
512
+
513
+			     $('[id^="rstsave-"]').unbind("click");
514
+			     $('[id^="rstsave-"]').click(function(event) {
515
+
516
+				 event.preventDefault();
517
+				 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
518
+
519
+				 if ($(this).attr("value") == "Save") {
520
+
521
+				     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
522
+				     var slctdGroups = [];
523
+				     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
524
+					slctdGroups.push($(this).text());
525
+				     });
526
+				     var slctdUsers = [];
527
+				     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
528
+					slctdUsers.push($(this).text());
529
+				     });
530
+
531
+				     if (phoneNmbr != '') {
532
+
533
+				       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
534
+
535
+					 var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
536
+
537
+					 var datatosend = { 
538
+					      userId: userid,
539
+					      savedByDsplname: crntadmDispName,
540
+					      phoneNumber: phoneNmbr,
541
+					      groups: slctdGroups,
542
+					      users: slctdUsers
543
+					 };
544
+
545
+					 $.ajax({
546
+					   method: 'PUT',
547
+					   url: saveRestrUrl + '/' + userid,
548
+					   contentType: 'application/json',
549
+					   data: JSON.stringify(datatosend),
550
+					   success: function(messagetosend) {
551
+					                if (messagetosend == 'success') {
552
+					                    showAlert('The restrictions have been successfully saved to the database!');
553
+					                } else {
554
+					                    showAlert('Error while trying to save the restrictions!');
555
+					                }
556
+					   },
557
+					   error: function() {
558
+							showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
559
+					   }
560
+					 });
561
+
562
+				       } else { showAlert("You must select at least a group or a user in order to restrict access to a phone number."); return; }
563
+
564
+				     } else { showAlert("Please select a phone number!"); return; }
565
+
566
+				     $(this).attr("value", "Edit");
567
+
568
+				} else {
569
+
570
+				     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
571
+				}
572
+
573
+			     });
574
+			  }
575
+			  saveRestrRow();
576
+
577
+			  // Remove a row
578
+			  function removeRestrRow() {
579
+
580
+			       $('[id^="rmRow-"]').click(function() {
581
+
582
+				  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
583
+				  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
584
+
585
+				  confirmAlert("Do you really want to remove this row from the database ?");
586
+
587
+				  $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
588
+
589
+				  $("#confirmOk").click(function() {
590
+
591
+				      $("#alertMsgOverlay").remove();
592
+				      $("#alertConfMessage").remove();
593
+
594
+				      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
595
+				      $.ajax({
596
+					   url: rmvRestrUrl + '/' + userid,
597
+					   method: "POST",
598
+					   dataType: "text",
599
+					   data: { phoneNumber: crntPhNmbr },
600
+					   success: function(delresult) {
601
+
602
+					                     if (delresult.indexOf("success") > -1) {
603
+					                         showAlert("The restriction has been removed successfully!");
604
+					                         $("#rstphn-"+ slctRowRmv).closest("tr").remove();
605
+					                     } else {
606
+					                         showAlert("Error while trying to remove restriction data!");
607
+					                     }
608
+					   },
609
+					   error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
610
+				       });
611
+				  });
612
+			       });
613
+			  }
614
+			  removeRestrRow();
615
+
616
+			  // Add a new row
617
+			  $("#addRestrRow").click(function() {
618
+			      if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
619
+				  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
620
+				  var indRowAdd = parseInt(lastrstAuth + 1);
621
+			      } else { var indRowAdd = 0; }
622
+			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
623
+			      showLists();
624
+			      saveRestrRow();
625
+			      removeRestrRow();
626
+
627
+			      // Check if the same phone number has been already restricted
628
+			      $("#rstphn-"+ indRowAdd).change(function() {
629
+				 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
630
+				 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
631
+				 var phNmbrChck = 0;
632
+				 allPHoneRestr.each(function() {
633
+				    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
634
+				    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
635
+				 });
636
+
637
+				 if (phNmbrChck == 2) {
638
+				     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict access to.");
639
+				     $(this).val('');
640
+				     return;
641
+				 }
642
+			      });
643
+			  });
644
+
645
+		     },
646
+		     error: function() {
647
+				showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
648
+		     }
649
+		  });
650
+
651
+
652
+
653
+		  // Save admin settings
654
+		  function randomStr(strlength) {
655
+			var fintext = "";
656
+			var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
657
+			for (var i = 0; i < strlength; i++) {
658
+			     fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
659
+			}
660
+			return fintext;
661
+		  }
662
+
663
+		  $("#generate_tel_rcpt").on("click", function(event) {
664
+
665
+		     var teltokenrec = randomStr(70);
666
+		     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
667
+
668
+		     $("#telapi_url_rec").val(telnyxwhurlrec);
669
+		  });
670
+
671
+		  $("#copyToClipboardtel").on("click", function(event) {
672
+		     var $tempEl = $("<input>");
673
+		     $("body").append($tempEl);
674
+		     $tempEl.val($("#telapi_url_rec").val()).select();
675
+		     document.execCommand("Copy");
676
+		     $tempEl.remove();
677
+		     showAlert("The link has been copied to your clipboard!");
678
+		  });
679
+
680
+		  $("#generate_tel_delrcpt").on("click", function(event) {
681
+
682
+		     var teltoken = randomStr(70);
683
+		     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
684
+
685
+		     $("#telapi_url").val(telnyxwhurl);
686
+		  });
687
+
688
+		  $("#generate_nex_rcpt").on("click", function(event) {
689
+
690
+		     var plivotokenrec = randomStr(70);
691
+		     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
692
+
693
+		     $("#nexapi_url_rec").val(plivowhurlrec);
694
+		  });
695
+
696
+		  $("#copyToClipboardnex").on("click", function(event) {
697
+		     var $tempElpl = $("<input>");
698
+		     $("body").append($tempElpl);
699
+		     $tempElpl.val($("#nexapi_url_rec").val()).select();
700
+		     document.execCommand("Copy");
701
+		     $tempElpl.remove();
702
+		     showAlert("The link has been copied to your clipboard!");
703
+		  });
704
+
705
+		  $("#generate_nex_delrcpt").on("click", function(event) {
706
+
707
+		     var plivotoken = randomStr(70);
708
+		     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
709
+
710
+		     $("#nexapi_url").val(plivodrwhurl);
711
+		  });
712
+
713
+		  $("#generate_twil_rcpt").on("click", function(event) {
714
+
715
+		     var twiltokenrec = randomStr(35);
716
+		     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
717
+
718
+		     $("#twilapi_url_rec").val(twilwhurlrec);
719
+		  });
720
+
721
+		  $("#copyToClipboardtwil").on("click", function(event) {
722
+		     var $tempElpl = $("<input>");
723
+		     $("body").append($tempElpl);
724
+		     $tempElpl.val($("#twilapi_url_rec").val()).select();
725
+		     document.execCommand("Copy");
726
+		     $tempElpl.remove();
727
+		     showAlert("The link has been copied to your clipboard!");
728
+		  });
729
+
730
+		  $("#generate_twil_delrcpt").on("click", function(event) {
731
+
732
+		     var twiltoken = randomStr(35);
733
+		     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
734
+
735
+		     $("#twilapi_url").val(twildrwhurl);
736
+		  });
737
+
738
+		  $("#generate_flow_rcpt").on("click", function(event) {
739
+
740
+		     var flowtokenrec = randomStr(70);
741
+		     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
742
+
743
+		     $("#flowapi_url_rec").val(flowwhurlrec);
744
+		  });
745
+
746
+		  $("#copyToClipboardflow").on("click", function(event) {
747
+		     var $tempElpl = $("<input>");
748
+		     $("body").append($tempElpl);
749
+		     $tempElpl.val($("#flowapi_url_rec").val()).select();
750
+		     document.execCommand("Copy");
751
+		     $tempElpl.remove();
752
+		     showAlert("The link has been copied to your clipboard!");
753
+		  });
754
+
755
+		  $("#generate_flow_delrcpt").on("click", function(event) {
756
+
757
+		     var flowtoken = randomStr(70);
758
+		     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
759
+
760
+		     $("#flowapi_url").val(flowdrwhurl);
761
+		  });
762
+
763
+		  // Add group icons
764
+		  $(".srGroupImg").each(function() {
765
+		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/group.svg");
766
+		  });
767
+
768
+		  // Add user icons
769
+		  $(".srUserImg").each(function() {
770
+		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/user.svg");
771
+		  });
772
+
773
+		  $("#save_admin_settings").on("click", function(event) {
774
+
775
+		    event.preventDefault();
776
+		    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
777
+
778
+		    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
779
+
780
+		    var showallmsgs = 0;
781
+		    if ($("#showallmessages").is(':checked')) {
782
+			showallmsgs = 1;
783
+		    }
784
+
785
+		    var telsenderinit = $("#tel_sender_name").val();
786
+		    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
787
+
788
+		    var nexsenderinit = $("#nex_sender_name").val();
789
+		    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
790
+
791
+		    var twilsenderinit = $("#twil_sender_name").val();
792
+		    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
793
+
794
+		    var datatosave = {
795
+				      userId: userid,
796
+				      telapiKey: $("#telapi_key").val(),
797
+				      telPubKey: $("#tel_pub_key").val(),
798
+				      telapiUrlRec: $("#telapi_url_rec").val(),
799
+				      telapiUrl: $("#telapi_url").val(),
800
+				      messagingProfileId: $("#messaging_profile_id").val(),
801
+				      nexapiKey: $("#nexapi_key").val(),
802
+				      nexapiSecret: $("#nexapi_secret").val(),
803
+				      nexapiUrlRec: $("#nexapi_url_rec").val(),
804
+				      nexapiUrl: $("#nexapi_url").val(),
805
+				      twilapiKey: $("#twilapi_key").val(),
806
+				      twilapiSecret: $("#twilapi_secret").val(),
807
+				      twilapiUrlRec: $("#twilapi_url_rec").val(),
808
+				      twilapiUrl: $("#twilapi_url").val(),
809
+				      flowapiKey: $("#flowapi_key").val(),
810
+				      flowapiSecret: $("#flowapi_secret").val(),
811
+				      flowapiUrlRec: $("#flowapi_url_rec").val(),
812
+				      flowapiUrl: $("#flowapi_url").val(),
813
+				      telSenderName: telsenderproc,
814
+				      nexSenderName: nexsenderproc,
815
+				      twilSenderName: twilsenderproc,
816
+				      showAllMessages: showallmsgs
817
+		    };
818
+
819
+
820
+		    $.ajax({
821
+		       method: 'PUT',
822
+		       url: baseUrlsv + '/' + userid,
823
+		       contentType: 'application/json',
824
+		       data: JSON.stringify(datatosave),
825
+		       success: function() {
826
+		       },
827
+		       error: function() {
828
+			    showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
829
+		       }
830
+		    });
831
+
832
+		  });
833
+
834
+		  function showAlert(alertText) {
835
+
836
+		     let alertwnd = "<div id='alertMessage'>";
837
+		     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
838
+		     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
839
+		     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
840
+		     alertwnd += "</div>";
841
+
842
+		     $("#content").append("<div id='alertMsgOverlay'></div>");
843
+		     $("#content").append(alertwnd);
844
+
845
+		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
846
+		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
847
+		     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
848
+
849
+		     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
850
+		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
851
+		     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
852
+		  }
853
+
854
+		  function confirmAlert(alertText) {
855
+
856
+		     $("#alertMsgOverlay").remove();
857
+		     $("#alertConfMessage").remove();
858
+
859
+		     let alertwndcf = "<div id='alertConfMessage'>";
860
+		     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
861
+		     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
862
+		     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
863
+		     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
864
+		     alertwndcf += "</div>";
865
+
866
+		     $("#content").append("<div id='alertMsgOverlay'></div>");
867
+		     $("#content").append(alertwndcf);
868
+
869
+		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
870
+		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
871
+		     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
872
+
873
+		     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
874
+		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
875
+		  }
876
+
877
+
878
+     },
879
+     error: function(appdirfdb) {
880
+                alert("An error occurred while getting the app's directory. You can check the Nextcloud log to find more details about this issue.");
881
+     }
882
+   });
883
+
884
+});
Browse code

removed appinfo/info.xml appinfo/signature.json CHANGELOG.txt css/style.css js/settings.js js/adminsettings.js lib/Controller/AuthorApiController.php lib/Controller/SmsrelentlessController.php lib/Service/SmsrelentlessService.php templates/settings/personal.php templates/settings/admin.php lib/Migration/Version135Date20240420221527.php

DoubleBastionAdmin authored on 02/05/2024 04:04:23
Showing 1 changed files
1 1
deleted file mode 100644
... ...
@@ -1,886 +0,0 @@
1
-/**
2
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
- *
4
- * @author Double Bastion LLC
5
- *
6
- * @license GNU AGPL version 3 or any later version
7
- *
8
- * This program is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
- * License as published by the Free Software Foundation; either
11
- * version 3 of the License, or any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
- *
18
- * You should have received a copy of the GNU Affero General Public
19
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- */
22
-
23
-$(document).ready(function() {
24
-
25
-  var userid = "<?php p($userId); ?>";
26
-  var ctappdir = 'apps';
27
-
28
-  // Get app directory
29
-  var getappdirurl = OC.generateUrl('/apps/sms_relentless/user/getappdirectory');
30
-
31
-  $.ajax({
32
-     method: 'GET',
33
-     url: getappdirurl + '/' + userid,
34
-     contentType: 'application/json',
35
-     success: function(appdirfdb) {
36
-
37
-                   ctappdir = appdirfdb;
38
-
39
-		  // Get admin settings
40
-		  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
41
-
42
-		  $.ajax({
43
-		     method: 'GET',
44
-		     url: baseUrlget + '/' + userid,
45
-		     contentType: 'application/json',
46
-		     success: function(settingsadm) {
47
-
48
-			  $("#telapi_key").val(settingsadm.telapi_key);
49
-			  $("#tel_pub_key").val(settingsadm.tel_pub_key);
50
-			  $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
51
-			  $("#telapi_url").val(settingsadm.telapi_url);
52
-			  $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
53
-			  $("#nexapi_key").val(settingsadm.nexapi_key);
54
-			  $("#nexapi_secret").val(settingsadm.nexapi_secret);
55
-			  $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
56
-			  $("#nexapi_url").val(settingsadm.nexapi_url);
57
-			  $("#twilapi_key").val(settingsadm.twilapi_key);
58
-			  $("#twilapi_secret").val(settingsadm.twilapi_secret);
59
-			  $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
60
-			  $("#twilapi_url").val(settingsadm.twilapi_url);
61
-			  $("#flowapi_key").val(settingsadm.flowapi_key);
62
-			  $("#flowapi_secret").val(settingsadm.flowapi_secret);
63
-			  $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
64
-			  $("#flowapi_url").val(settingsadm.flowapi_url);
65
-			  $("#tel_sender_name").val(settingsadm.tel_sender_name);
66
-			  $("#nex_sender_name").val(settingsadm.nex_sender_name);
67
-			  $("#twil_sender_name").val(settingsadm.twil_sender_name);
68
-
69
-			  var crntadmDispName = settingsadm.admdisplayname;
70
-			  var allRestrictions = settingsadm.restrictions;
71
-			  var allGroups = settingsadm.allgroups;
72
-			  var allUsers = settingsadm.allusers;
73
-			  var allGroupswadm = settingsadm.allgroupswadm;
74
-			  var allUserswadm = settingsadm.alluserswadm;
75
-			  var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
76
-			  var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
77
-			  var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
78
-			  var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
79
-			  var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
80
-			  var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
81
-			  var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
82
-			  var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
83
-
84
-			  var tnxallowedgrpdel = settingsadm.allowedkeysuse.tnx_groups_del;
85
-			  var tnxallowedusrdel = settingsadm.allowedkeysuse.tnx_users_del;
86
-			  var plvallowedgrpdel = settingsadm.allowedkeysuse.plv_groups_del;
87
-			  var plvallowedusrdel = settingsadm.allowedkeysuse.plv_users_del;
88
-			  var twlallowedgrpdel = settingsadm.allowedkeysuse.twl_groups_del;
89
-			  var twlallowedusrdel = settingsadm.allowedkeysuse.twl_users_del;
90
-			  var flrallowedgrpdel = settingsadm.allowedkeysuse.flr_groups_del;
91
-			  var flrallowedusrdel = settingsadm.allowedkeysuse.flr_users_del;
92
-
93
-			  if (tnxallowedgrpdel == 1) { $("#alwDelGrps-tnx").attr("checked", true); } else { $("#alwDelGrps-tnx").attr("checked", false); }
94
-			  if (tnxallowedusrdel == 1) { $("#alwDelUsrs-tnx").attr("checked", true); } else { $("#alwDelUsrs-tnx").attr("checked", false); }
95
-			  if (plvallowedgrpdel == 1) { $("#alwDelGrps-plv").attr("checked", true); } else { $("#alwDelGrps-plv").attr("checked", false); }
96
-			  if (plvallowedusrdel == 1) { $("#alwDelUsrs-plv").attr("checked", true); } else { $("#alwDelUsrs-plv").attr("checked", false); }
97
-			  if (twlallowedgrpdel == 1) { $("#alwDelGrps-twl").attr("checked", true); } else { $("#alwDelGrps-twl").attr("checked", false); }
98
-			  if (twlallowedusrdel == 1) { $("#alwDelUsrs-twl").attr("checked", true); } else { $("#alwDelUsrs-twl").attr("checked", false); }
99
-			  if (flrallowedgrpdel == 1) { $("#alwDelGrps-flr").attr("checked", true); } else { $("#alwDelGrps-flr").attr("checked", false); }
100
-			  if (flrallowedusrdel == 1) { $("#alwDelUsrs-flr").attr("checked", true); } else { $("#alwDelUsrs-flr").attr("checked", false); }
101
-
102
-			  if (settingsadm.show_all_messages == 1) { $("#showallmessages").attr("checked", true); } else { $("#showallmessages").attr("checked", false); }
103
-
104
-			  // List all the groups and users allowed to access the API keys, for each provider
105
-			  if (tnxallowedgrp) {
106
-			      var tnxallowedgrparr = tnxallowedgrp.split("|");
107
-			      for (var g = 0; g < tnxallowedgrparr.length; g++) {
108
-				   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
109
-			      }
110
-			  }
111
-
112
-			  if (tnxallowedusr) {
113
-			      var tnxallowedusrarr = tnxallowedusr.split("|");
114
-			      for (var g = 0; g < tnxallowedusrarr.length; g++) {
115
-				   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
116
-			      }
117
-			  }
118
-
119
-			  if (plvallowedgrp) {
120
-			      var plvallowedgrparr = plvallowedgrp.split("|");
121
-			      for (var g = 0; g < plvallowedgrparr.length; g++) {
122
-				   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
123
-			      }
124
-			  }
125
-
126
-			  if (plvallowedusr) {
127
-			      var plvallowedusrarr = plvallowedusr.split("|");
128
-			      for (var g = 0; g < plvallowedusrarr.length; g++) {
129
-				   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
130
-			      }
131
-			  }
132
-
133
-			  if (twlallowedgrp) {
134
-			      var twlallowedgrparr = twlallowedgrp.split("|");
135
-			      for (var g = 0; g < twlallowedgrparr.length; g++) {
136
-				   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
137
-			      }
138
-			  }
139
-
140
-			  if (twlallowedusr) {
141
-			      var twlallowedusrarr = twlallowedusr.split("|");
142
-			      for (var g = 0; g < twlallowedusrarr.length; g++) {
143
-				   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
144
-			      }
145
-			  }
146
-
147
-			  if (flrallowedgrp) {
148
-			      var flrallowedgrparr = flrallowedgrp.split("|");
149
-			      for (var g = 0; g < flrallowedgrparr.length; g++) {
150
-				   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
151
-			      }
152
-			  }
153
-
154
-			  if (flrallowedusr) {
155
-			      var flrallowedusrarr = flrallowedusr.split("|");
156
-			      for (var g = 0; g < flrallowedusrarr.length; g++) {
157
-				   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
158
-			      }
159
-			  }
160
-
161
-
162
-			  // Create a list with all the available groups, excluding the admin group
163
-			  var grpsListItemswadm = "";
164
-			  $.each(allGroupswadm, function(key, value) {
165
-				 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
166
-			  });
167
-
168
-			  // Create a list with all the available users, excluding the admins
169
-			  var usersListItemswadm = "";
170
-			  $.each(allUserswadm, function(key, usrval) {
171
-				 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
172
-			  });
173
-			  
174
-
175
-			  function showListsalwdk() {
176
-
177
-			      // Append the list of available groups to the table of groups and users allowed to use the API keys
178
-			      $('[id^="showakeyGrps-"]').click(function() {
179
-				 var crtid = $(this).attr("id").split("-")[1];
180
-				 $("#grpsadapik-"+ crtid).remove();
181
-				 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
182
-				 $("#adminOverlay").remove();
183
-				 $("#app-content").append("<div id='adminOverlay'></div>");
184
-				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
185
-
186
-				 $("#adminOverlay").click(function() { 
187
-				    $("#adminOverlay").remove();
188
-				    $("#grpsadapik-"+ crtid).remove();
189
-				    $("#usrsadapik-"+ crtid).remove();
190
-				 });
191
-
192
-				 // Select a group
193
-				 $(".groupsList").click(function() {
194
-				    var slctdGrp = $(this).text();
195
-				    $("#grpsadapik-"+ crtid).remove();
196
-				    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
197
-
198
-				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
199
-					$("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
200
-				    } else { showAlert("That group has already been added!"); }
201
-
202
-				    // Remove a group from list
203
-				    $('[id^="rmvGrp-"]').click(function() {
204
-				       $(this).closest(".selectedGrps").remove();
205
-				    });
206
-				 });
207
-
208
-			      });
209
-
210
-			      // Append the list of available users to the table of groups and users allowed to use the API keys
211
-			      $('[id^="showakeyUsrs-"]').click(function() {
212
-
213
-				 var crtidusr = $(this).attr("id").split("-")[1];
214
-				 $("#usrsadapik-"+ crtidusr).remove();
215
-				 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
216
-				 $("#adminOverlay").remove();
217
-				 $("#app-content").append("<div id='adminOverlay'></div>");
218
-				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
219
-
220
-				 $("#adminOverlay").click(function() { 
221
-				    $("#adminOverlay").remove(); 
222
-				    $("#grpsadapik-"+ crtidusr).remove();
223
-				    $("#usrsadapik-"+ crtidusr).remove();
224
-				 });
225
-
226
-				 // Select a user
227
-				 $(".usersList").click(function() {
228
-				    var slctdUsr = $(this).text();
229
-				    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
230
-
231
-				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
232
-					$("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
233
-				    } else { showAlert("That user has already been added!"); }
234
-
235
-				    // Remove a user from list
236
-				    $('[id^="rmvUsr-"]').click(function() {
237
-				       $(this).closest(".selectedUsrs").remove();
238
-				    });
239
-				 });
240
-
241
-			      });
242
-
243
-			      // Remove a group from the list 
244
-			      $('[id^="rmvGrp-"]').click(function() {
245
-				 $(this).closest(".selectedGrps").remove();
246
-			      });
247
-
248
-			      // Remove a user from the list
249
-			      $('[id^="rmvUsr-"]').click(function() {
250
-				 $(this).closest(".selectedUsrs").remove();
251
-			      });
252
-
253
-			  }
254
-			  showListsalwdk();
255
-
256
-
257
-			  // Save the data
258
-			  function saveAlwdRow() {
259
-			     $('[id^="alwdrstsave-"]').unbind("click");
260
-			     $('[id^="alwdrstsave-"]').click(function(event) {
261
-
262
-				 event.preventDefault();
263
-				 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
264
-				 
265
-				 if ($(this).attr("value") == "Save") {
266
-
267
-				     var selGroups = [];
268
-				     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
269
-					selGroups.push($(this).text());
270
-				     });
271
-				     if (selGroups.length == 0) { selGroups.push(""); }
272
-
273
-				     var selUsers = [];
274
-				     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
275
-					selUsers.push($(this).text());
276
-				     });
277
-				     if (selUsers.length == 0) { selUsers.push(""); }
278
-
279
-				     // Check if the access key fields have been left empty
280
-				     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
281
-					 showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
282
-					 return;
283
-				     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
284
-					 showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
285
-					 return;
286
-				     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
287
-					 showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
288
-					 return;
289
-				     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
290
-					 showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
291
-					 return;
292
-				     }
293
-
294
-                                     var delGroups = 0;
295
-		                     if ($("#alwDelGrps-"+ crntprov +"").is(':checked')) { delGroups = 1; }
296
-
297
-                                     var delUsers = 0;
298
-		                     if ($("#alwDelUsrs-"+ crntprov +"").is(':checked')) { delUsers = 1; }
299
-
300
-				     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
301
-
302
-				     var alwddatatosend = { 
303
-					      userId: userid,
304
-					      groups: selGroups,
305
-					      users: selUsers,
306
-                                              groupsdel: delGroups,
307
-                                              usersdel: delUsers,
308
-					      provider: crntprov
309
-				     };
310
-
311
-				     $.ajax({
312
-					   method: 'PUT',
313
-					   url: saveAlwdUrl + '/' + userid,
314
-					   contentType: 'application/json',
315
-					   data: JSON.stringify(alwddatatosend),
316
-					   success: function(messagesent) {
317
-					                if (messagesent == 'success') {
318
-					                    showAlert('The allowed groups and users have been successfully saved to the database! However, to be able to send and receive messages using the shared keys from above, the allowed users have to generate and save the 2 webhook URLs corresponding to this SMS provider, on their own Settings page.');
319
-					                } else if (messagesent != 'success' && messagesent != 'failure') {
320
-					                    showAlert(messagesent);
321
-					                } else if (messagesent == 'failure') {
322
-					                    showAlert('Error while trying to save the allowed groups and users!');
323
-					                }
324
-					   },
325
-					   error: function() {
326
-							showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
327
-					   }
328
-				     });
329
-
330
-				     $(this).attr("value", "Edit");
331
-
332
-				} else { $("#alwdrstsave-"+ crntprov).attr("value", "Save"); }
333
-
334
-			     });
335
-			  }
336
-			  saveAlwdRow();
337
-
338
-
339
-
340
-			  // Phone number restrictions
341
-
342
-			  // Create a list with all the available groups
343
-			  var grpsListItems = "";
344
-			  $.each(allGroups, function(key, value) {
345
-				 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
346
-			  });
347
-
348
-			  // Create a list with all the available users
349
-			  var usersListItems = "";
350
-			  $.each(allUsers, function(key, usrval) {
351
-				 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
352
-			  });
353
-
354
-
355
-			  if (allRestrictions.length > 0) {
356
-			      var restrNmb = allRestrictions.length;
357
-			  } else {
358
-			      var restrNmb = 0;
359
-			  }
360
-
361
-
362
-			  // List the access restrictions for groups and users
363
-			  if (restrNmb == 0) {
364
-
365
-			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
366
-			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
367
-
368
-			  } else {
369
-
370
-			      for (k = 0; k < restrNmb; k++) {
371
-
372
-				   if (allRestrictions[k].groups) {
373
-				       var groupsfdbpre = allRestrictions[k].groups.split("|");
374
-				       var groupsfdb = "";
375
-				       for (var g = 0; g < groupsfdbpre.length; g++) {
376
-					    groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
377
-				       }
378
-				   } else { var groupsfdb = ""; }
379
-
380
-				   if (allRestrictions[k].users) {
381
-				       var usersfdbpre = allRestrictions[k].users.split("|");
382
-				       var usersfdb = "";
383
-				       for (var u = 0; u < usersfdbpre.length; u++) {
384
-					    usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
385
-				       }
386
-				   } else { var usersfdb = ""; }
387
-
388
-				   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
389
-			      }
390
-			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
391
-			  }
392
-
393
-
394
-			  // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
395
-			  $("#phoneNumberTh").addClass('icon-loading');
396
-			  var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
397
-			  var numbersListItems = '';
398
-
399
-			  $.ajax({
400
-				  url: getnumbersUrl + '/' + userid,
401
-				  type: "POST",
402
-				  cache: false,
403
-				  processData: false,
404
-				  contentType: false,
405
-				  success: function(currentnmbrs) {
406
-
407
-					            $("#phoneNumberTh").removeClass('icon-loading');
408
-
409
-						    // Create a list with all the available phone numbers
410
-					            numbersListItems = "<option value='' selected>Select phone number</option>";
411
-
412
-						    $.each(currentnmbrs, function(key, indsmsnmb) {
413
-							   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
414
-						    });
415
-
416
-						    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
417
-
418
-						    // Append the list of available phone numbers
419
-						    $("#rstphn-"+ indRow).empty();
420
-						    $("#rstphn-"+ indRow).append(numbersListItems);
421
-			
422
-				  },
423
-				  error: function() {
424
-					            $("#phoneNumberTh").removeClass('icon-loading'); 
425
-					            showAlert("Error while attempting to retrieve the available phone numbers!");
426
-				  }
427
-			  });
428
-
429
-
430
-			  function showLists() {
431
-
432
-			      // Append the list of available groups to the restrictions table
433
-			      $('[id^="showGrps-"]').click(function() {
434
-				 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
435
-				 $("#grpL-"+ crtnmbr).remove();
436
-				 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
437
-				 $("#adminOverlay").remove();
438
-				 $("#app-content").append("<div id='adminOverlay'></div>");
439
-				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
440
-
441
-				 $("#adminOverlay").click(function() { 
442
-				    $("#adminOverlay").remove(); 
443
-				    $("#grpL-"+ crtnmbr).remove(); 
444
-				    $("#usrL-"+ crtnmbr).remove();
445
-				 });
446
-
447
-				 // Select a group
448
-				 $(".groupsList").click(function() {
449
-				    var slctdGrp = $(this).text();
450
-				    $("#grpL-"+ crtnmbr).remove();
451
-				    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
452
-
453
-				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
454
-					$("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
455
-				    } else { showAlert("That group has already been added!"); }
456
-
457
-				    // Remove a group from list
458
-				    $('[id^="rmvGrp-"]').click(function() {
459
-				       $(this).closest(".selectedGrps").remove();
460
-				    });
461
-				 });
462
-
463
-			      });
464
-
465
-			      // Append the list of available users to the restrictions table
466
-			      $('[id^="showUsr-"]').click(function() {
467
-
468
-				 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
469
-				 $("#usrL-"+ ctusrnmbr).remove();
470
-				 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
471
-				 $("#adminOverlay").remove();
472
-				 $("#app-content").append("<div id='adminOverlay'></div>");
473
-				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
474
-
475
-				 $("#adminOverlay").click(function() { 
476
-				    $("#adminOverlay").remove(); 
477
-				    $("#grpL-"+ ctusrnmbr).remove(); 
478
-				    $("#usrL-"+ ctusrnmbr).remove();
479
-				 });
480
-
481
-				 // Select a user
482
-				 $(".usersList").click(function() {
483
-				    var slctdUsr = $(this).text();
484
-				    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
485
-
486
-				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
487
-					$("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
488
-				    } else { showAlert("That user has already been added!"); }
489
-
490
-				    // Remove a user from list
491
-				    $('[id^="rmvUsr-"]').click(function() {
492
-				       $(this).closest(".selectedUsrs").remove();
493
-				    });
494
-				 });
495
-
496
-			      });
497
-
498
-			      // Remove a group from the list 
499
-			      $('[id^="rmvGrp-"]').click(function() {
500
-				 $(this).closest(".selectedGrps").remove();
501
-			      });
502
-
503
-			      // Remove a user from the list
504
-			      $('[id^="rmvUsr-"]').click(function() {
505
-				 $(this).closest(".selectedUsrs").remove();
506
-			      });
507
-
508
-			  }
509
-			  showLists();
510
-
511
-
512
-			  // Save the data
513
-			  function saveRestrRow() {
514
-
515
-			     $('[id^="rstsave-"]').unbind("click");
516
-			     $('[id^="rstsave-"]').click(function(event) {
517
-
518
-				 event.preventDefault();
519
-				 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
520
-
521
-				 if ($(this).attr("value") == "Save") {
522
-
523
-				     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
524
-				     var slctdGroups = [];
525
-				     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
526
-					slctdGroups.push($(this).text());
527
-				     });
528
-				     var slctdUsers = [];
529
-				     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
530
-					slctdUsers.push($(this).text());
531
-				     });
532
-
533
-				     if (phoneNmbr != '') {
534
-
535
-				       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
536
-
537
-					 var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
538
-
539
-					 var datatosend = { 
540
-					      userId: userid,
541
-					      savedByDsplname: crntadmDispName,
542
-					      phoneNumber: phoneNmbr,
543
-					      groups: slctdGroups,
544
-					      users: slctdUsers
545
-					 };
546
-
547
-					 $.ajax({
548
-					   method: 'PUT',
549
-					   url: saveRestrUrl + '/' + userid,
550
-					   contentType: 'application/json',
551
-					   data: JSON.stringify(datatosend),
552
-					   success: function(messagetosend) {
553
-					                if (messagetosend == 'success') {
554
-					                    showAlert('The restrictions have been successfully saved to the database!');
555
-					                } else {
556
-					                    showAlert('Error while trying to save the restrictions!');
557
-					                }
558
-					   },
559
-					   error: function() {
560
-							showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
561
-					   }
562
-					 });
563
-
564
-				       } else { showAlert("You must select at least a group or a user in order to restrict access to a phone number."); return; }
565
-
566
-				     } else { showAlert("Please select a phone number!"); return; }
567
-
568
-				     $(this).attr("value", "Edit");
569
-
570
-				} else {
571
-
572
-				     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
573
-				}
574
-
575
-			     });
576
-			  }
577
-			  saveRestrRow();
578
-
579
-			  // Remove a row
580
-			  function removeRestrRow() {
581
-
582
-			       $('[id^="rmRow-"]').click(function() {
583
-
584
-				  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
585
-				  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
586
-
587
-				  confirmAlert("Do you really want to remove this row from the database ?");
588
-
589
-				  $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
590
-
591
-				  $("#confirmOk").click(function() {
592
-
593
-				      $("#alertMsgOverlay").remove();
594
-				      $("#alertConfMessage").remove();
595
-
596
-				      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
597
-				      $.ajax({
598
-					   url: rmvRestrUrl + '/' + userid,
599
-					   method: "POST",
600
-					   dataType: "text",
601
-					   data: { phoneNumber: crntPhNmbr },
602
-					   success: function(delresult) {
603
-
604
-					                     if (delresult.indexOf("success") > -1) {
605
-					                         showAlert("The restriction has been removed successfully!");
606
-					                         $("#rstphn-"+ slctRowRmv).closest("tr").remove();
607
-					                     } else {
608
-					                         showAlert("Error while trying to remove restriction data!");
609
-					                     }
610
-					   },
611
-					   error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
612
-				       });
613
-				  });
614
-			       });
615
-			  }
616
-			  removeRestrRow();
617
-
618
-			  // Add a new row
619
-			  $("#addRestrRow").click(function() {
620
-			      if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
621
-				  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
622
-				  var indRowAdd = parseInt(lastrstAuth + 1);
623
-			      } else { var indRowAdd = 0; }
624
-			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
625
-			      showLists();
626
-			      saveRestrRow();
627
-			      removeRestrRow();
628
-
629
-			      // Check if the same phone number has been already restricted
630
-			      $("#rstphn-"+ indRowAdd).change(function() {
631
-				 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
632
-				 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
633
-				 var phNmbrChck = 0;
634
-				 allPHoneRestr.each(function() {
635
-				    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
636
-				    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
637
-				 });
638
-
639
-				 if (phNmbrChck == 2) {
640
-				     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict access to.");
641
-				     $(this).val('');
642
-				     return;
643
-				 }
644
-			      });
645
-			  });
646
-
647
-		     },
648
-		     error: function() {
649
-				showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
650
-		     }
651
-		  });
652
-
653
-
654
-
655
-		  // Save admin settings
656
-		  function randomStr(strlength) {
657
-			var fintext = "";
658
-			var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
659
-			for (var i = 0; i < strlength; i++) {
660
-			     fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
661
-			}
662
-			return fintext;
663
-		  }
664
-
665
-		  $("#generate_tel_rcpt").on("click", function(event) {
666
-
667
-		     var teltokenrec = randomStr(70);
668
-		     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
669
-
670
-		     $("#telapi_url_rec").val(telnyxwhurlrec);
671
-		  });
672
-
673
-		  $("#copyToClipboardtel").on("click", function(event) {
674
-		     var $tempEl = $("<input>");
675
-		     $("body").append($tempEl);
676
-		     $tempEl.val($("#telapi_url_rec").val()).select();
677
-		     document.execCommand("Copy");
678
-		     $tempEl.remove();
679
-		     showAlert("The link has been copied to your clipboard!");
680
-		  });
681
-
682
-		  $("#generate_tel_delrcpt").on("click", function(event) {
683
-
684
-		     var teltoken = randomStr(70);
685
-		     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
686
-
687
-		     $("#telapi_url").val(telnyxwhurl);
688
-		  });
689
-
690
-		  $("#generate_nex_rcpt").on("click", function(event) {
691
-
692
-		     var plivotokenrec = randomStr(70);
693
-		     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
694
-
695
-		     $("#nexapi_url_rec").val(plivowhurlrec);
696
-		  });
697
-
698
-		  $("#copyToClipboardnex").on("click", function(event) {
699
-		     var $tempElpl = $("<input>");
700
-		     $("body").append($tempElpl);
701
-		     $tempElpl.val($("#nexapi_url_rec").val()).select();
702
-		     document.execCommand("Copy");
703
-		     $tempElpl.remove();
704
-		     showAlert("The link has been copied to your clipboard!");
705
-		  });
706
-
707
-		  $("#generate_nex_delrcpt").on("click", function(event) {
708
-
709
-		     var plivotoken = randomStr(70);
710
-		     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
711
-
712
-		     $("#nexapi_url").val(plivodrwhurl);
713
-		  });
714
-
715
-		  $("#generate_twil_rcpt").on("click", function(event) {
716
-
717
-		     var twiltokenrec = randomStr(35);
718
-		     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
719
-
720
-		     $("#twilapi_url_rec").val(twilwhurlrec);
721
-		  });
722
-
723
-		  $("#copyToClipboardtwil").on("click", function(event) {
724
-		     var $tempElpl = $("<input>");
725
-		     $("body").append($tempElpl);
726
-		     $tempElpl.val($("#twilapi_url_rec").val()).select();
727
-		     document.execCommand("Copy");
728
-		     $tempElpl.remove();
729
-		     showAlert("The link has been copied to your clipboard!");
730
-		  });
731
-
732
-		  $("#generate_twil_delrcpt").on("click", function(event) {
733
-
734
-		     var twiltoken = randomStr(35);
735
-		     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
736
-
737
-		     $("#twilapi_url").val(twildrwhurl);
738
-		  });
739
-
740
-		  $("#generate_flow_rcpt").on("click", function(event) {
741
-
742
-		     var flowtokenrec = randomStr(70);
743
-		     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
744
-
745
-		     $("#flowapi_url_rec").val(flowwhurlrec);
746
-		  });
747
-
748
-		  $("#copyToClipboardflow").on("click", function(event) {
749
-		     var $tempElpl = $("<input>");
750
-		     $("body").append($tempElpl);
751
-		     $tempElpl.val($("#flowapi_url_rec").val()).select();
752
-		     document.execCommand("Copy");
753
-		     $tempElpl.remove();
754
-		     showAlert("The link has been copied to your clipboard!");
755
-		  });
756
-
757
-		  $("#generate_flow_delrcpt").on("click", function(event) {
758
-
759
-		     var flowtoken = randomStr(70);
760
-		     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
761
-
762
-		     $("#flowapi_url").val(flowdrwhurl);
763
-		  });
764
-
765
-		  // Add group icons
766
-		  $(".srGroupImg").each(function() {
767
-		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/group.svg");
768
-		  });
769
-
770
-		  // Add user icons
771
-		  $(".srUserImg").each(function() {
772
-		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/user.svg");
773
-		  });
774
-
775
-		  $("#save_admin_settings").on("click", function(event) {
776
-
777
-		    event.preventDefault();
778
-		    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
779
-
780
-		    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
781
-
782
-		    var showallmsgs = 0;
783
-		    if ($("#showallmessages").is(':checked')) {
784
-			showallmsgs = 1;
785
-		    }
786
-
787
-		    var telsenderinit = $("#tel_sender_name").val();
788
-		    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
789
-
790
-		    var nexsenderinit = $("#nex_sender_name").val();
791
-		    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
792
-
793
-		    var twilsenderinit = $("#twil_sender_name").val();
794
-		    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
795
-
796
-		    var datatosave = {
797
-				      userId: userid,
798
-				      telapiKey: $("#telapi_key").val(),
799
-				      telPubKey: $("#tel_pub_key").val(),
800
-				      telapiUrlRec: $("#telapi_url_rec").val(),
801
-				      telapiUrl: $("#telapi_url").val(),
802
-				      messagingProfileId: $("#messaging_profile_id").val(),
803
-				      nexapiKey: $("#nexapi_key").val(),
804
-				      nexapiSecret: $("#nexapi_secret").val(),
805
-				      nexapiUrlRec: $("#nexapi_url_rec").val(),
806
-				      nexapiUrl: $("#nexapi_url").val(),
807
-				      twilapiKey: $("#twilapi_key").val(),
808
-				      twilapiSecret: $("#twilapi_secret").val(),
809
-				      twilapiUrlRec: $("#twilapi_url_rec").val(),
810
-				      twilapiUrl: $("#twilapi_url").val(),
811
-				      flowapiKey: $("#flowapi_key").val(),
812
-				      flowapiSecret: $("#flowapi_secret").val(),
813
-				      flowapiUrlRec: $("#flowapi_url_rec").val(),
814
-				      flowapiUrl: $("#flowapi_url").val(),
815
-				      telSenderName: telsenderproc,
816
-				      nexSenderName: nexsenderproc,
817
-				      twilSenderName: twilsenderproc,
818
-				      showAllMessages: showallmsgs
819
-		    };
820
-
821
-
822
-		    $.ajax({
823
-		       method: 'PUT',
824
-		       url: baseUrlsv + '/' + userid,
825
-		       contentType: 'application/json',
826
-		       data: JSON.stringify(datatosave),
827
-		       success: function() {
828
-		       },
829
-		       error: function() {
830
-			    showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
831
-		       }
832
-		    });
833
-
834
-		  });
835
-
836
-		  function showAlert(alertText) {
837
-
838
-		     let alertwnd = "<div id='alertMessage'>";
839
-		     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
840
-		     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
841
-		     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
842
-		     alertwnd += "</div>";
843
-
844
-		     $("#content").append("<div id='alertMsgOverlay'></div>");
845
-		     $("#content").append(alertwnd);
846
-
847
-		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
848
-		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
849
-		     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
850
-
851
-		     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
852
-		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
853
-		     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
854
-		  }
855
-
856
-		  function confirmAlert(alertText) {
857
-
858
-		     $("#alertMsgOverlay").remove();
859
-		     $("#alertConfMessage").remove();
860
-
861
-		     let alertwndcf = "<div id='alertConfMessage'>";
862
-		     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
863
-		     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
864
-		     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
865
-		     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
866
-		     alertwndcf += "</div>";
867
-
868
-		     $("#content").append("<div id='alertMsgOverlay'></div>");
869
-		     $("#content").append(alertwndcf);
870
-
871
-		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
872
-		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
873
-		     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
874
-
875
-		     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
876
-		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
877
-		  }
878
-
879
-
880
-     },
881
-     error: function(appdirfdb) {
882
-                alert("An error occurred while getting the app's directory. You can check the Nextcloud log to find more details about this issue.");
883
-     }
884
-   });
885
-
886
-});
Browse code

added appinfo/info.xml appinfo/signature.json CHANGELOG.txt js/showsmstables.js js/adminsettings.js css/style.css lib/Controller/AuthorApiController.php lib/Controller/SmsrelentlessController.php lib/Service/SmsrelentlessService.php templates/settings/admin.php lib/Migration/Version135Date20240420221527.php

DoubleBastionAdmin authored on 20/04/2024 03:36:59
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,886 @@
1
+/**
2
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
+ *
4
+ * @author Double Bastion LLC
5
+ *
6
+ * @license GNU AGPL version 3 or any later version
7
+ *
8
+ * This program is free software; you can redistribute it and/or
9
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
+ * License as published by the Free Software Foundation; either
11
+ * version 3 of the License, or any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
+ *
18
+ * You should have received a copy of the GNU Affero General Public
19
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+$(document).ready(function() {
24
+
25
+  var userid = "<?php p($userId); ?>";
26
+  var ctappdir = 'apps';
27
+
28
+  // Get app directory
29
+  var getappdirurl = OC.generateUrl('/apps/sms_relentless/user/getappdirectory');
30
+
31
+  $.ajax({
32
+     method: 'GET',
33
+     url: getappdirurl + '/' + userid,
34
+     contentType: 'application/json',
35
+     success: function(appdirfdb) {
36
+
37
+                   ctappdir = appdirfdb;
38
+
39
+		  // Get admin settings
40
+		  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
41
+
42
+		  $.ajax({
43
+		     method: 'GET',
44
+		     url: baseUrlget + '/' + userid,
45
+		     contentType: 'application/json',
46
+		     success: function(settingsadm) {
47
+
48
+			  $("#telapi_key").val(settingsadm.telapi_key);
49
+			  $("#tel_pub_key").val(settingsadm.tel_pub_key);
50
+			  $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
51
+			  $("#telapi_url").val(settingsadm.telapi_url);
52
+			  $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
53
+			  $("#nexapi_key").val(settingsadm.nexapi_key);
54
+			  $("#nexapi_secret").val(settingsadm.nexapi_secret);
55
+			  $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
56
+			  $("#nexapi_url").val(settingsadm.nexapi_url);
57
+			  $("#twilapi_key").val(settingsadm.twilapi_key);
58
+			  $("#twilapi_secret").val(settingsadm.twilapi_secret);
59
+			  $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
60
+			  $("#twilapi_url").val(settingsadm.twilapi_url);
61
+			  $("#flowapi_key").val(settingsadm.flowapi_key);
62
+			  $("#flowapi_secret").val(settingsadm.flowapi_secret);
63
+			  $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
64
+			  $("#flowapi_url").val(settingsadm.flowapi_url);
65
+			  $("#tel_sender_name").val(settingsadm.tel_sender_name);
66
+			  $("#nex_sender_name").val(settingsadm.nex_sender_name);
67
+			  $("#twil_sender_name").val(settingsadm.twil_sender_name);
68
+
69
+			  var crntadmDispName = settingsadm.admdisplayname;
70
+			  var allRestrictions = settingsadm.restrictions;
71
+			  var allGroups = settingsadm.allgroups;
72
+			  var allUsers = settingsadm.allusers;
73
+			  var allGroupswadm = settingsadm.allgroupswadm;
74
+			  var allUserswadm = settingsadm.alluserswadm;
75
+			  var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
76
+			  var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
77
+			  var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
78
+			  var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
79
+			  var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
80
+			  var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
81
+			  var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
82
+			  var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
83
+
84
+			  var tnxallowedgrpdel = settingsadm.allowedkeysuse.tnx_groups_del;
85
+			  var tnxallowedusrdel = settingsadm.allowedkeysuse.tnx_users_del;
86
+			  var plvallowedgrpdel = settingsadm.allowedkeysuse.plv_groups_del;
87
+			  var plvallowedusrdel = settingsadm.allowedkeysuse.plv_users_del;
88
+			  var twlallowedgrpdel = settingsadm.allowedkeysuse.twl_groups_del;
89
+			  var twlallowedusrdel = settingsadm.allowedkeysuse.twl_users_del;
90
+			  var flrallowedgrpdel = settingsadm.allowedkeysuse.flr_groups_del;
91
+			  var flrallowedusrdel = settingsadm.allowedkeysuse.flr_users_del;
92
+
93
+			  if (tnxallowedgrpdel == 1) { $("#alwDelGrps-tnx").attr("checked", true); } else { $("#alwDelGrps-tnx").attr("checked", false); }
94
+			  if (tnxallowedusrdel == 1) { $("#alwDelUsrs-tnx").attr("checked", true); } else { $("#alwDelUsrs-tnx").attr("checked", false); }
95
+			  if (plvallowedgrpdel == 1) { $("#alwDelGrps-plv").attr("checked", true); } else { $("#alwDelGrps-plv").attr("checked", false); }
96
+			  if (plvallowedusrdel == 1) { $("#alwDelUsrs-plv").attr("checked", true); } else { $("#alwDelUsrs-plv").attr("checked", false); }
97
+			  if (twlallowedgrpdel == 1) { $("#alwDelGrps-twl").attr("checked", true); } else { $("#alwDelGrps-twl").attr("checked", false); }
98
+			  if (twlallowedusrdel == 1) { $("#alwDelUsrs-twl").attr("checked", true); } else { $("#alwDelUsrs-twl").attr("checked", false); }
99
+			  if (flrallowedgrpdel == 1) { $("#alwDelGrps-flr").attr("checked", true); } else { $("#alwDelGrps-flr").attr("checked", false); }
100
+			  if (flrallowedusrdel == 1) { $("#alwDelUsrs-flr").attr("checked", true); } else { $("#alwDelUsrs-flr").attr("checked", false); }
101
+
102
+			  if (settingsadm.show_all_messages == 1) { $("#showallmessages").attr("checked", true); } else { $("#showallmessages").attr("checked", false); }
103
+
104
+			  // List all the groups and users allowed to access the API keys, for each provider
105
+			  if (tnxallowedgrp) {
106
+			      var tnxallowedgrparr = tnxallowedgrp.split("|");
107
+			      for (var g = 0; g < tnxallowedgrparr.length; g++) {
108
+				   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
109
+			      }
110
+			  }
111
+
112
+			  if (tnxallowedusr) {
113
+			      var tnxallowedusrarr = tnxallowedusr.split("|");
114
+			      for (var g = 0; g < tnxallowedusrarr.length; g++) {
115
+				   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
116
+			      }
117
+			  }
118
+
119
+			  if (plvallowedgrp) {
120
+			      var plvallowedgrparr = plvallowedgrp.split("|");
121
+			      for (var g = 0; g < plvallowedgrparr.length; g++) {
122
+				   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
123
+			      }
124
+			  }
125
+
126
+			  if (plvallowedusr) {
127
+			      var plvallowedusrarr = plvallowedusr.split("|");
128
+			      for (var g = 0; g < plvallowedusrarr.length; g++) {
129
+				   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
130
+			      }
131
+			  }
132
+
133
+			  if (twlallowedgrp) {
134
+			      var twlallowedgrparr = twlallowedgrp.split("|");
135
+			      for (var g = 0; g < twlallowedgrparr.length; g++) {
136
+				   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
137
+			      }
138
+			  }
139
+
140
+			  if (twlallowedusr) {
141
+			      var twlallowedusrarr = twlallowedusr.split("|");
142
+			      for (var g = 0; g < twlallowedusrarr.length; g++) {
143
+				   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
144
+			      }
145
+			  }
146
+
147
+			  if (flrallowedgrp) {
148
+			      var flrallowedgrparr = flrallowedgrp.split("|");
149
+			      for (var g = 0; g < flrallowedgrparr.length; g++) {
150
+				   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
151
+			      }
152
+			  }
153
+
154
+			  if (flrallowedusr) {
155
+			      var flrallowedusrarr = flrallowedusr.split("|");
156
+			      for (var g = 0; g < flrallowedusrarr.length; g++) {
157
+				   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
158
+			      }
159
+			  }
160
+
161
+
162
+			  // Create a list with all the available groups, excluding the admin group
163
+			  var grpsListItemswadm = "";
164
+			  $.each(allGroupswadm, function(key, value) {
165
+				 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
166
+			  });
167
+
168
+			  // Create a list with all the available users, excluding the admins
169
+			  var usersListItemswadm = "";
170
+			  $.each(allUserswadm, function(key, usrval) {
171
+				 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
172
+			  });
173
+			  
174
+
175
+			  function showListsalwdk() {
176
+
177
+			      // Append the list of available groups to the table of groups and users allowed to use the API keys
178
+			      $('[id^="showakeyGrps-"]').click(function() {
179
+				 var crtid = $(this).attr("id").split("-")[1];
180
+				 $("#grpsadapik-"+ crtid).remove();
181
+				 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
182
+				 $("#adminOverlay").remove();
183
+				 $("#app-content").append("<div id='adminOverlay'></div>");
184
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
185
+
186
+				 $("#adminOverlay").click(function() { 
187
+				    $("#adminOverlay").remove();
188
+				    $("#grpsadapik-"+ crtid).remove();
189
+				    $("#usrsadapik-"+ crtid).remove();
190
+				 });
191
+
192
+				 // Select a group
193
+				 $(".groupsList").click(function() {
194
+				    var slctdGrp = $(this).text();
195
+				    $("#grpsadapik-"+ crtid).remove();
196
+				    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
197
+
198
+				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
199
+					$("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
200
+				    } else { showAlert("That group has already been added!"); }
201
+
202
+				    // Remove a group from list
203
+				    $('[id^="rmvGrp-"]').click(function() {
204
+				       $(this).closest(".selectedGrps").remove();
205
+				    });
206
+				 });
207
+
208
+			      });
209
+
210
+			      // Append the list of available users to the table of groups and users allowed to use the API keys
211
+			      $('[id^="showakeyUsrs-"]').click(function() {
212
+
213
+				 var crtidusr = $(this).attr("id").split("-")[1];
214
+				 $("#usrsadapik-"+ crtidusr).remove();
215
+				 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
216
+				 $("#adminOverlay").remove();
217
+				 $("#app-content").append("<div id='adminOverlay'></div>");
218
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
219
+
220
+				 $("#adminOverlay").click(function() { 
221
+				    $("#adminOverlay").remove(); 
222
+				    $("#grpsadapik-"+ crtidusr).remove();
223
+				    $("#usrsadapik-"+ crtidusr).remove();
224
+				 });
225
+
226
+				 // Select a user
227
+				 $(".usersList").click(function() {
228
+				    var slctdUsr = $(this).text();
229
+				    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
230
+
231
+				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
232
+					$("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
233
+				    } else { showAlert("That user has already been added!"); }
234
+
235
+				    // Remove a user from list
236
+				    $('[id^="rmvUsr-"]').click(function() {
237
+				       $(this).closest(".selectedUsrs").remove();
238
+				    });
239
+				 });
240
+
241
+			      });
242
+
243
+			      // Remove a group from the list 
244
+			      $('[id^="rmvGrp-"]').click(function() {
245
+				 $(this).closest(".selectedGrps").remove();
246
+			      });
247
+
248
+			      // Remove a user from the list
249
+			      $('[id^="rmvUsr-"]').click(function() {
250
+				 $(this).closest(".selectedUsrs").remove();
251
+			      });
252
+
253
+			  }
254
+			  showListsalwdk();
255
+
256
+
257
+			  // Save the data
258
+			  function saveAlwdRow() {
259
+			     $('[id^="alwdrstsave-"]').unbind("click");
260
+			     $('[id^="alwdrstsave-"]').click(function(event) {
261
+
262
+				 event.preventDefault();
263
+				 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
264
+				 
265
+				 if ($(this).attr("value") == "Save") {
266
+
267
+				     var selGroups = [];
268
+				     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
269
+					selGroups.push($(this).text());
270
+				     });
271
+				     if (selGroups.length == 0) { selGroups.push(""); }
272
+
273
+				     var selUsers = [];
274
+				     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
275
+					selUsers.push($(this).text());
276
+				     });
277
+				     if (selUsers.length == 0) { selUsers.push(""); }
278
+
279
+				     // Check if the access key fields have been left empty
280
+				     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
281
+					 showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
282
+					 return;
283
+				     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
284
+					 showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
285
+					 return;
286
+				     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
287
+					 showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
288
+					 return;
289
+				     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
290
+					 showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
291
+					 return;
292
+				     }
293
+
294
+                                     var delGroups = 0;
295
+		                     if ($("#alwDelGrps-"+ crntprov +"").is(':checked')) { delGroups = 1; }
296
+
297
+                                     var delUsers = 0;
298
+		                     if ($("#alwDelUsrs-"+ crntprov +"").is(':checked')) { delUsers = 1; }
299
+
300
+				     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
301
+
302
+				     var alwddatatosend = { 
303
+					      userId: userid,
304
+					      groups: selGroups,
305
+					      users: selUsers,
306
+                                              groupsdel: delGroups,
307
+                                              usersdel: delUsers,
308
+					      provider: crntprov
309
+				     };
310
+
311
+				     $.ajax({
312
+					   method: 'PUT',
313
+					   url: saveAlwdUrl + '/' + userid,
314
+					   contentType: 'application/json',
315
+					   data: JSON.stringify(alwddatatosend),
316
+					   success: function(messagesent) {
317
+					                if (messagesent == 'success') {
318
+					                    showAlert('The allowed groups and users have been successfully saved to the database! However, to be able to send and receive messages using the shared keys from above, the allowed users have to generate and save the 2 webhook URLs corresponding to this SMS provider, on their own Settings page.');
319
+					                } else if (messagesent != 'success' && messagesent != 'failure') {
320
+					                    showAlert(messagesent);
321
+					                } else if (messagesent == 'failure') {
322
+					                    showAlert('Error while trying to save the allowed groups and users!');
323
+					                }
324
+					   },
325
+					   error: function() {
326
+							showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
327
+					   }
328
+				     });
329
+
330
+				     $(this).attr("value", "Edit");
331
+
332
+				} else { $("#alwdrstsave-"+ crntprov).attr("value", "Save"); }
333
+
334
+			     });
335
+			  }
336
+			  saveAlwdRow();
337
+
338
+
339
+
340
+			  // Phone number restrictions
341
+
342
+			  // Create a list with all the available groups
343
+			  var grpsListItems = "";
344
+			  $.each(allGroups, function(key, value) {
345
+				 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
346
+			  });
347
+
348
+			  // Create a list with all the available users
349
+			  var usersListItems = "";
350
+			  $.each(allUsers, function(key, usrval) {
351
+				 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
352
+			  });
353
+
354
+
355
+			  if (allRestrictions.length > 0) {
356
+			      var restrNmb = allRestrictions.length;
357
+			  } else {
358
+			      var restrNmb = 0;
359
+			  }
360
+
361
+
362
+			  // List the access restrictions for groups and users
363
+			  if (restrNmb == 0) {
364
+
365
+			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
366
+			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
367
+
368
+			  } else {
369
+
370
+			      for (k = 0; k < restrNmb; k++) {
371
+
372
+				   if (allRestrictions[k].groups) {
373
+				       var groupsfdbpre = allRestrictions[k].groups.split("|");
374
+				       var groupsfdb = "";
375
+				       for (var g = 0; g < groupsfdbpre.length; g++) {
376
+					    groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
377
+				       }
378
+				   } else { var groupsfdb = ""; }
379
+
380
+				   if (allRestrictions[k].users) {
381
+				       var usersfdbpre = allRestrictions[k].users.split("|");
382
+				       var usersfdb = "";
383
+				       for (var u = 0; u < usersfdbpre.length; u++) {
384
+					    usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
385
+				       }
386
+				   } else { var usersfdb = ""; }
387
+
388
+				   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
389
+			      }
390
+			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
391
+			  }
392
+
393
+
394
+			  // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
395
+			  $("#phoneNumberTh").addClass('icon-loading');
396
+			  var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
397
+			  var numbersListItems = '';
398
+
399
+			  $.ajax({
400
+				  url: getnumbersUrl + '/' + userid,
401
+				  type: "POST",
402
+				  cache: false,
403
+				  processData: false,
404
+				  contentType: false,
405
+				  success: function(currentnmbrs) {
406
+
407
+					            $("#phoneNumberTh").removeClass('icon-loading');
408
+
409
+						    // Create a list with all the available phone numbers
410
+					            numbersListItems = "<option value='' selected>Select phone number</option>";
411
+
412
+						    $.each(currentnmbrs, function(key, indsmsnmb) {
413
+							   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
414
+						    });
415
+
416
+						    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
417
+
418
+						    // Append the list of available phone numbers
419
+						    $("#rstphn-"+ indRow).empty();
420
+						    $("#rstphn-"+ indRow).append(numbersListItems);
421
+			
422
+				  },
423
+				  error: function() {
424
+					            $("#phoneNumberTh").removeClass('icon-loading'); 
425
+					            showAlert("Error while attempting to retrieve the available phone numbers!");
426
+				  }
427
+			  });
428
+
429
+
430
+			  function showLists() {
431
+
432
+			      // Append the list of available groups to the restrictions table
433
+			      $('[id^="showGrps-"]').click(function() {
434
+				 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
435
+				 $("#grpL-"+ crtnmbr).remove();
436
+				 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
437
+				 $("#adminOverlay").remove();
438
+				 $("#app-content").append("<div id='adminOverlay'></div>");
439
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
440
+
441
+				 $("#adminOverlay").click(function() { 
442
+				    $("#adminOverlay").remove(); 
443
+				    $("#grpL-"+ crtnmbr).remove(); 
444
+				    $("#usrL-"+ crtnmbr).remove();
445
+				 });
446
+
447
+				 // Select a group
448
+				 $(".groupsList").click(function() {
449
+				    var slctdGrp = $(this).text();
450
+				    $("#grpL-"+ crtnmbr).remove();
451
+				    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
452
+
453
+				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
454
+					$("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
455
+				    } else { showAlert("That group has already been added!"); }
456
+
457
+				    // Remove a group from list
458
+				    $('[id^="rmvGrp-"]').click(function() {
459
+				       $(this).closest(".selectedGrps").remove();
460
+				    });
461
+				 });
462
+
463
+			      });
464
+
465
+			      // Append the list of available users to the restrictions table
466
+			      $('[id^="showUsr-"]').click(function() {
467
+
468
+				 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
469
+				 $("#usrL-"+ ctusrnmbr).remove();
470
+				 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
471
+				 $("#adminOverlay").remove();
472
+				 $("#app-content").append("<div id='adminOverlay'></div>");
473
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
474
+
475
+				 $("#adminOverlay").click(function() { 
476
+				    $("#adminOverlay").remove(); 
477
+				    $("#grpL-"+ ctusrnmbr).remove(); 
478
+				    $("#usrL-"+ ctusrnmbr).remove();
479
+				 });
480
+
481
+				 // Select a user
482
+				 $(".usersList").click(function() {
483
+				    var slctdUsr = $(this).text();
484
+				    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
485
+
486
+				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
487
+					$("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
488
+				    } else { showAlert("That user has already been added!"); }
489
+
490
+				    // Remove a user from list
491
+				    $('[id^="rmvUsr-"]').click(function() {
492
+				       $(this).closest(".selectedUsrs").remove();
493
+				    });
494
+				 });
495
+
496
+			      });
497
+
498
+			      // Remove a group from the list 
499
+			      $('[id^="rmvGrp-"]').click(function() {
500
+				 $(this).closest(".selectedGrps").remove();
501
+			      });
502
+
503
+			      // Remove a user from the list
504
+			      $('[id^="rmvUsr-"]').click(function() {
505
+				 $(this).closest(".selectedUsrs").remove();
506
+			      });
507
+
508
+			  }
509
+			  showLists();
510
+
511
+
512
+			  // Save the data
513
+			  function saveRestrRow() {
514
+
515
+			     $('[id^="rstsave-"]').unbind("click");
516
+			     $('[id^="rstsave-"]').click(function(event) {
517
+
518
+				 event.preventDefault();
519
+				 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
520
+
521
+				 if ($(this).attr("value") == "Save") {
522
+
523
+				     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
524
+				     var slctdGroups = [];
525
+				     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
526
+					slctdGroups.push($(this).text());
527
+				     });
528
+				     var slctdUsers = [];
529
+				     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
530
+					slctdUsers.push($(this).text());
531
+				     });
532
+
533
+				     if (phoneNmbr != '') {
534
+
535
+				       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
536
+
537
+					 var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
538
+
539
+					 var datatosend = { 
540
+					      userId: userid,
541
+					      savedByDsplname: crntadmDispName,
542
+					      phoneNumber: phoneNmbr,
543
+					      groups: slctdGroups,
544
+					      users: slctdUsers
545
+					 };
546
+
547
+					 $.ajax({
548
+					   method: 'PUT',
549
+					   url: saveRestrUrl + '/' + userid,
550
+					   contentType: 'application/json',
551
+					   data: JSON.stringify(datatosend),
552
+					   success: function(messagetosend) {
553
+					                if (messagetosend == 'success') {
554
+					                    showAlert('The restrictions have been successfully saved to the database!');
555
+					                } else {
556
+					                    showAlert('Error while trying to save the restrictions!');
557
+					                }
558
+					   },
559
+					   error: function() {
560
+							showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
561
+					   }
562
+					 });
563
+
564
+				       } else { showAlert("You must select at least a group or a user in order to restrict access to a phone number."); return; }
565
+
566
+				     } else { showAlert("Please select a phone number!"); return; }
567
+
568
+				     $(this).attr("value", "Edit");
569
+
570
+				} else {
571
+
572
+				     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
573
+				}
574
+
575
+			     });
576
+			  }
577
+			  saveRestrRow();
578
+
579
+			  // Remove a row
580
+			  function removeRestrRow() {
581
+
582
+			       $('[id^="rmRow-"]').click(function() {
583
+
584
+				  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
585
+				  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
586
+
587
+				  confirmAlert("Do you really want to remove this row from the database ?");
588
+
589
+				  $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
590
+
591
+				  $("#confirmOk").click(function() {
592
+
593
+				      $("#alertMsgOverlay").remove();
594
+				      $("#alertConfMessage").remove();
595
+
596
+				      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
597
+				      $.ajax({
598
+					   url: rmvRestrUrl + '/' + userid,
599
+					   method: "POST",
600
+					   dataType: "text",
601
+					   data: { phoneNumber: crntPhNmbr },
602
+					   success: function(delresult) {
603
+
604
+					                     if (delresult.indexOf("success") > -1) {
605
+					                         showAlert("The restriction has been removed successfully!");
606
+					                         $("#rstphn-"+ slctRowRmv).closest("tr").remove();
607
+					                     } else {
608
+					                         showAlert("Error while trying to remove restriction data!");
609
+					                     }
610
+					   },
611
+					   error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
612
+				       });
613
+				  });
614
+			       });
615
+			  }
616
+			  removeRestrRow();
617
+
618
+			  // Add a new row
619
+			  $("#addRestrRow").click(function() {
620
+			      if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
621
+				  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
622
+				  var indRowAdd = parseInt(lastrstAuth + 1);
623
+			      } else { var indRowAdd = 0; }
624
+			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
625
+			      showLists();
626
+			      saveRestrRow();
627
+			      removeRestrRow();
628
+
629
+			      // Check if the same phone number has been already restricted
630
+			      $("#rstphn-"+ indRowAdd).change(function() {
631
+				 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
632
+				 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
633
+				 var phNmbrChck = 0;
634
+				 allPHoneRestr.each(function() {
635
+				    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
636
+				    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
637
+				 });
638
+
639
+				 if (phNmbrChck == 2) {
640
+				     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict access to.");
641
+				     $(this).val('');
642
+				     return;
643
+				 }
644
+			      });
645
+			  });
646
+
647
+		     },
648
+		     error: function() {
649
+				showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
650
+		     }
651
+		  });
652
+
653
+
654
+
655
+		  // Save admin settings
656
+		  function randomStr(strlength) {
657
+			var fintext = "";
658
+			var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
659
+			for (var i = 0; i < strlength; i++) {
660
+			     fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
661
+			}
662
+			return fintext;
663
+		  }
664
+
665
+		  $("#generate_tel_rcpt").on("click", function(event) {
666
+
667
+		     var teltokenrec = randomStr(70);
668
+		     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
669
+
670
+		     $("#telapi_url_rec").val(telnyxwhurlrec);
671
+		  });
672
+
673
+		  $("#copyToClipboardtel").on("click", function(event) {
674
+		     var $tempEl = $("<input>");
675
+		     $("body").append($tempEl);
676
+		     $tempEl.val($("#telapi_url_rec").val()).select();
677
+		     document.execCommand("Copy");
678
+		     $tempEl.remove();
679
+		     showAlert("The link has been copied to your clipboard!");
680
+		  });
681
+
682
+		  $("#generate_tel_delrcpt").on("click", function(event) {
683
+
684
+		     var teltoken = randomStr(70);
685
+		     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
686
+
687
+		     $("#telapi_url").val(telnyxwhurl);
688
+		  });
689
+
690
+		  $("#generate_nex_rcpt").on("click", function(event) {
691
+
692
+		     var plivotokenrec = randomStr(70);
693
+		     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
694
+
695
+		     $("#nexapi_url_rec").val(plivowhurlrec);
696
+		  });
697
+
698
+		  $("#copyToClipboardnex").on("click", function(event) {
699
+		     var $tempElpl = $("<input>");
700
+		     $("body").append($tempElpl);
701
+		     $tempElpl.val($("#nexapi_url_rec").val()).select();
702
+		     document.execCommand("Copy");
703
+		     $tempElpl.remove();
704
+		     showAlert("The link has been copied to your clipboard!");
705
+		  });
706
+
707
+		  $("#generate_nex_delrcpt").on("click", function(event) {
708
+
709
+		     var plivotoken = randomStr(70);
710
+		     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
711
+
712
+		     $("#nexapi_url").val(plivodrwhurl);
713
+		  });
714
+
715
+		  $("#generate_twil_rcpt").on("click", function(event) {
716
+
717
+		     var twiltokenrec = randomStr(35);
718
+		     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
719
+
720
+		     $("#twilapi_url_rec").val(twilwhurlrec);
721
+		  });
722
+
723
+		  $("#copyToClipboardtwil").on("click", function(event) {
724
+		     var $tempElpl = $("<input>");
725
+		     $("body").append($tempElpl);
726
+		     $tempElpl.val($("#twilapi_url_rec").val()).select();
727
+		     document.execCommand("Copy");
728
+		     $tempElpl.remove();
729
+		     showAlert("The link has been copied to your clipboard!");
730
+		  });
731
+
732
+		  $("#generate_twil_delrcpt").on("click", function(event) {
733
+
734
+		     var twiltoken = randomStr(35);
735
+		     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
736
+
737
+		     $("#twilapi_url").val(twildrwhurl);
738
+		  });
739
+
740
+		  $("#generate_flow_rcpt").on("click", function(event) {
741
+
742
+		     var flowtokenrec = randomStr(70);
743
+		     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
744
+
745
+		     $("#flowapi_url_rec").val(flowwhurlrec);
746
+		  });
747
+
748
+		  $("#copyToClipboardflow").on("click", function(event) {
749
+		     var $tempElpl = $("<input>");
750
+		     $("body").append($tempElpl);
751
+		     $tempElpl.val($("#flowapi_url_rec").val()).select();
752
+		     document.execCommand("Copy");
753
+		     $tempElpl.remove();
754
+		     showAlert("The link has been copied to your clipboard!");
755
+		  });
756
+
757
+		  $("#generate_flow_delrcpt").on("click", function(event) {
758
+
759
+		     var flowtoken = randomStr(70);
760
+		     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
761
+
762
+		     $("#flowapi_url").val(flowdrwhurl);
763
+		  });
764
+
765
+		  // Add group icons
766
+		  $(".srGroupImg").each(function() {
767
+		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/group.svg");
768
+		  });
769
+
770
+		  // Add user icons
771
+		  $(".srUserImg").each(function() {
772
+		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/user.svg");
773
+		  });
774
+
775
+		  $("#save_admin_settings").on("click", function(event) {
776
+
777
+		    event.preventDefault();
778
+		    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
779
+
780
+		    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
781
+
782
+		    var showallmsgs = 0;
783
+		    if ($("#showallmessages").is(':checked')) {
784
+			showallmsgs = 1;
785
+		    }
786
+
787
+		    var telsenderinit = $("#tel_sender_name").val();
788
+		    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
789
+
790
+		    var nexsenderinit = $("#nex_sender_name").val();
791
+		    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
792
+
793
+		    var twilsenderinit = $("#twil_sender_name").val();
794
+		    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
795
+
796
+		    var datatosave = {
797
+				      userId: userid,
798
+				      telapiKey: $("#telapi_key").val(),
799
+				      telPubKey: $("#tel_pub_key").val(),
800
+				      telapiUrlRec: $("#telapi_url_rec").val(),
801
+				      telapiUrl: $("#telapi_url").val(),
802
+				      messagingProfileId: $("#messaging_profile_id").val(),
803
+				      nexapiKey: $("#nexapi_key").val(),
804
+				      nexapiSecret: $("#nexapi_secret").val(),
805
+				      nexapiUrlRec: $("#nexapi_url_rec").val(),
806
+				      nexapiUrl: $("#nexapi_url").val(),
807
+				      twilapiKey: $("#twilapi_key").val(),
808
+				      twilapiSecret: $("#twilapi_secret").val(),
809
+				      twilapiUrlRec: $("#twilapi_url_rec").val(),
810
+				      twilapiUrl: $("#twilapi_url").val(),
811
+				      flowapiKey: $("#flowapi_key").val(),
812
+				      flowapiSecret: $("#flowapi_secret").val(),
813
+				      flowapiUrlRec: $("#flowapi_url_rec").val(),
814
+				      flowapiUrl: $("#flowapi_url").val(),
815
+				      telSenderName: telsenderproc,
816
+				      nexSenderName: nexsenderproc,
817
+				      twilSenderName: twilsenderproc,
818
+				      showAllMessages: showallmsgs
819
+		    };
820
+
821
+
822
+		    $.ajax({
823
+		       method: 'PUT',
824
+		       url: baseUrlsv + '/' + userid,
825
+		       contentType: 'application/json',
826
+		       data: JSON.stringify(datatosave),
827
+		       success: function() {
828
+		       },
829
+		       error: function() {
830
+			    showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
831
+		       }
832
+		    });
833
+
834
+		  });
835
+
836
+		  function showAlert(alertText) {
837
+
838
+		     let alertwnd = "<div id='alertMessage'>";
839
+		     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
840
+		     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
841
+		     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
842
+		     alertwnd += "</div>";
843
+
844
+		     $("#content").append("<div id='alertMsgOverlay'></div>");
845
+		     $("#content").append(alertwnd);
846
+
847
+		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
848
+		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
849
+		     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
850
+
851
+		     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
852
+		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
853
+		     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
854
+		  }
855
+
856
+		  function confirmAlert(alertText) {
857
+
858
+		     $("#alertMsgOverlay").remove();
859
+		     $("#alertConfMessage").remove();
860
+
861
+		     let alertwndcf = "<div id='alertConfMessage'>";
862
+		     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
863
+		     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
864
+		     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
865
+		     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
866
+		     alertwndcf += "</div>";
867
+
868
+		     $("#content").append("<div id='alertMsgOverlay'></div>");
869
+		     $("#content").append(alertwndcf);
870
+
871
+		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
872
+		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
873
+		     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
874
+
875
+		     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
876
+		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
877
+		  }
878
+
879
+
880
+     },
881
+     error: function(appdirfdb) {
882
+                alert("An error occurred while getting the app's directory. You can check the Nextcloud log to find more details about this issue.");
883
+     }
884
+   });
885
+
886
+});
Browse code

removed appinfo/info.xml appinfo/signature.json CHANGELOG.txt js/showsmstables.js js/adminsettings.js css/style.css lib/Controller/AuthorApiController.php lib/Controller/SmsrelentlessController.php lib/Service/SmsrelentlessService.php templates/settings/admin.php

DoubleBastionAdmin authored on 20/04/2024 03:30:52
Showing 1 changed files
1 1
deleted file mode 100644
... ...
@@ -1,867 +0,0 @@
1
-/**
2
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
- *
4
- * @author Double Bastion LLC
5
- *
6
- * @license GNU AGPL version 3 or any later version
7
- *
8
- * This program is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
- * License as published by the Free Software Foundation; either
11
- * version 3 of the License, or any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
- *
18
- * You should have received a copy of the GNU Affero General Public
19
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- */
22
-
23
-$(document).ready(function() {
24
-
25
-  var userid = "<?php p($userId); ?>";
26
-  var ctappdir = 'apps';
27
-
28
-  // Get app directory
29
-  var getappdirurl = OC.generateUrl('/apps/sms_relentless/user/getappdirectory');
30
-
31
-  $.ajax({
32
-     method: 'GET',
33
-     url: getappdirurl + '/' + userid,
34
-     contentType: 'application/json',
35
-     success: function(appdirfdb) {
36
-
37
-                   ctappdir = appdirfdb;
38
-
39
-		  // Get admin settings
40
-		  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
41
-
42
-		  $.ajax({
43
-		     method: 'GET',
44
-		     url: baseUrlget + '/' + userid,
45
-		     contentType: 'application/json',
46
-		     success: function(settingsadm) {
47
-
48
-			  $("#telapi_key").val(settingsadm.telapi_key);
49
-			  $("#tel_pub_key").val(settingsadm.tel_pub_key);
50
-			  $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
51
-			  $("#telapi_url").val(settingsadm.telapi_url);
52
-			  $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
53
-			  $("#nexapi_key").val(settingsadm.nexapi_key);
54
-			  $("#nexapi_secret").val(settingsadm.nexapi_secret);
55
-			  $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
56
-			  $("#nexapi_url").val(settingsadm.nexapi_url);
57
-			  $("#twilapi_key").val(settingsadm.twilapi_key);
58
-			  $("#twilapi_secret").val(settingsadm.twilapi_secret);
59
-			  $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
60
-			  $("#twilapi_url").val(settingsadm.twilapi_url);
61
-			  $("#flowapi_key").val(settingsadm.flowapi_key);
62
-			  $("#flowapi_secret").val(settingsadm.flowapi_secret);
63
-			  $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
64
-			  $("#flowapi_url").val(settingsadm.flowapi_url);
65
-			  $("#tel_sender_name").val(settingsadm.tel_sender_name);
66
-			  $("#nex_sender_name").val(settingsadm.nex_sender_name);
67
-			  $("#twil_sender_name").val(settingsadm.twil_sender_name);
68
-
69
-			  if (settingsadm.show_all_messages == 1) {
70
-			      $("#showallmessages").attr("checked", true);
71
-			  } else {
72
-			      $("#showallmessages").attr("checked", false);
73
-			  }
74
-
75
-			  var crntadmDispName = settingsadm.admdisplayname;
76
-			  var allRestrictions = settingsadm.restrictions;
77
-			  var allGroups = settingsadm.allgroups;
78
-			  var allUsers = settingsadm.allusers;
79
-			  var allGroupswadm = settingsadm.allgroupswadm;
80
-			  var allUserswadm = settingsadm.alluserswadm;
81
-			  var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
82
-			  var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
83
-			  var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
84
-			  var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
85
-			  var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
86
-			  var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
87
-			  var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
88
-			  var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
89
-
90
-			  // List all the groups and users allowed to access the API keys, for each provider
91
-			  if (tnxallowedgrp) {
92
-			      var tnxallowedgrparr = tnxallowedgrp.split("|");
93
-			      for (var g = 0; g < tnxallowedgrparr.length; g++) {
94
-				   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
95
-			      }
96
-			  }
97
-
98
-			  if (tnxallowedusr) {
99
-			      var tnxallowedusrarr = tnxallowedusr.split("|");
100
-			      for (var g = 0; g < tnxallowedusrarr.length; g++) {
101
-				   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
102
-			      }
103
-			  }
104
-
105
-			  if (plvallowedgrp) {
106
-			      var plvallowedgrparr = plvallowedgrp.split("|");
107
-			      for (var g = 0; g < plvallowedgrparr.length; g++) {
108
-				   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
109
-			      }
110
-			  }
111
-
112
-			  if (plvallowedusr) {
113
-			      var plvallowedusrarr = plvallowedusr.split("|");
114
-			      for (var g = 0; g < plvallowedusrarr.length; g++) {
115
-				   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
116
-			      }
117
-			  }
118
-
119
-			  if (twlallowedgrp) {
120
-			      var twlallowedgrparr = twlallowedgrp.split("|");
121
-			      for (var g = 0; g < twlallowedgrparr.length; g++) {
122
-				   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
123
-			      }
124
-			  }
125
-
126
-			  if (twlallowedusr) {
127
-			      var twlallowedusrarr = twlallowedusr.split("|");
128
-			      for (var g = 0; g < twlallowedusrarr.length; g++) {
129
-				   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
130
-			      }
131
-			  }
132
-
133
-			  if (flrallowedgrp) {
134
-			      var flrallowedgrparr = flrallowedgrp.split("|");
135
-			      for (var g = 0; g < flrallowedgrparr.length; g++) {
136
-				   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
137
-			      }
138
-			  }
139
-
140
-			  if (flrallowedusr) {
141
-			      var flrallowedusrarr = flrallowedusr.split("|");
142
-			      for (var g = 0; g < flrallowedusrarr.length; g++) {
143
-				   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
144
-			      }
145
-			  }
146
-
147
-
148
-			  // Create a list with all the available groups, excluding the admin group
149
-			  var grpsListItemswadm = "";
150
-			  $.each(allGroupswadm, function(key, value) {
151
-				 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
152
-			  });
153
-
154
-			  // Create a list with all the available users, excluding the admins
155
-			  var usersListItemswadm = "";
156
-			  $.each(allUserswadm, function(key, usrval) {
157
-				 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
158
-			  });
159
-			  
160
-
161
-			  function showListsalwdk() {
162
-
163
-			      // Append the list of available groups to the table of groups and users allowed to use the API keys
164
-			      $('[id^="showakeyGrps-"]').click(function() {
165
-				 var crtid = $(this).attr("id").split("-")[1];
166
-				 $("#grpsadapik-"+ crtid).remove();
167
-				 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
168
-				 $("#adminOverlay").remove();
169
-				 $("#app-content").append("<div id='adminOverlay'></div>");
170
-				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
171
-
172
-				 $("#adminOverlay").click(function() { 
173
-				    $("#adminOverlay").remove();
174
-				    $("#grpsadapik-"+ crtid).remove();
175
-				    $("#usrsadapik-"+ crtid).remove();
176
-				 });
177
-
178
-				 // Select a group
179
-				 $(".groupsList").click(function() {
180
-				    var slctdGrp = $(this).text();
181
-				    $("#grpsadapik-"+ crtid).remove();
182
-				    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
183
-
184
-				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
185
-					$("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
186
-				    } else { showAlert("That group has already been added!"); }
187
-
188
-				    // Remove a group from list
189
-				    $('[id^="rmvGrp-"]').click(function() {
190
-				       $(this).closest(".selectedGrps").remove();
191
-				    });
192
-				 });
193
-
194
-			      });
195
-
196
-			      // Append the list of available users to the table of groups and users allowed to use the API keys
197
-			      $('[id^="showakeyUsrs-"]').click(function() {
198
-
199
-				 var crtidusr = $(this).attr("id").split("-")[1];
200
-				 $("#usrsadapik-"+ crtidusr).remove();
201
-				 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
202
-				 $("#adminOverlay").remove();
203
-				 $("#app-content").append("<div id='adminOverlay'></div>");
204
-				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
205
-
206
-				 $("#adminOverlay").click(function() { 
207
-				    $("#adminOverlay").remove(); 
208
-				    $("#grpsadapik-"+ crtidusr).remove();
209
-				    $("#usrsadapik-"+ crtidusr).remove();
210
-				 });
211
-
212
-				 // Select a user
213
-				 $(".usersList").click(function() {
214
-				    var slctdUsr = $(this).text();
215
-				    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
216
-
217
-				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
218
-					$("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
219
-				    } else { showAlert("That user has already been added!"); }
220
-
221
-				    // Remove a user from list
222
-				    $('[id^="rmvUsr-"]').click(function() {
223
-				       $(this).closest(".selectedUsrs").remove();
224
-				    });
225
-				 });
226
-
227
-			      });
228
-
229
-			      // Remove a group from the list 
230
-			      $('[id^="rmvGrp-"]').click(function() {
231
-				 $(this).closest(".selectedGrps").remove();
232
-			      });
233
-
234
-			      // Remove a user from the list
235
-			      $('[id^="rmvUsr-"]').click(function() {
236
-				 $(this).closest(".selectedUsrs").remove();
237
-			      });
238
-
239
-			  }
240
-			  showListsalwdk();
241
-
242
-
243
-			  // Save the data
244
-			  function saveAlwdRow() {
245
-			     $('[id^="alwdrstsave-"]').unbind("click");
246
-			     $('[id^="alwdrstsave-"]').click(function(event) {
247
-
248
-				 event.preventDefault();
249
-				 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
250
-				 
251
-				 if ($(this).attr("value") == "Save") {
252
-
253
-				     var selGroups = [];
254
-				     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
255
-					selGroups.push($(this).text());
256
-				     });
257
-				     if (selGroups.length == 0) { selGroups.push(""); }
258
-
259
-				     var selUsers = [];
260
-				     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
261
-					selUsers.push($(this).text());
262
-				     });
263
-				     if (selUsers.length == 0) { selUsers.push(""); }
264
-
265
-				     // Check if the access key fields have been left empty
266
-				     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
267
-					 showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
268
-					 return;
269
-				     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
270
-					 showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
271
-					 return;
272
-				     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
273
-					 showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
274
-					 return;
275
-				     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
276
-					 showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
277
-					 return;
278
-				     }
279
-
280
-				     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
281
-
282
-				     var alwddatatosend = { 
283
-					      userId: userid,
284
-					      groups: selGroups,
285
-					      users: selUsers,
286
-					      provider: crntprov
287
-				     };
288
-
289
-				     $.ajax({
290
-					   method: 'PUT',
291
-					   url: saveAlwdUrl + '/' + userid,
292
-					   contentType: 'application/json',
293
-					   data: JSON.stringify(alwddatatosend),
294
-					   success: function(messagesent) {
295
-					                if (messagesent == 'success') {
296
-					                    showAlert('The allowed groups and users have been successfully saved to the database! However, to be able to send and receive messages using the shared keys from above, the allowed users have to generate and save the 2 webhook URLs corresponding to this SMS provider, on their own Settings page.');
297
-					                } else if (messagesent != 'success' && messagesent != 'failure') {
298
-					                    showAlert(messagesent);
299
-					                } else if (messagesent == 'failure') {
300
-					                    showAlert('Error while trying to save the allowed groups and users!');
301
-					                }
302
-					   },
303
-					   error: function() {
304
-							showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
305
-					   }
306
-				     });
307
-
308
-				     $(this).attr("value", "Edit");
309
-
310
-				} else {
311
-
312
-				     $("#alwdrstsave-"+ crntprov).attr("value", "Save");
313
-				}
314
-
315
-			     });
316
-			  }
317
-			  saveAlwdRow();
318
-
319
-
320
-
321
-			  // Phone number restrictions
322
-
323
-			  // Create a list with all the available groups
324
-			  var grpsListItems = "";
325
-			  $.each(allGroups, function(key, value) {
326
-				 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
327
-			  });
328
-
329
-			  // Create a list with all the available users
330
-			  var usersListItems = "";
331
-			  $.each(allUsers, function(key, usrval) {
332
-				 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
333
-			  });
334
-
335
-
336
-			  if (allRestrictions.length > 0) {
337
-			      var restrNmb = allRestrictions.length;
338
-			  } else {
339
-			      var restrNmb = 0;
340
-			  }
341
-
342
-
343
-			  // List the access restrictions for groups and users
344
-			  if (restrNmb == 0) {
345
-
346
-			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
347
-			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
348
-
349
-			  } else {
350
-
351
-			      for (k = 0; k < restrNmb; k++) {
352
-
353
-				   if (allRestrictions[k].groups) {
354
-				       var groupsfdbpre = allRestrictions[k].groups.split("|");
355
-				       var groupsfdb = "";
356
-				       for (var g = 0; g < groupsfdbpre.length; g++) {
357
-					    groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
358
-				       }
359
-				   } else { var groupsfdb = ""; }
360
-
361
-				   if (allRestrictions[k].users) {
362
-				       var usersfdbpre = allRestrictions[k].users.split("|");
363
-				       var usersfdb = "";
364
-				       for (var u = 0; u < usersfdbpre.length; u++) {
365
-					    usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
366
-				       }
367
-				   } else { var usersfdb = ""; }
368
-
369
-				   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
370
-			      }
371
-			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
372
-			  }
373
-
374
-
375
-			  // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
376
-			  $("#phoneNumberTh").addClass('icon-loading');
377
-			  var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
378
-			  var numbersListItems = '';
379
-
380
-			  $.ajax({
381
-				  url: getnumbersUrl + '/' + userid,
382
-				  type: "POST",
383
-				  cache: false,
384
-				  processData: false,
385
-				  contentType: false,
386
-				  success: function(currentnmbrs) {
387
-
388
-					            $("#phoneNumberTh").removeClass('icon-loading');
389
-
390
-						    // Create a list with all the available phone numbers
391
-					            numbersListItems = "<option value='' selected>Select phone number</option>";
392
-
393
-						    $.each(currentnmbrs, function(key, indsmsnmb) {
394
-							   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
395
-						    });
396
-
397
-						    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
398
-
399
-						    // Append the list of available phone numbers
400
-						    $("#rstphn-"+ indRow).empty();
401
-						    $("#rstphn-"+ indRow).append(numbersListItems);
402
-			
403
-				  },
404
-				  error: function() {
405
-					            $("#phoneNumberTh").removeClass('icon-loading'); 
406
-					            showAlert("Error while attempting to retrieve the available phone numbers!");
407
-				  }
408
-			  });
409
-
410
-
411
-			  function showLists() {
412
-
413
-			      // Append the list of available groups to the restrictions table
414
-			      $('[id^="showGrps-"]').click(function() {
415
-				 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
416
-				 $("#grpL-"+ crtnmbr).remove();
417
-				 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
418
-				 $("#adminOverlay").remove();
419
-				 $("#app-content").append("<div id='adminOverlay'></div>");
420
-				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
421
-
422
-				 $("#adminOverlay").click(function() { 
423
-				    $("#adminOverlay").remove(); 
424
-				    $("#grpL-"+ crtnmbr).remove(); 
425
-				    $("#usrL-"+ crtnmbr).remove();
426
-				 });
427
-
428
-				 // Select a group
429
-				 $(".groupsList").click(function() {
430
-				    var slctdGrp = $(this).text();
431
-				    $("#grpL-"+ crtnmbr).remove();
432
-				    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
433
-
434
-				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
435
-					$("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
436
-				    } else { showAlert("That group has already been added!"); }
437
-
438
-				    // Remove a group from list
439
-				    $('[id^="rmvGrp-"]').click(function() {
440
-				       $(this).closest(".selectedGrps").remove();
441
-				    });
442
-				 });
443
-
444
-			      });
445
-
446
-			      // Append the list of available users to the restrictions table
447
-			      $('[id^="showUsr-"]').click(function() {
448
-
449
-				 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
450
-				 $("#usrL-"+ ctusrnmbr).remove();
451
-				 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
452
-				 $("#adminOverlay").remove();
453
-				 $("#app-content").append("<div id='adminOverlay'></div>");
454
-				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
455
-
456
-				 $("#adminOverlay").click(function() { 
457
-				    $("#adminOverlay").remove(); 
458
-				    $("#grpL-"+ ctusrnmbr).remove(); 
459
-				    $("#usrL-"+ ctusrnmbr).remove();
460
-				 });
461
-
462
-				 // Select a user
463
-				 $(".usersList").click(function() {
464
-				    var slctdUsr = $(this).text();
465
-				    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
466
-
467
-				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
468
-					$("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
469
-				    } else { showAlert("That user has already been added!"); }
470
-
471
-				    // Remove a user from list
472
-				    $('[id^="rmvUsr-"]').click(function() {
473
-				       $(this).closest(".selectedUsrs").remove();
474
-				    });
475
-				 });
476
-
477
-			      });
478
-
479
-			      // Remove a group from the list 
480
-			      $('[id^="rmvGrp-"]').click(function() {
481
-				 $(this).closest(".selectedGrps").remove();
482
-			      });
483
-
484
-			      // Remove a user from the list
485
-			      $('[id^="rmvUsr-"]').click(function() {
486
-				 $(this).closest(".selectedUsrs").remove();
487
-			      });
488
-
489
-			  }
490
-			  showLists();
491
-
492
-
493
-			  // Save the data
494
-			  function saveRestrRow() {
495
-
496
-			     $('[id^="rstsave-"]').unbind("click");
497
-			     $('[id^="rstsave-"]').click(function(event) {
498
-
499
-				 event.preventDefault();
500
-				 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
501
-
502
-				 if ($(this).attr("value") == "Save") {
503
-
504
-				     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
505
-				     var slctdGroups = [];
506
-				     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
507
-					slctdGroups.push($(this).text());
508
-				     });
509
-				     var slctdUsers = [];
510
-				     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
511
-					slctdUsers.push($(this).text());
512
-				     });
513
-
514
-				     if (phoneNmbr != '') {
515
-
516
-				       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
517
-
518
-					 var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
519
-
520
-					 var datatosend = { 
521
-					      userId: userid,
522
-					      savedByDsplname: crntadmDispName,
523
-					      phoneNumber: phoneNmbr,
524
-					      groups: slctdGroups,
525
-					      users: slctdUsers
526
-					 };
527
-
528
-					 $.ajax({
529
-					   method: 'PUT',
530
-					   url: saveRestrUrl + '/' + userid,
531
-					   contentType: 'application/json',
532
-					   data: JSON.stringify(datatosend),
533
-					   success: function(messagetosend) {
534
-					                if (messagetosend == 'success') {
535
-					                    showAlert('The restrictions have been successfully saved to the database!');
536
-					                } else {
537
-					                    showAlert('Error while trying to save the restrictions!');
538
-					                }
539
-					   },
540
-					   error: function() {
541
-							showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
542
-					   }
543
-					 });
544
-
545
-				       } else { showAlert("You must select at least a group or a user in order to restrict access to a phone number."); return; }
546
-
547
-				     } else { showAlert("Please select a phone number!"); return; }
548
-
549
-				     $(this).attr("value", "Edit");
550
-
551
-				} else {
552
-
553
-				     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
554
-				}
555
-
556
-			     });
557
-			  }
558
-			  saveRestrRow();
559
-
560
-			  // Remove a row
561
-			  function removeRestrRow() {
562
-
563
-			       $('[id^="rmRow-"]').click(function() {
564
-
565
-				  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
566
-				  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
567
-
568
-				  confirmAlert("Do you really want to remove this row from the database ?");
569
-
570
-				  $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
571
-
572
-				  $("#confirmOk").click(function() {
573
-
574
-				      $("#alertMsgOverlay").remove();
575
-				      $("#alertConfMessage").remove();
576
-
577
-				      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
578
-				      $.ajax({
579
-					   url: rmvRestrUrl + '/' + userid,
580
-					   method: "POST",
581
-					   dataType: "text",
582
-					   data: { phoneNumber: crntPhNmbr },
583
-					   success: function(delresult) {
584
-
585
-					                     if (delresult.indexOf("success") > -1) {
586
-					                         showAlert("The restriction has been removed successfully!");
587
-					                         $("#rstphn-"+ slctRowRmv).closest("tr").remove();
588
-					                     } else {
589
-					                         showAlert("Error while trying to remove restriction data!");
590
-					                     }
591
-					   },
592
-					   error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
593
-				       });
594
-				  });
595
-			       });
596
-			  }
597
-			  removeRestrRow();
598
-
599
-			  // Add a new row
600
-			  $("#addRestrRow").click(function() {
601
-			      if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
602
-				  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
603
-				  var indRowAdd = parseInt(lastrstAuth + 1);
604
-			      } else { var indRowAdd = 0; }
605
-			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
606
-			      showLists();
607
-			      saveRestrRow();
608
-			      removeRestrRow();
609
-
610
-			      // Check if the same phone number has been already restricted
611
-			      $("#rstphn-"+ indRowAdd).change(function() {
612
-				 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
613
-				 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
614
-				 var phNmbrChck = 0;
615
-				 allPHoneRestr.each(function() {
616
-				    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
617
-				    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
618
-				 });
619
-
620
-				 if (phNmbrChck == 2) {
621
-				     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict access to.");
622
-				     $(this).val('');
623
-				     return;
624
-				 }
625
-			      });
626
-			  });
627
-
628
-		     },
629
-		     error: function() {
630
-				showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
631
-		     }
632
-		  });
633
-
634
-
635
-
636
-		  // Save admin settings
637
-		  function randomStr(strlength) {
638
-			var fintext = "";
639
-			var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
640
-			for (var i = 0; i < strlength; i++) {
641
-			     fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
642
-			}
643
-			return fintext;
644
-		  }
645
-
646
-		  $("#generate_tel_rcpt").on("click", function(event) {
647
-
648
-		     var teltokenrec = randomStr(70);
649
-		     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
650
-
651
-		     $("#telapi_url_rec").val(telnyxwhurlrec);
652
-		  });
653
-
654
-		  $("#copyToClipboardtel").on("click", function(event) {
655
-		     var $tempEl = $("<input>");
656
-		     $("body").append($tempEl);
657
-		     $tempEl.val($("#telapi_url_rec").val()).select();
658
-		     document.execCommand("Copy");
659
-		     $tempEl.remove();
660
-		     showAlert("The link has been copied to your clipboard!");
661
-		  });
662
-
663
-		  $("#generate_tel_delrcpt").on("click", function(event) {
664
-
665
-		     var teltoken = randomStr(70);
666
-		     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
667
-
668
-		     $("#telapi_url").val(telnyxwhurl);
669
-		  });
670
-
671
-		  $("#generate_nex_rcpt").on("click", function(event) {
672
-
673
-		     var plivotokenrec = randomStr(70);
674
-		     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
675
-
676
-		     $("#nexapi_url_rec").val(plivowhurlrec);
677
-		  });
678
-
679
-		  $("#copyToClipboardnex").on("click", function(event) {
680
-		     var $tempElpl = $("<input>");
681
-		     $("body").append($tempElpl);
682
-		     $tempElpl.val($("#nexapi_url_rec").val()).select();
683
-		     document.execCommand("Copy");
684
-		     $tempElpl.remove();
685
-		     showAlert("The link has been copied to your clipboard!");
686
-		  });
687
-
688
-		  $("#generate_nex_delrcpt").on("click", function(event) {
689
-
690
-		     var plivotoken = randomStr(70);
691
-		     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
692
-
693
-		     $("#nexapi_url").val(plivodrwhurl);
694
-		  });
695
-
696
-		  $("#generate_twil_rcpt").on("click", function(event) {
697
-
698
-		     var twiltokenrec = randomStr(35);
699
-		     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
700
-
701
-		     $("#twilapi_url_rec").val(twilwhurlrec);
702
-		  });
703
-
704
-		  $("#copyToClipboardtwil").on("click", function(event) {
705
-		     var $tempElpl = $("<input>");
706
-		     $("body").append($tempElpl);
707
-		     $tempElpl.val($("#twilapi_url_rec").val()).select();
708
-		     document.execCommand("Copy");
709
-		     $tempElpl.remove();
710
-		     showAlert("The link has been copied to your clipboard!");
711
-		  });
712
-
713
-		  $("#generate_twil_delrcpt").on("click", function(event) {
714
-
715
-		     var twiltoken = randomStr(35);
716
-		     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
717
-
718
-		     $("#twilapi_url").val(twildrwhurl);
719
-		  });
720
-
721
-		  $("#generate_flow_rcpt").on("click", function(event) {
722
-
723
-		     var flowtokenrec = randomStr(70);
724
-		     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
725
-
726
-		     $("#flowapi_url_rec").val(flowwhurlrec);
727
-		  });
728
-
729
-		  $("#copyToClipboardflow").on("click", function(event) {
730
-		     var $tempElpl = $("<input>");
731
-		     $("body").append($tempElpl);
732
-		     $tempElpl.val($("#flowapi_url_rec").val()).select();
733
-		     document.execCommand("Copy");
734
-		     $tempElpl.remove();
735
-		     showAlert("The link has been copied to your clipboard!");
736
-		  });
737
-
738
-		  $("#generate_flow_delrcpt").on("click", function(event) {
739
-
740
-		     var flowtoken = randomStr(70);
741
-		     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
742
-
743
-		     $("#flowapi_url").val(flowdrwhurl);
744
-		  });
745
-
746
-		  // Add group icons
747
-		  $(".srGroupImg").each(function() {
748
-		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/group.svg");
749
-		  });
750
-
751
-		  // Add user icons
752
-		  $(".srUserImg").each(function() {
753
-		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/user.svg");
754
-		  });
755
-
756
-		  $("#save_admin_settings").on("click", function(event) {
757
-
758
-		    event.preventDefault();
759
-		    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
760
-
761
-		    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
762
-
763
-		    var showallmsgs = 0;
764
-		    if ($("#showallmessages").is(':checked')) {
765
-			showallmsgs = 1;
766
-		    }
767
-
768
-		    var telsenderinit = $("#tel_sender_name").val();
769
-		    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
770
-
771
-		    var nexsenderinit = $("#nex_sender_name").val();
772
-		    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
773
-
774
-		    var twilsenderinit = $("#twil_sender_name").val();
775
-		    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
776
-
777
-		    var datatosave = {
778
-				      userId: userid,
779
-				      telapiKey: $("#telapi_key").val(),
780
-				      telPubKey: $("#tel_pub_key").val(),
781
-				      telapiUrlRec: $("#telapi_url_rec").val(),
782
-				      telapiUrl: $("#telapi_url").val(),
783
-				      messagingProfileId: $("#messaging_profile_id").val(),
784
-				      nexapiKey: $("#nexapi_key").val(),
785
-				      nexapiSecret: $("#nexapi_secret").val(),
786
-				      nexapiUrlRec: $("#nexapi_url_rec").val(),
787
-				      nexapiUrl: $("#nexapi_url").val(),
788
-				      twilapiKey: $("#twilapi_key").val(),
789
-				      twilapiSecret: $("#twilapi_secret").val(),
790
-				      twilapiUrlRec: $("#twilapi_url_rec").val(),
791
-				      twilapiUrl: $("#twilapi_url").val(),
792
-				      flowapiKey: $("#flowapi_key").val(),
793
-				      flowapiSecret: $("#flowapi_secret").val(),
794
-				      flowapiUrlRec: $("#flowapi_url_rec").val(),
795
-				      flowapiUrl: $("#flowapi_url").val(),
796
-				      telSenderName: telsenderproc,
797
-				      nexSenderName: nexsenderproc,
798
-				      twilSenderName: twilsenderproc,
799
-				      showAllMessages: showallmsgs
800
-		    };
801
-
802
-
803
-		    $.ajax({
804
-		       method: 'PUT',
805
-		       url: baseUrlsv + '/' + userid,
806
-		       contentType: 'application/json',
807
-		       data: JSON.stringify(datatosave),
808
-		       success: function() {
809
-		       },
810
-		       error: function() {
811
-			    showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
812
-		       }
813
-		    });
814
-
815
-		  });
816
-
817
-		  function showAlert(alertText) {
818
-
819
-		     let alertwnd = "<div id='alertMessage'>";
820
-		     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
821
-		     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
822
-		     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
823
-		     alertwnd += "</div>";
824
-
825
-		     $("#content").append("<div id='alertMsgOverlay'></div>");
826
-		     $("#content").append(alertwnd);
827
-
828
-		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
829
-		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
830
-		     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
831
-
832
-		     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
833
-		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
834
-		     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
835
-		  }
836
-
837
-		  function confirmAlert(alertText) {
838
-
839
-		     $("#alertMsgOverlay").remove();
840
-		     $("#alertConfMessage").remove();
841
-
842
-		     let alertwndcf = "<div id='alertConfMessage'>";
843
-		     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
844
-		     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
845
-		     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
846
-		     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
847
-		     alertwndcf += "</div>";
848
-
849
-		     $("#content").append("<div id='alertMsgOverlay'></div>");
850
-		     $("#content").append(alertwndcf);
851
-
852
-		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
853
-		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
854
-		     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
855
-
856
-		     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
857
-		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
858
-		  }
859
-
860
-
861
-     },
862
-     error: function(appdirfdb) {
863
-                alert("An error occurred while getting the app's directory. You can check the Nextcloud log to find more details about this issue.");
864
-     }
865
-   });
866
-
867
-});
Browse code

added appinfo/info.xml appinfo/signature.json appinfo/routes.php CHANGELOG.txt README.md css/style.css js/settings.js js/sendsms.js js/adminsettings.js js/showsmstables.js templates/settings/admin.php templates/settings/personal.php templates/navigation/index.php lib/Controller/SmsrelentlessController.php lib/Service/SmsrelentlessService.php l10n/en_GB.js l10n/en_GB.json l10n/en_US.js l10n/en_US.json lib/Migration/Version133Date20240215094712.php

DoubleBastionAdmin authored on 14/02/2024 22:47:20
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,867 @@
1
+/**
2
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
+ *
4
+ * @author Double Bastion LLC
5
+ *
6
+ * @license GNU AGPL version 3 or any later version
7
+ *
8
+ * This program is free software; you can redistribute it and/or
9
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
+ * License as published by the Free Software Foundation; either
11
+ * version 3 of the License, or any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
+ *
18
+ * You should have received a copy of the GNU Affero General Public
19
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+$(document).ready(function() {
24
+
25
+  var userid = "<?php p($userId); ?>";
26
+  var ctappdir = 'apps';
27
+
28
+  // Get app directory
29
+  var getappdirurl = OC.generateUrl('/apps/sms_relentless/user/getappdirectory');
30
+
31
+  $.ajax({
32
+     method: 'GET',
33
+     url: getappdirurl + '/' + userid,
34
+     contentType: 'application/json',
35
+     success: function(appdirfdb) {
36
+
37
+                   ctappdir = appdirfdb;
38
+
39
+		  // Get admin settings
40
+		  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
41
+
42
+		  $.ajax({
43
+		     method: 'GET',
44
+		     url: baseUrlget + '/' + userid,
45
+		     contentType: 'application/json',
46
+		     success: function(settingsadm) {
47
+
48
+			  $("#telapi_key").val(settingsadm.telapi_key);
49
+			  $("#tel_pub_key").val(settingsadm.tel_pub_key);
50
+			  $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
51
+			  $("#telapi_url").val(settingsadm.telapi_url);
52
+			  $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
53
+			  $("#nexapi_key").val(settingsadm.nexapi_key);
54
+			  $("#nexapi_secret").val(settingsadm.nexapi_secret);
55
+			  $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
56
+			  $("#nexapi_url").val(settingsadm.nexapi_url);
57
+			  $("#twilapi_key").val(settingsadm.twilapi_key);
58
+			  $("#twilapi_secret").val(settingsadm.twilapi_secret);
59
+			  $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
60
+			  $("#twilapi_url").val(settingsadm.twilapi_url);
61
+			  $("#flowapi_key").val(settingsadm.flowapi_key);
62
+			  $("#flowapi_secret").val(settingsadm.flowapi_secret);
63
+			  $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
64
+			  $("#flowapi_url").val(settingsadm.flowapi_url);
65
+			  $("#tel_sender_name").val(settingsadm.tel_sender_name);
66
+			  $("#nex_sender_name").val(settingsadm.nex_sender_name);
67
+			  $("#twil_sender_name").val(settingsadm.twil_sender_name);
68
+
69
+			  if (settingsadm.show_all_messages == 1) {
70
+			      $("#showallmessages").attr("checked", true);
71
+			  } else {
72
+			      $("#showallmessages").attr("checked", false);
73
+			  }
74
+
75
+			  var crntadmDispName = settingsadm.admdisplayname;
76
+			  var allRestrictions = settingsadm.restrictions;
77
+			  var allGroups = settingsadm.allgroups;
78
+			  var allUsers = settingsadm.allusers;
79
+			  var allGroupswadm = settingsadm.allgroupswadm;
80
+			  var allUserswadm = settingsadm.alluserswadm;
81
+			  var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
82
+			  var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
83
+			  var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
84
+			  var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
85
+			  var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
86
+			  var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
87
+			  var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
88
+			  var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
89
+
90
+			  // List all the groups and users allowed to access the API keys, for each provider
91
+			  if (tnxallowedgrp) {
92
+			      var tnxallowedgrparr = tnxallowedgrp.split("|");
93
+			      for (var g = 0; g < tnxallowedgrparr.length; g++) {
94
+				   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
95
+			      }
96
+			  }
97
+
98
+			  if (tnxallowedusr) {
99
+			      var tnxallowedusrarr = tnxallowedusr.split("|");
100
+			      for (var g = 0; g < tnxallowedusrarr.length; g++) {
101
+				   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
102
+			      }
103
+			  }
104
+
105
+			  if (plvallowedgrp) {
106
+			      var plvallowedgrparr = plvallowedgrp.split("|");
107
+			      for (var g = 0; g < plvallowedgrparr.length; g++) {
108
+				   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
109
+			      }
110
+			  }
111
+
112
+			  if (plvallowedusr) {
113
+			      var plvallowedusrarr = plvallowedusr.split("|");
114
+			      for (var g = 0; g < plvallowedusrarr.length; g++) {
115
+				   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
116
+			      }
117
+			  }
118
+
119
+			  if (twlallowedgrp) {
120
+			      var twlallowedgrparr = twlallowedgrp.split("|");
121
+			      for (var g = 0; g < twlallowedgrparr.length; g++) {
122
+				   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
123
+			      }
124
+			  }
125
+
126
+			  if (twlallowedusr) {
127
+			      var twlallowedusrarr = twlallowedusr.split("|");
128
+			      for (var g = 0; g < twlallowedusrarr.length; g++) {
129
+				   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
130
+			      }
131
+			  }
132
+
133
+			  if (flrallowedgrp) {
134
+			      var flrallowedgrparr = flrallowedgrp.split("|");
135
+			      for (var g = 0; g < flrallowedgrparr.length; g++) {
136
+				   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
137
+			      }
138
+			  }
139
+
140
+			  if (flrallowedusr) {
141
+			      var flrallowedusrarr = flrallowedusr.split("|");
142
+			      for (var g = 0; g < flrallowedusrarr.length; g++) {
143
+				   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
144
+			      }
145
+			  }
146
+
147
+
148
+			  // Create a list with all the available groups, excluding the admin group
149
+			  var grpsListItemswadm = "";
150
+			  $.each(allGroupswadm, function(key, value) {
151
+				 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
152
+			  });
153
+
154
+			  // Create a list with all the available users, excluding the admins
155
+			  var usersListItemswadm = "";
156
+			  $.each(allUserswadm, function(key, usrval) {
157
+				 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
158
+			  });
159
+			  
160
+
161
+			  function showListsalwdk() {
162
+
163
+			      // Append the list of available groups to the table of groups and users allowed to use the API keys
164
+			      $('[id^="showakeyGrps-"]').click(function() {
165
+				 var crtid = $(this).attr("id").split("-")[1];
166
+				 $("#grpsadapik-"+ crtid).remove();
167
+				 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
168
+				 $("#adminOverlay").remove();
169
+				 $("#app-content").append("<div id='adminOverlay'></div>");
170
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
171
+
172
+				 $("#adminOverlay").click(function() { 
173
+				    $("#adminOverlay").remove();
174
+				    $("#grpsadapik-"+ crtid).remove();
175
+				    $("#usrsadapik-"+ crtid).remove();
176
+				 });
177
+
178
+				 // Select a group
179
+				 $(".groupsList").click(function() {
180
+				    var slctdGrp = $(this).text();
181
+				    $("#grpsadapik-"+ crtid).remove();
182
+				    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
183
+
184
+				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
185
+					$("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
186
+				    } else { showAlert("That group has already been added!"); }
187
+
188
+				    // Remove a group from list
189
+				    $('[id^="rmvGrp-"]').click(function() {
190
+				       $(this).closest(".selectedGrps").remove();
191
+				    });
192
+				 });
193
+
194
+			      });
195
+
196
+			      // Append the list of available users to the table of groups and users allowed to use the API keys
197
+			      $('[id^="showakeyUsrs-"]').click(function() {
198
+
199
+				 var crtidusr = $(this).attr("id").split("-")[1];
200
+				 $("#usrsadapik-"+ crtidusr).remove();
201
+				 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
202
+				 $("#adminOverlay").remove();
203
+				 $("#app-content").append("<div id='adminOverlay'></div>");
204
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
205
+
206
+				 $("#adminOverlay").click(function() { 
207
+				    $("#adminOverlay").remove(); 
208
+				    $("#grpsadapik-"+ crtidusr).remove();
209
+				    $("#usrsadapik-"+ crtidusr).remove();
210
+				 });
211
+
212
+				 // Select a user
213
+				 $(".usersList").click(function() {
214
+				    var slctdUsr = $(this).text();
215
+				    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
216
+
217
+				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
218
+					$("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
219
+				    } else { showAlert("That user has already been added!"); }
220
+
221
+				    // Remove a user from list
222
+				    $('[id^="rmvUsr-"]').click(function() {
223
+				       $(this).closest(".selectedUsrs").remove();
224
+				    });
225
+				 });
226
+
227
+			      });
228
+
229
+			      // Remove a group from the list 
230
+			      $('[id^="rmvGrp-"]').click(function() {
231
+				 $(this).closest(".selectedGrps").remove();
232
+			      });
233
+
234
+			      // Remove a user from the list
235
+			      $('[id^="rmvUsr-"]').click(function() {
236
+				 $(this).closest(".selectedUsrs").remove();
237
+			      });
238
+
239
+			  }
240
+			  showListsalwdk();
241
+
242
+
243
+			  // Save the data
244
+			  function saveAlwdRow() {
245
+			     $('[id^="alwdrstsave-"]').unbind("click");
246
+			     $('[id^="alwdrstsave-"]').click(function(event) {
247
+
248
+				 event.preventDefault();
249
+				 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
250
+				 
251
+				 if ($(this).attr("value") == "Save") {
252
+
253
+				     var selGroups = [];
254
+				     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
255
+					selGroups.push($(this).text());
256
+				     });
257
+				     if (selGroups.length == 0) { selGroups.push(""); }
258
+
259
+				     var selUsers = [];
260
+				     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
261
+					selUsers.push($(this).text());
262
+				     });
263
+				     if (selUsers.length == 0) { selUsers.push(""); }
264
+
265
+				     // Check if the access key fields have been left empty
266
+				     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
267
+					 showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
268
+					 return;
269
+				     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
270
+					 showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
271
+					 return;
272
+				     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
273
+					 showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
274
+					 return;
275
+				     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
276
+					 showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
277
+					 return;
278
+				     }
279
+
280
+				     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
281
+
282
+				     var alwddatatosend = { 
283
+					      userId: userid,
284
+					      groups: selGroups,
285
+					      users: selUsers,
286
+					      provider: crntprov
287
+				     };
288
+
289
+				     $.ajax({
290
+					   method: 'PUT',
291
+					   url: saveAlwdUrl + '/' + userid,
292
+					   contentType: 'application/json',
293
+					   data: JSON.stringify(alwddatatosend),
294
+					   success: function(messagesent) {
295
+					                if (messagesent == 'success') {
296
+					                    showAlert('The allowed groups and users have been successfully saved to the database! However, to be able to send and receive messages using the shared keys from above, the allowed users have to generate and save the 2 webhook URLs corresponding to this SMS provider, on their own Settings page.');
297
+					                } else if (messagesent != 'success' && messagesent != 'failure') {
298
+					                    showAlert(messagesent);
299
+					                } else if (messagesent == 'failure') {
300
+					                    showAlert('Error while trying to save the allowed groups and users!');
301
+					                }
302
+					   },
303
+					   error: function() {
304
+							showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
305
+					   }
306
+				     });
307
+
308
+				     $(this).attr("value", "Edit");
309
+
310
+				} else {
311
+
312
+				     $("#alwdrstsave-"+ crntprov).attr("value", "Save");
313
+				}
314
+
315
+			     });
316
+			  }
317
+			  saveAlwdRow();
318
+
319
+
320
+
321
+			  // Phone number restrictions
322
+
323
+			  // Create a list with all the available groups
324
+			  var grpsListItems = "";
325
+			  $.each(allGroups, function(key, value) {
326
+				 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
327
+			  });
328
+
329
+			  // Create a list with all the available users
330
+			  var usersListItems = "";
331
+			  $.each(allUsers, function(key, usrval) {
332
+				 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
333
+			  });
334
+
335
+
336
+			  if (allRestrictions.length > 0) {
337
+			      var restrNmb = allRestrictions.length;
338
+			  } else {
339
+			      var restrNmb = 0;
340
+			  }
341
+
342
+
343
+			  // List the access restrictions for groups and users
344
+			  if (restrNmb == 0) {
345
+
346
+			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
347
+			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
348
+
349
+			  } else {
350
+
351
+			      for (k = 0; k < restrNmb; k++) {
352
+
353
+				   if (allRestrictions[k].groups) {
354
+				       var groupsfdbpre = allRestrictions[k].groups.split("|");
355
+				       var groupsfdb = "";
356
+				       for (var g = 0; g < groupsfdbpre.length; g++) {
357
+					    groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
358
+				       }
359
+				   } else { var groupsfdb = ""; }
360
+
361
+				   if (allRestrictions[k].users) {
362
+				       var usersfdbpre = allRestrictions[k].users.split("|");
363
+				       var usersfdb = "";
364
+				       for (var u = 0; u < usersfdbpre.length; u++) {
365
+					    usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
366
+				       }
367
+				   } else { var usersfdb = ""; }
368
+
369
+				   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
370
+			      }
371
+			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
372
+			  }
373
+
374
+
375
+			  // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
376
+			  $("#phoneNumberTh").addClass('icon-loading');
377
+			  var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
378
+			  var numbersListItems = '';
379
+
380
+			  $.ajax({
381
+				  url: getnumbersUrl + '/' + userid,
382
+				  type: "POST",
383
+				  cache: false,
384
+				  processData: false,
385
+				  contentType: false,
386
+				  success: function(currentnmbrs) {
387
+
388
+					            $("#phoneNumberTh").removeClass('icon-loading');
389
+
390
+						    // Create a list with all the available phone numbers
391
+					            numbersListItems = "<option value='' selected>Select phone number</option>";
392
+
393
+						    $.each(currentnmbrs, function(key, indsmsnmb) {
394
+							   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
395
+						    });
396
+
397
+						    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
398
+
399
+						    // Append the list of available phone numbers
400
+						    $("#rstphn-"+ indRow).empty();
401
+						    $("#rstphn-"+ indRow).append(numbersListItems);
402
+			
403
+				  },
404
+				  error: function() {
405
+					            $("#phoneNumberTh").removeClass('icon-loading'); 
406
+					            showAlert("Error while attempting to retrieve the available phone numbers!");
407
+				  }
408
+			  });
409
+
410
+
411
+			  function showLists() {
412
+
413
+			      // Append the list of available groups to the restrictions table
414
+			      $('[id^="showGrps-"]').click(function() {
415
+				 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
416
+				 $("#grpL-"+ crtnmbr).remove();
417
+				 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
418
+				 $("#adminOverlay").remove();
419
+				 $("#app-content").append("<div id='adminOverlay'></div>");
420
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
421
+
422
+				 $("#adminOverlay").click(function() { 
423
+				    $("#adminOverlay").remove(); 
424
+				    $("#grpL-"+ crtnmbr).remove(); 
425
+				    $("#usrL-"+ crtnmbr).remove();
426
+				 });
427
+
428
+				 // Select a group
429
+				 $(".groupsList").click(function() {
430
+				    var slctdGrp = $(this).text();
431
+				    $("#grpL-"+ crtnmbr).remove();
432
+				    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
433
+
434
+				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
435
+					$("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
436
+				    } else { showAlert("That group has already been added!"); }
437
+
438
+				    // Remove a group from list
439
+				    $('[id^="rmvGrp-"]').click(function() {
440
+				       $(this).closest(".selectedGrps").remove();
441
+				    });
442
+				 });
443
+
444
+			      });
445
+
446
+			      // Append the list of available users to the restrictions table
447
+			      $('[id^="showUsr-"]').click(function() {
448
+
449
+				 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
450
+				 $("#usrL-"+ ctusrnmbr).remove();
451
+				 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
452
+				 $("#adminOverlay").remove();
453
+				 $("#app-content").append("<div id='adminOverlay'></div>");
454
+				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
455
+
456
+				 $("#adminOverlay").click(function() { 
457
+				    $("#adminOverlay").remove(); 
458
+				    $("#grpL-"+ ctusrnmbr).remove(); 
459
+				    $("#usrL-"+ ctusrnmbr).remove();
460
+				 });
461
+
462
+				 // Select a user
463
+				 $(".usersList").click(function() {
464
+				    var slctdUsr = $(this).text();
465
+				    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
466
+
467
+				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
468
+					$("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
469
+				    } else { showAlert("That user has already been added!"); }
470
+
471
+				    // Remove a user from list
472
+				    $('[id^="rmvUsr-"]').click(function() {
473
+				       $(this).closest(".selectedUsrs").remove();
474
+				    });
475
+				 });
476
+
477
+			      });
478
+
479
+			      // Remove a group from the list 
480
+			      $('[id^="rmvGrp-"]').click(function() {
481
+				 $(this).closest(".selectedGrps").remove();
482
+			      });
483
+
484
+			      // Remove a user from the list
485
+			      $('[id^="rmvUsr-"]').click(function() {
486
+				 $(this).closest(".selectedUsrs").remove();
487
+			      });
488
+
489
+			  }
490
+			  showLists();
491
+
492
+
493
+			  // Save the data
494
+			  function saveRestrRow() {
495
+
496
+			     $('[id^="rstsave-"]').unbind("click");
497
+			     $('[id^="rstsave-"]').click(function(event) {
498
+
499
+				 event.preventDefault();
500
+				 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
501
+
502
+				 if ($(this).attr("value") == "Save") {
503
+
504
+				     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
505
+				     var slctdGroups = [];
506
+				     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
507
+					slctdGroups.push($(this).text());
508
+				     });
509
+				     var slctdUsers = [];
510
+				     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
511
+					slctdUsers.push($(this).text());
512
+				     });
513
+
514
+				     if (phoneNmbr != '') {
515
+
516
+				       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
517
+
518
+					 var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
519
+
520
+					 var datatosend = { 
521
+					      userId: userid,
522
+					      savedByDsplname: crntadmDispName,
523
+					      phoneNumber: phoneNmbr,
524
+					      groups: slctdGroups,
525
+					      users: slctdUsers
526
+					 };
527
+
528
+					 $.ajax({
529
+					   method: 'PUT',
530
+					   url: saveRestrUrl + '/' + userid,
531
+					   contentType: 'application/json',
532
+					   data: JSON.stringify(datatosend),
533
+					   success: function(messagetosend) {
534
+					                if (messagetosend == 'success') {
535
+					                    showAlert('The restrictions have been successfully saved to the database!');
536
+					                } else {
537
+					                    showAlert('Error while trying to save the restrictions!');
538
+					                }
539
+					   },
540
+					   error: function() {
541
+							showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
542
+					   }
543
+					 });
544
+
545
+				       } else { showAlert("You must select at least a group or a user in order to restrict access to a phone number."); return; }
546
+
547
+				     } else { showAlert("Please select a phone number!"); return; }
548
+
549
+				     $(this).attr("value", "Edit");
550
+
551
+				} else {
552
+
553
+				     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
554
+				}
555
+
556
+			     });
557
+			  }
558
+			  saveRestrRow();
559
+
560
+			  // Remove a row
561
+			  function removeRestrRow() {
562
+
563
+			       $('[id^="rmRow-"]').click(function() {
564
+
565
+				  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
566
+				  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
567
+
568
+				  confirmAlert("Do you really want to remove this row from the database ?");
569
+
570
+				  $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
571
+
572
+				  $("#confirmOk").click(function() {
573
+
574
+				      $("#alertMsgOverlay").remove();
575
+				      $("#alertConfMessage").remove();
576
+
577
+				      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
578
+				      $.ajax({
579
+					   url: rmvRestrUrl + '/' + userid,
580
+					   method: "POST",
581
+					   dataType: "text",
582
+					   data: { phoneNumber: crntPhNmbr },
583
+					   success: function(delresult) {
584
+
585
+					                     if (delresult.indexOf("success") > -1) {
586
+					                         showAlert("The restriction has been removed successfully!");
587
+					                         $("#rstphn-"+ slctRowRmv).closest("tr").remove();
588
+					                     } else {
589
+					                         showAlert("Error while trying to remove restriction data!");
590
+					                     }
591
+					   },
592
+					   error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
593
+				       });
594
+				  });
595
+			       });
596
+			  }
597
+			  removeRestrRow();
598
+
599
+			  // Add a new row
600
+			  $("#addRestrRow").click(function() {
601
+			      if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
602
+				  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
603
+				  var indRowAdd = parseInt(lastrstAuth + 1);
604
+			      } else { var indRowAdd = 0; }
605
+			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
606
+			      showLists();
607
+			      saveRestrRow();
608
+			      removeRestrRow();
609
+
610
+			      // Check if the same phone number has been already restricted
611
+			      $("#rstphn-"+ indRowAdd).change(function() {
612
+				 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
613
+				 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
614
+				 var phNmbrChck = 0;
615
+				 allPHoneRestr.each(function() {
616
+				    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
617
+				    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
618
+				 });
619
+
620
+				 if (phNmbrChck == 2) {
621
+				     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict access to.");
622
+				     $(this).val('');
623
+				     return;
624
+				 }
625
+			      });
626
+			  });
627
+
628
+		     },
629
+		     error: function() {
630
+				showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
631
+		     }
632
+		  });
633
+
634
+
635
+
636
+		  // Save admin settings
637
+		  function randomStr(strlength) {
638
+			var fintext = "";
639
+			var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
640
+			for (var i = 0; i < strlength; i++) {
641
+			     fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
642
+			}
643
+			return fintext;
644
+		  }
645
+
646
+		  $("#generate_tel_rcpt").on("click", function(event) {
647
+
648
+		     var teltokenrec = randomStr(70);
649
+		     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
650
+
651
+		     $("#telapi_url_rec").val(telnyxwhurlrec);
652
+		  });
653
+
654
+		  $("#copyToClipboardtel").on("click", function(event) {
655
+		     var $tempEl = $("<input>");
656
+		     $("body").append($tempEl);
657
+		     $tempEl.val($("#telapi_url_rec").val()).select();
658
+		     document.execCommand("Copy");
659
+		     $tempEl.remove();
660
+		     showAlert("The link has been copied to your clipboard!");
661
+		  });
662
+
663
+		  $("#generate_tel_delrcpt").on("click", function(event) {
664
+
665
+		     var teltoken = randomStr(70);
666
+		     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
667
+
668
+		     $("#telapi_url").val(telnyxwhurl);
669
+		  });
670
+
671
+		  $("#generate_nex_rcpt").on("click", function(event) {
672
+
673
+		     var plivotokenrec = randomStr(70);
674
+		     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
675
+
676
+		     $("#nexapi_url_rec").val(plivowhurlrec);
677
+		  });
678
+
679
+		  $("#copyToClipboardnex").on("click", function(event) {
680
+		     var $tempElpl = $("<input>");
681
+		     $("body").append($tempElpl);
682
+		     $tempElpl.val($("#nexapi_url_rec").val()).select();
683
+		     document.execCommand("Copy");
684
+		     $tempElpl.remove();
685
+		     showAlert("The link has been copied to your clipboard!");
686
+		  });
687
+
688
+		  $("#generate_nex_delrcpt").on("click", function(event) {
689
+
690
+		     var plivotoken = randomStr(70);
691
+		     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
692
+
693
+		     $("#nexapi_url").val(plivodrwhurl);
694
+		  });
695
+
696
+		  $("#generate_twil_rcpt").on("click", function(event) {
697
+
698
+		     var twiltokenrec = randomStr(35);
699
+		     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
700
+
701
+		     $("#twilapi_url_rec").val(twilwhurlrec);
702
+		  });
703
+
704
+		  $("#copyToClipboardtwil").on("click", function(event) {
705
+		     var $tempElpl = $("<input>");
706
+		     $("body").append($tempElpl);
707
+		     $tempElpl.val($("#twilapi_url_rec").val()).select();
708
+		     document.execCommand("Copy");
709
+		     $tempElpl.remove();
710
+		     showAlert("The link has been copied to your clipboard!");
711
+		  });
712
+
713
+		  $("#generate_twil_delrcpt").on("click", function(event) {
714
+
715
+		     var twiltoken = randomStr(35);
716
+		     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
717
+
718
+		     $("#twilapi_url").val(twildrwhurl);
719
+		  });
720
+
721
+		  $("#generate_flow_rcpt").on("click", function(event) {
722
+
723
+		     var flowtokenrec = randomStr(70);
724
+		     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
725
+
726
+		     $("#flowapi_url_rec").val(flowwhurlrec);
727
+		  });
728
+
729
+		  $("#copyToClipboardflow").on("click", function(event) {
730
+		     var $tempElpl = $("<input>");
731
+		     $("body").append($tempElpl);
732
+		     $tempElpl.val($("#flowapi_url_rec").val()).select();
733
+		     document.execCommand("Copy");
734
+		     $tempElpl.remove();
735
+		     showAlert("The link has been copied to your clipboard!");
736
+		  });
737
+
738
+		  $("#generate_flow_delrcpt").on("click", function(event) {
739
+
740
+		     var flowtoken = randomStr(70);
741
+		     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
742
+
743
+		     $("#flowapi_url").val(flowdrwhurl);
744
+		  });
745
+
746
+		  // Add group icons
747
+		  $(".srGroupImg").each(function() {
748
+		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/group.svg");
749
+		  });
750
+
751
+		  // Add user icons
752
+		  $(".srUserImg").each(function() {
753
+		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/user.svg");
754
+		  });
755
+
756
+		  $("#save_admin_settings").on("click", function(event) {
757
+
758
+		    event.preventDefault();
759
+		    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
760
+
761
+		    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
762
+
763
+		    var showallmsgs = 0;
764
+		    if ($("#showallmessages").is(':checked')) {
765
+			showallmsgs = 1;
766
+		    }
767
+
768
+		    var telsenderinit = $("#tel_sender_name").val();
769
+		    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
770
+
771
+		    var nexsenderinit = $("#nex_sender_name").val();
772
+		    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
773
+
774
+		    var twilsenderinit = $("#twil_sender_name").val();
775
+		    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
776
+
777
+		    var datatosave = {
778
+				      userId: userid,
779
+				      telapiKey: $("#telapi_key").val(),
780
+				      telPubKey: $("#tel_pub_key").val(),
781
+				      telapiUrlRec: $("#telapi_url_rec").val(),
782
+				      telapiUrl: $("#telapi_url").val(),
783
+				      messagingProfileId: $("#messaging_profile_id").val(),
784
+				      nexapiKey: $("#nexapi_key").val(),
785
+				      nexapiSecret: $("#nexapi_secret").val(),
786
+				      nexapiUrlRec: $("#nexapi_url_rec").val(),
787
+				      nexapiUrl: $("#nexapi_url").val(),
788
+				      twilapiKey: $("#twilapi_key").val(),
789
+				      twilapiSecret: $("#twilapi_secret").val(),
790
+				      twilapiUrlRec: $("#twilapi_url_rec").val(),
791
+				      twilapiUrl: $("#twilapi_url").val(),
792
+				      flowapiKey: $("#flowapi_key").val(),
793
+				      flowapiSecret: $("#flowapi_secret").val(),
794
+				      flowapiUrlRec: $("#flowapi_url_rec").val(),
795
+				      flowapiUrl: $("#flowapi_url").val(),
796
+				      telSenderName: telsenderproc,
797
+				      nexSenderName: nexsenderproc,
798
+				      twilSenderName: twilsenderproc,
799
+				      showAllMessages: showallmsgs
800
+		    };
801
+
802
+
803
+		    $.ajax({
804
+		       method: 'PUT',
805
+		       url: baseUrlsv + '/' + userid,
806
+		       contentType: 'application/json',
807
+		       data: JSON.stringify(datatosave),
808
+		       success: function() {
809
+		       },
810
+		       error: function() {
811
+			    showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
812
+		       }
813
+		    });
814
+
815
+		  });
816
+
817
+		  function showAlert(alertText) {
818
+
819
+		     let alertwnd = "<div id='alertMessage'>";
820
+		     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
821
+		     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
822
+		     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
823
+		     alertwnd += "</div>";
824
+
825
+		     $("#content").append("<div id='alertMsgOverlay'></div>");
826
+		     $("#content").append(alertwnd);
827
+
828
+		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
829
+		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
830
+		     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
831
+
832
+		     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
833
+		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
834
+		     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
835
+		  }
836
+
837
+		  function confirmAlert(alertText) {
838
+
839
+		     $("#alertMsgOverlay").remove();
840
+		     $("#alertConfMessage").remove();
841
+
842
+		     let alertwndcf = "<div id='alertConfMessage'>";
843
+		     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
844
+		     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
845
+		     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
846
+		     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
847
+		     alertwndcf += "</div>";
848
+
849
+		     $("#content").append("<div id='alertMsgOverlay'></div>");
850
+		     $("#content").append(alertwndcf);
851
+
852
+		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
853
+		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
854
+		     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
855
+
856
+		     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
857
+		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
858
+		  }
859
+
860
+
861
+     },
862
+     error: function(appdirfdb) {
863
+                alert("An error occurred while getting the app's directory. You can check the Nextcloud log to find more details about this issue.");
864
+     }
865
+   });
866
+
867
+});
Browse code

removed appinfo/info.xml appinfo/signature.json appinfo/routes.php CHANGELOG.txt README.md css/style.css js/settings.js js/sendsms.js js/adminsettings.js js/showsmstables.js templates/settings/admin.php templates/settings/personal.php templates/navigation/index.php lib/Controller/SmsrelentlessController.php lib/Service/SmsrelentlessService.php l10n/en_GB.js l10n/en_GB.json l10n/en_US.js l10n/en_US.json

DoubleBastionAdmin authored on 14/02/2024 22:37:16
Showing 1 changed files
1 1
deleted file mode 100644
... ...
@@ -1,837 +0,0 @@
1
-/**
2
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
- *
4
- * @author Double Bastion LLC
5
- *
6
- * @license GNU AGPL version 3 or any later version
7
- *
8
- * This program is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
- * License as published by the Free Software Foundation; either
11
- * version 3 of the License, or any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
- *
18
- * You should have received a copy of the GNU Affero General Public
19
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- */
22
-
23
-$(document).ready(function() {
24
-
25
-  // Get admin settings
26
-  var userid = "<?php p($userId); ?>";
27
-  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
28
-
29
-  $.ajax({
30
-     method: 'GET',
31
-     url: baseUrlget + '/' + userid,
32
-     contentType: 'application/json',
33
-     success: function(settingsadm) {
34
-
35
-          $("#telapi_key").val(settingsadm.telapi_key);
36
-          $("#tel_pub_key").val(settingsadm.tel_pub_key);
37
-          $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
38
-          $("#telapi_url").val(settingsadm.telapi_url);
39
-          $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
40
-          $("#nexapi_key").val(settingsadm.nexapi_key);
41
-          $("#nexapi_secret").val(settingsadm.nexapi_secret);
42
-          $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
43
-          $("#nexapi_url").val(settingsadm.nexapi_url);
44
-          $("#twilapi_key").val(settingsadm.twilapi_key);
45
-          $("#twilapi_secret").val(settingsadm.twilapi_secret);
46
-          $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
47
-          $("#twilapi_url").val(settingsadm.twilapi_url);
48
-          $("#flowapi_key").val(settingsadm.flowapi_key);
49
-          $("#flowapi_secret").val(settingsadm.flowapi_secret);
50
-          $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
51
-          $("#flowapi_url").val(settingsadm.flowapi_url);
52
-          $("#tel_sender_name").val(settingsadm.tel_sender_name);
53
-          $("#nex_sender_name").val(settingsadm.nex_sender_name);
54
-          $("#twil_sender_name").val(settingsadm.twil_sender_name);
55
-
56
-          if (settingsadm.show_all_messages == 1) {
57
-              $("#showallmessages").attr("checked", true);
58
-          } else {
59
-              $("#showallmessages").attr("checked", false);
60
-          }
61
-
62
-          var crntadmDispName = settingsadm.admdisplayname;
63
-          var allRestrictions = settingsadm.restrictions;
64
-          var allGroups = settingsadm.allgroups;
65
-          var allUsers = settingsadm.allusers;
66
-          var allGroupswadm = settingsadm.allgroupswadm;
67
-          var allUserswadm = settingsadm.alluserswadm;
68
-          var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
69
-          var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
70
-          var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
71
-          var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
72
-          var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
73
-          var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
74
-          var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
75
-          var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
76
-
77
-          // List all the groups and users allowed to access the API keys, for each provider
78
-          if (tnxallowedgrp) {
79
-              var tnxallowedgrparr = tnxallowedgrp.split("|");
80
-              for (var g = 0; g < tnxallowedgrparr.length; g++) {
81
-                   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
82
-              }
83
-          }
84
-
85
-          if (tnxallowedusr) {
86
-              var tnxallowedusrarr = tnxallowedusr.split("|");
87
-              for (var g = 0; g < tnxallowedusrarr.length; g++) {
88
-                   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
89
-              }
90
-          }
91
-
92
-          if (plvallowedgrp) {
93
-              var plvallowedgrparr = plvallowedgrp.split("|");
94
-              for (var g = 0; g < plvallowedgrparr.length; g++) {
95
-                   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
96
-              }
97
-          }
98
-
99
-          if (plvallowedusr) {
100
-              var plvallowedusrarr = plvallowedusr.split("|");
101
-              for (var g = 0; g < plvallowedusrarr.length; g++) {
102
-                   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
103
-              }
104
-          }
105
-
106
-          if (twlallowedgrp) {
107
-              var twlallowedgrparr = twlallowedgrp.split("|");
108
-              for (var g = 0; g < twlallowedgrparr.length; g++) {
109
-                   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
110
-              }
111
-          }
112
-
113
-          if (twlallowedusr) {
114
-              var twlallowedusrarr = twlallowedusr.split("|");
115
-              for (var g = 0; g < twlallowedusrarr.length; g++) {
116
-                   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
117
-              }
118
-          }
119
-
120
-          if (flrallowedgrp) {
121
-              var flrallowedgrparr = flrallowedgrp.split("|");
122
-              for (var g = 0; g < flrallowedgrparr.length; g++) {
123
-                   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
124
-              }
125
-          }
126
-
127
-          if (flrallowedusr) {
128
-              var flrallowedusrarr = flrallowedusr.split("|");
129
-              for (var g = 0; g < flrallowedusrarr.length; g++) {
130
-                   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
131
-              }
132
-          }
133
-
134
-
135
-          // Create a list with all the available groups, excluding the admin group
136
-          var grpsListItemswadm = "";
137
-          $.each(allGroupswadm, function(key, value) {
138
-                 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
139
-          });
140
-
141
-          // Create a list with all the available users, excluding the admins
142
-          var usersListItemswadm = "";
143
-          $.each(allUserswadm, function(key, usrval) {
144
-                 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
145
-          });
146
-          
147
-
148
-          function showListsalwdk() {
149
-
150
-              // Append the list of available groups to the table of groups and users allowed to use the API keys
151
-              $('[id^="showakeyGrps-"]').click(function() {
152
-                 var crtid = $(this).attr("id").split("-")[1];
153
-                 $("#grpsadapik-"+ crtid).remove();
154
-                 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
155
-                 $("#adminOverlay").remove();
156
-                 $("#app-content").append("<div id='adminOverlay'></div>");
157
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
158
-
159
-                 $("#adminOverlay").click(function() { 
160
-                    $("#adminOverlay").remove();
161
-                    $("#grpsadapik-"+ crtid).remove();
162
-                    $("#usrsadapik-"+ crtid).remove();
163
-                 });
164
-
165
-                 // Select a group
166
-                 $(".groupsList").click(function() {
167
-                    var slctdGrp = $(this).text();
168
-                    $("#grpsadapik-"+ crtid).remove();
169
-                    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
170
-
171
-                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
172
-                        $("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
173
-                    } else { showAlert("That group has already been added!"); }
174
-
175
-                    // Remove a group from list
176
-                    $('[id^="rmvGrp-"]').click(function() {
177
-                       $(this).closest(".selectedGrps").remove();
178
-                    });
179
-                 });
180
-
181
-              });
182
-
183
-              // Append the list of available users to the table of groups and users allowed to use the API keys
184
-              $('[id^="showakeyUsrs-"]').click(function() {
185
-
186
-                 var crtidusr = $(this).attr("id").split("-")[1];
187
-                 $("#usrsadapik-"+ crtidusr).remove();
188
-                 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
189
-                 $("#adminOverlay").remove();
190
-                 $("#app-content").append("<div id='adminOverlay'></div>");
191
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
192
-
193
-                 $("#adminOverlay").click(function() { 
194
-                    $("#adminOverlay").remove(); 
195
-                    $("#grpsadapik-"+ crtidusr).remove();
196
-                    $("#usrsadapik-"+ crtidusr).remove();
197
-                 });
198
-
199
-                 // Select a user
200
-                 $(".usersList").click(function() {
201
-                    var slctdUsr = $(this).text();
202
-                    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
203
-
204
-                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
205
-                        $("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
206
-                    } else { showAlert("That user has already been added!"); }
207
-
208
-                    // Remove a user from list
209
-                    $('[id^="rmvUsr-"]').click(function() {
210
-                       $(this).closest(".selectedUsrs").remove();
211
-                    });
212
-                 });
213
-
214
-              });
215
-
216
-              // Remove a group from the list 
217
-              $('[id^="rmvGrp-"]').click(function() {
218
-                 $(this).closest(".selectedGrps").remove();
219
-              });
220
-
221
-              // Remove a user from the list
222
-              $('[id^="rmvUsr-"]').click(function() {
223
-                 $(this).closest(".selectedUsrs").remove();
224
-              });
225
-
226
-          }
227
-          showListsalwdk();
228
-
229
-
230
-          // Save the data
231
-          function saveAlwdRow() {
232
-             $('[id^="alwdrstsave-"]').unbind("click");
233
-             $('[id^="alwdrstsave-"]').click(function(event) {
234
-
235
-                 event.preventDefault();
236
-                 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
237
-                 
238
-                 if ($(this).attr("value") == "Save") {
239
-
240
-                     var selGroups = [];
241
-                     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
242
-                        selGroups.push($(this).text());
243
-                     });
244
-                     if (selGroups.length == 0) { selGroups.push(""); }
245
-
246
-                     var selUsers = [];
247
-                     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
248
-                        selUsers.push($(this).text());
249
-                     });
250
-                     if (selUsers.length == 0) { selUsers.push(""); }
251
-
252
-                     // Check if the access key fields have been left empty
253
-                     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
254
-                         showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
255
-                         return;
256
-                     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
257
-                         showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
258
-                         return;
259
-                     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
260
-                         showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
261
-                         return;
262
-                     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
263
-                         showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
264
-                         return;
265
-                     }
266
-
267
-                     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
268
-
269
-                     var alwddatatosend = { 
270
-                              userId: userid,
271
-                              groups: selGroups,
272
-                              users: selUsers,
273
-                              provider: crntprov
274
-                     };
275
-
276
-	             $.ajax({
277
-	                   method: 'PUT',
278
-	                   url: saveAlwdUrl + '/' + userid,
279
-	                   contentType: 'application/json',
280
-	                   data: JSON.stringify(alwddatatosend),
281
-                           success: function(messagesent) {
282
-                                        if (messagesent == 'success') {
283
-                                            showAlert('The allowed groups and users have been successfully saved to the database! However, to be able to send and receive messages using the shared keys from above, the allowed users have to generate and save the 2 webhook URLs corresponding to this SMS provider, on their own Settings page.');
284
-                                        } else if (messagesent != 'success' && messagesent != 'failure') {
285
-                                            showAlert(messagesent);
286
-                                        } else if (messagesent == 'failure') {
287
-                                            showAlert('Error while trying to save the allowed groups and users!');
288
-                                        }
289
-                           },
290
-	                   error: function() {
291
-		                        showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
292
-	                   }
293
-	             });
294
-
295
-                     $(this).attr("value", "Edit");
296
-
297
-                } else {
298
-
299
-                     $("#alwdrstsave-"+ crntprov).attr("value", "Save");
300
-                }
301
-
302
-             });
303
-          }
304
-          saveAlwdRow();
305
-
306
-
307
-
308
-          // Phone number restrictions
309
-
310
-          // Create a list with all the available groups
311
-          var grpsListItems = "";
312
-          $.each(allGroups, function(key, value) {
313
-                 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
314
-          });
315
-
316
-          // Create a list with all the available users
317
-          var usersListItems = "";
318
-          $.each(allUsers, function(key, usrval) {
319
-                 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
320
-          });
321
-
322
-
323
-          if (allRestrictions.length > 0) {
324
-              var restrNmb = allRestrictions.length;
325
-          } else {
326
-              var restrNmb = 0;
327
-          }
328
-
329
-
330
-	  // List the access restrictions for groups and users
331
-          if (restrNmb == 0) {
332
-
333
-              $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
334
-	      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
335
-
336
-          } else {
337
-
338
-	      for (k = 0; k < restrNmb; k++) {
339
-
340
-                   if (allRestrictions[k].groups) {
341
-                       var groupsfdbpre = allRestrictions[k].groups.split("|");
342
-                       var groupsfdb = "";
343
-                       for (var g = 0; g < groupsfdbpre.length; g++) {
344
-                            groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
345
-                       }
346
-                   } else { var groupsfdb = ""; }
347
-
348
-                   if (allRestrictions[k].users) {
349
-                       var usersfdbpre = allRestrictions[k].users.split("|");
350
-                       var usersfdb = "";
351
-                       for (var u = 0; u < usersfdbpre.length; u++) {
352
-                            usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
353
-                       }
354
-                   } else { var usersfdb = ""; }
355
-
356
-		   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
357
-              }
358
-              $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
359
-          }
360
-
361
-
362
-          // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
363
-          $("#phoneNumberTh").addClass('icon-loading');
364
-          var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
365
-          var numbersListItems = '';
366
-
367
-	  $.ajax({
368
-		  url: getnumbersUrl + '/' + userid,
369
-		  type: "POST",
370
-		  cache: false,
371
-		  processData: false,
372
-		  contentType: false,
373
-		  success: function(currentnmbrs) {
374
-
375
-                                    $("#phoneNumberTh").removeClass('icon-loading');
376
-
377
-				    // Create a list with all the available phone numbers
378
-                                    numbersListItems = "<option value='' selected>Select phone number</option>";
379
-
380
-				    $.each(currentnmbrs, function(key, indsmsnmb) {
381
-					   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
382
-				    });
383
-
384
-				    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
385
-
386
-				    // Append the list of available phone numbers
387
-				    $("#rstphn-"+ indRow).empty();
388
-				    $("#rstphn-"+ indRow).append(numbersListItems);
389
-        
390
-		  },
391
-		  error: function() {
392
-                                    $("#phoneNumberTh").removeClass('icon-loading'); 
393
-                                    showAlert("Error while attempting to retrieve the available phone numbers!");
394
-                  }
395
-          });
396
-
397
-
398
-          function showLists() {
399
-
400
-              // Append the list of available groups to the restrictions table
401
-              $('[id^="showGrps-"]').click(function() {
402
-                 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
403
-                 $("#grpL-"+ crtnmbr).remove();
404
-                 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
405
-                 $("#adminOverlay").remove();
406
-                 $("#app-content").append("<div id='adminOverlay'></div>");
407
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
408
-
409
-                 $("#adminOverlay").click(function() { 
410
-                    $("#adminOverlay").remove(); 
411
-                    $("#grpL-"+ crtnmbr).remove(); 
412
-                    $("#usrL-"+ crtnmbr).remove();
413
-                 });
414
-
415
-                 // Select a group
416
-                 $(".groupsList").click(function() {
417
-                    var slctdGrp = $(this).text();
418
-                    $("#grpL-"+ crtnmbr).remove();
419
-                    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
420
-
421
-                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
422
-                        $("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
423
-                    } else { showAlert("That group has already been added!"); }
424
-
425
-                    // Remove a group from list
426
-                    $('[id^="rmvGrp-"]').click(function() {
427
-                       $(this).closest(".selectedGrps").remove();
428
-                    });
429
-                 });
430
-
431
-              });
432
-
433
-              // Append the list of available users to the restrictions table
434
-              $('[id^="showUsr-"]').click(function() {
435
-
436
-                 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
437
-                 $("#usrL-"+ ctusrnmbr).remove();
438
-                 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
439
-                 $("#adminOverlay").remove();
440
-                 $("#app-content").append("<div id='adminOverlay'></div>");
441
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
442
-
443
-                 $("#adminOverlay").click(function() { 
444
-                    $("#adminOverlay").remove(); 
445
-                    $("#grpL-"+ ctusrnmbr).remove(); 
446
-                    $("#usrL-"+ ctusrnmbr).remove();
447
-                 });
448
-
449
-                 // Select a user
450
-                 $(".usersList").click(function() {
451
-                    var slctdUsr = $(this).text();
452
-                    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
453
-
454
-                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
455
-                        $("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
456
-                    } else { showAlert("That user has already been added!"); }
457
-
458
-                    // Remove a user from list
459
-                    $('[id^="rmvUsr-"]').click(function() {
460
-                       $(this).closest(".selectedUsrs").remove();
461
-                    });
462
-                 });
463
-
464
-              });
465
-
466
-              // Remove a group from the list 
467
-              $('[id^="rmvGrp-"]').click(function() {
468
-                 $(this).closest(".selectedGrps").remove();
469
-              });
470
-
471
-              // Remove a user from the list
472
-              $('[id^="rmvUsr-"]').click(function() {
473
-                 $(this).closest(".selectedUsrs").remove();
474
-              });
475
-
476
-          }
477
-          showLists();
478
-
479
-
480
-          // Save the data
481
-          function saveRestrRow() {
482
-             $('[id^="rstsave-"]').unbind("click");
483
-             $('[id^="rstsave-"]').click(function(event) {
484
-
485
-                 event.preventDefault();
486
-                 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
487
-
488
-                 if ($(this).attr("value") == "Save") {
489
-
490
-                     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
491
-                     var slctdGroups = [];
492
-                     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
493
-                        slctdGroups.push($(this).text());
494
-                     });
495
-                     var slctdUsers = [];
496
-                     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
497
-                        slctdUsers.push($(this).text());
498
-                     });
499
-
500
-                     if (phoneNmbr != '') {
501
-
502
-                       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
503
-
504
-                         var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
505
-
506
-                         var datatosend = { 
507
-                              userId: userid,
508
-                              savedByDsplname: crntadmDispName,
509
-                              phoneNumber: phoneNmbr,
510
-                              groups: slctdGroups,
511
-                              users: slctdUsers
512
-                         };
513
-
514
-	                 $.ajax({
515
-	                   method: 'PUT',
516
-	                   url: saveRestrUrl + '/' + userid,
517
-	                   contentType: 'application/json',
518
-	                   data: JSON.stringify(datatosend),
519
-                           success: function(messagetosend) {
520
-                                        if (messagetosend == 'success') {
521
-                                            showAlert('The restrictions have been successfully saved to the database!');
522
-                                        } else {
523
-                                            showAlert('Error while trying to save the restrictions!');
524
-                                        }
525
-                           },
526
-	                   error: function() {
527
-		                        showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
528
-	                   }
529
-	                 });
530
-
531
-                       } else { showAlert("You must select at least a group or a user in order to restrict the use of a phone number."); return; }
532
-
533
-                     } else { showAlert("Please select a phone number!"); return; }
534
-
535
-                     $(this).attr("value", "Edit");
536
-
537
-                } else {
538
-
539
-                     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
540
-                }
541
-
542
-             });
543
-          }
544
-          saveRestrRow();
545
-
546
-          // Remove a row
547
-          function removeRestrRow() {
548
-
549
-               $('[id^="rmRow-"]').click(function() {
550
-
551
-                  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
552
-                  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
553
-
554
-                  confirmAlert("Do you really want to remove this row from the database ?");
555
-
556
-                  $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
557
-
558
-                  $("#confirmOk").click(function() {
559
-
560
-                      $("#alertMsgOverlay").remove();
561
-                      $("#alertConfMessage").remove();
562
-
563
-                      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
564
-                      $.ajax({
565
-                           url: rmvRestrUrl + '/' + userid,
566
-                           method: "POST",
567
-                           dataType: "text",
568
-                           data: { phoneNumber: crntPhNmbr },
569
-                           success: function(delresult) {
570
-
571
-                                             if (delresult.indexOf("success") > -1) {
572
-                                                 showAlert("The restriction has been removed successfully!");
573
-                                                 $("#rstphn-"+ slctRowRmv).closest("tr").remove();
574
-                                             } else {
575
-                                                 showAlert("Error while trying to remove restriction data!");
576
-                                             }
577
-                           },
578
-                           error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
579
-                       });
580
-                  });
581
-               });
582
-          }
583
-          removeRestrRow();
584
-
585
-          // Add a new row
586
-	  $("#addRestrRow").click(function() {
587
-              if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
588
-                  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
589
-                  var indRowAdd = parseInt(lastrstAuth + 1);
590
-              } else { var indRowAdd = 0; }
591
-	      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
592
-              showLists();
593
-              saveRestrRow();
594
-              removeRestrRow();
595
-
596
-              // Check if the same phone number has been already restricted
597
-              $("#rstphn-"+ indRowAdd).change(function() {
598
-                 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
599
-                 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
600
-                 var phNmbrChck = 0;
601
-                 allPHoneRestr.each(function() {
602
-                    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
603
-                    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
604
-                 });
605
-
606
-                 if (phNmbrChck == 2) {
607
-                     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict.");
608
-                     $(this).val('');
609
-                     return;
610
-                 }
611
-              });
612
-	  });
613
-
614
-     },
615
-     error: function() {
616
-                showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
617
-     }
618
-  });
619
-
620
-
621
-
622
-  // Save admin settings
623
-  function randomStr(strlength) {
624
-        var fintext = "";
625
-        var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
626
-        for (var i = 0; i < strlength; i++) {
627
-             fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
628
-        }
629
-        return fintext;
630
-  }
631
-
632
-  $("#generate_tel_rcpt").on("click", function(event) {
633
-
634
-     var teltokenrec = randomStr(70);
635
-     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
636
-
637
-     $("#telapi_url_rec").val(telnyxwhurlrec);
638
-  });
639
-
640
-  $("#copyToClipboardtel").on("click", function(event) {
641
-     var $tempEl = $("<input>");
642
-     $("body").append($tempEl);
643
-     $tempEl.val($("#telapi_url_rec").val()).select();
644
-     document.execCommand("Copy");
645
-     $tempEl.remove();
646
-     showAlert("The link has been copied to your clipboard!");
647
-  });
648
-
649
-  $("#generate_tel_delrcpt").on("click", function(event) {
650
-
651
-     var teltoken = randomStr(70);
652
-     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
653
-
654
-     $("#telapi_url").val(telnyxwhurl);
655
-  });
656
-
657
-  $("#generate_nex_rcpt").on("click", function(event) {
658
-
659
-     var plivotokenrec = randomStr(70);
660
-     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
661
-
662
-     $("#nexapi_url_rec").val(plivowhurlrec);
663
-  });
664
-
665
-  $("#copyToClipboardnex").on("click", function(event) {
666
-     var $tempElpl = $("<input>");
667
-     $("body").append($tempElpl);
668
-     $tempElpl.val($("#nexapi_url_rec").val()).select();
669
-     document.execCommand("Copy");
670
-     $tempElpl.remove();
671
-     showAlert("The link has been copied to your clipboard!");
672
-  });
673
-
674
-  $("#generate_nex_delrcpt").on("click", function(event) {
675
-
676
-     var plivotoken = randomStr(70);
677
-     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
678
-
679
-     $("#nexapi_url").val(plivodrwhurl);
680
-  });
681
-
682
-  $("#generate_twil_rcpt").on("click", function(event) {
683
-
684
-     var twiltokenrec = randomStr(35);
685
-     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
686
-
687
-     $("#twilapi_url_rec").val(twilwhurlrec);
688
-  });
689
-
690
-  $("#copyToClipboardtwil").on("click", function(event) {
691
-     var $tempElpl = $("<input>");
692
-     $("body").append($tempElpl);
693
-     $tempElpl.val($("#twilapi_url_rec").val()).select();
694
-     document.execCommand("Copy");
695
-     $tempElpl.remove();
696
-     showAlert("The link has been copied to your clipboard!");
697
-  });
698
-
699
-  $("#generate_twil_delrcpt").on("click", function(event) {
700
-
701
-     var twiltoken = randomStr(35);
702
-     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
703
-
704
-     $("#twilapi_url").val(twildrwhurl);
705
-  });
706
-
707
-  $("#generate_flow_rcpt").on("click", function(event) {
708
-
709
-     var flowtokenrec = randomStr(70);
710
-     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
711
-
712
-     $("#flowapi_url_rec").val(flowwhurlrec);
713
-  });
714
-
715
-  $("#copyToClipboardflow").on("click", function(event) {
716
-     var $tempElpl = $("<input>");
717
-     $("body").append($tempElpl);
718
-     $tempElpl.val($("#flowapi_url_rec").val()).select();
719
-     document.execCommand("Copy");
720
-     $tempElpl.remove();
721
-     showAlert("The link has been copied to your clipboard!");
722
-  });
723
-
724
-  $("#generate_flow_delrcpt").on("click", function(event) {
725
-
726
-     var flowtoken = randomStr(70);
727
-     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
728
-
729
-     $("#flowapi_url").val(flowdrwhurl);
730
-  });
731
-
732
-
733
-  $("#save_admin_settings").on("click", function(event) {
734
-
735
-    event.preventDefault();
736
-    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
737
-
738
-    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
739
-
740
-    var showallmsgs = 0;
741
-    if ($("#showallmessages").is(':checked')) {
742
-        showallmsgs = 1;
743
-    }
744
-
745
-    var telsenderinit = $("#tel_sender_name").val();
746
-    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
747
-
748
-    var nexsenderinit = $("#nex_sender_name").val();
749
-    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
750
-
751
-    var twilsenderinit = $("#twil_sender_name").val();
752
-    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
753
-
754
-    var datatosave = {
755
-                      userId: userid,
756
-                      telapiKey: $("#telapi_key").val(),
757
-                      telPubKey: $("#tel_pub_key").val(),
758
-                      telapiUrlRec: $("#telapi_url_rec").val(),
759
-                      telapiUrl: $("#telapi_url").val(),
760
-                      messagingProfileId: $("#messaging_profile_id").val(),
761
-                      nexapiKey: $("#nexapi_key").val(),
762
-                      nexapiSecret: $("#nexapi_secret").val(),
763
-                      nexapiUrlRec: $("#nexapi_url_rec").val(),
764
-                      nexapiUrl: $("#nexapi_url").val(),
765
-                      twilapiKey: $("#twilapi_key").val(),
766
-                      twilapiSecret: $("#twilapi_secret").val(),
767
-                      twilapiUrlRec: $("#twilapi_url_rec").val(),
768
-                      twilapiUrl: $("#twilapi_url").val(),
769
-                      flowapiKey: $("#flowapi_key").val(),
770
-                      flowapiSecret: $("#flowapi_secret").val(),
771
-                      flowapiUrlRec: $("#flowapi_url_rec").val(),
772
-                      flowapiUrl: $("#flowapi_url").val(),
773
-                      telSenderName: telsenderproc,
774
-                      nexSenderName: nexsenderproc,
775
-                      twilSenderName: twilsenderproc,
776
-                      showAllMessages: showallmsgs
777
-    };
778
-
779
-
780
-    $.ajax({
781
-       method: 'PUT',
782
-       url: baseUrlsv + '/' + userid,
783
-       contentType: 'application/json',
784
-       data: JSON.stringify(datatosave),
785
-       success: function() {
786
-       },
787
-       error: function() {
788
-            showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
789
-       }
790
-    });
791
-
792
-  });
793
-
794
-  function showAlert(alertText) {
795
-
796
-     let alertwnd = "<div id='alertMessage'>";
797
-     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
798
-     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
799
-     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
800
-     alertwnd += "</div>";
801
-
802
-     $("#content").append("<div id='alertMsgOverlay'></div>");
803
-     $("#content").append(alertwnd);
804
-
805
-     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
806
-     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
807
-     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
808
-
809
-     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
810
-     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
811
-     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
812
-  }
813
-
814
-  function confirmAlert(alertText) {
815
-
816
-     $("#alertMsgOverlay").remove();
817
-     $("#alertConfMessage").remove();
818
-
819
-     let alertwndcf = "<div id='alertConfMessage'>";
820
-     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
821
-     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
822
-     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
823
-     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
824
-     alertwndcf += "</div>";
825
-
826
-     $("#content").append("<div id='alertMsgOverlay'></div>");
827
-     $("#content").append(alertwndcf);
828
-
829
-     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
830
-     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
831
-     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
832
-
833
-     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
834
-     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
835
-  }
836
-
837
-});
Browse code

added CHANGELOG.txt appinfo/info.xml appinfo/signature.json appinfo/routes.php css/style.css js/adminsettings.js js/deleteoldsms.js js/sendsms.js js/settings.js js/showsmstables.js lib/Controller/AuthorApiController.php lib/Controller/SmsrelentlessController.php lib/Service/SmsrelentlessService.php providers/Telnyx/lib/ApiResource.php

DoubleBastionAdmin authored on 15/07/2023 22:05:06
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,837 @@
1
+/**
2
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
+ *
4
+ * @author Double Bastion LLC
5
+ *
6
+ * @license GNU AGPL version 3 or any later version
7
+ *
8
+ * This program is free software; you can redistribute it and/or
9
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
+ * License as published by the Free Software Foundation; either
11
+ * version 3 of the License, or any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
+ *
18
+ * You should have received a copy of the GNU Affero General Public
19
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+$(document).ready(function() {
24
+
25
+  // Get admin settings
26
+  var userid = "<?php p($userId); ?>";
27
+  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
28
+
29
+  $.ajax({
30
+     method: 'GET',
31
+     url: baseUrlget + '/' + userid,
32
+     contentType: 'application/json',
33
+     success: function(settingsadm) {
34
+
35
+          $("#telapi_key").val(settingsadm.telapi_key);
36
+          $("#tel_pub_key").val(settingsadm.tel_pub_key);
37
+          $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
38
+          $("#telapi_url").val(settingsadm.telapi_url);
39
+          $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
40
+          $("#nexapi_key").val(settingsadm.nexapi_key);
41
+          $("#nexapi_secret").val(settingsadm.nexapi_secret);
42
+          $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
43
+          $("#nexapi_url").val(settingsadm.nexapi_url);
44
+          $("#twilapi_key").val(settingsadm.twilapi_key);
45
+          $("#twilapi_secret").val(settingsadm.twilapi_secret);
46
+          $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
47
+          $("#twilapi_url").val(settingsadm.twilapi_url);
48
+          $("#flowapi_key").val(settingsadm.flowapi_key);
49
+          $("#flowapi_secret").val(settingsadm.flowapi_secret);
50
+          $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
51
+          $("#flowapi_url").val(settingsadm.flowapi_url);
52
+          $("#tel_sender_name").val(settingsadm.tel_sender_name);
53
+          $("#nex_sender_name").val(settingsadm.nex_sender_name);
54
+          $("#twil_sender_name").val(settingsadm.twil_sender_name);
55
+
56
+          if (settingsadm.show_all_messages == 1) {
57
+              $("#showallmessages").attr("checked", true);
58
+          } else {
59
+              $("#showallmessages").attr("checked", false);
60
+          }
61
+
62
+          var crntadmDispName = settingsadm.admdisplayname;
63
+          var allRestrictions = settingsadm.restrictions;
64
+          var allGroups = settingsadm.allgroups;
65
+          var allUsers = settingsadm.allusers;
66
+          var allGroupswadm = settingsadm.allgroupswadm;
67
+          var allUserswadm = settingsadm.alluserswadm;
68
+          var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
69
+          var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
70
+          var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
71
+          var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
72
+          var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
73
+          var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
74
+          var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
75
+          var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
76
+
77
+          // List all the groups and users allowed to access the API keys, for each provider
78
+          if (tnxallowedgrp) {
79
+              var tnxallowedgrparr = tnxallowedgrp.split("|");
80
+              for (var g = 0; g < tnxallowedgrparr.length; g++) {
81
+                   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
82
+              }
83
+          }
84
+
85
+          if (tnxallowedusr) {
86
+              var tnxallowedusrarr = tnxallowedusr.split("|");
87
+              for (var g = 0; g < tnxallowedusrarr.length; g++) {
88
+                   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
89
+              }
90
+          }
91
+
92
+          if (plvallowedgrp) {
93
+              var plvallowedgrparr = plvallowedgrp.split("|");
94
+              for (var g = 0; g < plvallowedgrparr.length; g++) {
95
+                   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
96
+              }
97
+          }
98
+
99
+          if (plvallowedusr) {
100
+              var plvallowedusrarr = plvallowedusr.split("|");
101
+              for (var g = 0; g < plvallowedusrarr.length; g++) {
102
+                   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
103
+              }
104
+          }
105
+
106
+          if (twlallowedgrp) {
107
+              var twlallowedgrparr = twlallowedgrp.split("|");
108
+              for (var g = 0; g < twlallowedgrparr.length; g++) {
109
+                   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
110
+              }
111
+          }
112
+
113
+          if (twlallowedusr) {
114
+              var twlallowedusrarr = twlallowedusr.split("|");
115
+              for (var g = 0; g < twlallowedusrarr.length; g++) {
116
+                   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
117
+              }
118
+          }
119
+
120
+          if (flrallowedgrp) {
121
+              var flrallowedgrparr = flrallowedgrp.split("|");
122
+              for (var g = 0; g < flrallowedgrparr.length; g++) {
123
+                   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
124
+              }
125
+          }
126
+
127
+          if (flrallowedusr) {
128
+              var flrallowedusrarr = flrallowedusr.split("|");
129
+              for (var g = 0; g < flrallowedusrarr.length; g++) {
130
+                   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
131
+              }
132
+          }
133
+
134
+
135
+          // Create a list with all the available groups, excluding the admin group
136
+          var grpsListItemswadm = "";
137
+          $.each(allGroupswadm, function(key, value) {
138
+                 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
139
+          });
140
+
141
+          // Create a list with all the available users, excluding the admins
142
+          var usersListItemswadm = "";
143
+          $.each(allUserswadm, function(key, usrval) {
144
+                 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
145
+          });
146
+          
147
+
148
+          function showListsalwdk() {
149
+
150
+              // Append the list of available groups to the table of groups and users allowed to use the API keys
151
+              $('[id^="showakeyGrps-"]').click(function() {
152
+                 var crtid = $(this).attr("id").split("-")[1];
153
+                 $("#grpsadapik-"+ crtid).remove();
154
+                 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
155
+                 $("#adminOverlay").remove();
156
+                 $("#app-content").append("<div id='adminOverlay'></div>");
157
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
158
+
159
+                 $("#adminOverlay").click(function() { 
160
+                    $("#adminOverlay").remove();
161
+                    $("#grpsadapik-"+ crtid).remove();
162
+                    $("#usrsadapik-"+ crtid).remove();
163
+                 });
164
+
165
+                 // Select a group
166
+                 $(".groupsList").click(function() {
167
+                    var slctdGrp = $(this).text();
168
+                    $("#grpsadapik-"+ crtid).remove();
169
+                    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
170
+
171
+                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
172
+                        $("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
173
+                    } else { showAlert("That group has already been added!"); }
174
+
175
+                    // Remove a group from list
176
+                    $('[id^="rmvGrp-"]').click(function() {
177
+                       $(this).closest(".selectedGrps").remove();
178
+                    });
179
+                 });
180
+
181
+              });
182
+
183
+              // Append the list of available users to the table of groups and users allowed to use the API keys
184
+              $('[id^="showakeyUsrs-"]').click(function() {
185
+
186
+                 var crtidusr = $(this).attr("id").split("-")[1];
187
+                 $("#usrsadapik-"+ crtidusr).remove();
188
+                 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
189
+                 $("#adminOverlay").remove();
190
+                 $("#app-content").append("<div id='adminOverlay'></div>");
191
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
192
+
193
+                 $("#adminOverlay").click(function() { 
194
+                    $("#adminOverlay").remove(); 
195
+                    $("#grpsadapik-"+ crtidusr).remove();
196
+                    $("#usrsadapik-"+ crtidusr).remove();
197
+                 });
198
+
199
+                 // Select a user
200
+                 $(".usersList").click(function() {
201
+                    var slctdUsr = $(this).text();
202
+                    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
203
+
204
+                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
205
+                        $("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
206
+                    } else { showAlert("That user has already been added!"); }
207
+
208
+                    // Remove a user from list
209
+                    $('[id^="rmvUsr-"]').click(function() {
210
+                       $(this).closest(".selectedUsrs").remove();
211
+                    });
212
+                 });
213
+
214
+              });
215
+
216
+              // Remove a group from the list 
217
+              $('[id^="rmvGrp-"]').click(function() {
218
+                 $(this).closest(".selectedGrps").remove();
219
+              });
220
+
221
+              // Remove a user from the list
222
+              $('[id^="rmvUsr-"]').click(function() {
223
+                 $(this).closest(".selectedUsrs").remove();
224
+              });
225
+
226
+          }
227
+          showListsalwdk();
228
+
229
+
230
+          // Save the data
231
+          function saveAlwdRow() {
232
+             $('[id^="alwdrstsave-"]').unbind("click");
233
+             $('[id^="alwdrstsave-"]').click(function(event) {
234
+
235
+                 event.preventDefault();
236
+                 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
237
+                 
238
+                 if ($(this).attr("value") == "Save") {
239
+
240
+                     var selGroups = [];
241
+                     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
242
+                        selGroups.push($(this).text());
243
+                     });
244
+                     if (selGroups.length == 0) { selGroups.push(""); }
245
+
246
+                     var selUsers = [];
247
+                     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
248
+                        selUsers.push($(this).text());
249
+                     });
250
+                     if (selUsers.length == 0) { selUsers.push(""); }
251
+
252
+                     // Check if the access key fields have been left empty
253
+                     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
254
+                         showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
255
+                         return;
256
+                     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
257
+                         showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
258
+                         return;
259
+                     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
260
+                         showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
261
+                         return;
262
+                     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
263
+                         showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
264
+                         return;
265
+                     }
266
+
267
+                     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
268
+
269
+                     var alwddatatosend = { 
270
+                              userId: userid,
271
+                              groups: selGroups,
272
+                              users: selUsers,
273
+                              provider: crntprov
274
+                     };
275
+
276
+	             $.ajax({
277
+	                   method: 'PUT',
278
+	                   url: saveAlwdUrl + '/' + userid,
279
+	                   contentType: 'application/json',
280
+	                   data: JSON.stringify(alwddatatosend),
281
+                           success: function(messagesent) {
282
+                                        if (messagesent == 'success') {
283
+                                            showAlert('The allowed groups and users have been successfully saved to the database! However, to be able to send and receive messages using the shared keys from above, the allowed users have to generate and save the 2 webhook URLs corresponding to this SMS provider, on their own Settings page.');
284
+                                        } else if (messagesent != 'success' && messagesent != 'failure') {
285
+                                            showAlert(messagesent);
286
+                                        } else if (messagesent == 'failure') {
287
+                                            showAlert('Error while trying to save the allowed groups and users!');
288
+                                        }
289
+                           },
290
+	                   error: function() {
291
+		                        showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
292
+	                   }
293
+	             });
294
+
295
+                     $(this).attr("value", "Edit");
296
+
297
+                } else {
298
+
299
+                     $("#alwdrstsave-"+ crntprov).attr("value", "Save");
300
+                }
301
+
302
+             });
303
+          }
304
+          saveAlwdRow();
305
+
306
+
307
+
308
+          // Phone number restrictions
309
+
310
+          // Create a list with all the available groups
311
+          var grpsListItems = "";
312
+          $.each(allGroups, function(key, value) {
313
+                 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
314
+          });
315
+
316
+          // Create a list with all the available users
317
+          var usersListItems = "";
318
+          $.each(allUsers, function(key, usrval) {
319
+                 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
320
+          });
321
+
322
+
323
+          if (allRestrictions.length > 0) {
324
+              var restrNmb = allRestrictions.length;
325
+          } else {
326
+              var restrNmb = 0;
327
+          }
328
+
329
+
330
+	  // List the access restrictions for groups and users
331
+          if (restrNmb == 0) {
332
+
333
+              $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
334
+	      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
335
+
336
+          } else {
337
+
338
+	      for (k = 0; k < restrNmb; k++) {
339
+
340
+                   if (allRestrictions[k].groups) {
341
+                       var groupsfdbpre = allRestrictions[k].groups.split("|");
342
+                       var groupsfdb = "";
343
+                       for (var g = 0; g < groupsfdbpre.length; g++) {
344
+                            groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
345
+                       }
346
+                   } else { var groupsfdb = ""; }
347
+
348
+                   if (allRestrictions[k].users) {
349
+                       var usersfdbpre = allRestrictions[k].users.split("|");
350
+                       var usersfdb = "";
351
+                       for (var u = 0; u < usersfdbpre.length; u++) {
352
+                            usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
353
+                       }
354
+                   } else { var usersfdb = ""; }
355
+
356
+		   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
357
+              }
358
+              $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
359
+          }
360
+
361
+
362
+          // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
363
+          $("#phoneNumberTh").addClass('icon-loading');
364
+          var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
365
+          var numbersListItems = '';
366
+
367
+	  $.ajax({
368
+		  url: getnumbersUrl + '/' + userid,
369
+		  type: "POST",
370
+		  cache: false,
371
+		  processData: false,
372
+		  contentType: false,
373
+		  success: function(currentnmbrs) {
374
+
375
+                                    $("#phoneNumberTh").removeClass('icon-loading');
376
+
377
+				    // Create a list with all the available phone numbers
378
+                                    numbersListItems = "<option value='' selected>Select phone number</option>";
379
+
380
+				    $.each(currentnmbrs, function(key, indsmsnmb) {
381
+					   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
382
+				    });
383
+
384
+				    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
385
+
386
+				    // Append the list of available phone numbers
387
+				    $("#rstphn-"+ indRow).empty();
388
+				    $("#rstphn-"+ indRow).append(numbersListItems);
389
+        
390
+		  },
391
+		  error: function() {
392
+                                    $("#phoneNumberTh").removeClass('icon-loading'); 
393
+                                    showAlert("Error while attempting to retrieve the available phone numbers!");
394
+                  }
395
+          });
396
+
397
+
398
+          function showLists() {
399
+
400
+              // Append the list of available groups to the restrictions table
401
+              $('[id^="showGrps-"]').click(function() {
402
+                 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
403
+                 $("#grpL-"+ crtnmbr).remove();
404
+                 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
405
+                 $("#adminOverlay").remove();
406
+                 $("#app-content").append("<div id='adminOverlay'></div>");
407
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
408
+
409
+                 $("#adminOverlay").click(function() { 
410
+                    $("#adminOverlay").remove(); 
411
+                    $("#grpL-"+ crtnmbr).remove(); 
412
+                    $("#usrL-"+ crtnmbr).remove();
413
+                 });
414
+
415
+                 // Select a group
416
+                 $(".groupsList").click(function() {
417
+                    var slctdGrp = $(this).text();
418
+                    $("#grpL-"+ crtnmbr).remove();
419
+                    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
420
+
421
+                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
422
+                        $("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
423
+                    } else { showAlert("That group has already been added!"); }
424
+
425
+                    // Remove a group from list
426
+                    $('[id^="rmvGrp-"]').click(function() {
427
+                       $(this).closest(".selectedGrps").remove();
428
+                    });
429
+                 });
430
+
431
+              });
432
+
433
+              // Append the list of available users to the restrictions table
434
+              $('[id^="showUsr-"]').click(function() {
435
+
436
+                 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
437
+                 $("#usrL-"+ ctusrnmbr).remove();
438
+                 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
439
+                 $("#adminOverlay").remove();
440
+                 $("#app-content").append("<div id='adminOverlay'></div>");
441
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
442
+
443
+                 $("#adminOverlay").click(function() { 
444
+                    $("#adminOverlay").remove(); 
445
+                    $("#grpL-"+ ctusrnmbr).remove(); 
446
+                    $("#usrL-"+ ctusrnmbr).remove();
447
+                 });
448
+
449
+                 // Select a user
450
+                 $(".usersList").click(function() {
451
+                    var slctdUsr = $(this).text();
452
+                    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
453
+
454
+                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
455
+                        $("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
456
+                    } else { showAlert("That user has already been added!"); }
457
+
458
+                    // Remove a user from list
459
+                    $('[id^="rmvUsr-"]').click(function() {
460
+                       $(this).closest(".selectedUsrs").remove();
461
+                    });
462
+                 });
463
+
464
+              });
465
+
466
+              // Remove a group from the list 
467
+              $('[id^="rmvGrp-"]').click(function() {
468
+                 $(this).closest(".selectedGrps").remove();
469
+              });
470
+
471
+              // Remove a user from the list
472
+              $('[id^="rmvUsr-"]').click(function() {
473
+                 $(this).closest(".selectedUsrs").remove();
474
+              });
475
+
476
+          }
477
+          showLists();
478
+
479
+
480
+          // Save the data
481
+          function saveRestrRow() {
482
+             $('[id^="rstsave-"]').unbind("click");
483
+             $('[id^="rstsave-"]').click(function(event) {
484
+
485
+                 event.preventDefault();
486
+                 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
487
+
488
+                 if ($(this).attr("value") == "Save") {
489
+
490
+                     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
491
+                     var slctdGroups = [];
492
+                     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
493
+                        slctdGroups.push($(this).text());
494
+                     });
495
+                     var slctdUsers = [];
496
+                     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
497
+                        slctdUsers.push($(this).text());
498
+                     });
499
+
500
+                     if (phoneNmbr != '') {
501
+
502
+                       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
503
+
504
+                         var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
505
+
506
+                         var datatosend = { 
507
+                              userId: userid,
508
+                              savedByDsplname: crntadmDispName,
509
+                              phoneNumber: phoneNmbr,
510
+                              groups: slctdGroups,
511
+                              users: slctdUsers
512
+                         };
513
+
514
+	                 $.ajax({
515
+	                   method: 'PUT',
516
+	                   url: saveRestrUrl + '/' + userid,
517
+	                   contentType: 'application/json',
518
+	                   data: JSON.stringify(datatosend),
519
+                           success: function(messagetosend) {
520
+                                        if (messagetosend == 'success') {
521
+                                            showAlert('The restrictions have been successfully saved to the database!');
522
+                                        } else {
523
+                                            showAlert('Error while trying to save the restrictions!');
524
+                                        }
525
+                           },
526
+	                   error: function() {
527
+		                        showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
528
+	                   }
529
+	                 });
530
+
531
+                       } else { showAlert("You must select at least a group or a user in order to restrict the use of a phone number."); return; }
532
+
533
+                     } else { showAlert("Please select a phone number!"); return; }
534
+
535
+                     $(this).attr("value", "Edit");
536
+
537
+                } else {
538
+
539
+                     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
540
+                }
541
+
542
+             });
543
+          }
544
+          saveRestrRow();
545
+
546
+          // Remove a row
547
+          function removeRestrRow() {
548
+
549
+               $('[id^="rmRow-"]').click(function() {
550
+
551
+                  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
552
+                  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
553
+
554
+                  confirmAlert("Do you really want to remove this row from the database ?");
555
+
556
+                  $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
557
+
558
+                  $("#confirmOk").click(function() {
559
+
560
+                      $("#alertMsgOverlay").remove();
561
+                      $("#alertConfMessage").remove();
562
+
563
+                      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
564
+                      $.ajax({
565
+                           url: rmvRestrUrl + '/' + userid,
566
+                           method: "POST",
567
+                           dataType: "text",
568
+                           data: { phoneNumber: crntPhNmbr },
569
+                           success: function(delresult) {
570
+
571
+                                             if (delresult.indexOf("success") > -1) {
572
+                                                 showAlert("The restriction has been removed successfully!");
573
+                                                 $("#rstphn-"+ slctRowRmv).closest("tr").remove();
574
+                                             } else {
575
+                                                 showAlert("Error while trying to remove restriction data!");
576
+                                             }
577
+                           },
578
+                           error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
579
+                       });
580
+                  });
581
+               });
582
+          }
583
+          removeRestrRow();
584
+
585
+          // Add a new row
586
+	  $("#addRestrRow").click(function() {
587
+              if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
588
+                  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
589
+                  var indRowAdd = parseInt(lastrstAuth + 1);
590
+              } else { var indRowAdd = 0; }
591
+	      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
592
+              showLists();
593
+              saveRestrRow();
594
+              removeRestrRow();
595
+
596
+              // Check if the same phone number has been already restricted
597
+              $("#rstphn-"+ indRowAdd).change(function() {
598
+                 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
599
+                 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
600
+                 var phNmbrChck = 0;
601
+                 allPHoneRestr.each(function() {
602
+                    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
603
+                    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
604
+                 });
605
+
606
+                 if (phNmbrChck == 2) {
607
+                     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict.");
608
+                     $(this).val('');
609
+                     return;
610
+                 }
611
+              });
612
+	  });
613
+
614
+     },
615
+     error: function() {
616
+                showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
617
+     }
618
+  });
619
+
620
+
621
+
622
+  // Save admin settings
623
+  function randomStr(strlength) {
624
+        var fintext = "";
625
+        var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
626
+        for (var i = 0; i < strlength; i++) {
627
+             fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
628
+        }
629
+        return fintext;
630
+  }
631
+
632
+  $("#generate_tel_rcpt").on("click", function(event) {
633
+
634
+     var teltokenrec = randomStr(70);
635
+     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
636
+
637
+     $("#telapi_url_rec").val(telnyxwhurlrec);
638
+  });
639
+
640
+  $("#copyToClipboardtel").on("click", function(event) {
641
+     var $tempEl = $("<input>");
642
+     $("body").append($tempEl);
643
+     $tempEl.val($("#telapi_url_rec").val()).select();
644
+     document.execCommand("Copy");
645
+     $tempEl.remove();
646
+     showAlert("The link has been copied to your clipboard!");
647
+  });
648
+
649
+  $("#generate_tel_delrcpt").on("click", function(event) {
650
+
651
+     var teltoken = randomStr(70);
652
+     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
653
+
654
+     $("#telapi_url").val(telnyxwhurl);
655
+  });
656
+
657
+  $("#generate_nex_rcpt").on("click", function(event) {
658
+
659
+     var plivotokenrec = randomStr(70);
660
+     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
661
+
662
+     $("#nexapi_url_rec").val(plivowhurlrec);
663
+  });
664
+
665
+  $("#copyToClipboardnex").on("click", function(event) {
666
+     var $tempElpl = $("<input>");
667
+     $("body").append($tempElpl);
668
+     $tempElpl.val($("#nexapi_url_rec").val()).select();
669
+     document.execCommand("Copy");
670
+     $tempElpl.remove();
671
+     showAlert("The link has been copied to your clipboard!");
672
+  });
673
+
674
+  $("#generate_nex_delrcpt").on("click", function(event) {
675
+
676
+     var plivotoken = randomStr(70);
677
+     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
678
+
679
+     $("#nexapi_url").val(plivodrwhurl);
680
+  });
681
+
682
+  $("#generate_twil_rcpt").on("click", function(event) {
683
+
684
+     var twiltokenrec = randomStr(35);
685
+     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
686
+
687
+     $("#twilapi_url_rec").val(twilwhurlrec);
688
+  });
689
+
690
+  $("#copyToClipboardtwil").on("click", function(event) {
691
+     var $tempElpl = $("<input>");
692
+     $("body").append($tempElpl);
693
+     $tempElpl.val($("#twilapi_url_rec").val()).select();
694
+     document.execCommand("Copy");
695
+     $tempElpl.remove();
696
+     showAlert("The link has been copied to your clipboard!");
697
+  });
698
+
699
+  $("#generate_twil_delrcpt").on("click", function(event) {
700
+
701
+     var twiltoken = randomStr(35);
702
+     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
703
+
704
+     $("#twilapi_url").val(twildrwhurl);
705
+  });
706
+
707
+  $("#generate_flow_rcpt").on("click", function(event) {
708
+
709
+     var flowtokenrec = randomStr(70);
710
+     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
711
+
712
+     $("#flowapi_url_rec").val(flowwhurlrec);
713
+  });
714
+
715
+  $("#copyToClipboardflow").on("click", function(event) {
716
+     var $tempElpl = $("<input>");
717
+     $("body").append($tempElpl);
718
+     $tempElpl.val($("#flowapi_url_rec").val()).select();
719
+     document.execCommand("Copy");
720
+     $tempElpl.remove();
721
+     showAlert("The link has been copied to your clipboard!");
722
+  });
723
+
724
+  $("#generate_flow_delrcpt").on("click", function(event) {
725
+
726
+     var flowtoken = randomStr(70);
727
+     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
728
+
729
+     $("#flowapi_url").val(flowdrwhurl);
730
+  });
731
+
732
+
733
+  $("#save_admin_settings").on("click", function(event) {
734
+
735
+    event.preventDefault();
736
+    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
737
+
738
+    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
739
+
740
+    var showallmsgs = 0;
741
+    if ($("#showallmessages").is(':checked')) {
742
+        showallmsgs = 1;
743
+    }
744
+
745
+    var telsenderinit = $("#tel_sender_name").val();
746
+    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
747
+
748
+    var nexsenderinit = $("#nex_sender_name").val();
749
+    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
750
+
751
+    var twilsenderinit = $("#twil_sender_name").val();
752
+    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
753
+
754
+    var datatosave = {
755
+                      userId: userid,
756
+                      telapiKey: $("#telapi_key").val(),
757
+                      telPubKey: $("#tel_pub_key").val(),
758
+                      telapiUrlRec: $("#telapi_url_rec").val(),
759
+                      telapiUrl: $("#telapi_url").val(),
760
+                      messagingProfileId: $("#messaging_profile_id").val(),
761
+                      nexapiKey: $("#nexapi_key").val(),
762
+                      nexapiSecret: $("#nexapi_secret").val(),
763
+                      nexapiUrlRec: $("#nexapi_url_rec").val(),
764
+                      nexapiUrl: $("#nexapi_url").val(),
765
+                      twilapiKey: $("#twilapi_key").val(),
766
+                      twilapiSecret: $("#twilapi_secret").val(),
767
+                      twilapiUrlRec: $("#twilapi_url_rec").val(),
768
+                      twilapiUrl: $("#twilapi_url").val(),
769
+                      flowapiKey: $("#flowapi_key").val(),
770
+                      flowapiSecret: $("#flowapi_secret").val(),
771
+                      flowapiUrlRec: $("#flowapi_url_rec").val(),
772
+                      flowapiUrl: $("#flowapi_url").val(),
773
+                      telSenderName: telsenderproc,
774
+                      nexSenderName: nexsenderproc,
775
+                      twilSenderName: twilsenderproc,
776
+                      showAllMessages: showallmsgs
777
+    };
778
+
779
+
780
+    $.ajax({
781
+       method: 'PUT',
782
+       url: baseUrlsv + '/' + userid,
783
+       contentType: 'application/json',
784
+       data: JSON.stringify(datatosave),
785
+       success: function() {
786
+       },
787
+       error: function() {
788
+            showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
789
+       }
790
+    });
791
+
792
+  });
793
+
794
+  function showAlert(alertText) {
795
+
796
+     let alertwnd = "<div id='alertMessage'>";
797
+     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
798
+     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
799
+     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
800
+     alertwnd += "</div>";
801
+
802
+     $("#content").append("<div id='alertMsgOverlay'></div>");
803
+     $("#content").append(alertwnd);
804
+
805
+     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
806
+     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
807
+     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
808
+
809
+     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
810
+     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
811
+     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
812
+  }
813
+
814
+  function confirmAlert(alertText) {
815
+
816
+     $("#alertMsgOverlay").remove();
817
+     $("#alertConfMessage").remove();
818
+
819
+     let alertwndcf = "<div id='alertConfMessage'>";
820
+     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
821
+     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
822
+     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
823
+     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
824
+     alertwndcf += "</div>";
825
+
826
+     $("#content").append("<div id='alertMsgOverlay'></div>");
827
+     $("#content").append(alertwndcf);
828
+
829
+     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
830
+     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
831
+     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
832
+
833
+     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
834
+     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
835
+  }
836
+
837
+});
Browse code

removed CHANGELOG.txt appinfo/info.xml appinfo/signature.json appinfo/routes.php css/style.css js/adminsettings.js js/deleteoldsms.js js/sendsms.js js/settings.js js/showsmstables.js lib/Controller/AuthorApiController.php lib/Controller/SmsrelentlessController.php lib/Service/SmsrelentlessService.php providers/Telnyx/lib/ApiResource.php

DoubleBastionAdmin authored on 15/07/2023 21:56:42
Showing 1 changed files
1 1
deleted file mode 100644
... ...
@@ -1,834 +0,0 @@
1
-/**
2
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
- *
4
- * @author Double Bastion LLC
5
- *
6
- * @license GNU AGPL version 3 or any later version
7
- *
8
- * This program is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
- * License as published by the Free Software Foundation; either
11
- * version 3 of the License, or any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
- *
18
- * You should have received a copy of the GNU Affero General Public
19
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- */
22
-
23
-$(document).ready(function() {
24
-
25
-  // Get admin settings
26
-  var userid = "<?php p($userId); ?>";
27
-  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
28
-
29
-  $.ajax({
30
-     method: 'GET',
31
-     url: baseUrlget + '/' + userid,
32
-     contentType: 'application/json',
33
-     success: function(settingsadm) {
34
-
35
-          $("#telapi_key").val(settingsadm.telapi_key);
36
-          $("#tel_pub_key").val(settingsadm.tel_pub_key);
37
-          $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
38
-          $("#telapi_url").val(settingsadm.telapi_url);
39
-          $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
40
-          $("#nexapi_key").val(settingsadm.nexapi_key);
41
-          $("#nexapi_secret").val(settingsadm.nexapi_secret);
42
-          $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
43
-          $("#nexapi_url").val(settingsadm.nexapi_url);
44
-          $("#twilapi_key").val(settingsadm.twilapi_key);
45
-          $("#twilapi_secret").val(settingsadm.twilapi_secret);
46
-          $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
47
-          $("#twilapi_url").val(settingsadm.twilapi_url);
48
-          $("#flowapi_key").val(settingsadm.flowapi_key);
49
-          $("#flowapi_secret").val(settingsadm.flowapi_secret);
50
-          $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
51
-          $("#flowapi_url").val(settingsadm.flowapi_url);
52
-          $("#tel_sender_name").val(settingsadm.tel_sender_name);
53
-          $("#nex_sender_name").val(settingsadm.nex_sender_name);
54
-          $("#twil_sender_name").val(settingsadm.twil_sender_name);
55
-
56
-          if (settingsadm.show_all_messages == 1) {
57
-              $("#showallmessages").attr("checked", true);
58
-          } else {
59
-              $("#showallmessages").attr("checked", false);
60
-          }
61
-
62
-          var crntadmDispName = settingsadm.admdisplayname;
63
-          var allRestrictions = settingsadm.restrictions;
64
-          var allGroups = settingsadm.allgroups;
65
-          var allUsers = settingsadm.allusers;
66
-          var allGroupswadm = settingsadm.allgroupswadm;
67
-          var allUserswadm = settingsadm.alluserswadm;
68
-          var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
69
-          var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
70
-          var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
71
-          var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
72
-          var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
73
-          var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
74
-          var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
75
-          var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
76
-
77
-          // List all the groups and users allowed to access the API keys, for each provider
78
-          if (tnxallowedgrp) {
79
-              var tnxallowedgrparr = tnxallowedgrp.split("|");
80
-              for (var g = 0; g < tnxallowedgrparr.length; g++) {
81
-                   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
82
-              }
83
-          }
84
-
85
-          if (tnxallowedusr) {
86
-              var tnxallowedusrarr = tnxallowedusr.split("|");
87
-              for (var g = 0; g < tnxallowedusrarr.length; g++) {
88
-                   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
89
-              }
90
-          }
91
-
92
-          if (plvallowedgrp) {
93
-              var plvallowedgrparr = plvallowedgrp.split("|");
94
-              for (var g = 0; g < plvallowedgrparr.length; g++) {
95
-                   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
96
-              }
97
-          }
98
-
99
-          if (plvallowedusr) {
100
-              var plvallowedusrarr = plvallowedusr.split("|");
101
-              for (var g = 0; g < plvallowedusrarr.length; g++) {
102
-                   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
103
-              }
104
-          }
105
-
106
-          if (twlallowedgrp) {
107
-              var twlallowedgrparr = twlallowedgrp.split("|");
108
-              for (var g = 0; g < twlallowedgrparr.length; g++) {
109
-                   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
110
-              }
111
-          }
112
-
113
-          if (twlallowedusr) {
114
-              var twlallowedusrarr = twlallowedusr.split("|");
115
-              for (var g = 0; g < twlallowedusrarr.length; g++) {
116
-                   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
117
-              }
118
-          }
119
-
120
-          if (flrallowedgrp) {
121
-              var flrallowedgrparr = flrallowedgrp.split("|");
122
-              for (var g = 0; g < flrallowedgrparr.length; g++) {
123
-                   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
124
-              }
125
-          }
126
-
127
-          if (flrallowedusr) {
128
-              var flrallowedusrarr = flrallowedusr.split("|");
129
-              for (var g = 0; g < flrallowedusrarr.length; g++) {
130
-                   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
131
-              }
132
-          }
133
-
134
-
135
-          // Create a list with all the available groups, excluding the admin group
136
-          var grpsListItemswadm = "";
137
-          $.each(allGroupswadm, function(key, value) {
138
-                 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
139
-          });
140
-
141
-          // Create a list with all the available users, excluding the admins
142
-          var usersListItemswadm = "";
143
-          $.each(allUserswadm, function(key, usrval) {
144
-                 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
145
-          });
146
-          
147
-
148
-          function showListsalwdk() {
149
-
150
-              // Append the list of available groups to the table of groups and users allowed to use the API keys
151
-              $('[id^="showakeyGrps-"]').click(function() {
152
-                 var crtid = $(this).attr("id").split("-")[1];
153
-                 $("#grpsadapik-"+ crtid).remove();
154
-                 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
155
-                 $("#adminOverlay").remove();
156
-                 $("#app-content").append("<div id='adminOverlay'></div>");
157
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
158
-
159
-                 $("#adminOverlay").click(function() { 
160
-                    $("#adminOverlay").remove();
161
-                    $("#grpsadapik-"+ crtid).remove();
162
-                    $("#usrsadapik-"+ crtid).remove();
163
-                 });
164
-
165
-                 // Select a group
166
-                 $(".groupsList").click(function() {
167
-                    var slctdGrp = $(this).text();
168
-                    $("#grpsadapik-"+ crtid).remove();
169
-                    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
170
-
171
-                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
172
-                        $("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
173
-                    } else { showAlert("That group has already been added!"); }
174
-
175
-                    // Remove a group from list
176
-                    $('[id^="rmvGrp-"]').click(function() {
177
-                       $(this).closest(".selectedGrps").remove();
178
-                    });
179
-                 });
180
-
181
-              });
182
-
183
-              // Append the list of available users to the table of groups and users allowed to use the API keys
184
-              $('[id^="showakeyUsrs-"]').click(function() {
185
-
186
-                 var crtidusr = $(this).attr("id").split("-")[1];
187
-                 $("#usrsadapik-"+ crtidusr).remove();
188
-                 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
189
-                 $("#adminOverlay").remove();
190
-                 $("#app-content").append("<div id='adminOverlay'></div>");
191
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
192
-
193
-                 $("#adminOverlay").click(function() { 
194
-                    $("#adminOverlay").remove(); 
195
-                    $("#grpsadapik-"+ crtidusr).remove();
196
-                    $("#usrsadapik-"+ crtidusr).remove();
197
-                 });
198
-
199
-                 // Select a user
200
-                 $(".usersList").click(function() {
201
-                    var slctdUsr = $(this).text();
202
-                    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
203
-
204
-                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
205
-                        $("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
206
-                    } else { showAlert("That user has already been added!"); }
207
-
208
-                    // Remove a user from list
209
-                    $('[id^="rmvUsr-"]').click(function() {
210
-                       $(this).closest(".selectedUsrs").remove();
211
-                    });
212
-                 });
213
-
214
-              });
215
-
216
-              // Remove a group from the list 
217
-              $('[id^="rmvGrp-"]').click(function() {
218
-                 $(this).closest(".selectedGrps").remove();
219
-              });
220
-
221
-              // Remove a user from the list
222
-              $('[id^="rmvUsr-"]').click(function() {
223
-                 $(this).closest(".selectedUsrs").remove();
224
-              });
225
-
226
-          }
227
-          showListsalwdk();
228
-
229
-
230
-          // Save the data
231
-          function saveAlwdRow() {
232
-             $('[id^="alwdrstsave-"]').unbind("click");
233
-             $('[id^="alwdrstsave-"]').click(function(event) {
234
-
235
-                 event.preventDefault();
236
-                 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
237
-                 
238
-                 if ($(this).attr("value") == "Save") {
239
-
240
-                     var selGroups = [];
241
-                     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
242
-                        selGroups.push($(this).text());
243
-                     });
244
-                     if (selGroups.length == 0) { selGroups.push(""); }
245
-
246
-                     var selUsers = [];
247
-                     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
248
-                        selUsers.push($(this).text());
249
-                     });
250
-                     if (selUsers.length == 0) { selUsers.push(""); }
251
-
252
-                     // Check if the access key fields have been left empty
253
-                     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
254
-                         showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
255
-                         return;
256
-                     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
257
-                         showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
258
-                         return;
259
-                     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
260
-                         showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
261
-                         return;
262
-                     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
263
-                         showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
264
-                         return;
265
-                     }
266
-
267
-                     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
268
-
269
-                     var alwddatatosend = { 
270
-                              userId: userid,
271
-                              groups: selGroups,
272
-                              users: selUsers,
273
-                              provider: crntprov
274
-                     };
275
-
276
-	             $.ajax({
277
-	                   method: 'PUT',
278
-	                   url: saveAlwdUrl + '/' + userid,
279
-	                   contentType: 'application/json',
280
-	                   data: JSON.stringify(alwddatatosend),
281
-                           success: function(messagesent) {
282
-                                        if (messagesent == 'success') {
283
-                                            showAlert('The allowed groups and users have been successfully saved to the database!');
284
-                                        } else if (messagesent != 'success' && messagesent != 'failure') {
285
-                                            showAlert(messagesent);
286
-                                        } else if (messagesent == 'failure') {
287
-                                            showAlert('Error while trying to save the allowed groups and users!');
288
-                                        }
289
-                           },
290
-	                   error: function() {
291
-		                        showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
292
-	                   }
293
-	             });
294
-
295
-                     $(this).attr("value", "Edit");
296
-
297
-                } else {
298
-
299
-                     $("#alwdrstsave-"+ crntprov).attr("value", "Save");
300
-                }
301
-
302
-             });
303
-          }
304
-          saveAlwdRow();
305
-
306
-
307
-
308
-          // Phone number restrictions
309
-
310
-          // Create a list with all the available groups
311
-          var grpsListItems = "";
312
-          $.each(allGroups, function(key, value) {
313
-                 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
314
-          });
315
-
316
-          // Create a list with all the available users
317
-          var usersListItems = "";
318
-          $.each(allUsers, function(key, usrval) {
319
-                 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
320
-          });
321
-
322
-
323
-          if (allRestrictions.length > 0) {
324
-              var restrNmb = allRestrictions.length;
325
-          } else {
326
-              var restrNmb = 0;
327
-          }
328
-
329
-
330
-	  // List the access restrictions for groups and users
331
-          if (restrNmb == 0) {
332
-
333
-              $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
334
-	      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
335
-
336
-          } else {
337
-
338
-	      for (k = 0; k < restrNmb; k++) {
339
-
340
-                   if (allRestrictions[k].groups) {
341
-                       var groupsfdbpre = allRestrictions[k].groups.split("|");
342
-                       var groupsfdb = "";
343
-                       for (var g = 0; g < groupsfdbpre.length; g++) {
344
-                            groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
345
-                       }
346
-                   } else { var groupsfdb = ""; }
347
-
348
-                   if (allRestrictions[k].users) {
349
-                       var usersfdbpre = allRestrictions[k].users.split("|");
350
-                       var usersfdb = "";
351
-                       for (var u = 0; u < usersfdbpre.length; u++) {
352
-                            usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
353
-                       }
354
-                   } else { var usersfdb = ""; }
355
-
356
-		   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
357
-              }
358
-              $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
359
-          }
360
-
361
-
362
-          // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
363
-          $("#phoneNumberTh").addClass('icon-loading');
364
-          var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
365
-          var numbersListItems = '';
366
-
367
-	  $.ajax({
368
-		  url: getnumbersUrl + '/' + userid,
369
-		  type: "POST",
370
-		  cache: false,
371
-		  processData: false,
372
-		  contentType: false,
373
-		  success: function(currentnmbrs) {
374
-
375
-                                    $("#phoneNumberTh").removeClass('icon-loading');
376
-
377
-				    // Create a list with all the available phone numbers
378
-                                    numbersListItems = "<option value='' selected>Select phone number</option>";
379
-
380
-				    $.each(currentnmbrs, function(key, indsmsnmb) {
381
-					   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
382
-				    });
383
-
384
-				    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
385
-
386
-				    // Append the list of available phone numbers
387
-				    $("#rstphn-"+ indRow).empty();
388
-				    $("#rstphn-"+ indRow).append(numbersListItems);
389
-        
390
-		  },
391
-		  error: function() {
392
-                                    $("#phoneNumberTh").removeClass('icon-loading'); 
393
-                                    showAlert("Error while attempting to retrieve the available phone numbers!");
394
-                  }
395
-          });
396
-
397
-
398
-          function showLists() {
399
-
400
-              // Append the list of available groups to the restrictions table
401
-              $('[id^="showGrps-"]').click(function() {
402
-                 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
403
-                 $("#grpL-"+ crtnmbr).remove();
404
-                 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
405
-                 $("#adminOverlay").remove();
406
-                 $("#app-content").append("<div id='adminOverlay'></div>");
407
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
408
-
409
-                 $("#adminOverlay").click(function() { 
410
-                    $("#adminOverlay").remove(); 
411
-                    $("#grpL-"+ crtnmbr).remove(); 
412
-                    $("#usrL-"+ crtnmbr).remove();
413
-                 });
414
-
415
-                 // Select a group
416
-                 $(".groupsList").click(function() {
417
-                    var slctdGrp = $(this).text();
418
-                    $("#grpL-"+ crtnmbr).remove();
419
-                    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
420
-
421
-                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
422
-                        $("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
423
-                    } else { showAlert("That group has already been added!"); }
424
-
425
-                    // Remove a group from list
426
-                    $('[id^="rmvGrp-"]').click(function() {
427
-                       $(this).closest(".selectedGrps").remove();
428
-                    });
429
-                 });
430
-
431
-              });
432
-
433
-              // Append the list of available users to the restrictions table
434
-              $('[id^="showUsr-"]').click(function() {
435
-
436
-                 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
437
-                 $("#usrL-"+ ctusrnmbr).remove();
438
-                 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
439
-                 $("#adminOverlay").remove();
440
-                 $("#app-content").append("<div id='adminOverlay'></div>");
441
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
442
-
443
-                 $("#adminOverlay").click(function() { 
444
-                    $("#adminOverlay").remove(); 
445
-                    $("#grpL-"+ ctusrnmbr).remove(); 
446
-                    $("#usrL-"+ ctusrnmbr).remove();
447
-                 });
448
-
449
-                 // Select a user
450
-                 $(".usersList").click(function() {
451
-                    var slctdUsr = $(this).text();
452
-                    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
453
-
454
-                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
455
-                        $("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
456
-                    } else { showAlert("That user has already been added!"); }
457
-
458
-                    // Remove a user from list
459
-                    $('[id^="rmvUsr-"]').click(function() {
460
-                       $(this).closest(".selectedUsrs").remove();
461
-                    });
462
-                 });
463
-
464
-              });
465
-
466
-              // Remove a group from the list 
467
-              $('[id^="rmvGrp-"]').click(function() {
468
-                 $(this).closest(".selectedGrps").remove();
469
-              });
470
-
471
-              // Remove a user from the list
472
-              $('[id^="rmvUsr-"]').click(function() {
473
-                 $(this).closest(".selectedUsrs").remove();
474
-              });
475
-
476
-          }
477
-          showLists();
478
-
479
-
480
-          // Save the data
481
-          function saveRestrRow() {
482
-             $('[id^="rstsave-"]').unbind("click");
483
-             $('[id^="rstsave-"]').click(function(event) {
484
-
485
-                 event.preventDefault();
486
-                 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
487
-
488
-                 if ($(this).attr("value") == "Save") {
489
-
490
-                     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
491
-                     var slctdGroups = [];
492
-                     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
493
-                        slctdGroups.push($(this).text());
494
-                     });
495
-                     var slctdUsers = [];
496
-                     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
497
-                        slctdUsers.push($(this).text());
498
-                     });
499
-
500
-                     if (phoneNmbr != '') {
501
-
502
-                       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
503
-
504
-                         var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
505
-
506
-                         var datatosend = { 
507
-                              userId: userid,
508
-                              savedByDsplname: crntadmDispName,
509
-                              phoneNumber: phoneNmbr,
510
-                              groups: slctdGroups,
511
-                              users: slctdUsers
512
-                         };
513
-
514
-	                 $.ajax({
515
-	                   method: 'PUT',
516
-	                   url: saveRestrUrl + '/' + userid,
517
-	                   contentType: 'application/json',
518
-	                   data: JSON.stringify(datatosend),
519
-                           success: function(messagetosend) {
520
-                                        if (messagetosend == 'success') {
521
-                                            showAlert('The restrictions have been successfully saved to the database!');
522
-                                        } else {
523
-                                            showAlert('Error while trying to save the restrictions!');
524
-                                        }
525
-                           },
526
-	                   error: function() {
527
-		                        showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
528
-	                   }
529
-	                 });
530
-
531
-                       } else { showAlert("You must select at least a group or a user in order to restrict the use of a phone number."); return; }
532
-
533
-                     } else { showAlert("Please select a phone number!"); return; }
534
-
535
-                     $(this).attr("value", "Edit");
536
-
537
-                } else {
538
-
539
-                     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
540
-                }
541
-
542
-             });
543
-          }
544
-          saveRestrRow();
545
-
546
-          // Remove a row
547
-          function removeRestrRow() {
548
-
549
-               $('[id^="rmRow-"]').click(function() {
550
-
551
-                  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
552
-                  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
553
-
554
-                  confirmAlert("Do you really want to remove this row from the database ?");
555
-
556
-                  $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
557
-
558
-                  $("#confirmOk").click(function() {
559
-
560
-                      $("#alertMsgOverlay").remove();
561
-                      $("#alertConfMessage").remove();
562
-
563
-                      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
564
-                      $.ajax({
565
-                           url: rmvRestrUrl + '/' + userid,
566
-                           method: "POST",
567
-                           dataType: "text",
568
-                           data: { phoneNumber: crntPhNmbr },
569
-                           success: function(delresult) {
570
-
571
-                                             if (delresult.indexOf("success") > -1) {
572
-                                                 showAlert("The restriction has been removed successfully!");
573
-                                                 $("#rstphn-"+ slctRowRmv).closest("tr").remove();
574
-                                             } else {
575
-                                                 showAlert("Error while trying to remove restriction data!");
576
-                                             }
577
-                           },
578
-                           error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
579
-                       });
580
-                  });
581
-               });
582
-          }
583
-          removeRestrRow();
584
-
585
-          // Add a new row
586
-	  $("#addRestrRow").click(function() {
587
-              if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
588
-                  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
589
-                  var indRowAdd = parseInt(lastrstAuth + 1);
590
-              } else { var indRowAdd = 0; }
591
-	      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
592
-              showLists();
593
-              saveRestrRow();
594
-              removeRestrRow();
595
-
596
-              // Check if the same phone number has been already restricted
597
-              $("#rstphn-"+ indRowAdd).change(function() {
598
-                 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
599
-                 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
600
-                 var phNmbrChck = 0;
601
-                 allPHoneRestr.each(function() {
602
-                    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
603
-                    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
604
-                 });
605
-
606
-                 if (phNmbrChck == 2) {
607
-                     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict.");
608
-                     $(this).val('');
609
-                     return;
610
-                 }
611
-              });
612
-	  });
613
-
614
-     },
615
-     error: function() {
616
-                showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
617
-     }
618
-  });
619
-
620
-
621
-
622
-  // Save admin settings
623
-  function randomStr(strlength) {
624
-        var fintext = "";
625
-        var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
626
-        for (var i = 0; i < strlength; i++) {
627
-             fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
628
-        }
629
-        return fintext;
630
-  }
631
-
632
-  $("#generate_tel_rcpt").on("click", function(event) {
633
-
634
-     var teltokenrec = randomStr(70);
635
-     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
636
-
637
-     $("#telapi_url_rec").val(telnyxwhurlrec);
638
-  });
639
-
640
-  $("#copyToClipboardtel").on("click", function(event) {
641
-     var $tempEl = $("<input>");
642
-     $("body").append($tempEl);
643
-     $tempEl.val($("#telapi_url_rec").val()).select();
644
-     document.execCommand("Copy");
645
-     $tempEl.remove();
646
-     showAlert("The link has been copied to your clipboard!");
647
-  });
648
-
649
-  $("#generate_tel_delrcpt").on("click", function(event) {
650
-
651
-     var teltoken = randomStr(70);
652
-     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
653
-
654
-     $("#telapi_url").val(telnyxwhurl);
655
-  });
656
-
657
-  $("#generate_nex_rcpt").on("click", function(event) {
658
-
659
-     var plivotokenrec = randomStr(70);
660
-     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
661
-
662
-     $("#nexapi_url_rec").val(plivowhurlrec);
663
-  });
664
-
665
-  $("#copyToClipboardnex").on("click", function(event) {
666
-     var $tempElpl = $("<input>");
667
-     $("body").append($tempElpl);
668
-     $tempElpl.val($("#nexapi_url_rec").val()).select();
669
-     document.execCommand("Copy");
670
-     $tempElpl.remove();
671
-     showAlert("The link has been copied to your clipboard!");
672
-  });
673
-
674
-  $("#generate_nex_delrcpt").on("click", function(event) {
675
-
676
-     var plivotoken = randomStr(70);
677
-     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
678
-
679
-     $("#nexapi_url").val(plivodrwhurl);
680
-  });
681
-
682
-  $("#generate_twil_rcpt").on("click", function(event) {
683
-
684
-     var twiltokenrec = randomStr(35);
685
-     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
686
-
687
-     $("#twilapi_url_rec").val(twilwhurlrec);
688
-  });
689
-
690
-  $("#copyToClipboardtwil").on("click", function(event) {
691
-     var $tempElpl = $("<input>");
692
-     $("body").append($tempElpl);
693
-     $tempElpl.val($("#twilapi_url_rec").val()).select();
694
-     document.execCommand("Copy");
695
-     $tempElpl.remove();
696
-     showAlert("The link has been copied to your clipboard!");
697
-  });
698
-
699
-  $("#generate_twil_delrcpt").on("click", function(event) {
700
-
701
-     var twiltoken = randomStr(35);
702
-     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
703
-
704
-     $("#twilapi_url").val(twildrwhurl);
705
-  });
706
-
707
-  $("#generate_flow_rcpt").on("click", function(event) {
708
-
709
-     var flowtokenrec = randomStr(70);
710
-     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
711
-
712
-     $("#flowapi_url_rec").val(flowwhurlrec);
713
-  });
714
-
715
-  $("#copyToClipboardflow").on("click", function(event) {
716
-     var $tempElpl = $("<input>");
717
-     $("body").append($tempElpl);
718
-     $tempElpl.val($("#flowapi_url_rec").val()).select();
719
-     document.execCommand("Copy");
720
-     $tempElpl.remove();
721
-     showAlert("The link has been copied to your clipboard!");
722
-  });
723
-
724
-  $("#generate_flow_delrcpt").on("click", function(event) {
725
-
726
-     var flowtoken = randomStr(70);
727
-     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
728
-
729
-     $("#flowapi_url").val(flowdrwhurl);
730
-  });
731
-
732
-
733
-  $("#save_admin_settings").on("click", function(event) {
734
-
735
-    event.preventDefault();
736
-    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
737
-
738
-    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
739
-
740
-    var showallmsgs = 0;
741
-    if ($("#showallmessages").is(':checked')) {
742
-        showallmsgs = 1;
743
-    }
744
-
745
-    var telsenderinit = $("#tel_sender_name").val();
746
-    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
747
-
748
-    var nexsenderinit = $("#nex_sender_name").val();
749
-    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
750
-
751
-    var twilsenderinit = $("#twil_sender_name").val();
752
-    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
753
-
754
-    var datatosave = {
755
-                      userId: userid,
756
-                      telapiKey: $("#telapi_key").val(),
757
-                      telPubKey: $("#tel_pub_key").val(),
758
-                      telapiUrlRec: $("#telapi_url_rec").val(),
759
-                      telapiUrl: $("#telapi_url").val(),
760
-                      messagingProfileId: $("#messaging_profile_id").val(),
761
-                      nexapiKey: $("#nexapi_key").val(),
762
-                      nexapiSecret: $("#nexapi_secret").val(),
763
-                      nexapiUrlRec: $("#nexapi_url_rec").val(),
764
-                      nexapiUrl: $("#nexapi_url").val(),
765
-                      twilapiKey: $("#twilapi_key").val(),
766
-                      twilapiSecret: $("#twilapi_secret").val(),
767
-                      twilapiUrlRec: $("#twilapi_url_rec").val(),
768
-                      twilapiUrl: $("#twilapi_url").val(),
769
-                      flowapiKey: $("#flowapi_key").val(),
770
-                      flowapiSecret: $("#flowapi_secret").val(),
771
-                      flowapiUrlRec: $("#flowapi_url_rec").val(),
772
-                      flowapiUrl: $("#flowapi_url").val(),
773
-                      telSenderName: telsenderproc,
774
-                      nexSenderName: nexsenderproc,
775
-                      twilSenderName: twilsenderproc,
776
-                      showAllMessages: showallmsgs
777
-    };
778
-
779
-
780
-    $.ajax({
781
-       method: 'PUT',
782
-       url: baseUrlsv + '/' + userid,
783
-       contentType: 'application/json',
784
-       data: JSON.stringify(datatosave),
785
-       success: function() {
786
-       },
787
-       error: function() {
788
-            showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
789
-       }
790
-    });
791
-
792
-  });
793
-
794
-  function showAlert(alertText) {
795
-
796
-     let alertwnd = "<div id='alertMessage'>";
797
-     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
798
-     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
799
-     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
800
-     alertwnd += "</div>";
801
-
802
-     $("#content").append("<div id='alertMsgOverlay'></div>");
803
-     $("#content").append(alertwnd);
804
-
805
-     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
806
-     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
807
-     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
808
-
809
-     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
810
-     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
811
-     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
812
-  }
813
-
814
-  function confirmAlert(alertText) {
815
-
816
-     let alertwndcf = "<div id='alertConfMessage'>";
817
-     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
818
-     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
819
-     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
820
-     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
821
-     alertwndcf += "</div>";
822
-
823
-     $("#content").append("<div id='alertMsgOverlay'></div>");
824
-     $("#content").append(alertwndcf);
825
-
826
-     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
827
-     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
828
-     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
829
-
830
-     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
831
-     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
832
-  }
833
-
834
-});
Browse code

added CHANGELOG.txt appinfo/info.xml appinfo/signature.json css/style.css img/closewnd.svg js/adminsettings.js js/deleteoldsms.js ...

DoubleBastionAdmin authored on 23/05/2023 19:00:54
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,834 @@
1
+/**
2
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
+ *
4
+ * @author Double Bastion LLC
5
+ *
6
+ * @license GNU AGPL version 3 or any later version
7
+ *
8
+ * This program is free software; you can redistribute it and/or
9
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
+ * License as published by the Free Software Foundation; either
11
+ * version 3 of the License, or any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
+ *
18
+ * You should have received a copy of the GNU Affero General Public
19
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+$(document).ready(function() {
24
+
25
+  // Get admin settings
26
+  var userid = "<?php p($userId); ?>";
27
+  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
28
+
29
+  $.ajax({
30
+     method: 'GET',
31
+     url: baseUrlget + '/' + userid,
32
+     contentType: 'application/json',
33
+     success: function(settingsadm) {
34
+
35
+          $("#telapi_key").val(settingsadm.telapi_key);
36
+          $("#tel_pub_key").val(settingsadm.tel_pub_key);
37
+          $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
38
+          $("#telapi_url").val(settingsadm.telapi_url);
39
+          $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
40
+          $("#nexapi_key").val(settingsadm.nexapi_key);
41
+          $("#nexapi_secret").val(settingsadm.nexapi_secret);
42
+          $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
43
+          $("#nexapi_url").val(settingsadm.nexapi_url);
44
+          $("#twilapi_key").val(settingsadm.twilapi_key);
45
+          $("#twilapi_secret").val(settingsadm.twilapi_secret);
46
+          $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
47
+          $("#twilapi_url").val(settingsadm.twilapi_url);
48
+          $("#flowapi_key").val(settingsadm.flowapi_key);
49
+          $("#flowapi_secret").val(settingsadm.flowapi_secret);
50
+          $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
51
+          $("#flowapi_url").val(settingsadm.flowapi_url);
52
+          $("#tel_sender_name").val(settingsadm.tel_sender_name);
53
+          $("#nex_sender_name").val(settingsadm.nex_sender_name);
54
+          $("#twil_sender_name").val(settingsadm.twil_sender_name);
55
+
56
+          if (settingsadm.show_all_messages == 1) {
57
+              $("#showallmessages").attr("checked", true);
58
+          } else {
59
+              $("#showallmessages").attr("checked", false);
60
+          }
61
+
62
+          var crntadmDispName = settingsadm.admdisplayname;
63
+          var allRestrictions = settingsadm.restrictions;
64
+          var allGroups = settingsadm.allgroups;
65
+          var allUsers = settingsadm.allusers;
66
+          var allGroupswadm = settingsadm.allgroupswadm;
67
+          var allUserswadm = settingsadm.alluserswadm;
68
+          var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
69
+          var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
70
+          var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
71
+          var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
72
+          var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
73
+          var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
74
+          var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
75
+          var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
76
+
77
+          // List all the groups and users allowed to access the API keys, for each provider
78
+          if (tnxallowedgrp) {
79
+              var tnxallowedgrparr = tnxallowedgrp.split("|");
80
+              for (var g = 0; g < tnxallowedgrparr.length; g++) {
81
+                   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
82
+              }
83
+          }
84
+
85
+          if (tnxallowedusr) {
86
+              var tnxallowedusrarr = tnxallowedusr.split("|");
87
+              for (var g = 0; g < tnxallowedusrarr.length; g++) {
88
+                   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
89
+              }
90
+          }
91
+
92
+          if (plvallowedgrp) {
93
+              var plvallowedgrparr = plvallowedgrp.split("|");
94
+              for (var g = 0; g < plvallowedgrparr.length; g++) {
95
+                   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
96
+              }
97
+          }
98
+
99
+          if (plvallowedusr) {
100
+              var plvallowedusrarr = plvallowedusr.split("|");
101
+              for (var g = 0; g < plvallowedusrarr.length; g++) {
102
+                   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
103
+              }
104
+          }
105
+
106
+          if (twlallowedgrp) {
107
+              var twlallowedgrparr = twlallowedgrp.split("|");
108
+              for (var g = 0; g < twlallowedgrparr.length; g++) {
109
+                   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
110
+              }
111
+          }
112
+
113
+          if (twlallowedusr) {
114
+              var twlallowedusrarr = twlallowedusr.split("|");
115
+              for (var g = 0; g < twlallowedusrarr.length; g++) {
116
+                   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
117
+              }
118
+          }
119
+
120
+          if (flrallowedgrp) {
121
+              var flrallowedgrparr = flrallowedgrp.split("|");
122
+              for (var g = 0; g < flrallowedgrparr.length; g++) {
123
+                   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
124
+              }
125
+          }
126
+
127
+          if (flrallowedusr) {
128
+              var flrallowedusrarr = flrallowedusr.split("|");
129
+              for (var g = 0; g < flrallowedusrarr.length; g++) {
130
+                   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
131
+              }
132
+          }
133
+
134
+
135
+          // Create a list with all the available groups, excluding the admin group
136
+          var grpsListItemswadm = "";
137
+          $.each(allGroupswadm, function(key, value) {
138
+                 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
139
+          });
140
+
141
+          // Create a list with all the available users, excluding the admins
142
+          var usersListItemswadm = "";
143
+          $.each(allUserswadm, function(key, usrval) {
144
+                 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
145
+          });
146
+          
147
+
148
+          function showListsalwdk() {
149
+
150
+              // Append the list of available groups to the table of groups and users allowed to use the API keys
151
+              $('[id^="showakeyGrps-"]').click(function() {
152
+                 var crtid = $(this).attr("id").split("-")[1];
153
+                 $("#grpsadapik-"+ crtid).remove();
154
+                 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
155
+                 $("#adminOverlay").remove();
156
+                 $("#app-content").append("<div id='adminOverlay'></div>");
157
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
158
+
159
+                 $("#adminOverlay").click(function() { 
160
+                    $("#adminOverlay").remove();
161
+                    $("#grpsadapik-"+ crtid).remove();
162
+                    $("#usrsadapik-"+ crtid).remove();
163
+                 });
164
+
165
+                 // Select a group
166
+                 $(".groupsList").click(function() {
167
+                    var slctdGrp = $(this).text();
168
+                    $("#grpsadapik-"+ crtid).remove();
169
+                    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
170
+
171
+                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
172
+                        $("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
173
+                    } else { showAlert("That group has already been added!"); }
174
+
175
+                    // Remove a group from list
176
+                    $('[id^="rmvGrp-"]').click(function() {
177
+                       $(this).closest(".selectedGrps").remove();
178
+                    });
179
+                 });
180
+
181
+              });
182
+
183
+              // Append the list of available users to the table of groups and users allowed to use the API keys
184
+              $('[id^="showakeyUsrs-"]').click(function() {
185
+
186
+                 var crtidusr = $(this).attr("id").split("-")[1];
187
+                 $("#usrsadapik-"+ crtidusr).remove();
188
+                 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
189
+                 $("#adminOverlay").remove();
190
+                 $("#app-content").append("<div id='adminOverlay'></div>");
191
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
192
+
193
+                 $("#adminOverlay").click(function() { 
194
+                    $("#adminOverlay").remove(); 
195
+                    $("#grpsadapik-"+ crtidusr).remove();
196
+                    $("#usrsadapik-"+ crtidusr).remove();
197
+                 });
198
+
199
+                 // Select a user
200
+                 $(".usersList").click(function() {
201
+                    var slctdUsr = $(this).text();
202
+                    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
203
+
204
+                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
205
+                        $("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
206
+                    } else { showAlert("That user has already been added!"); }
207
+
208
+                    // Remove a user from list
209
+                    $('[id^="rmvUsr-"]').click(function() {
210
+                       $(this).closest(".selectedUsrs").remove();
211
+                    });
212
+                 });
213
+
214
+              });
215
+
216
+              // Remove a group from the list 
217
+              $('[id^="rmvGrp-"]').click(function() {
218
+                 $(this).closest(".selectedGrps").remove();
219
+              });
220
+
221
+              // Remove a user from the list
222
+              $('[id^="rmvUsr-"]').click(function() {
223
+                 $(this).closest(".selectedUsrs").remove();
224
+              });
225
+
226
+          }
227
+          showListsalwdk();
228
+
229
+
230
+          // Save the data
231
+          function saveAlwdRow() {
232
+             $('[id^="alwdrstsave-"]').unbind("click");
233
+             $('[id^="alwdrstsave-"]').click(function(event) {
234
+
235
+                 event.preventDefault();
236
+                 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
237
+                 
238
+                 if ($(this).attr("value") == "Save") {
239
+
240
+                     var selGroups = [];
241
+                     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
242
+                        selGroups.push($(this).text());
243
+                     });
244
+                     if (selGroups.length == 0) { selGroups.push(""); }
245
+
246
+                     var selUsers = [];
247
+                     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
248
+                        selUsers.push($(this).text());
249
+                     });
250
+                     if (selUsers.length == 0) { selUsers.push(""); }
251
+
252
+                     // Check if the access key fields have been left empty
253
+                     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
254
+                         showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
255
+                         return;
256
+                     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
257
+                         showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
258
+                         return;
259
+                     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
260
+                         showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
261
+                         return;
262
+                     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
263
+                         showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
264
+                         return;
265
+                     }
266
+
267
+                     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
268
+
269
+                     var alwddatatosend = { 
270
+                              userId: userid,
271
+                              groups: selGroups,
272
+                              users: selUsers,
273
+                              provider: crntprov
274
+                     };
275
+
276
+	             $.ajax({
277
+	                   method: 'PUT',
278
+	                   url: saveAlwdUrl + '/' + userid,
279
+	                   contentType: 'application/json',
280
+	                   data: JSON.stringify(alwddatatosend),
281
+                           success: function(messagesent) {
282
+                                        if (messagesent == 'success') {
283
+                                            showAlert('The allowed groups and users have been successfully saved to the database!');
284
+                                        } else if (messagesent != 'success' && messagesent != 'failure') {
285
+                                            showAlert(messagesent);
286
+                                        } else if (messagesent == 'failure') {
287
+                                            showAlert('Error while trying to save the allowed groups and users!');
288
+                                        }
289
+                           },
290
+	                   error: function() {
291
+		                        showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
292
+	                   }
293
+	             });
294
+
295
+                     $(this).attr("value", "Edit");
296
+
297
+                } else {
298
+
299
+                     $("#alwdrstsave-"+ crntprov).attr("value", "Save");
300
+                }
301
+
302
+             });
303
+          }
304
+          saveAlwdRow();
305
+
306
+
307
+
308
+          // Phone number restrictions
309
+
310
+          // Create a list with all the available groups
311
+          var grpsListItems = "";
312
+          $.each(allGroups, function(key, value) {
313
+                 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
314
+          });
315
+
316
+          // Create a list with all the available users
317
+          var usersListItems = "";
318
+          $.each(allUsers, function(key, usrval) {
319
+                 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
320
+          });
321
+
322
+
323
+          if (allRestrictions.length > 0) {
324
+              var restrNmb = allRestrictions.length;
325
+          } else {
326
+              var restrNmb = 0;
327
+          }
328
+
329
+
330
+	  // List the access restrictions for groups and users
331
+          if (restrNmb == 0) {
332
+
333
+              $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
334
+	      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
335
+
336
+          } else {
337
+
338
+	      for (k = 0; k < restrNmb; k++) {
339
+
340
+                   if (allRestrictions[k].groups) {
341
+                       var groupsfdbpre = allRestrictions[k].groups.split("|");
342
+                       var groupsfdb = "";
343
+                       for (var g = 0; g < groupsfdbpre.length; g++) {
344
+                            groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
345
+                       }
346
+                   } else { var groupsfdb = ""; }
347
+
348
+                   if (allRestrictions[k].users) {
349
+                       var usersfdbpre = allRestrictions[k].users.split("|");
350
+                       var usersfdb = "";
351
+                       for (var u = 0; u < usersfdbpre.length; u++) {
352
+                            usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
353
+                       }
354
+                   } else { var usersfdb = ""; }
355
+
356
+		   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
357
+              }
358
+              $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
359
+          }
360
+
361
+
362
+          // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
363
+          $("#phoneNumberTh").addClass('icon-loading');
364
+          var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
365
+          var numbersListItems = '';
366
+
367
+	  $.ajax({
368
+		  url: getnumbersUrl + '/' + userid,
369
+		  type: "POST",
370
+		  cache: false,
371
+		  processData: false,
372
+		  contentType: false,
373
+		  success: function(currentnmbrs) {
374
+
375
+                                    $("#phoneNumberTh").removeClass('icon-loading');
376
+
377
+				    // Create a list with all the available phone numbers
378
+                                    numbersListItems = "<option value='' selected>Select phone number</option>";
379
+
380
+				    $.each(currentnmbrs, function(key, indsmsnmb) {
381
+					   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
382
+				    });
383
+
384
+				    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
385
+
386
+				    // Append the list of available phone numbers
387
+				    $("#rstphn-"+ indRow).empty();
388
+				    $("#rstphn-"+ indRow).append(numbersListItems);
389
+        
390
+		  },
391
+		  error: function() {
392
+                                    $("#phoneNumberTh").removeClass('icon-loading'); 
393
+                                    showAlert("Error while attempting to retrieve the available phone numbers!");
394
+                  }
395
+          });
396
+
397
+
398
+          function showLists() {
399
+
400
+              // Append the list of available groups to the restrictions table
401
+              $('[id^="showGrps-"]').click(function() {
402
+                 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
403
+                 $("#grpL-"+ crtnmbr).remove();
404
+                 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
405
+                 $("#adminOverlay").remove();
406
+                 $("#app-content").append("<div id='adminOverlay'></div>");
407
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
408
+
409
+                 $("#adminOverlay").click(function() { 
410
+                    $("#adminOverlay").remove(); 
411
+                    $("#grpL-"+ crtnmbr).remove(); 
412
+                    $("#usrL-"+ crtnmbr).remove();
413
+                 });
414
+
415
+                 // Select a group
416
+                 $(".groupsList").click(function() {
417
+                    var slctdGrp = $(this).text();
418
+                    $("#grpL-"+ crtnmbr).remove();
419
+                    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
420
+
421
+                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
422
+                        $("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
423
+                    } else { showAlert("That group has already been added!"); }
424
+
425
+                    // Remove a group from list
426
+                    $('[id^="rmvGrp-"]').click(function() {
427
+                       $(this).closest(".selectedGrps").remove();
428
+                    });
429
+                 });
430
+
431
+              });
432
+
433
+              // Append the list of available users to the restrictions table
434
+              $('[id^="showUsr-"]').click(function() {
435
+
436
+                 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
437
+                 $("#usrL-"+ ctusrnmbr).remove();
438
+                 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
439
+                 $("#adminOverlay").remove();
440
+                 $("#app-content").append("<div id='adminOverlay'></div>");
441
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
442
+
443
+                 $("#adminOverlay").click(function() { 
444
+                    $("#adminOverlay").remove(); 
445
+                    $("#grpL-"+ ctusrnmbr).remove(); 
446
+                    $("#usrL-"+ ctusrnmbr).remove();
447
+                 });
448
+
449
+                 // Select a user
450
+                 $(".usersList").click(function() {
451
+                    var slctdUsr = $(this).text();
452
+                    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
453
+
454
+                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
455
+                        $("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
456
+                    } else { showAlert("That user has already been added!"); }
457
+
458
+                    // Remove a user from list
459
+                    $('[id^="rmvUsr-"]').click(function() {
460
+                       $(this).closest(".selectedUsrs").remove();
461
+                    });
462
+                 });
463
+
464
+              });
465
+
466
+              // Remove a group from the list 
467
+              $('[id^="rmvGrp-"]').click(function() {
468
+                 $(this).closest(".selectedGrps").remove();
469
+              });
470
+
471
+              // Remove a user from the list
472
+              $('[id^="rmvUsr-"]').click(function() {
473
+                 $(this).closest(".selectedUsrs").remove();
474
+              });
475
+
476
+          }
477
+          showLists();
478
+
479
+
480
+          // Save the data
481
+          function saveRestrRow() {
482
+             $('[id^="rstsave-"]').unbind("click");
483
+             $('[id^="rstsave-"]').click(function(event) {
484
+
485
+                 event.preventDefault();
486
+                 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
487
+
488
+                 if ($(this).attr("value") == "Save") {
489
+
490
+                     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
491
+                     var slctdGroups = [];
492
+                     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
493
+                        slctdGroups.push($(this).text());
494
+                     });
495
+                     var slctdUsers = [];
496
+                     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
497
+                        slctdUsers.push($(this).text());
498
+                     });
499
+
500
+                     if (phoneNmbr != '') {
501
+
502
+                       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
503
+
504
+                         var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
505
+
506
+                         var datatosend = { 
507
+                              userId: userid,
508
+                              savedByDsplname: crntadmDispName,
509
+                              phoneNumber: phoneNmbr,
510
+                              groups: slctdGroups,
511
+                              users: slctdUsers
512
+                         };
513
+
514
+	                 $.ajax({
515
+	                   method: 'PUT',
516
+	                   url: saveRestrUrl + '/' + userid,
517
+	                   contentType: 'application/json',
518
+	                   data: JSON.stringify(datatosend),
519
+                           success: function(messagetosend) {
520
+                                        if (messagetosend == 'success') {
521
+                                            showAlert('The restrictions have been successfully saved to the database!');
522
+                                        } else {
523
+                                            showAlert('Error while trying to save the restrictions!');
524
+                                        }
525
+                           },
526
+	                   error: function() {
527
+		                        showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
528
+	                   }
529
+	                 });
530
+
531
+                       } else { showAlert("You must select at least a group or a user in order to restrict the use of a phone number."); return; }
532
+
533
+                     } else { showAlert("Please select a phone number!"); return; }
534
+
535
+                     $(this).attr("value", "Edit");
536
+
537
+                } else {
538
+
539
+                     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
540
+                }
541
+
542
+             });
543
+          }
544
+          saveRestrRow();
545
+
546
+          // Remove a row
547
+          function removeRestrRow() {
548
+
549
+               $('[id^="rmRow-"]').click(function() {
550
+
551
+                  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
552
+                  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
553
+
554
+                  confirmAlert("Do you really want to remove this row from the database ?");
555
+
556
+                  $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
557
+
558
+                  $("#confirmOk").click(function() {
559
+
560
+                      $("#alertMsgOverlay").remove();
561
+                      $("#alertConfMessage").remove();
562
+
563
+                      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
564
+                      $.ajax({
565
+                           url: rmvRestrUrl + '/' + userid,
566
+                           method: "POST",
567
+                           dataType: "text",
568
+                           data: { phoneNumber: crntPhNmbr },
569
+                           success: function(delresult) {
570
+
571
+                                             if (delresult.indexOf("success") > -1) {
572
+                                                 showAlert("The restriction has been removed successfully!");
573
+                                                 $("#rstphn-"+ slctRowRmv).closest("tr").remove();
574
+                                             } else {
575
+                                                 showAlert("Error while trying to remove restriction data!");
576
+                                             }
577
+                           },
578
+                           error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
579
+                       });
580
+                  });
581
+               });
582
+          }
583
+          removeRestrRow();
584
+
585
+          // Add a new row
586
+	  $("#addRestrRow").click(function() {
587
+              if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
588
+                  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
589
+                  var indRowAdd = parseInt(lastrstAuth + 1);
590
+              } else { var indRowAdd = 0; }
591
+	      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
592
+              showLists();
593
+              saveRestrRow();
594
+              removeRestrRow();
595
+
596
+              // Check if the same phone number has been already restricted
597
+              $("#rstphn-"+ indRowAdd).change(function() {
598
+                 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
599
+                 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
600
+                 var phNmbrChck = 0;
601
+                 allPHoneRestr.each(function() {
602
+                    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
603
+                    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
604
+                 });
605
+
606
+                 if (phNmbrChck == 2) {
607
+                     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict.");
608
+                     $(this).val('');
609
+                     return;
610
+                 }
611
+              });
612
+	  });
613
+
614
+     },
615
+     error: function() {
616
+                showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
617
+     }
618
+  });
619
+
620
+
621
+
622
+  // Save admin settings
623
+  function randomStr(strlength) {
624
+        var fintext = "";
625
+        var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
626
+        for (var i = 0; i < strlength; i++) {
627
+             fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
628
+        }
629
+        return fintext;
630
+  }
631
+
632
+  $("#generate_tel_rcpt").on("click", function(event) {
633
+
634
+     var teltokenrec = randomStr(70);
635
+     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
636
+
637
+     $("#telapi_url_rec").val(telnyxwhurlrec);
638
+  });
639
+
640
+  $("#copyToClipboardtel").on("click", function(event) {
641
+     var $tempEl = $("<input>");
642
+     $("body").append($tempEl);
643
+     $tempEl.val($("#telapi_url_rec").val()).select();
644
+     document.execCommand("Copy");
645
+     $tempEl.remove();
646
+     showAlert("The link has been copied to your clipboard!");
647
+  });
648
+
649
+  $("#generate_tel_delrcpt").on("click", function(event) {
650
+
651
+     var teltoken = randomStr(70);
652
+     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
653
+
654
+     $("#telapi_url").val(telnyxwhurl);
655
+  });
656
+
657
+  $("#generate_nex_rcpt").on("click", function(event) {
658
+
659
+     var plivotokenrec = randomStr(70);
660
+     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
661
+
662
+     $("#nexapi_url_rec").val(plivowhurlrec);
663
+  });
664
+
665
+  $("#copyToClipboardnex").on("click", function(event) {
666
+     var $tempElpl = $("<input>");
667
+     $("body").append($tempElpl);
668
+     $tempElpl.val($("#nexapi_url_rec").val()).select();
669
+     document.execCommand("Copy");
670
+     $tempElpl.remove();
671
+     showAlert("The link has been copied to your clipboard!");
672
+  });
673
+
674
+  $("#generate_nex_delrcpt").on("click", function(event) {
675
+
676
+     var plivotoken = randomStr(70);
677
+     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
678
+
679
+     $("#nexapi_url").val(plivodrwhurl);
680
+  });
681
+
682
+  $("#generate_twil_rcpt").on("click", function(event) {
683
+
684
+     var twiltokenrec = randomStr(35);
685
+     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
686
+
687
+     $("#twilapi_url_rec").val(twilwhurlrec);
688
+  });
689
+
690
+  $("#copyToClipboardtwil").on("click", function(event) {
691
+     var $tempElpl = $("<input>");
692
+     $("body").append($tempElpl);
693
+     $tempElpl.val($("#twilapi_url_rec").val()).select();
694
+     document.execCommand("Copy");
695
+     $tempElpl.remove();
696
+     showAlert("The link has been copied to your clipboard!");
697
+  });
698
+
699
+  $("#generate_twil_delrcpt").on("click", function(event) {
700
+
701
+     var twiltoken = randomStr(35);
702
+     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
703
+
704
+     $("#twilapi_url").val(twildrwhurl);
705
+  });
706
+
707
+  $("#generate_flow_rcpt").on("click", function(event) {
708
+
709
+     var flowtokenrec = randomStr(70);
710
+     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
711
+
712
+     $("#flowapi_url_rec").val(flowwhurlrec);
713
+  });
714
+
715
+  $("#copyToClipboardflow").on("click", function(event) {
716
+     var $tempElpl = $("<input>");
717
+     $("body").append($tempElpl);
718
+     $tempElpl.val($("#flowapi_url_rec").val()).select();
719
+     document.execCommand("Copy");
720
+     $tempElpl.remove();
721
+     showAlert("The link has been copied to your clipboard!");
722
+  });
723
+
724
+  $("#generate_flow_delrcpt").on("click", function(event) {
725
+
726
+     var flowtoken = randomStr(70);
727
+     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
728
+
729
+     $("#flowapi_url").val(flowdrwhurl);
730
+  });
731
+
732
+
733
+  $("#save_admin_settings").on("click", function(event) {
734
+
735
+    event.preventDefault();
736
+    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
737
+
738
+    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
739
+
740
+    var showallmsgs = 0;
741
+    if ($("#showallmessages").is(':checked')) {
742
+        showallmsgs = 1;
743
+    }
744
+
745
+    var telsenderinit = $("#tel_sender_name").val();
746
+    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
747
+
748
+    var nexsenderinit = $("#nex_sender_name").val();
749
+    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
750
+
751
+    var twilsenderinit = $("#twil_sender_name").val();
752
+    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
753
+
754
+    var datatosave = {
755
+                      userId: userid,
756
+                      telapiKey: $("#telapi_key").val(),
757
+                      telPubKey: $("#tel_pub_key").val(),
758
+                      telapiUrlRec: $("#telapi_url_rec").val(),
759
+                      telapiUrl: $("#telapi_url").val(),
760
+                      messagingProfileId: $("#messaging_profile_id").val(),
761
+                      nexapiKey: $("#nexapi_key").val(),
762
+                      nexapiSecret: $("#nexapi_secret").val(),
763
+                      nexapiUrlRec: $("#nexapi_url_rec").val(),
764
+                      nexapiUrl: $("#nexapi_url").val(),
765
+                      twilapiKey: $("#twilapi_key").val(),
766
+                      twilapiSecret: $("#twilapi_secret").val(),
767
+                      twilapiUrlRec: $("#twilapi_url_rec").val(),
768
+                      twilapiUrl: $("#twilapi_url").val(),
769
+                      flowapiKey: $("#flowapi_key").val(),
770
+                      flowapiSecret: $("#flowapi_secret").val(),
771
+                      flowapiUrlRec: $("#flowapi_url_rec").val(),
772
+                      flowapiUrl: $("#flowapi_url").val(),
773
+                      telSenderName: telsenderproc,
774
+                      nexSenderName: nexsenderproc,
775
+                      twilSenderName: twilsenderproc,
776
+                      showAllMessages: showallmsgs
777
+    };
778
+
779
+
780
+    $.ajax({
781
+       method: 'PUT',
782
+       url: baseUrlsv + '/' + userid,
783
+       contentType: 'application/json',
784
+       data: JSON.stringify(datatosave),
785
+       success: function() {
786
+       },
787
+       error: function() {
788
+            showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
789
+       }
790
+    });
791
+
792
+  });
793
+
794
+  function showAlert(alertText) {
795
+
796
+     let alertwnd = "<div id='alertMessage'>";
797
+     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
798
+     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
799
+     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
800
+     alertwnd += "</div>";
801
+
802
+     $("#content").append("<div id='alertMsgOverlay'></div>");
803
+     $("#content").append(alertwnd);
804
+
805
+     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
806
+     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
807
+     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
808
+
809
+     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
810
+     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
811
+     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
812
+  }
813
+
814
+  function confirmAlert(alertText) {
815
+
816
+     let alertwndcf = "<div id='alertConfMessage'>";
817
+     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
818
+     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
819
+     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
820
+     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
821
+     alertwndcf += "</div>";
822
+
823
+     $("#content").append("<div id='alertMsgOverlay'></div>");
824
+     $("#content").append(alertwndcf);
825
+
826
+     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
827
+     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
828
+     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
829
+
830
+     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
831
+     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
832
+  }
833
+
834
+});
Browse code

removed CHANGELOG.txt appinfo/info.xml appinfo/signature.json css/style.css img/closewnd.svg ...

DoubleBastionAdmin authored on 23/05/2023 18:50:19
Showing 1 changed files
1 1
deleted file mode 100644
... ...
@@ -1,828 +0,0 @@
1
-/**
2
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
- *
4
- * @author Double Bastion LLC
5
- *
6
- * @license GNU AGPL version 3 or any later version
7
- *
8
- * This program is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
- * License as published by the Free Software Foundation; either
11
- * version 3 of the License, or any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
- *
18
- * You should have received a copy of the GNU Affero General Public
19
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- */
22
-
23
-$(document).ready(function() {
24
-
25
-  // Get admin settings
26
-  var userid = "<?php p($userId); ?>";
27
-  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
28
-
29
-  $.ajax({
30
-     method: 'GET',
31
-     url: baseUrlget + '/' + userid,
32
-     contentType: 'application/json',
33
-     success: function(settingsadm) {
34
-
35
-          $("#telapi_key").val(settingsadm.telapi_key);
36
-          $("#tel_pub_key").val(settingsadm.tel_pub_key);
37
-          $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
38
-          $("#telapi_url").val(settingsadm.telapi_url);
39
-          $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
40
-          $("#nexapi_key").val(settingsadm.nexapi_key);
41
-          $("#nexapi_secret").val(settingsadm.nexapi_secret);
42
-          $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
43
-          $("#nexapi_url").val(settingsadm.nexapi_url);
44
-          $("#twilapi_key").val(settingsadm.twilapi_key);
45
-          $("#twilapi_secret").val(settingsadm.twilapi_secret);
46
-          $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
47
-          $("#twilapi_url").val(settingsadm.twilapi_url);
48
-          $("#flowapi_key").val(settingsadm.flowapi_key);
49
-          $("#flowapi_secret").val(settingsadm.flowapi_secret);
50
-          $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
51
-          $("#flowapi_url").val(settingsadm.flowapi_url);
52
-          $("#tel_sender_name").val(settingsadm.tel_sender_name);
53
-          $("#nex_sender_name").val(settingsadm.nex_sender_name);
54
-          $("#twil_sender_name").val(settingsadm.twil_sender_name);
55
-/*
56
-          $("#messagesperpage").val(settingsadm.messagesperpage);
57
-
58
-          if (settingsadm.get_notify == 1) {
59
-              $("#get_notify").attr('checked', true);
60
-          } else {
61
-              $("#get_notify").attr('checked', false);
62
-          }
63
-
64
-          $("#notification_email").val(settingsadm.notification_email);
65
-
66
-          if (settingsadm.getsmsinemail == 1) {
67
-              $("#includesmsinemail").attr('checked', true);
68
-          } else {
69
-              $("#includesmsinemail").attr('checked', false);
70
-          }
71
-
72
-          if (settingsadm.show_display_names == 1) {
73
-              $("#showdisplaynames").attr('checked', true);
74
-          } else {
75
-              $("#showdisplaynames").attr('checked', false);
76
-          }
77
-*/
78
-          if (settingsadm.show_all_messages == 1) {
79
-              $("#showallmessages").attr("checked", true);
80
-          } else {
81
-              $("#showallmessages").attr("checked", false);
82
-          }
83
-
84
-          var crntadmDispName = settingsadm.admdisplayname;
85
-          var allRestrictions = settingsadm.restrictions;
86
-          var allGroups = settingsadm.allgroups;
87
-          var allUsers = settingsadm.allusers;
88
-          var allGroupswadm = settingsadm.allgroupswadm;
89
-          var allUserswadm = settingsadm.alluserswadm;
90
-          var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
91
-          var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
92
-          var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
93
-          var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
94
-          var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
95
-          var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
96
-          var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
97
-          var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
98
-
99
-          // List all the groups and users allowed to access the API keys, for each provider
100
-          if (tnxallowedgrp) {
101
-              var tnxallowedgrparr = tnxallowedgrp.split("|");
102
-              for (var g = 0; g < tnxallowedgrparr.length; g++) {
103
-                   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
104
-              }
105
-          }
106
-
107
-          if (tnxallowedusr) {
108
-              var tnxallowedusrarr = tnxallowedusr.split("|");
109
-              for (var g = 0; g < tnxallowedusrarr.length; g++) {
110
-                   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
111
-              }
112
-          }
113
-
114
-          if (plvallowedgrp) {
115
-              var plvallowedgrparr = plvallowedgrp.split("|");
116
-              for (var g = 0; g < plvallowedgrparr.length; g++) {
117
-                   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
118
-              }
119
-          }
120
-
121
-          if (plvallowedusr) {
122
-              var plvallowedusrarr = plvallowedusr.split("|");
123
-              for (var g = 0; g < plvallowedusrarr.length; g++) {
124
-                   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
125
-              }
126
-          }
127
-
128
-          if (twlallowedgrp) {
129
-              var twlallowedgrparr = twlallowedgrp.split("|");
130
-              for (var g = 0; g < twlallowedgrparr.length; g++) {
131
-                   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
132
-              }
133
-          }
134
-
135
-          if (twlallowedusr) {
136
-              var twlallowedusrarr = twlallowedusr.split("|");
137
-              for (var g = 0; g < twlallowedusrarr.length; g++) {
138
-                   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
139
-              }
140
-          }
141
-
142
-          if (flrallowedgrp) {
143
-              var flrallowedgrparr = flrallowedgrp.split("|");
144
-              for (var g = 0; g < flrallowedgrparr.length; g++) {
145
-                   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
146
-              }
147
-          }
148
-
149
-          if (flrallowedusr) {
150
-              var flrallowedusrarr = flrallowedusr.split("|");
151
-              for (var g = 0; g < flrallowedusrarr.length; g++) {
152
-                   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
153
-              }
154
-          }
155
-
156
-
157
-          // Create a list with all the available groups, excluding the admin group
158
-          var grpsListItemswadm = "";
159
-          $.each(allGroupswadm, function(key, value) {
160
-                 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
161
-          });
162
-
163
-          // Create a list with all the available users, excluding the admins
164
-          var usersListItemswadm = "";
165
-          $.each(allUserswadm, function(key, usrval) {
166
-                 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
167
-          });
168
-          
169
-
170
-          function showListsalwdk() {
171
-
172
-              // Append the list of available groups to the table of groups and users allowed to use the API keys
173
-              $('[id^="showakeyGrps-"]').click(function() {
174
-                 var crtid = $(this).attr("id").split("-")[1];
175
-                 $("#grpsadapik-"+ crtid).remove();
176
-                 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
177
-                 $("#adminOverlay").remove();
178
-                 $("#app-content").append("<div id='adminOverlay'></div>");
179
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
180
-
181
-                 $("#adminOverlay").click(function() { 
182
-                    $("#adminOverlay").remove();
183
-                    $("#grpsadapik-"+ crtid).remove();
184
-                    $("#usrsadapik-"+ crtid).remove();
185
-                 });
186
-
187
-                 // Select a group
188
-                 $(".groupsList").click(function() {
189
-                    var slctdGrp = $(this).text();
190
-                    $("#grpsadapik-"+ crtid).remove();
191
-                    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
192
-
193
-                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
194
-                        $("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
195
-                    } else { showAlert("That group has already been added!"); }
196
-
197
-                    // Remove a group from list
198
-                    $('[id^="rmvGrp-"]').click(function() {
199
-                       $(this).closest(".selectedGrps").remove();
200
-                    });
201
-                 });
202
-
203
-              });
204
-
205
-              // Append the list of available users to the table of groups and users allowed to use the API keys
206
-              $('[id^="showakeyUsrs-"]').click(function() {
207
-
208
-                 var crtidusr = $(this).attr("id").split("-")[1];
209
-                 $("#usrsadapik-"+ crtidusr).remove();
210
-                 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
211
-                 $("#adminOverlay").remove();
212
-                 $("#app-content").append("<div id='adminOverlay'></div>");
213
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
214
-
215
-                 $("#adminOverlay").click(function() { 
216
-                    $("#adminOverlay").remove(); 
217
-                    $("#grpsadapik-"+ crtidusr).remove();
218
-                    $("#usrsadapik-"+ crtidusr).remove();
219
-                 });
220
-
221
-                 // Select a user
222
-                 $(".usersList").click(function() {
223
-                    var slctdUsr = $(this).text();
224
-                    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
225
-
226
-                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
227
-                        $("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
228
-                    } else { showAlert("That user has already been added!"); }
229
-
230
-                    // Remove a user from list
231
-                    $('[id^="rmvUsr-"]').click(function() {
232
-                       $(this).closest(".selectedUsrs").remove();
233
-                    });
234
-                 });
235
-
236
-              });
237
-
238
-              // Remove a group from the list 
239
-              $('[id^="rmvGrp-"]').click(function() {
240
-                 $(this).closest(".selectedGrps").remove();
241
-              });
242
-
243
-              // Remove a user from the list
244
-              $('[id^="rmvUsr-"]').click(function() {
245
-                 $(this).closest(".selectedUsrs").remove();
246
-              });
247
-
248
-          }
249
-          showListsalwdk();
250
-
251
-
252
-          // Save the data
253
-          function saveAlwdRow() {
254
-             $('[id^="alwdrstsave-"]').unbind("click");
255
-             $('[id^="alwdrstsave-"]').click(function(event) {
256
-
257
-                 event.preventDefault();
258
-                 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
259
-                 
260
-                 if ($(this).attr("value") == "Save") {
261
-
262
-                     var selGroups = [];
263
-                     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
264
-                        selGroups.push($(this).text());
265
-                     });
266
-                     if (selGroups.length == 0) { selGroups.push(""); }
267
-
268
-                     var selUsers = [];
269
-                     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
270
-                        selUsers.push($(this).text());
271
-                     });
272
-                     if (selUsers.length == 0) { selUsers.push(""); }
273
-
274
-                     // Check if the access key fields have been left empty
275
-                     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
276
-                         showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
277
-                         return;
278
-                     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
279
-                         showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
280
-                         return;
281
-                     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
282
-                         showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
283
-                         return;
284
-                     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
285
-                         showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
286
-                         return;
287
-                     }
288
-
289
-                     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
290
-
291
-                     var alwddatatosend = { 
292
-                              userId: userid,
293
-                              groups: selGroups,
294
-                              users: selUsers,
295
-                              provider: crntprov
296
-                     };
297
-
298
-	             $.ajax({
299
-	                   method: 'PUT',
300
-	                   url: saveAlwdUrl + '/' + userid,
301
-	                   contentType: 'application/json',
302
-	                   data: JSON.stringify(alwddatatosend),
303
-                           success: function(messagesent) {
304
-                                        if (messagesent == 'success') {
305
-                                            showAlert('The allowed groups and users have been successfully saved to the database!');
306
-                                        } else if (messagesent != 'success' && messagesent != 'failure') {
307
-                                            showAlert(messagesent);
308
-                                        } else if (messagesent == 'failure') {
309
-                                            showAlert('Error while trying to save the allowed groups and users!');
310
-                                        }
311
-                           },
312
-	                   error: function() {
313
-		                        showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
314
-	                   }
315
-	             });
316
-
317
-                     $(this).attr("value", "Edit");
318
-
319
-                } else {
320
-
321
-                     $("#alwdrstsave-"+ crntprov).attr("value", "Save");
322
-                }
323
-
324
-             });
325
-          }
326
-          saveAlwdRow();
327
-
328
-
329
-
330
-          // Phone number restrictions
331
-
332
-          // Create a list with all the available groups
333
-          var grpsListItems = "";
334
-          $.each(allGroups, function(key, value) {
335
-                 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
336
-          });
337
-
338
-          // Create a list with all the available users
339
-          var usersListItems = "";
340
-          $.each(allUsers, function(key, usrval) {
341
-                 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
342
-          });
343
-
344
-
345
-          if (allRestrictions.length > 0) {
346
-              var restrNmb = allRestrictions.length;
347
-          } else {
348
-              var restrNmb = 0;
349
-          }
350
-
351
-
352
-	  // List the access restrictions for groups and users
353
-          if (restrNmb == 0) {
354
-
355
-              $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
356
-	      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
357
-
358
-          } else {
359
-
360
-	      for (k = 0; k < restrNmb; k++) {
361
-
362
-                   if (allRestrictions[k].groups) {
363
-                       var groupsfdbpre = allRestrictions[k].groups.split("|");
364
-                       var groupsfdb = "";
365
-                       for (var g = 0; g < groupsfdbpre.length; g++) {
366
-                            groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
367
-                       }
368
-                   } else { var groupsfdb = ""; }
369
-
370
-                   if (allRestrictions[k].users) {
371
-                       var usersfdbpre = allRestrictions[k].users.split("|");
372
-                       var usersfdb = "";
373
-                       for (var u = 0; u < usersfdbpre.length; u++) {
374
-                            usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
375
-                       }
376
-                   } else { var usersfdb = ""; }
377
-
378
-		   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
379
-              }
380
-              $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
381
-          }
382
-
383
-
384
-          // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
385
-          $("#phoneNumberTh").addClass('icon-loading');
386
-          var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
387
-          var numbersListItems = '';
388
-
389
-	  $.ajax({
390
-		  url: getnumbersUrl + '/' + userid,
391
-		  type: "POST",
392
-		  cache: false,
393
-		  processData: false,
394
-		  contentType: false,
395
-		  success: function(currentnmbrs) {
396
-
397
-                                    $("#phoneNumberTh").removeClass('icon-loading');
398
-
399
-				    // Create a list with all the available phone numbers
400
-                                    numbersListItems = "<option value='' selected>Select phone number</option>";
401
-
402
-				    $.each(currentnmbrs, function(key, indsmsnmb) {
403
-					   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
404
-				    });
405
-
406
-				    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
407
-
408
-				    // Append the list of available phone numbers
409
-				    $("#rstphn-"+ indRow).empty();
410
-				    $("#rstphn-"+ indRow).append(numbersListItems);
411
-        
412
-		  },
413
-		  error: function() {
414
-                                    $("#phoneNumberTh").removeClass('icon-loading'); 
415
-                                    showAlert("Error while attempting to retrieve the available phone numbers!");
416
-                  }
417
-          });
418
-
419
-
420
-          function showLists() {
421
-
422
-              // Append the list of available groups to the restrictions table
423
-              $('[id^="showGrps-"]').click(function() {
424
-                 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
425
-                 $("#grpL-"+ crtnmbr).remove();
426
-                 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
427
-                 $("#adminOverlay").remove();
428
-                 $("#app-content").append("<div id='adminOverlay'></div>");
429
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
430
-
431
-                 $("#adminOverlay").click(function() { 
432
-                    $("#adminOverlay").remove(); 
433
-                    $("#grpL-"+ crtnmbr).remove(); 
434
-                    $("#usrL-"+ crtnmbr).remove();
435
-                 });
436
-
437
-                 // Select a group
438
-                 $(".groupsList").click(function() {
439
-                    var slctdGrp = $(this).text();
440
-                    $("#grpL-"+ crtnmbr).remove();
441
-                    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
442
-
443
-                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
444
-                        $("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
445
-                    } else { showAlert("That group has already been added!"); }
446
-
447
-                    // Remove a group from list
448
-                    $('[id^="rmvGrp-"]').click(function() {
449
-                       $(this).closest(".selectedGrps").remove();
450
-                    });
451
-                 });
452
-
453
-              });
454
-
455
-              // Append the list of available users to the restrictions table
456
-              $('[id^="showUsr-"]').click(function() {
457
-
458
-                 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
459
-                 $("#usrL-"+ ctusrnmbr).remove();
460
-                 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
461
-                 $("#adminOverlay").remove();
462
-                 $("#app-content").append("<div id='adminOverlay'></div>");
463
-                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
464
-
465
-                 $("#adminOverlay").click(function() { 
466
-                    $("#adminOverlay").remove(); 
467
-                    $("#grpL-"+ ctusrnmbr).remove(); 
468
-                    $("#usrL-"+ ctusrnmbr).remove();
469
-                 });
470
-
471
-                 // Select a user
472
-                 $(".usersList").click(function() {
473
-                    var slctdUsr = $(this).text();
474
-                    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
475
-
476
-                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
477
-                        $("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
478
-                    } else { showAlert("That user has already been added!"); }
479
-
480
-                    // Remove a user from list
481
-                    $('[id^="rmvUsr-"]').click(function() {
482
-                       $(this).closest(".selectedUsrs").remove();
483
-                    });
484
-                 });
485
-
486
-              });
487
-
488
-              // Remove a group from the list 
489
-              $('[id^="rmvGrp-"]').click(function() {
490
-                 $(this).closest(".selectedGrps").remove();
491
-              });
492
-
493
-              // Remove a user from the list
494
-              $('[id^="rmvUsr-"]').click(function() {
495
-                 $(this).closest(".selectedUsrs").remove();
496
-              });
497
-
498
-          }
499
-          showLists();
500
-
501
-
502
-          // Save the data
503
-          function saveRestrRow() {
504
-             $('[id^="rstsave-"]').unbind("click");
505
-             $('[id^="rstsave-"]').click(function(event) {
506
-
507
-                 event.preventDefault();
508
-                 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
509
-
510
-                 if ($(this).attr("value") == "Save") {
511
-
512
-                     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
513
-                     var slctdGroups = [];
514
-                     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
515
-                        slctdGroups.push($(this).text());
516
-                     });
517
-                     var slctdUsers = [];
518
-                     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
519
-                        slctdUsers.push($(this).text());
520
-                     });
521
-
522
-                     if (phoneNmbr != '') {
523
-
524
-                       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
525
-
526
-                         var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
527
-
528
-                         var datatosend = { 
529
-                              userId: userid,
530
-                              savedByDsplname: crntadmDispName,
531
-                              phoneNumber: phoneNmbr,
532
-                              groups: slctdGroups,
533
-                              users: slctdUsers
534
-                         };
535
-
536
-	                 $.ajax({
537
-	                   method: 'PUT',
538
-	                   url: saveRestrUrl + '/' + userid,
539
-	                   contentType: 'application/json',
540
-	                   data: JSON.stringify(datatosend),
541
-                           success: function(messagetosend) {
542
-                                        if (messagetosend == 'success') {
543
-                                            showAlert('The restrictions have been successfully saved to the database!');
544
-                                        } else {
545
-                                            showAlert('Error while trying to save the restrictions!');
546
-                                        }
547
-                           },
548
-	                   error: function() {
549
-		                        showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
550
-	                   }
551
-	                 });
552
-
553
-                       } else { showAlert("You must select at least a group or a user in order to restrict the use of a phone number."); return; }
554
-
555
-                     } else { showAlert("Please select a phone number!"); return; }
556
-
557
-                     $(this).attr("value", "Edit");
558
-
559
-                } else {
560
-
561
-                     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
562
-                }
563
-
564
-             });
565
-          }
566
-          saveRestrRow();
567
-
568
-          // Remove a row
569
-          function removeRestrRow() {
570
-               $('[id^="rmRow-"]').click(function() {
571
-
572
-                  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
573
-                  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
574
-
575
-                  if (confirm("Do you really want to remove this row from the database ?")) {
576
-
577
-                      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
578
-                      $.ajax({
579
-                           url: rmvRestrUrl + '/' + userid,
580
-                           method: "POST",
581
-                           dataType: "text",
582
-                           data: { phoneNumber: crntPhNmbr },
583
-                           success: function(delresult) {
584
-
585
-                                             if (delresult.indexOf("success") > -1) {
586
-                                                 showAlert("The restriction has been removed successfully!");
587
-                                                 $("#rstphn-"+ slctRowRmv).closest("tr").remove();
588
-                                             } else {
589
-                                                 showAlert("Error while trying to remove restriction data!");
590
-                                             }
591
-                           },
592
-                           error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
593
-                       });
594
-                  }
595
-               });
596
-          }
597
-          removeRestrRow();
598
-
599
-          // Add a new row
600
-	  $("#addRestrRow").click(function() {
601
-              if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
602
-                  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
603
-                  var indRowAdd = parseInt(lastrstAuth + 1);
604
-              } else { var indRowAdd = 0; }
605
-	      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
606
-              showLists();
607
-              saveRestrRow();
608
-              removeRestrRow();
609
-
610
-              // Check if the same phone number has been already restricted
611
-              $("#rstphn-"+ indRowAdd).change(function() {
612
-                 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
613
-                 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
614
-                 var phNmbrChck = 0;
615
-                 allPHoneRestr.each(function() {
616
-                    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
617
-                    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
618
-                 });
619
-
620
-                 if (phNmbrChck == 2) {
621
-                     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict.");
622
-                     $(this).val('');
623
-                     return;
624
-                 }
625
-              });
626
-	  });
627
-
628
-     },
629
-     error: function() {
630
-                showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
631
-     }
632
-  });
633
-
634
-
635
-
636
-  // Save admin settings
637
-  function randomStr(strlength) {
638
-        var fintext = "";
639
-        var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
640
-        for (var i = 0; i < strlength; i++) {
641
-             fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
642
-        }
643
-        return fintext;
644
-  }
645
-
646
-  $("#generate_tel_rcpt").on("click", function(event) {
647
-
648
-     var teltokenrec = randomStr(70);
649
-     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
650
-
651
-     $("#telapi_url_rec").val(telnyxwhurlrec);
652
-  });
653
-
654
-  $("#copyToClipboardtel").on("click", function(event) {
655
-     var $tempEl = $("<input>");
656
-     $("body").append($tempEl);
657
-     $tempEl.val($("#telapi_url_rec").val()).select();
658
-     document.execCommand("Copy");
659
-     $tempEl.remove();
660
-     showAlert("The link has been copied to your clipboard!");
661
-  });
662
-
663
-  $("#generate_tel_delrcpt").on("click", function(event) {
664
-
665
-     var teltoken = randomStr(70);
666
-     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
667
-
668
-     $("#telapi_url").val(telnyxwhurl);
669
-  });
670
-
671
-  $("#generate_nex_rcpt").on("click", function(event) {
672
-
673
-     var plivotokenrec = randomStr(70);
674
-     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
675
-
676
-     $("#nexapi_url_rec").val(plivowhurlrec);
677
-  });
678
-
679
-  $("#copyToClipboardnex").on("click", function(event) {
680
-     var $tempElpl = $("<input>");
681
-     $("body").append($tempElpl);
682
-     $tempElpl.val($("#nexapi_url_rec").val()).select();
683
-     document.execCommand("Copy");
684
-     $tempElpl.remove();
685
-     showAlert("The link has been copied to your clipboard!");
686
-  });
687
-
688
-  $("#generate_nex_delrcpt").on("click", function(event) {
689
-
690
-     var plivotoken = randomStr(70);
691
-     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
692
-
693
-     $("#nexapi_url").val(plivodrwhurl);
694
-  });
695
-
696
-  $("#generate_twil_rcpt").on("click", function(event) {
697
-
698
-     var twiltokenrec = randomStr(35);
699
-     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
700
-
701
-     $("#twilapi_url_rec").val(twilwhurlrec);
702
-  });
703
-
704
-  $("#copyToClipboardtwil").on("click", function(event) {
705
-     var $tempElpl = $("<input>");
706
-     $("body").append($tempElpl);
707
-     $tempElpl.val($("#twilapi_url_rec").val()).select();
708
-     document.execCommand("Copy");
709
-     $tempElpl.remove();
710
-     showAlert("The link has been copied to your clipboard!");
711
-  });
712
-
713
-  $("#generate_twil_delrcpt").on("click", function(event) {
714
-
715
-     var twiltoken = randomStr(35);
716
-     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
717
-
718
-     $("#twilapi_url").val(twildrwhurl);
719
-  });
720
-
721
-  $("#generate_flow_rcpt").on("click", function(event) {
722
-
723
-     var flowtokenrec = randomStr(70);
724
-     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
725
-
726
-     $("#flowapi_url_rec").val(flowwhurlrec);
727
-  });
728
-
729
-  $("#copyToClipboardflow").on("click", function(event) {
730
-     var $tempElpl = $("<input>");
731
-     $("body").append($tempElpl);
732
-     $tempElpl.val($("#flowapi_url_rec").val()).select();
733
-     document.execCommand("Copy");
734
-     $tempElpl.remove();
735
-     showAlert("The link has been copied to your clipboard!");
736
-  });
737
-
738
-  $("#generate_flow_delrcpt").on("click", function(event) {
739
-
740
-     var flowtoken = randomStr(70);
741
-     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
742
-
743
-     $("#flowapi_url").val(flowdrwhurl);
744
-  });
745
-
746
-
747
-  $("#save_admin_settings").on("click", function(event) {
748
-
749
-    event.preventDefault();
750
-    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
751
-
752
-    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
753
-
754
-    var showallmsgs = 0;
755
-    if ($("#showallmessages").is(':checked')) {
756
-        showallmsgs = 1;
757
-    }
758
-
759
-    var telsenderinit = $("#tel_sender_name").val();
760
-    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
761
-
762
-    var nexsenderinit = $("#nex_sender_name").val();
763
-    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
764
-
765
-    var twilsenderinit = $("#twil_sender_name").val();
766
-    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
767
-
768
-    var datatosave = {
769
-                      userId: userid,
770
-                      telapiKey: $("#telapi_key").val(),
771
-                      telPubKey: $("#tel_pub_key").val(),
772
-                      telapiUrlRec: $("#telapi_url_rec").val(),
773
-                      telapiUrl: $("#telapi_url").val(),
774
-                      messagingProfileId: $("#messaging_profile_id").val(),
775
-                      nexapiKey: $("#nexapi_key").val(),
776
-                      nexapiSecret: $("#nexapi_secret").val(),
777
-                      nexapiUrlRec: $("#nexapi_url_rec").val(),
778
-                      nexapiUrl: $("#nexapi_url").val(),
779
-                      twilapiKey: $("#twilapi_key").val(),
780
-                      twilapiSecret: $("#twilapi_secret").val(),
781
-                      twilapiUrlRec: $("#twilapi_url_rec").val(),
782
-                      twilapiUrl: $("#twilapi_url").val(),
783
-                      flowapiKey: $("#flowapi_key").val(),
784
-                      flowapiSecret: $("#flowapi_secret").val(),
785
-                      flowapiUrlRec: $("#flowapi_url_rec").val(),
786
-                      flowapiUrl: $("#flowapi_url").val(),
787
-                      telSenderName: telsenderproc,
788
-                      nexSenderName: nexsenderproc,
789
-                      twilSenderName: twilsenderproc,
790
-                      showAllMessages: showallmsgs
791
-    };
792
-
793
-
794
-    $.ajax({
795
-       method: 'PUT',
796
-       url: baseUrlsv + '/' + userid,
797
-       contentType: 'application/json',
798
-       data: JSON.stringify(datatosave),
799
-       success: function() {
800
-       },
801
-       error: function() {
802
-            showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
803
-       }
804
-    });
805
-
806
-  });
807
-
808
-  function showAlert(alertText) {
809
-
810
-     let alertwnd = "<div id='alertMessage'>";
811
-     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
812
-     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
813
-     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
814
-     alertwnd += "</div>";
815
-
816
-     $("#content").append("<div id='alertMsgOverlay'></div>");
817
-     $("#content").append(alertwnd);
818
-
819
-     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
820
-     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
821
-     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
822
-
823
-     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
824
-     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
825
-     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
826
-  }
827
-
828
-});
Browse code

added files to implement pop-up windows, etc.

DoubleBastionAdmin authored on 20/05/2023 01:06:57
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,828 @@
1
+/**
2
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
+ *
4
+ * @author Double Bastion LLC
5
+ *
6
+ * @license GNU AGPL version 3 or any later version
7
+ *
8
+ * This program is free software; you can redistribute it and/or
9
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
+ * License as published by the Free Software Foundation; either
11
+ * version 3 of the License, or any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
+ *
18
+ * You should have received a copy of the GNU Affero General Public
19
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+$(document).ready(function() {
24
+
25
+  // Get admin settings
26
+  var userid = "<?php p($userId); ?>";
27
+  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
28
+
29
+  $.ajax({
30
+     method: 'GET',
31
+     url: baseUrlget + '/' + userid,
32
+     contentType: 'application/json',
33
+     success: function(settingsadm) {
34
+
35
+          $("#telapi_key").val(settingsadm.telapi_key);
36
+          $("#tel_pub_key").val(settingsadm.tel_pub_key);
37
+          $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
38
+          $("#telapi_url").val(settingsadm.telapi_url);
39
+          $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
40
+          $("#nexapi_key").val(settingsadm.nexapi_key);
41
+          $("#nexapi_secret").val(settingsadm.nexapi_secret);
42
+          $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
43
+          $("#nexapi_url").val(settingsadm.nexapi_url);
44
+          $("#twilapi_key").val(settingsadm.twilapi_key);
45
+          $("#twilapi_secret").val(settingsadm.twilapi_secret);
46
+          $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
47
+          $("#twilapi_url").val(settingsadm.twilapi_url);
48
+          $("#flowapi_key").val(settingsadm.flowapi_key);
49
+          $("#flowapi_secret").val(settingsadm.flowapi_secret);
50
+          $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
51
+          $("#flowapi_url").val(settingsadm.flowapi_url);
52
+          $("#tel_sender_name").val(settingsadm.tel_sender_name);
53
+          $("#nex_sender_name").val(settingsadm.nex_sender_name);
54
+          $("#twil_sender_name").val(settingsadm.twil_sender_name);
55
+/*
56
+          $("#messagesperpage").val(settingsadm.messagesperpage);
57
+
58
+          if (settingsadm.get_notify == 1) {
59
+              $("#get_notify").attr('checked', true);
60
+          } else {
61
+              $("#get_notify").attr('checked', false);
62
+          }
63
+
64
+          $("#notification_email").val(settingsadm.notification_email);
65
+
66
+          if (settingsadm.getsmsinemail == 1) {
67
+              $("#includesmsinemail").attr('checked', true);
68
+          } else {
69
+              $("#includesmsinemail").attr('checked', false);
70
+          }
71
+
72
+          if (settingsadm.show_display_names == 1) {
73
+              $("#showdisplaynames").attr('checked', true);
74
+          } else {
75
+              $("#showdisplaynames").attr('checked', false);
76
+          }
77
+*/
78
+          if (settingsadm.show_all_messages == 1) {
79
+              $("#showallmessages").attr("checked", true);
80
+          } else {
81
+              $("#showallmessages").attr("checked", false);
82
+          }
83
+
84
+          var crntadmDispName = settingsadm.admdisplayname;
85
+          var allRestrictions = settingsadm.restrictions;
86
+          var allGroups = settingsadm.allgroups;
87
+          var allUsers = settingsadm.allusers;
88
+          var allGroupswadm = settingsadm.allgroupswadm;
89
+          var allUserswadm = settingsadm.alluserswadm;
90
+          var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
91
+          var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
92
+          var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
93
+          var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
94
+          var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
95
+          var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
96
+          var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
97
+          var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;
98
+
99
+          // List all the groups and users allowed to access the API keys, for each provider
100
+          if (tnxallowedgrp) {
101
+              var tnxallowedgrparr = tnxallowedgrp.split("|");
102
+              for (var g = 0; g < tnxallowedgrparr.length; g++) {
103
+                   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
104
+              }
105
+          }
106
+
107
+          if (tnxallowedusr) {
108
+              var tnxallowedusrarr = tnxallowedusr.split("|");
109
+              for (var g = 0; g < tnxallowedusrarr.length; g++) {
110
+                   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
111
+              }
112
+          }
113
+
114
+          if (plvallowedgrp) {
115
+              var plvallowedgrparr = plvallowedgrp.split("|");
116
+              for (var g = 0; g < plvallowedgrparr.length; g++) {
117
+                   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
118
+              }
119
+          }
120
+
121
+          if (plvallowedusr) {
122
+              var plvallowedusrarr = plvallowedusr.split("|");
123
+              for (var g = 0; g < plvallowedusrarr.length; g++) {
124
+                   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
125
+              }
126
+          }
127
+
128
+          if (twlallowedgrp) {
129
+              var twlallowedgrparr = twlallowedgrp.split("|");
130
+              for (var g = 0; g < twlallowedgrparr.length; g++) {
131
+                   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
132
+              }
133
+          }
134
+
135
+          if (twlallowedusr) {
136
+              var twlallowedusrarr = twlallowedusr.split("|");
137
+              for (var g = 0; g < twlallowedusrarr.length; g++) {
138
+                   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
139
+              }
140
+          }
141
+
142
+          if (flrallowedgrp) {
143
+              var flrallowedgrparr = flrallowedgrp.split("|");
144
+              for (var g = 0; g < flrallowedgrparr.length; g++) {
145
+                   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
146
+              }
147
+          }
148
+
149
+          if (flrallowedusr) {
150
+              var flrallowedusrarr = flrallowedusr.split("|");
151
+              for (var g = 0; g < flrallowedusrarr.length; g++) {
152
+                   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
153
+              }
154
+          }
155
+
156
+
157
+          // Create a list with all the available groups, excluding the admin group
158
+          var grpsListItemswadm = "";
159
+          $.each(allGroupswadm, function(key, value) {
160
+                 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
161
+          });
162
+
163
+          // Create a list with all the available users, excluding the admins
164
+          var usersListItemswadm = "";
165
+          $.each(allUserswadm, function(key, usrval) {
166
+                 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
167
+          });
168
+          
169
+
170
+          function showListsalwdk() {
171
+
172
+              // Append the list of available groups to the table of groups and users allowed to use the API keys
173
+              $('[id^="showakeyGrps-"]').click(function() {
174
+                 var crtid = $(this).attr("id").split("-")[1];
175
+                 $("#grpsadapik-"+ crtid).remove();
176
+                 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
177
+                 $("#adminOverlay").remove();
178
+                 $("#app-content").append("<div id='adminOverlay'></div>");
179
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
180
+
181
+                 $("#adminOverlay").click(function() { 
182
+                    $("#adminOverlay").remove();
183
+                    $("#grpsadapik-"+ crtid).remove();
184
+                    $("#usrsadapik-"+ crtid).remove();
185
+                 });
186
+
187
+                 // Select a group
188
+                 $(".groupsList").click(function() {
189
+                    var slctdGrp = $(this).text();
190
+                    $("#grpsadapik-"+ crtid).remove();
191
+                    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();
192
+
193
+                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
194
+                        $("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
195
+                    } else { showAlert("That group has already been added!"); }
196
+
197
+                    // Remove a group from list
198
+                    $('[id^="rmvGrp-"]').click(function() {
199
+                       $(this).closest(".selectedGrps").remove();
200
+                    });
201
+                 });
202
+
203
+              });
204
+
205
+              // Append the list of available users to the table of groups and users allowed to use the API keys
206
+              $('[id^="showakeyUsrs-"]').click(function() {
207
+
208
+                 var crtidusr = $(this).attr("id").split("-")[1];
209
+                 $("#usrsadapik-"+ crtidusr).remove();
210
+                 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
211
+                 $("#adminOverlay").remove();
212
+                 $("#app-content").append("<div id='adminOverlay'></div>");
213
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
214
+
215
+                 $("#adminOverlay").click(function() { 
216
+                    $("#adminOverlay").remove(); 
217
+                    $("#grpsadapik-"+ crtidusr).remove();
218
+                    $("#usrsadapik-"+ crtidusr).remove();
219
+                 });
220
+
221
+                 // Select a user
222
+                 $(".usersList").click(function() {
223
+                    var slctdUsr = $(this).text();
224
+                    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();
225
+
226
+                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
227
+                        $("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
228
+                    } else { showAlert("That user has already been added!"); }
229
+
230
+                    // Remove a user from list
231
+                    $('[id^="rmvUsr-"]').click(function() {
232
+                       $(this).closest(".selectedUsrs").remove();
233
+                    });
234
+                 });
235
+
236
+              });
237
+
238
+              // Remove a group from the list 
239
+              $('[id^="rmvGrp-"]').click(function() {
240
+                 $(this).closest(".selectedGrps").remove();
241
+              });
242
+
243
+              // Remove a user from the list
244
+              $('[id^="rmvUsr-"]').click(function() {
245
+                 $(this).closest(".selectedUsrs").remove();
246
+              });
247
+
248
+          }
249
+          showListsalwdk();
250
+
251
+
252
+          // Save the data
253
+          function saveAlwdRow() {
254
+             $('[id^="alwdrstsave-"]').unbind("click");
255
+             $('[id^="alwdrstsave-"]').click(function(event) {
256
+
257
+                 event.preventDefault();
258
+                 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
259
+                 
260
+                 if ($(this).attr("value") == "Save") {
261
+
262
+                     var selGroups = [];
263
+                     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
264
+                        selGroups.push($(this).text());
265
+                     });
266
+                     if (selGroups.length == 0) { selGroups.push(""); }
267
+
268
+                     var selUsers = [];
269
+                     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
270
+                        selUsers.push($(this).text());
271
+                     });
272
+                     if (selUsers.length == 0) { selUsers.push(""); }
273
+
274
+                     // Check if the access key fields have been left empty
275
+                     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
276
+                         showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
277
+                         return;
278
+                     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
279
+                         showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
280
+                         return;
281
+                     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
282
+                         showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
283
+                         return;
284
+                     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
285
+                         showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
286
+                         return;
287
+                     }
288
+
289
+                     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');
290
+
291
+                     var alwddatatosend = { 
292
+                              userId: userid,
293
+                              groups: selGroups,
294
+                              users: selUsers,
295
+                              provider: crntprov
296
+                     };
297
+
298
+	             $.ajax({
299
+	                   method: 'PUT',
300
+	                   url: saveAlwdUrl + '/' + userid,
301
+	                   contentType: 'application/json',
302
+	                   data: JSON.stringify(alwddatatosend),
303
+                           success: function(messagesent) {
304
+                                        if (messagesent == 'success') {
305
+                                            showAlert('The allowed groups and users have been successfully saved to the database!');
306
+                                        } else if (messagesent != 'success' && messagesent != 'failure') {
307
+                                            showAlert(messagesent);
308
+                                        } else if (messagesent == 'failure') {
309
+                                            showAlert('Error while trying to save the allowed groups and users!');
310
+                                        }
311
+                           },
312
+	                   error: function() {
313
+		                        showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
314
+	                   }
315
+	             });
316
+
317
+                     $(this).attr("value", "Edit");
318
+
319
+                } else {
320
+
321
+                     $("#alwdrstsave-"+ crntprov).attr("value", "Save");
322
+                }
323
+
324
+             });
325
+          }
326
+          saveAlwdRow();
327
+
328
+
329
+
330
+          // Phone number restrictions
331
+
332
+          // Create a list with all the available groups
333
+          var grpsListItems = "";
334
+          $.each(allGroups, function(key, value) {
335
+                 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
336
+          });
337
+
338
+          // Create a list with all the available users
339
+          var usersListItems = "";
340
+          $.each(allUsers, function(key, usrval) {
341
+                 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
342
+          });
343
+
344
+
345
+          if (allRestrictions.length > 0) {
346
+              var restrNmb = allRestrictions.length;
347
+          } else {
348
+              var restrNmb = 0;
349
+          }
350
+
351
+
352
+	  // List the access restrictions for groups and users
353
+          if (restrNmb == 0) {
354
+
355
+              $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
356
+	      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
357
+
358
+          } else {
359
+
360
+	      for (k = 0; k < restrNmb; k++) {
361
+
362
+                   if (allRestrictions[k].groups) {
363
+                       var groupsfdbpre = allRestrictions[k].groups.split("|");
364
+                       var groupsfdb = "";
365
+                       for (var g = 0; g < groupsfdbpre.length; g++) {
366
+                            groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
367
+                       }
368
+                   } else { var groupsfdb = ""; }
369
+
370
+                   if (allRestrictions[k].users) {
371
+                       var usersfdbpre = allRestrictions[k].users.split("|");
372
+                       var usersfdb = "";
373
+                       for (var u = 0; u < usersfdbpre.length; u++) {
374
+                            usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
375
+                       }
376
+                   } else { var usersfdb = ""; }
377
+
378
+		   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
379
+              }
380
+              $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
381
+          }
382
+
383
+
384
+          // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
385
+          $("#phoneNumberTh").addClass('icon-loading');
386
+          var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
387
+          var numbersListItems = '';
388
+
389
+	  $.ajax({
390
+		  url: getnumbersUrl + '/' + userid,
391
+		  type: "POST",
392
+		  cache: false,
393
+		  processData: false,
394
+		  contentType: false,
395
+		  success: function(currentnmbrs) {
396
+
397
+                                    $("#phoneNumberTh").removeClass('icon-loading');
398
+
399
+				    // Create a list with all the available phone numbers
400
+                                    numbersListItems = "<option value='' selected>Select phone number</option>";
401
+
402
+				    $.each(currentnmbrs, function(key, indsmsnmb) {
403
+					   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
404
+				    });
405
+
406
+				    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
407
+
408
+				    // Append the list of available phone numbers
409
+				    $("#rstphn-"+ indRow).empty();
410
+				    $("#rstphn-"+ indRow).append(numbersListItems);
411
+        
412
+		  },
413
+		  error: function() {
414
+                                    $("#phoneNumberTh").removeClass('icon-loading'); 
415
+                                    showAlert("Error while attempting to retrieve the available phone numbers!");
416
+                  }
417
+          });
418
+
419
+
420
+          function showLists() {
421
+
422
+              // Append the list of available groups to the restrictions table
423
+              $('[id^="showGrps-"]').click(function() {
424
+                 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
425
+                 $("#grpL-"+ crtnmbr).remove();
426
+                 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
427
+                 $("#adminOverlay").remove();
428
+                 $("#app-content").append("<div id='adminOverlay'></div>");
429
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
430
+
431
+                 $("#adminOverlay").click(function() { 
432
+                    $("#adminOverlay").remove(); 
433
+                    $("#grpL-"+ crtnmbr).remove(); 
434
+                    $("#usrL-"+ crtnmbr).remove();
435
+                 });
436
+
437
+                 // Select a group
438
+                 $(".groupsList").click(function() {
439
+                    var slctdGrp = $(this).text();
440
+                    $("#grpL-"+ crtnmbr).remove();
441
+                    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
442
+
443
+                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
444
+                        $("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
445
+                    } else { showAlert("That group has already been added!"); }
446
+
447
+                    // Remove a group from list
448
+                    $('[id^="rmvGrp-"]').click(function() {
449
+                       $(this).closest(".selectedGrps").remove();
450
+                    });
451
+                 });
452
+
453
+              });
454
+
455
+              // Append the list of available users to the restrictions table
456
+              $('[id^="showUsr-"]').click(function() {
457
+
458
+                 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
459
+                 $("#usrL-"+ ctusrnmbr).remove();
460
+                 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
461
+                 $("#adminOverlay").remove();
462
+                 $("#app-content").append("<div id='adminOverlay'></div>");
463
+                 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });
464
+
465
+                 $("#adminOverlay").click(function() { 
466
+                    $("#adminOverlay").remove(); 
467
+                    $("#grpL-"+ ctusrnmbr).remove(); 
468
+                    $("#usrL-"+ ctusrnmbr).remove();
469
+                 });
470
+
471
+                 // Select a user
472
+                 $(".usersList").click(function() {
473
+                    var slctdUsr = $(this).text();
474
+                    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
475
+
476
+                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
477
+                        $("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
478
+                    } else { showAlert("That user has already been added!"); }
479
+
480
+                    // Remove a user from list
481
+                    $('[id^="rmvUsr-"]').click(function() {
482
+                       $(this).closest(".selectedUsrs").remove();
483
+                    });
484
+                 });
485
+
486
+              });
487
+
488
+              // Remove a group from the list 
489
+              $('[id^="rmvGrp-"]').click(function() {
490
+                 $(this).closest(".selectedGrps").remove();
491
+              });
492
+
493
+              // Remove a user from the list
494
+              $('[id^="rmvUsr-"]').click(function() {
495
+                 $(this).closest(".selectedUsrs").remove();
496
+              });
497
+
498
+          }
499
+          showLists();
500
+
501
+
502
+          // Save the data
503
+          function saveRestrRow() {
504
+             $('[id^="rstsave-"]').unbind("click");
505
+             $('[id^="rstsave-"]').click(function(event) {
506
+
507
+                 event.preventDefault();
508
+                 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
509
+
510
+                 if ($(this).attr("value") == "Save") {
511
+
512
+                     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
513
+                     var slctdGroups = [];
514
+                     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
515
+                        slctdGroups.push($(this).text());
516
+                     });
517
+                     var slctdUsers = [];
518
+                     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
519
+                        slctdUsers.push($(this).text());
520
+                     });
521
+
522
+                     if (phoneNmbr != '') {
523
+
524
+                       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
525
+
526
+                         var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
527
+
528
+                         var datatosend = { 
529
+                              userId: userid,
530
+                              savedByDsplname: crntadmDispName,
531
+                              phoneNumber: phoneNmbr,
532
+                              groups: slctdGroups,
533
+                              users: slctdUsers
534
+                         };
535
+
536
+	                 $.ajax({
537
+	                   method: 'PUT',
538
+	                   url: saveRestrUrl + '/' + userid,
539
+	                   contentType: 'application/json',
540
+	                   data: JSON.stringify(datatosend),
541
+                           success: function(messagetosend) {
542
+                                        if (messagetosend == 'success') {
543
+                                            showAlert('The restrictions have been successfully saved to the database!');
544
+                                        } else {
545
+                                            showAlert('Error while trying to save the restrictions!');
546
+                                        }
547
+                           },
548
+	                   error: function() {
549
+		                        showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
550
+	                   }
551
+	                 });
552
+
553
+                       } else { showAlert("You must select at least a group or a user in order to restrict the use of a phone number."); return; }
554
+
555
+                     } else { showAlert("Please select a phone number!"); return; }
556
+
557
+                     $(this).attr("value", "Edit");
558
+
559
+                } else {
560
+
561
+                     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
562
+                }
563
+
564
+             });
565
+          }
566
+          saveRestrRow();
567
+
568
+          // Remove a row
569
+          function removeRestrRow() {
570
+               $('[id^="rmRow-"]').click(function() {
571
+
572
+                  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
573
+                  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
574
+
575
+                  if (confirm("Do you really want to remove this row from the database ?")) {
576
+
577
+                      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
578
+                      $.ajax({
579
+                           url: rmvRestrUrl + '/' + userid,
580
+                           method: "POST",
581
+                           dataType: "text",
582
+                           data: { phoneNumber: crntPhNmbr },
583
+                           success: function(delresult) {
584
+
585
+                                             if (delresult.indexOf("success") > -1) {
586
+                                                 showAlert("The restriction has been removed successfully!");
587
+                                                 $("#rstphn-"+ slctRowRmv).closest("tr").remove();
588
+                                             } else {
589
+                                                 showAlert("Error while trying to remove restriction data!");
590
+                                             }
591
+                           },
592
+                           error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
593
+                       });
594
+                  }
595
+               });
596
+          }
597
+          removeRestrRow();
598
+
599
+          // Add a new row
600
+	  $("#addRestrRow").click(function() {
601
+              if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
602
+                  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
603
+                  var indRowAdd = parseInt(lastrstAuth + 1);
604
+              } else { var indRowAdd = 0; }
605
+	      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
606
+              showLists();
607
+              saveRestrRow();
608
+              removeRestrRow();
609
+
610
+              // Check if the same phone number has been already restricted
611
+              $("#rstphn-"+ indRowAdd).change(function() {
612
+                 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
613
+                 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
614
+                 var phNmbrChck = 0;
615
+                 allPHoneRestr.each(function() {
616
+                    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
617
+                    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
618
+                 });
619
+
620
+                 if (phNmbrChck == 2) {
621
+                     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict.");
622
+                     $(this).val('');
623
+                     return;
624
+                 }
625
+              });
626
+	  });
627
+
628
+     },
629
+     error: function() {
630
+                showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
631
+     }
632
+  });
633
+
634
+
635
+
636
+  // Save admin settings
637
+  function randomStr(strlength) {
638
+        var fintext = "";
639
+        var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
640
+        for (var i = 0; i < strlength; i++) {
641
+             fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
642
+        }
643
+        return fintext;
644
+  }
645
+
646
+  $("#generate_tel_rcpt").on("click", function(event) {
647
+
648
+     var teltokenrec = randomStr(70);
649
+     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
650
+
651
+     $("#telapi_url_rec").val(telnyxwhurlrec);
652
+  });
653
+
654
+  $("#copyToClipboardtel").on("click", function(event) {
655
+     var $tempEl = $("<input>");
656
+     $("body").append($tempEl);
657
+     $tempEl.val($("#telapi_url_rec").val()).select();
658
+     document.execCommand("Copy");
659
+     $tempEl.remove();
660
+     showAlert("The link has been copied to your clipboard!");
661
+  });
662
+
663
+  $("#generate_tel_delrcpt").on("click", function(event) {
664
+
665
+     var teltoken = randomStr(70);
666
+     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
667
+
668
+     $("#telapi_url").val(telnyxwhurl);
669
+  });
670
+
671
+  $("#generate_nex_rcpt").on("click", function(event) {
672
+
673
+     var plivotokenrec = randomStr(70);
674
+     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
675
+
676
+     $("#nexapi_url_rec").val(plivowhurlrec);
677
+  });
678
+
679
+  $("#copyToClipboardnex").on("click", function(event) {
680
+     var $tempElpl = $("<input>");
681
+     $("body").append($tempElpl);
682
+     $tempElpl.val($("#nexapi_url_rec").val()).select();
683
+     document.execCommand("Copy");
684
+     $tempElpl.remove();
685
+     showAlert("The link has been copied to your clipboard!");
686
+  });
687
+
688
+  $("#generate_nex_delrcpt").on("click", function(event) {
689
+
690
+     var plivotoken = randomStr(70);
691
+     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
692
+
693
+     $("#nexapi_url").val(plivodrwhurl);
694
+  });
695
+
696
+  $("#generate_twil_rcpt").on("click", function(event) {
697
+
698
+     var twiltokenrec = randomStr(35);
699
+     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
700
+
701
+     $("#twilapi_url_rec").val(twilwhurlrec);
702
+  });
703
+
704
+  $("#copyToClipboardtwil").on("click", function(event) {
705
+     var $tempElpl = $("<input>");
706
+     $("body").append($tempElpl);
707
+     $tempElpl.val($("#twilapi_url_rec").val()).select();
708
+     document.execCommand("Copy");
709
+     $tempElpl.remove();
710
+     showAlert("The link has been copied to your clipboard!");
711
+  });
712
+
713
+  $("#generate_twil_delrcpt").on("click", function(event) {
714
+
715
+     var twiltoken = randomStr(35);
716
+     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
717
+
718
+     $("#twilapi_url").val(twildrwhurl);
719
+  });
720
+
721
+  $("#generate_flow_rcpt").on("click", function(event) {
722
+
723
+     var flowtokenrec = randomStr(70);
724
+     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
725
+
726
+     $("#flowapi_url_rec").val(flowwhurlrec);
727
+  });
728
+
729
+  $("#copyToClipboardflow").on("click", function(event) {
730
+     var $tempElpl = $("<input>");
731
+     $("body").append($tempElpl);
732
+     $tempElpl.val($("#flowapi_url_rec").val()).select();
733
+     document.execCommand("Copy");
734
+     $tempElpl.remove();
735
+     showAlert("The link has been copied to your clipboard!");
736
+  });
737
+
738
+  $("#generate_flow_delrcpt").on("click", function(event) {
739
+
740
+     var flowtoken = randomStr(70);
741
+     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
742
+
743
+     $("#flowapi_url").val(flowdrwhurl);
744
+  });
745
+
746
+
747
+  $("#save_admin_settings").on("click", function(event) {
748
+
749
+    event.preventDefault();
750
+    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
751
+
752
+    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
753
+
754
+    var showallmsgs = 0;
755
+    if ($("#showallmessages").is(':checked')) {
756
+        showallmsgs = 1;
757
+    }
758
+
759
+    var telsenderinit = $("#tel_sender_name").val();
760
+    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');
761
+
762
+    var nexsenderinit = $("#nex_sender_name").val();
763
+    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');
764
+
765
+    var twilsenderinit = $("#twil_sender_name").val();
766
+    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');
767
+
768
+    var datatosave = {
769
+                      userId: userid,
770
+                      telapiKey: $("#telapi_key").val(),
771
+                      telPubKey: $("#tel_pub_key").val(),
772
+                      telapiUrlRec: $("#telapi_url_rec").val(),
773
+                      telapiUrl: $("#telapi_url").val(),
774
+                      messagingProfileId: $("#messaging_profile_id").val(),
775
+                      nexapiKey: $("#nexapi_key").val(),
776
+                      nexapiSecret: $("#nexapi_secret").val(),
777
+                      nexapiUrlRec: $("#nexapi_url_rec").val(),
778
+                      nexapiUrl: $("#nexapi_url").val(),
779
+                      twilapiKey: $("#twilapi_key").val(),
780
+                      twilapiSecret: $("#twilapi_secret").val(),
781
+                      twilapiUrlRec: $("#twilapi_url_rec").val(),
782
+                      twilapiUrl: $("#twilapi_url").val(),
783
+                      flowapiKey: $("#flowapi_key").val(),
784
+                      flowapiSecret: $("#flowapi_secret").val(),
785
+                      flowapiUrlRec: $("#flowapi_url_rec").val(),
786
+                      flowapiUrl: $("#flowapi_url").val(),
787
+                      telSenderName: telsenderproc,
788
+                      nexSenderName: nexsenderproc,
789
+                      twilSenderName: twilsenderproc,
790
+                      showAllMessages: showallmsgs
791
+    };
792
+
793
+
794
+    $.ajax({
795
+       method: 'PUT',
796
+       url: baseUrlsv + '/' + userid,
797
+       contentType: 'application/json',
798
+       data: JSON.stringify(datatosave),
799
+       success: function() {
800
+       },
801
+       error: function() {
802
+            showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
803
+       }
804
+    });
805
+
806
+  });
807
+
808
+  function showAlert(alertText) {
809
+
810
+     let alertwnd = "<div id='alertMessage'>";
811
+     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
812
+     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
813
+     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
814
+     alertwnd += "</div>";
815
+
816
+     $("#content").append("<div id='alertMsgOverlay'></div>");
817
+     $("#content").append(alertwnd);
818
+
819
+     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
820
+     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
821
+     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
822
+
823
+     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
824
+     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
825
+     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
826
+  }
827
+
828
+});
Browse code

removed files to implement auto-reply fix, etc.

DoubleBastionAdmin authored on 20/05/2023 00:46:30
Showing 1 changed files
1 1
deleted file mode 100644
... ...
@@ -1,378 +0,0 @@
1
-/**
2
- * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
- *
4
- * @author Double Bastion LLC
5
- *
6
- * @license GNU AGPL version 3 or any later version
7
- *
8
- * This program is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
- * License as published by the Free Software Foundation; either
11
- * version 3 of the License, or any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
- *
18
- * You should have received a copy of the GNU Affero General Public
19
- * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- */
22
-
23
-$(document).ready(function() {
24
-
25
-  var userid = "<?php p($userId); ?>";
26
-  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
27
-
28
-  $.ajax({
29
-     method: 'GET',
30
-     url: baseUrlget + '/' + userid,
31
-     contentType: 'application/json',
32
-     success: function(settingsadm) {
33
-
34
-          if (settingsadm.show_all_messages == 1) {
35
-              $("#showallmessages").attr("checked", true);
36
-          } else {
37
-              $("#showallmessages").attr("checked", false);
38
-          }
39
-
40
-          var crntadmDispName = settingsadm.admdisplayname;
41
-          var allRestrictions = settingsadm.restrictions;
42
-          var allGroups = settingsadm.allgroups;
43
-          var allUsers = settingsadm.allusers;
44
-
45
-          if (allRestrictions.length > 0) { 
46
-              var restrNmb = allRestrictions.length;
47
-          } else { 
48
-              var restrNmb = 0; 
49
-          }
50
-
51
-
52
-	  // List the access restrictions for groups and users
53
-          if (restrNmb == 0) {
54
-
55
-              $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/apps/sms_relentless/img/close.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
56
-	      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
57
-
58
-          } else {
59
-
60
-	      for (k = 0; k < restrNmb; k++) {
61
-
62
-                   if (allRestrictions[k].groups) {
63
-                       var groupsfdbpre = allRestrictions[k].groups.split("|");
64
-                       var groupsfdb = "";
65
-                       for (var g = 0; g < groupsfdbpre.length; g++) {
66
-                            groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/apps/sms_relentless/img/close.svg' title='Remove this group'></div>";
67
-                       }
68
-                   } else { var groupsfdb = ""; }
69
-
70
-                   if (allRestrictions[k].users) {
71
-                       var usersfdbpre = allRestrictions[k].users.split("|");
72
-                       var usersfdb = "";
73
-                       for (var u = 0; u < usersfdbpre.length; u++) {
74
-                            usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/apps/sms_relentless/img/close.svg' title='Remove this user'></div>";
75
-                       }
76
-                   } else { var usersfdb = ""; }
77
-
78
-		   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/apps/sms_relentless/img/close.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
79
-              }
80
-              $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
81
-          }
82
-
83
-
84
-          // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
85
-          $("#phoneNumberTh").addClass('icon-loading');
86
-          var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
87
-          var numbersListItems = '';
88
-
89
-	  $.ajax({
90
-		  url: getnumbersUrl + '/' + userid,
91
-		  type: "POST",
92
-		  cache: false,
93
-		  processData: false,
94
-		  contentType: false,
95
-		  success: function(currentnmbrs) {
96
-
97
-                                    $("#phoneNumberTh").removeClass('icon-loading');
98
-
99
-				    // Create a list with all the available phone numbers
100
-                                    numbersListItems = "<option value='' selected>Select phone number</option>";
101
-
102
-				    $.each(currentnmbrs, function(key, indsmsnmb) {
103
-					 var emptyinit = indsmsnmb.split(":");
104
-					 var emptysec = emptyinit[1];
105
-					 var emptycheck = emptysec.replace(" ", "").replace("+", "");
106
-
107
-					 if (emptycheck != '') {
108
-					     numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
109
-					 }
110
-				    });
111
-
112
-				    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
113
-
114
-				    // Append the list of available phone numbers
115
-				    $("#rstphn-"+ indRow).empty();
116
-				    $("#rstphn-"+ indRow).append(numbersListItems);
117
-        
118
-		  },
119
-		  error: function() {
120
-                                    $("#phoneNumberTh").removeClass('icon-loading'); 
121
-                                    alert("Error while attempting to retrieve the available phone numbers!");
122
-                  }
123
-          });
124
-
125
-
126
-          // Create a list with all the available groups
127
-          var grpsListItems = "";
128
-          $.each(allGroups, function(key, value) {
129
-                 grpsListItems += "<div class='groupsList'>"+ value.gid +"</div>";
130
-          });
131
-
132
-          // Create a list with all the available users
133
-          var usersListItems = "";
134
-          $.each(allUsers, function(key, usrval) {
135
-                 usersListItems += "<div class='usersList'>"+ usrval.value +"</div>";
136
-          });
137
-
138
-
139
-          function showLists() {
140
-
141
-              // Append the list of available groups
142
-              $('[id^="showGrps-"]').click(function() {
143
-                 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
144
-                 $("#grpL-"+ crtnmbr).remove();
145
-                 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
146
-                 $("#adminOverlay").remove();
147
-                 $("#admin_conf").append("<div id='adminOverlay'></div>");
148
-
149
-                 $("#adminOverlay").click(function() { 
150
-                    $("#adminOverlay").remove(); 
151
-                    $("#grpL-"+ crtnmbr).remove(); 
152
-                    $("#usrL-"+ crtnmbr).remove();
153
-                 });
154
-
155
-                 // Select a group
156
-                 $(".groupsList").click(function() {
157
-                    var slctdGrp = $(this).text();
158
-                    $("#grpL-"+ crtnmbr).remove();
159
-                    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
160
-
161
-                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
162
-                        $("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/close.svg' title='Remove this group'></div>");
163
-                    } else { alert("That group has already been added!"); }
164
-
165
-                    // Remove a group from list
166
-                    $('[id^="rmvGrp-"]').click(function() {
167
-                       $(this).closest(".selectedGrps").remove();
168
-                    });
169
-                 });
170
-
171
-              });
172
-
173
-              // Append the list of available users
174
-              $('[id^="showUsr-"]').click(function() {
175
-
176
-                 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
177
-                 $("#usrL-"+ ctusrnmbr).remove();
178
-                 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
179
-                 $("#adminOverlay").remove();
180
-                 $("#admin_conf").append("<div id='adminOverlay'></div>");
181
-
182
-                 $("#adminOverlay").click(function() { 
183
-                    $("#adminOverlay").remove(); 
184
-                    $("#grpL-"+ ctusrnmbr).remove(); 
185
-                    $("#usrL-"+ ctusrnmbr).remove();
186
-                 });
187
-
188
-                 // Select a user
189
-                 $(".usersList").click(function() {
190
-                    var slctdUsr = $(this).text();
191
-                    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
192
-
193
-                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
194
-                        $("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/close.svg' title='Remove this user'></div>");
195
-                    } else { alert("That user has already been added!"); }
196
-
197
-                    // Remove a user from list
198
-                    $('[id^="rmvUsr-"]').click(function() {
199
-                       $(this).closest(".selectedUsrs").remove();
200
-                    });
201
-                 });
202
-
203
-              });
204
-
205
-              // Remove a group from list
206
-              $('[id^="rmvGrp-"]').click(function() {
207
-                 $(this).closest(".selectedGrps").remove();
208
-              });
209
-
210
-              // Remove a user from list
211
-              $('[id^="rmvUsr-"]').click(function() {
212
-                 $(this).closest(".selectedUsrs").remove();
213
-              });
214
-
215
-          }
216
-          showLists();
217
-
218
-
219
-          // Save the data
220
-          function saveRestrRow() {
221
-             $('[id^="rstsave-"]').unbind("click");
222
-             $('[id^="rstsave-"]').click(function(event) {
223
-
224
-                 event.preventDefault();
225
-                 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
226
-
227
-                 if ($(this).attr("value") == "Save") {
228
-
229
-                     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
230
-                     var slctdGroups = [];
231
-                     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
232
-                        slctdGroups.push($(this).text());
233
-                     });
234
-                     var slctdUsers = [];
235
-                     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
236
-                        slctdUsers.push($(this).text());
237
-                     });
238
-
239
-                     if (phoneNmbr != '') {
240
-
241
-                       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
242
-
243
-                         var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
244
-                         var datatosend = { 
245
-                              userId: userid,
246
-                              savedByDsplname: crntadmDispName,
247
-                              phoneNumber: phoneNmbr,
248
-                              groups: slctdGroups,
249
-                              users: slctdUsers
250
-                         };
251
-
252
-	                 $.ajax({
253
-	                   method: 'PUT',
254
-	                   url: saveRestrUrl + '/' + userid,
255
-	                   contentType: 'application/json',
256
-	                   data: JSON.stringify(datatosend),
257
-                           success: function(messagetosend) {
258
-                                        if (messagetosend == 'success') {
259
-                                            alert('The restrictions have been successfully saved to the database!');
260
-                                        } else {
261
-                                            alert('Error while trying to save the restrictions!');
262
-                                        }
263
-                           },
264
-	                   error: function() {
265
-		                        alert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
266
-	                   }
267
-	                 });
268
-
269
-                       } else { alert("You must select at least a group or a user in order to restrict the use of a phone number."); return; }
270
-
271
-                     } else { alert("Please select a phone number!"); return; }
272
-
273
-                     $(this).attr("value", "Edit");
274
-
275
-                } else {
276
-
277
-                     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
278
-                }
279
-
280
-             });
281
-          }
282
-          saveRestrRow();
283
-
284
-          // Remove a row
285
-          function removeRestrRow() {
286
-               $('[id^="rmRow-"]').click(function() {
287
-
288
-                  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
289
-                  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
290
-
291
-                  if (confirm("Do you really want to remove this row from the database ?")) {
292
-
293
-                      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
294
-                      $.ajax({
295
-                           url: rmvRestrUrl + '/' + userid,
296
-                           method: "POST",
297
-                           dataType: "text",
298
-                           data: { phoneNumber: crntPhNmbr },
299
-                           success: function(delresult) {
300
-
301
-                                             if (delresult.indexOf("success") > -1) {
302
-                                                 alert("The restriction has been removed successfully!");
303
-                                                 $("#rstphn-"+ slctRowRmv).closest("tr").remove();
304
-                                             } else {
305
-                                                 alert("Error while trying to remove restriction data!");
306
-                                             }
307
-                           },
308
-                           error: function() { alert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
309
-                       });
310
-                  }
311
-               });
312
-          }
313
-          removeRestrRow();
314
-
315
-          // Add a new row
316
-	  $("#addRestrRow").click(function() {
317
-              if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
318
-                  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
319
-                  var indRowAdd = parseInt(lastrstAuth + 1);
320
-              } else { var indRowAdd = 0; }
321
-	      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/apps/sms_relentless/img/close.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
322
-              showLists();
323
-              saveRestrRow();
324
-              removeRestrRow();
325
-
326
-              // Check if the same phone number has been already restricted
327
-              $("#rstphn-"+ indRowAdd).change(function() {
328
-                 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
329
-                 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
330
-                 var phNmbrChck = 0;
331
-                 allPHoneRestr.each(function() {
332
-                    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
333
-                    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
334
-                 });
335
-
336
-                 if (phNmbrChck == 2) {
337
-                     alert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict.");
338
-                     $(this).val('');
339
-                     return;
340
-                 }
341
-              });
342
-	  });
343
-
344
-     },
345
-     error: function() {
346
-                alert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
347
-     }
348
-  });
349
-
350
-
351
-  $("#save_admin_settings").on("click", function(event) {
352
-
353
-    event.preventDefault();
354
-    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
355
-
356
-    var baseUrl = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
357
-
358
-    var showallmsgs = 0;
359
-    if ($("#showallmessages").is(':checked')) {
360
-        showallmsgs = 1;
361
-    }
362
-
363
-    var datatosave = {
364
-                      userId: userid,
365
-                      showAllMessages: showallmsgs
366
-    };
367
-
368
-    $.ajax({
369
-       method: 'PUT',
370
-       url: baseUrl + '/' + userid,
371
-       contentType: 'application/json',
372
-       data: JSON.stringify(datatosave),
373
-       error: function(resp) {
374
-                 alert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
375
-       }
376
-    });
377
-  });
378
-});
Browse code

added changes for origination, auto-reply, etc.

DoubleBastionAdmin authored on 08/05/2023 20:50:18
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,378 @@
1
+/**
2
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
+ *
4
+ * @author Double Bastion LLC
5
+ *
6
+ * @license GNU AGPL version 3 or any later version
7
+ *
8
+ * This program is free software; you can redistribute it and/or
9
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
+ * License as published by the Free Software Foundation; either
11
+ * version 3 of the License, or any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
+ *
18
+ * You should have received a copy of the GNU Affero General Public
19
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+$(document).ready(function() {
24
+
25
+  var userid = "<?php p($userId); ?>";
26
+  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');
27
+
28
+  $.ajax({
29
+     method: 'GET',
30
+     url: baseUrlget + '/' + userid,
31
+     contentType: 'application/json',
32
+     success: function(settingsadm) {
33
+
34
+          if (settingsadm.show_all_messages == 1) {
35
+              $("#showallmessages").attr("checked", true);
36
+          } else {
37
+              $("#showallmessages").attr("checked", false);
38
+          }
39
+
40
+          var crntadmDispName = settingsadm.admdisplayname;
41
+          var allRestrictions = settingsadm.restrictions;
42
+          var allGroups = settingsadm.allgroups;
43
+          var allUsers = settingsadm.allusers;
44
+
45
+          if (allRestrictions.length > 0) { 
46
+              var restrNmb = allRestrictions.length;
47
+          } else { 
48
+              var restrNmb = 0; 
49
+          }
50
+
51
+
52
+	  // List the access restrictions for groups and users
53
+          if (restrNmb == 0) {
54
+
55
+              $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/apps/sms_relentless/img/close.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
56
+	      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
57
+
58
+          } else {
59
+
60
+	      for (k = 0; k < restrNmb; k++) {
61
+
62
+                   if (allRestrictions[k].groups) {
63
+                       var groupsfdbpre = allRestrictions[k].groups.split("|");
64
+                       var groupsfdb = "";
65
+                       for (var g = 0; g < groupsfdbpre.length; g++) {
66
+                            groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/apps/sms_relentless/img/close.svg' title='Remove this group'></div>";
67
+                       }
68
+                   } else { var groupsfdb = ""; }
69
+
70
+                   if (allRestrictions[k].users) {
71
+                       var usersfdbpre = allRestrictions[k].users.split("|");
72
+                       var usersfdb = "";
73
+                       for (var u = 0; u < usersfdbpre.length; u++) {
74
+                            usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/apps/sms_relentless/img/close.svg' title='Remove this user'></div>";
75
+                       }
76
+                   } else { var usersfdb = ""; }
77
+
78
+		   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/apps/sms_relentless/img/close.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
79
+              }
80
+              $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
81
+          }
82
+
83
+
84
+          // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
85
+          $("#phoneNumberTh").addClass('icon-loading');
86
+          var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
87
+          var numbersListItems = '';
88
+
89
+	  $.ajax({
90
+		  url: getnumbersUrl + '/' + userid,
91
+		  type: "POST",
92
+		  cache: false,
93
+		  processData: false,
94
+		  contentType: false,
95
+		  success: function(currentnmbrs) {
96
+
97
+                                    $("#phoneNumberTh").removeClass('icon-loading');
98
+
99
+				    // Create a list with all the available phone numbers
100
+                                    numbersListItems = "<option value='' selected>Select phone number</option>";
101
+
102
+				    $.each(currentnmbrs, function(key, indsmsnmb) {
103
+					 var emptyinit = indsmsnmb.split(":");
104
+					 var emptysec = emptyinit[1];
105
+					 var emptycheck = emptysec.replace(" ", "").replace("+", "");
106
+
107
+					 if (emptycheck != '') {
108
+					     numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
109
+					 }
110
+				    });
111
+
112
+				    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }
113
+
114
+				    // Append the list of available phone numbers
115
+				    $("#rstphn-"+ indRow).empty();
116
+				    $("#rstphn-"+ indRow).append(numbersListItems);
117
+        
118
+		  },
119
+		  error: function() {
120
+                                    $("#phoneNumberTh").removeClass('icon-loading'); 
121
+                                    alert("Error while attempting to retrieve the available phone numbers!");
122
+                  }
123
+          });
124
+
125
+
126
+          // Create a list with all the available groups
127
+          var grpsListItems = "";
128
+          $.each(allGroups, function(key, value) {
129
+                 grpsListItems += "<div class='groupsList'>"+ value.gid +"</div>";
130
+          });
131
+
132
+          // Create a list with all the available users
133
+          var usersListItems = "";
134
+          $.each(allUsers, function(key, usrval) {
135
+                 usersListItems += "<div class='usersList'>"+ usrval.value +"</div>";
136
+          });
137
+
138
+
139
+          function showLists() {
140
+
141
+              // Append the list of available groups
142
+              $('[id^="showGrps-"]').click(function() {
143
+                 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
144
+                 $("#grpL-"+ crtnmbr).remove();
145
+                 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
146
+                 $("#adminOverlay").remove();
147
+                 $("#admin_conf").append("<div id='adminOverlay'></div>");
148
+
149
+                 $("#adminOverlay").click(function() { 
150
+                    $("#adminOverlay").remove(); 
151
+                    $("#grpL-"+ crtnmbr).remove(); 
152
+                    $("#usrL-"+ crtnmbr).remove();
153
+                 });
154
+
155
+                 // Select a group
156
+                 $(".groupsList").click(function() {
157
+                    var slctdGrp = $(this).text();
158
+                    $("#grpL-"+ crtnmbr).remove();
159
+                    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();
160
+
161
+                    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
162
+                        $("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/apps/sms_relentless/img/close.svg' title='Remove this group'></div>");
163
+                    } else { alert("That group has already been added!"); }
164
+
165
+                    // Remove a group from list
166
+                    $('[id^="rmvGrp-"]').click(function() {
167
+                       $(this).closest(".selectedGrps").remove();
168
+                    });
169
+                 });
170
+
171
+              });
172
+
173
+              // Append the list of available users
174
+              $('[id^="showUsr-"]').click(function() {
175
+
176
+                 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
177
+                 $("#usrL-"+ ctusrnmbr).remove();
178
+                 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
179
+                 $("#adminOverlay").remove();
180
+                 $("#admin_conf").append("<div id='adminOverlay'></div>");
181
+
182
+                 $("#adminOverlay").click(function() { 
183
+                    $("#adminOverlay").remove(); 
184
+                    $("#grpL-"+ ctusrnmbr).remove(); 
185
+                    $("#usrL-"+ ctusrnmbr).remove();
186
+                 });
187
+
188
+                 // Select a user
189
+                 $(".usersList").click(function() {
190
+                    var slctdUsr = $(this).text();
191
+                    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();
192
+
193
+                    if (addedTxtusr.indexOf(slctdUsr) == -1) {
194
+                        $("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/apps/sms_relentless/img/close.svg' title='Remove this user'></div>");
195
+                    } else { alert("That user has already been added!"); }
196
+
197
+                    // Remove a user from list
198
+                    $('[id^="rmvUsr-"]').click(function() {
199
+                       $(this).closest(".selectedUsrs").remove();
200
+                    });
201
+                 });
202
+
203
+              });
204
+
205
+              // Remove a group from list
206
+              $('[id^="rmvGrp-"]').click(function() {
207
+                 $(this).closest(".selectedGrps").remove();
208
+              });
209
+
210
+              // Remove a user from list
211
+              $('[id^="rmvUsr-"]').click(function() {
212
+                 $(this).closest(".selectedUsrs").remove();
213
+              });
214
+
215
+          }
216
+          showLists();
217
+
218
+
219
+          // Save the data
220
+          function saveRestrRow() {
221
+             $('[id^="rstsave-"]').unbind("click");
222
+             $('[id^="rstsave-"]').click(function(event) {
223
+
224
+                 event.preventDefault();
225
+                 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");
226
+
227
+                 if ($(this).attr("value") == "Save") {
228
+
229
+                     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
230
+                     var slctdGroups = [];
231
+                     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
232
+                        slctdGroups.push($(this).text());
233
+                     });
234
+                     var slctdUsers = [];
235
+                     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
236
+                        slctdUsers.push($(this).text());
237
+                     });
238
+
239
+                     if (phoneNmbr != '') {
240
+
241
+                       if (slctdGroups.length > 0 || slctdUsers.length > 0) {
242
+
243
+                         var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');
244
+                         var datatosend = { 
245
+                              userId: userid,
246
+                              savedByDsplname: crntadmDispName,
247
+                              phoneNumber: phoneNmbr,
248
+                              groups: slctdGroups,
249
+                              users: slctdUsers
250
+                         };
251
+
252
+	                 $.ajax({
253
+	                   method: 'PUT',
254
+	                   url: saveRestrUrl + '/' + userid,
255
+	                   contentType: 'application/json',
256
+	                   data: JSON.stringify(datatosend),
257
+                           success: function(messagetosend) {
258
+                                        if (messagetosend == 'success') {
259
+                                            alert('The restrictions have been successfully saved to the database!');
260
+                                        } else {
261
+                                            alert('Error while trying to save the restrictions!');
262
+                                        }
263
+                           },
264
+	                   error: function() {
265
+		                        alert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
266
+	                   }
267
+	                 });
268
+
269
+                       } else { alert("You must select at least a group or a user in order to restrict the use of a phone number."); return; }
270
+
271
+                     } else { alert("Please select a phone number!"); return; }
272
+
273
+                     $(this).attr("value", "Edit");
274
+
275
+                } else {
276
+
277
+                     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
278
+                }
279
+
280
+             });
281
+          }
282
+          saveRestrRow();
283
+
284
+          // Remove a row
285
+          function removeRestrRow() {
286
+               $('[id^="rmRow-"]').click(function() {
287
+
288
+                  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
289
+                  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();
290
+
291
+                  if (confirm("Do you really want to remove this row from the database ?")) {
292
+
293
+                      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
294
+                      $.ajax({
295
+                           url: rmvRestrUrl + '/' + userid,
296
+                           method: "POST",
297
+                           dataType: "text",
298
+                           data: { phoneNumber: crntPhNmbr },
299
+                           success: function(delresult) {
300
+
301
+                                             if (delresult.indexOf("success") > -1) {
302
+                                                 alert("The restriction has been removed successfully!");
303
+                                                 $("#rstphn-"+ slctRowRmv).closest("tr").remove();
304
+                                             } else {
305
+                                                 alert("Error while trying to remove restriction data!");
306
+                                             }
307
+                           },
308
+                           error: function() { alert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
309
+                       });
310
+                  }
311
+               });
312
+          }
313
+          removeRestrRow();
314
+
315
+          // Add a new row
316
+	  $("#addRestrRow").click(function() {
317
+              if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
318
+                  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
319
+                  var indRowAdd = parseInt(lastrstAuth + 1);
320
+              } else { var indRowAdd = 0; }
321
+	      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/apps/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/apps/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/apps/sms_relentless/img/close.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
322
+              showLists();
323
+              saveRestrRow();
324
+              removeRestrRow();
325
+
326
+              // Check if the same phone number has been already restricted
327
+              $("#rstphn-"+ indRowAdd).change(function() {
328
+                 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
329
+                 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
330
+                 var phNmbrChck = 0;
331
+                 allPHoneRestr.each(function() {
332
+                    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
333
+                    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
334
+                 });
335
+
336
+                 if (phNmbrChck == 2) {
337
+                     alert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict.");
338
+                     $(this).val('');
339
+                     return;
340
+                 }
341
+              });
342
+	  });
343
+
344
+     },
345
+     error: function() {
346
+                alert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
347
+     }
348
+  });
349
+
350
+
351
+  $("#save_admin_settings").on("click", function(event) {
352
+
353
+    event.preventDefault();
354
+    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
355
+
356
+    var baseUrl = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');
357
+
358
+    var showallmsgs = 0;
359
+    if ($("#showallmessages").is(':checked')) {
360
+        showallmsgs = 1;
361
+    }
362
+
363
+    var datatosave = {
364
+                      userId: userid,
365
+                      showAllMessages: showallmsgs
366
+    };
367
+
368
+    $.ajax({
369
+       method: 'PUT',
370
+       url: baseUrl + '/' + userid,
371
+       contentType: 'application/json',
372
+       data: JSON.stringify(datatosave),
373
+       error: function(resp) {
374
+                 alert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
375
+       }
376
+    });
377
+  });
378
+});