invites.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /* PHP MAILER JS FILE */
  2. /*
  3. $(document).on('click', '#PHPMAILER-settings-button', function() {
  4. var post = {
  5. plugin:'PHPMailer/settings/get', // used for switch case in your API call
  6. api:'api/?v1/plugin', // API Endpoint will always be this for custom plugin API calls
  7. name:$(this).attr('data-plugin-name'),
  8. configName:$(this).attr('data-config-name'),
  9. messageTitle:'', // Send succees message title (top line)
  10. messageBody:'Disabled '+$(this).attr('data-plugin-name'), // Send succees message body (bottom line)
  11. error:'Organizr Function: API Connection Failed' // conole error message
  12. };
  13. var callbacks = $.Callbacks(); // init callbacks var
  14. //callbacks.add( ); // add function to callback to be fired after API call
  15. //settingsAPI(post,callbacks); // exec API call
  16. //ajaxloader(".content-wrap","in");
  17. //setTimeout(function(){ buildPlugins();ajaxloader(); }, 3000);
  18. });
  19. */
  20. // FUNCTIONS
  21. function joinPlex(){
  22. var username = $('#invitePlexJoinUsername');
  23. var email = $('#invitePlexJoinEmail');
  24. var password = $('#invitePlexJoinPassword');
  25. if(username.val() == ''){
  26. username.focus();
  27. message('Invite Error',' Please Enter Username','bottom-right','#FFF','warning','5000');
  28. }else if(email.val() == ''){
  29. email.focus();
  30. message('Invite Error',' Please Enter Email','bottom-right','#FFF','warning','5000');
  31. }else if(password.val() == ''){
  32. password.focus();
  33. message('Invite Error',' Please Enter Passowrd','bottom-right','#FFF','warning','5000');
  34. }
  35. if(email.val() !== '' && username.val() !== '' && password.val() !== ''){
  36. organizrAPI('POST','api/?v1/plex/join',{username:username.val(), email:email.val(), password:password.val()}).success(function(data) {
  37. var response = JSON.parse(data);
  38. if(response.data === true){
  39. $('.invite-step-3-plex-no').toggleClass('hidden');
  40. $('.invite-step-3-plex-yes').toggleClass('hidden');
  41. message('Invite Function',' User Created','bottom-right','#FFF','success','5000');
  42. $('#inviteUsernameInvite').val(username.val());
  43. hasPlexUsername();
  44. }else{
  45. message('Invite Error',' '+response.data,'bottom-right','#FFF','warning','5000');
  46. }
  47. }).fail(function(xhr) {
  48. console.error("Organizr Function: API Connection Failed");
  49. });
  50. }
  51. }
  52. function inviteHasAccount(type,value){
  53. switch (type) {
  54. case 'plex':
  55. if(value){
  56. $('.invite-step-2').toggleClass('hidden');
  57. $('.invite-step-3-plex-yes').toggleClass('hidden');
  58. }else{
  59. $('.invite-step-2').toggleClass('hidden');
  60. $('.invite-step-3-plex-no').toggleClass('hidden');
  61. }
  62. break;
  63. default:
  64. alert(type+' is not set up yet');
  65. }
  66. }
  67. function hasPlexUsername(){
  68. var code = $('#inviteCodeInput').val().toUpperCase();
  69. var username = $('#inviteUsernameInvite');
  70. if(username.val() == ''){
  71. username.focus();
  72. message('Invite Error',' Please Enter Username','bottom-right','#FFF','warning','5000');
  73. }else{
  74. var post = {
  75. plugin:'Invites/codes',
  76. action:'use',
  77. code:code,
  78. usedby:username.val()
  79. };
  80. ajaxloader(".content-wrap","in");
  81. organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
  82. var response = JSON.parse(data);
  83. if(response.data === true){
  84. $('.invite-step-3-plex-yes').toggleClass('hidden');
  85. $('.invite-step-4-plex-accept').toggleClass('hidden');
  86. if(local('get', 'invite')){
  87. local('remove', 'invite');
  88. }
  89. }else{
  90. message('Invite Error',' Code Incorrect','bottom-right','#FFF','warning','5000');
  91. }
  92. ajaxloader();;
  93. }).fail(function(xhr) {
  94. console.error("Organizr Function: API Connection Failed");
  95. ajaxloader();
  96. });
  97. }
  98. }
  99. function verifyInvite(){
  100. var code = $('#inviteCodeInput').val().toUpperCase();
  101. var post = {
  102. plugin:'Invites/codes',
  103. action:'check',
  104. code:code
  105. };
  106. ajaxloader(".content-wrap","in");
  107. organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
  108. var response = JSON.parse(data);
  109. if(response.data === true){
  110. $('.invite-step-1').toggleClass('hidden');
  111. $('.invite-step-2').toggleClass('hidden');
  112. }else{
  113. message('Invite Error',' Code Incorrect','bottom-right','#FFF','warning','5000');
  114. }
  115. if(local('get', 'invite')){
  116. local('remove', 'invite');
  117. }
  118. ajaxloader();;
  119. }).fail(function(xhr) {
  120. console.error("Organizr Function: API Connection Failed");
  121. ajaxloader();
  122. });
  123. }
  124. function getInvite(invite=null){
  125. if(invite){
  126. local('set','invite',invite);
  127. }
  128. if($.urlParam('invite') !== null){
  129. local('set','invite',$.urlParam('invite'));
  130. }
  131. if(local('get', 'invite')){
  132. //show error page
  133. $('.inviteModal').trigger('click');
  134. $('#inviteCodeInput').val(local('get', 'invite'));
  135. //local('remove', 'invite');
  136. window.history.pushState({}, document.title, "/" );
  137. }
  138. }
  139. function createNewInvite(){
  140. var username = $('#new-invite-form-inputUsername');
  141. var email = $('#new-invite-form-inputEmail');
  142. if(username.val() == ''){
  143. username.focus();
  144. message('Invite Error',' Please Enter Username','bottom-right','#FFF','warning','5000');
  145. }else if(email.val() == ''){
  146. email.focus();
  147. message('Invite Error',' Please Enter Email','bottom-right','#FFF','warning','5000');
  148. }
  149. if(email.val() !== '' && username.val() !== ''){
  150. var post = {
  151. plugin:'Invites/codes',
  152. action:'create',
  153. code:createRandomString(6).toUpperCase(),
  154. email:email.val(),
  155. username:username.val(),
  156. };
  157. ajaxloader(".content-wrap","in");
  158. organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
  159. var response = JSON.parse(data);
  160. $.magnificPopup.close();
  161. ajaxloader();
  162. message('Invite',' Invite Created','bottom-right','#FFF','success','5000');
  163. }).fail(function(xhr) {
  164. console.error("Organizr Function: API Connection Failed");
  165. ajaxloader();
  166. message('Invite Error',' An Error Occured','bottom-right','#FFF','error','5000');
  167. });
  168. }
  169. }
  170. function deleteInvite(id){
  171. var post = {
  172. plugin:'Invites/codes',
  173. action:'delete',
  174. id:id,
  175. };
  176. ajaxloader(".content-wrap","in");
  177. organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
  178. var response = JSON.parse(data);
  179. $('#inviteItem-'+id).remove();
  180. //$.magnificPopup.close();
  181. ajaxloader();
  182. message('Invite',' Invite Deleted','bottom-right','#FFF','success','5000');
  183. }).fail(function(xhr) {
  184. console.error("Organizr Function: API Connection Failed");
  185. ajaxloader();
  186. message('Invite Error',' An Error Occured','bottom-right','#FFF','error','5000');
  187. });
  188. }
  189. // EVENTS and LISTENERS
  190. $(window).on('load', function() {
  191. var menuList = '';
  192. var htmlDOM = `
  193. <div id="invite-area" class="white-popup mfp-with-anim mfp-hide">
  194. <div class="col-md-10 col-md-offset-1">
  195. <div class="invite-div"></div>
  196. </div>
  197. </div>
  198. `;
  199. if(activeInfo.plugins["INVITES-enabled"] == true){
  200. if (activeInfo.user.loggedin === true && activeInfo.user.groupID <= 1) {
  201. menuList = `<li><a class="inline-popups inviteModal" href="#invite-area" data-effect="mfp-zoom-out"><i class="fa fa-ticket fa-fw"></i> <span lang="en">Manage Invites</span></a></li>`;
  202. htmlDOM += `
  203. <div id="new-invite-area" class="white-popup mfp-with-anim mfp-hide">
  204. <div class="col-md-10 col-md-offset-1">
  205. <div class="col-md-12">
  206. <div class="panel panel-info m-b-0">
  207. <div class="panel-heading" lang="en">New Invite</div>
  208. <div class="panel-wrapper collapse in" aria-expanded="true">
  209. <div class="panel-body">
  210. <form id="new-invite-form">
  211. <fieldset style="border:0;">
  212. <div class="form-group">
  213. <label class="control-label" for="new-invite-form-inputUsername" lang="en">Name or Username</label>
  214. <input type="text" class="form-control" id="new-invite-form-inputUsername" name="username" required="" autofocus="">
  215. </div>
  216. <div class="form-group">
  217. <label class="control-label" for="new-invite-form-inputEmail" lang="en">Email</label>
  218. <input type="text" class="form-control" id="new-invite-form-inputEmail" name="email" required="" autofocus="">
  219. </div>
  220. </fieldset>
  221. <button class="btn btn-sm btn-info btn-rounded waves-effect waves-light pull-right row b-none" onclick="createNewInvite();" type="button"><span class="btn-label"><i class="fa fa-plus"></i></span><span lang="en">Create/Send Invite</span></button>
  222. <div class="clearfix"></div>
  223. </form>
  224. </div>
  225. </div>
  226. </div>
  227. </div>
  228. <div class="clearfix"></div>
  229. </div>
  230. </div>`;
  231. }else if (activeInfo.user.loggedin === false){
  232. menuList = `<li><a class="inline-popups inviteModal" href="#invite-area" data-effect="mfp-zoom-out"><i class="fa fa-ticket fa-fw"></i> <span lang="en">Use Invite Code</span></a></li>`;
  233. }
  234. $('.append-menu').after(menuList);
  235. $('.organizr-area').after(htmlDOM);
  236. pageLoad();
  237. getInvite();
  238. }
  239. });
  240. function buildInvites(array){
  241. if(array.length == 0){
  242. return '<h2 class="text-center" lang="en">No Invites</h2>';
  243. }
  244. var invites = '';
  245. $.each(array, function(i,v) {
  246. v.dateused = (v.dateused) ? v.dateused : '-';
  247. v.usedby = (v.usedby) ? v.usedby : '-';
  248. v.ip = (v.ip) ? v.ip : '-';
  249. invites += `
  250. <tr id="inviteItem-`+v.id+`">
  251. <td class="text-center">`+v.id+`</td>
  252. <td>`+v.username+`</td>
  253. <td>`+v.email+`</td>
  254. <td>`+v.code+`</td>
  255. <td>`+v.date+`</td>
  256. <td>`+v.dateused+`</td>
  257. <td>`+v.usedby+`</td>
  258. <td>`+v.ip+`</td>
  259. <td>`+v.valid+`</td>
  260. <td><button type="button" class="btn btn-danger btn-outline btn-circle btn-lg m-r-5" onclick="deleteInvite('`+v.id+`');"><i class="ti-trash"></i></button></td>
  261. </tr>
  262. `;
  263. });
  264. return invites;
  265. }
  266. $(document).on('click', '.inviteModal', function() {
  267. var htmlDOM = '';
  268. if (activeInfo.user.loggedin === true && activeInfo.user.groupID <= 1) {
  269. var post = {
  270. plugin:'Invites/codes',
  271. action:'get',
  272. };
  273. ajaxloader(".content-wrap","in");
  274. organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
  275. var response = JSON.parse(data);
  276. var htmlDOM = '';
  277. htmlDOM = `
  278. <div class="col-md-12">
  279. <div class="panel bg-org panel-info">
  280. <div class="panel-heading">
  281. <span lang="en">Manage Invites</span>
  282. <button type="button" class="btn btn-info btn-circle pull-right popup-with-form" href="#new-invite-area" data-effect="mfp-3d-unfold"><i class="fa fa-plus"></i> </button>
  283. </div>
  284. <div class="table-responsive">
  285. <table class="table table-hover manage-u-table">
  286. <thead>
  287. <tr>
  288. <th width="70" class="text-center">#</th>
  289. <th lang="en">USERNAME</th>
  290. <th lang="en">EMAIL</th>
  291. <th lang="en">INVITE CODE</th>
  292. <th lang="en">DATE SENT</th>
  293. <th lang="en">DATE USED</th>
  294. <th lang="en">USED BY</th>
  295. <th lang="en">IP ADDRESS</th>
  296. <th lang="en">VALID</th>
  297. <th lang="en">DELETE</th>
  298. </tr>
  299. </thead>
  300. <tbody id="manageInviteTable">
  301. `+buildInvites(response.data)+`
  302. </tbody>
  303. </table>
  304. </div>
  305. </div>
  306. </div>
  307. <div class="clearfix"></div>
  308. `;
  309. $('.invite-div').html(htmlDOM);
  310. }).fail(function(xhr) {
  311. console.error("Organizr Function: API Connection Failed");
  312. });
  313. ajaxloader();
  314. }else if (activeInfo.user.loggedin === false){
  315. htmlDOM = `
  316. <div class="col-md-12">
  317. <div class="panel panel-info m-b-0">
  318. <div class="panel-heading" lang="en">Use Invite Code</div>
  319. <div class="panel-wrapper collapse in" aria-expanded="true">
  320. <div class="panel-body">
  321. <div class="form-group invite-step-1">
  322. <div class="input-group" style="width: 100%;">
  323. <div class="input-group-addon hidden-xs"><i class="ti-lock"></i></div>
  324. <input type="text" class="form-control text-uppercase" id="inviteCodeInput" placeholder="Code" autocomplete="off" autocorrect="off" autocapitalize="off" maxlength="6" spellcheck="false" autofocus="" required="">
  325. </div>
  326. <br />
  327. <button class="btn btn-block btn-info" onclick="verifyInvite();">Verify</button>
  328. </div>
  329. <div class="form-group invite-step-2 hidden">
  330. <div class="row">
  331. <h2 class="text-center" lang="en">Do you have a `+activeInfo.plugins.includes["INVITES-type-include"].toUpperCase()+` account?</h2>
  332. <div class="col-lg-6">
  333. <button class="btn btn-block btn-info m-b-10" onclick="inviteHasAccount('`+activeInfo.plugins.includes["INVITES-type-include"]+`',true);" lang="en">Yes</button>
  334. </div>
  335. <div class="col-lg-6">
  336. <button class="btn btn-block btn-primary m-b-10" onclick="inviteHasAccount('`+activeInfo.plugins.includes["INVITES-type-include"]+`',false);" lang="en">No</button>
  337. </div>
  338. </div>
  339. </div>
  340. <div class="form-group invite-step-3-plex-yes hidden">
  341. <div class="input-group" style="width: 100%;">
  342. <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
  343. <input type="text" class="form-control" id="inviteUsernameInvite" placeholder="Plex Username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
  344. </div>
  345. <br />
  346. <button class="btn btn-block btn-info" onclick="hasPlexUsername();">Submit</button>
  347. </div>
  348. <div class="form-group invite-step-3-plex-no hidden">
  349. <div class="input-group" style="width: 100%;">
  350. <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
  351. <input type="text" class="form-control" id="invitePlexJoinUsername" lang="en" placeholder="Username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
  352. </div>
  353. <div class="input-group" style="width: 100%;">
  354. <div class="input-group-addon hidden-xs"><i class="ti-email"></i></div>
  355. <input type="text" class="form-control" id="invitePlexJoinEmail" lang="en" placeholder="E-Mail" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" required="">
  356. </div>
  357. <div class="input-group" style="width: 100%;">
  358. <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
  359. <input type="password" class="form-control" id="invitePlexJoinPassword" lang="en" placeholder="Password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" required="">
  360. </div>
  361. <br />
  362. <button class="btn btn-block btn-info" onclick="joinPlex();">Submit</button>
  363. </div>
  364. <div class="form-group invite-step-3-emby-yes hidden">
  365. </div>
  366. <div class="form-group invite-step-3-emby-no hidden">
  367. </div>
  368. <div class="form-group invite-step-4-plex-accept hidden">
  369. <h4 class="" lang="en">You have been invited. Please goto <a href="https://plex.tv" target="_blank">PLEX.TV</a> and login to accept the invite. Once you have done that, you may head back here and login with your credentials.</h4>
  370. </div>
  371. </div>
  372. </div>
  373. </div>
  374. </div>
  375. <div class="clearfix"></div>
  376. `;
  377. $('.invite-div').html(htmlDOM);
  378. }
  379. });
  380. // CHANGE CUSTOMIZE Options
  381. $(document).on('change asColorPicker::close', '#INVITES-settings-page :input', function(e) {
  382. var input = $(this);
  383. switch ($(this).attr('type')) {
  384. case 'switch':
  385. case 'checkbox':
  386. var value = $(this).prop("checked") ? true : false;
  387. break;
  388. default:
  389. var value = $(this).val().toString();
  390. }
  391. var post = {
  392. api:'api/?v1/update/config',
  393. name:$(this).attr("name"),
  394. type:$(this).attr("data-type"),
  395. value:value,
  396. messageTitle:'',
  397. messageBody:'Updated Value for '+$(this).parent().parent().find('label').text(),
  398. error:'Organizr Function: API Connection Failed'
  399. };
  400. var callbacks = $.Callbacks();
  401. //callbacks.add( buildCustomizeAppearance );
  402. settingsAPI(post,callbacks);
  403. //disable button then renable
  404. $('#INVITES-settings-page :input').prop('disabled', 'true');
  405. setTimeout(
  406. function(){
  407. $('#INVITES-settings-page :input').prop('disabled', null);
  408. input.emulateTab();
  409. },
  410. 2000
  411. );
  412. });
  413. $(document).on('click', '#INVITES-settings-button', function() {
  414. var post = {
  415. plugin:'Invites/settings/get', // used for switch case in your API call
  416. };
  417. ajaxloader(".content-wrap","in");
  418. organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
  419. var response = JSON.parse(data);
  420. $('#INVITES-settings-items').html(buildFormGroup(response.data));
  421. $(".select2").select2();
  422. $('.selectpicker').selectpicker();
  423. }).fail(function(xhr) {
  424. console.error("Organizr Function: API Connection Failed");
  425. });
  426. ajaxloader();
  427. });