TableAjax.php.upload.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. // @require variables:
  2. if ('undefined' === typeof URL_UPLOAD_FILES_AJAX) throw "Missing URL_UPLOAD_FILES_AJAX";
  3. var this__dragOverChecker = (function () {
  4. var _node = null
  5. var _pk = null
  6. var _ns = null
  7. var _overlayNode = null
  8. var markNodeHoverOn = function (node, pk, ns) {
  9. if (!_overlayNode) {
  10. _overlayNode = document.createElement('div')
  11. _overlayNode.style.backgroundColor = '#03a9f4'
  12. _overlayNode.style.opacity = '0.2'
  13. _overlayNode.style.position = 'absolute'
  14. document.body.appendChild(_overlayNode)
  15. _overlayNode.appendChild(document.createTextNode('drag file...'))
  16. }
  17. var bbox = node.getBoundingClientRect()
  18. _overlayNode.style.top = ((window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0) + bbox.top) + 'px'
  19. _overlayNode.style.left = '0px' // bbox.left + 'px'
  20. _overlayNode.style.width = '100%' // bbox.width + 'px'
  21. _overlayNode.style.height = bbox.height + 'px'
  22. _overlayNode.setAttribute('ondrop', 'p5TA_onDrop(event, \''+pk+'\', \''+ns+'\')')
  23. _overlayNode.setAttribute('ondragover', 'p5TA_overlay_onDragOver(event, this, \''+pk+'\', \''+ns+'\')')
  24. }
  25. var markNodeHoverOff = function () {
  26. if (_overlayNode && _overlayNode.parentNode) _overlayNode.parentNode.removeChild(_overlayNode)
  27. _overlayNode = null
  28. }
  29. var _removeOverlayTimeoutId = null
  30. return {
  31. update: function (node, pk, ns) {
  32. _ns = ns
  33. if (null !== _pk && _pk !== pk) {
  34. markNodeHoverOff()
  35. }
  36. if (_pk !== pk) {
  37. if (null !== node) markNodeHoverOn(node, pk, ns)
  38. }
  39. _pk = pk
  40. if (null !== node) _node = node
  41. if (_removeOverlayTimeoutId) clearTimeout(_removeOverlayTimeoutId)
  42. _removeOverlayTimeoutId = setTimeout(markNodeHoverOff, 1000)
  43. },
  44. removeOverlay: function () {
  45. markNodeHoverOff()
  46. },
  47. }
  48. })();
  49. function p5Utils__getFilesFromDropEvent(event) {
  50. var dt = event.dataTransfer
  51. var files = []
  52. if (dt.items) { // Use DataTransferItemList interface to access the file(s)
  53. for (var i = 0; i < dt.items.length; i++) {
  54. if (dt.items[i].kind == 'file') {
  55. var file = dt.items[i].getAsFile();
  56. files.push(file)
  57. }
  58. }
  59. } else { // Use DataTransfer interface to access the file(s)
  60. for (var i=0; i < dt.files.length; i++) {
  61. files.push(dt.files[i])
  62. }
  63. }
  64. return files
  65. }
  66. function p5TA_uploadWithProgress(files, ns, pk, callbacks) {
  67. var formData = new FormData()
  68. formData.append('namespace', ns)
  69. formData.append('primaryKey', pk)
  70. files.forEach(function (file, idx) {
  71. formData.append('file' + idx, file)
  72. })
  73. var xhr = new XMLHttpRequest()
  74. xhr.withCredentials = true
  75. xhr.open('POST', URL_UPLOAD_FILES_AJAX)
  76. xhr.onerror = function (e) {
  77. if (callbacks && callbacks.onError) {
  78. callbacks.onError(e)
  79. } else {
  80. console.log('error', e);
  81. }
  82. }
  83. if (xhr.upload && callbacks && callbacks.onProgress) {
  84. xhr.upload.onprogress = function __onProgress(event) {
  85. // event.loaded / event.total * 100; // event.lengthComputable
  86. callbacks.onProgress(event.loaded / event.total * 100)
  87. };
  88. }
  89. xhr.onload = function (e) {
  90. if (callbacks && callbacks.onLoad) {
  91. callbacks.onLoad(e.target.responseText)
  92. } else {
  93. console.log('onload e.target.responseText:', e.target.responseText, 'event', e)
  94. }
  95. }
  96. xhr.send(formData)
  97. }
  98. function p5TA_uploadFiles(files, ns, pk) {
  99. var formData = new FormData()
  100. formData.append('namespace', ns)
  101. formData.append('primaryKey', pk)
  102. files.forEach(function (file, idx) {
  103. formData.append('file' + idx, file)
  104. })
  105. window.fetch(URL_UPLOAD_FILES_AJAX, {
  106. method: 'POST',
  107. body: formData,
  108. credentials: 'same-origin',
  109. }).then(function (response) {
  110. return response.json()
  111. }).then(function (response) {
  112. p5UI__notifyAjaxCallback(response)
  113. }).catch(function(error) {
  114. p5UI__notifyAjaxCallback({ type: 'error', msg: error })
  115. })
  116. }
  117. function p5TA_onDrop(event, pk, ns) {
  118. event.preventDefault()
  119. var files = p5Utils__getFilesFromDropEvent(event)
  120. if (!files) {
  121. p5UI__notifyAjaxCallback({
  122. type: 'info',
  123. msg: 'brak plików',
  124. })
  125. return false
  126. }
  127. p5TA_uploadFiles(files, ns, pk)
  128. this__dragOverChecker.removeOverlay()
  129. }
  130. function p5TA_onDragOver(e, n, pk, ns) {
  131. e.preventDefault();
  132. this__dragOverChecker.update(n, pk, ns)
  133. }
  134. function p5TA_overlay_onDragOver(e, n, pk, ns) {
  135. e.preventDefault();
  136. this__dragOverChecker.update(null, pk, ns)
  137. }
  138. function p5TA_onDragEnd(e, n, pk, ns) {
  139. var dt = e.dataTransfer;
  140. if (dt.items) { // Use DataTransferItemList interface to remove the drag data
  141. for (var i = 0; i < dt.items.length; i++) {
  142. dt.items.remove(i);
  143. }
  144. } else { // Use DataTransfer interface to remove the drag data
  145. e.dataTransfer.clearData();
  146. }
  147. }
  148. global.p5TA_onDrop = p5TA_onDrop
  149. global.p5TA_onDragOver = p5TA_onDragOver
  150. global.p5TA_onDragEnd = p5TA_onDragEnd
  151. global.p5TA_overlay_onDragOver = p5TA_overlay_onDragOver
  152. global.p5Utils__getFilesFromDropEvent = p5Utils__getFilesFromDropEvent
  153. global.p5TA_uploadWithProgress = p5TA_uploadWithProgress