formCollection.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /**
  2. * Collection that holds our form models.
  3. *
  4. * @package Ninja Forms client
  5. * @copyright (c) 2017 WP Ninjas
  6. * @since 3.0
  7. */
  8. define( ['models/formModel'], function( FormModel ) {
  9. var collection = Backbone.Collection.extend( {
  10. model: FormModel,
  11. comparator: 'title',
  12. tmpNum: 1,
  13. url: function() {
  14. return ajaxurl + "?action=nf_forms";
  15. },
  16. initialize: function() {
  17. this.newIDs = [];
  18. this.baseUrl = window.location.href.split('?')[0];
  19. this.listenTo( nfRadio.channel( 'dashboard' ), 'forms:delete', this.modalConfirm );
  20. this.listenTo( nfRadio.channel( 'dashboard' ), 'forms:duplicate', this.duplicate );
  21. this.modal = new jBox( 'Modal', {
  22. width: 400,
  23. addClass: 'dashboard-modal',
  24. overlay: true,
  25. closeOnClick: 'body'
  26. } );
  27. },
  28. parse: function( response, options ){
  29. return response.data;
  30. },
  31. modalConfirm: function( view ){
  32. var message, container, messageBox, title, buttons, confirm, cancel, lineBreak;
  33. var formID = view.model.get( 'id' );
  34. var formTitle = view.model.get( 'title' );
  35. container = document.createElement( 'div' );
  36. container.style.paddingRight = '20px';
  37. container.style.paddingLeft = '20px';
  38. container.style.paddingBottom = '20px';
  39. messageBox = document.createElement( 'p' );
  40. title = document.createElement( 'em' );
  41. buttons = document.createElement( 'div' );
  42. confirm = document.createElement( 'div' );
  43. cancel = document.createElement( 'div' );
  44. container.classList.add( 'message' );
  45. title.innerHTML = formTitle;
  46. messageBox.innerHTML += nfi18n.deleteWarningA + ' (<strong>'
  47. + formTitle + '</strong>). ' + nfi18n.deleteWarningB;
  48. messageBox.appendChild( document.createElement( 'br') );
  49. messageBox.appendChild( document.createElement( 'br') );
  50. var exportFormLink = document.createElement( 'a' );
  51. // link to export page with this form selected
  52. exportFormLink.href = this.baseUrl + '?page=nf-import-export&exportFormId='
  53. + formID;
  54. exportFormLink.innerHTML = '<i class="fa fa-download"' +
  55. ' style="padding:5px;"></i>' + nfi18n.deleteXForm;
  56. exportFormLink.target = '_blank'; // open in new tab
  57. messageBox.appendChild( exportFormLink );
  58. messageBox.appendChild( document.createElement( 'br') );
  59. var exportSubmissionLink = document.createElement( 'a' );
  60. // link to export submissions page
  61. exportSubmissionLink.href = this.baseUrl + '?page=nf-processing&action=download_all_subs&form_id='
  62. + formID + '&redirect=' + encodeURIComponent( this.baseUrl.replace( 'admin.php', 'edit.php' ) + '?post_status=all&post_type=nf_sub&form_id='
  63. + formID );
  64. exportSubmissionLink.target = '_blank';
  65. exportSubmissionLink.innerHTML = '<i class="fa fa-download" ' +
  66. 'style="padding:5px;"></i>' + nfi18n.deleteXSubs;
  67. messageBox.appendChild( exportSubmissionLink );
  68. messageBox.appendChild( document.createElement( 'br') );
  69. container.appendChild( messageBox );
  70. var inputLabel = document.createElement( 'label' );
  71. inputLabel.for = 'confirmDeleteFormInput';
  72. inputLabel.innerHTML = nfi18n.deleteConfirmA + ' <span style="color:red;">DELETE</span> ' + nfi18n.deleteConfirmB;
  73. var deleteInput = document.createElement( 'input' );
  74. deleteInput.type = 'text';
  75. deleteInput.id = 'confirmDeleteFormInput';
  76. deleteInput.style.marginTop = '10px';
  77. deleteInput.style.width = '100%';
  78. deleteInput.style.height = '2.5em';
  79. deleteInput.style.fontSize = '1em';
  80. container.appendChild( inputLabel );
  81. container.appendChild( document.createElement( 'br' ) );
  82. container.appendChild( deleteInput );
  83. container.appendChild( document.createElement( 'br' ) );
  84. container.appendChild( document.createElement( 'br' ) );
  85. confirm.innerHTML = nfi18n.delete;
  86. confirm.classList.add( 'confirm', 'nf-button', 'primary', 'pull-right' );
  87. cancel.innerHTML = nfi18n.cancel;
  88. cancel.classList.add( 'cancel', 'nf-button', 'secondary' );
  89. buttons.appendChild( cancel );
  90. buttons.appendChild( confirm );
  91. buttons.classList.add( 'buttons' );
  92. container.appendChild( buttons );
  93. message = document.createElement( 'div' );
  94. message.appendChild( container );
  95. this.modal.setContent( message.innerHTML );
  96. this.modal.setTitle( nfi18n.deleteTitle );
  97. this.modal.open();
  98. var that = this;
  99. var btnCancel = this.modal.container[0].getElementsByClassName('cancel')[0];
  100. btnCancel.addEventListener('click', function() {
  101. that.modalClose();
  102. } );
  103. var btnConfirm = this.modal.container[0].getElementsByClassName('confirm')[0];
  104. btnConfirm.addEventListener('click', function() {
  105. var deleteInputVal = document.getElementById( 'confirmDeleteFormInput' ).value;
  106. if( 'DELETE' === deleteInputVal ) {
  107. that.confirmDelete(view);
  108. } else {
  109. that.modalClose();
  110. }
  111. } );
  112. },
  113. modalClose: function() {
  114. this.modal.close();
  115. },
  116. confirmDelete: function( view ) {
  117. jQuery( view.el ).removeClass( 'show-actions' );
  118. jQuery( view.el ).addClass( 'deleting' );
  119. jQuery( view.el ).animate({
  120. 'opacity': 0,
  121. 'line-height': 0,
  122. 'display': 'none'
  123. }, 500 );
  124. console.log(view);
  125. view.model.destroy();
  126. this.modalClose();
  127. },
  128. duplicate: function( view ) {
  129. var message = '<div class="message">Duplicating <em>' + view.model.get( 'title' ) +
  130. '</em>...' + '<div class="nf-loading-spinner"></div></div>';
  131. this.modal.setContent( message );
  132. this.modal.setTitle( 'Please Wait' );
  133. this.modal.open();
  134. var that = this;
  135. jQuery.ajax({
  136. type: "POST",
  137. url: ajaxurl + '?action=nf_forms&clone_id=' + view.model.get( 'id' ),
  138. success: function( response ){
  139. var response = JSON.parse( response );
  140. var newID = response.data.new_form_id;
  141. var clone = view.model.clone();
  142. clone.set({
  143. id: newID,
  144. title: clone.get( 'title' ) + ' - copy',
  145. created_at: new Date(),
  146. });
  147. clone.initShortcode( newID );
  148. view.model.collection.add( clone );
  149. that.modalClose();
  150. }
  151. });
  152. }
  153. } );
  154. return collection;
  155. } );