imgpaste.html 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <div class="field">
  2. <p style="font-size:13px;color:var(--sub);margin-bottom:10px;">Copy an image and press <strong style="color:var(--text);">Ctrl + V</strong> anywhere on this page to paste it here.</p>
  3. <div id="ip-dropzone" style="min-height:200px;border:1.5px dashed var(--border);border-radius:10px;display:flex;align-items:center;justify-content:center;overflow:hidden;background:var(--inp-bg);position:relative;">
  4. <span id="ip-hint" style="font-size:26px;font-weight:200;color:var(--border);pointer-events:none;letter-spacing:3px;">Ctrl + V</span>
  5. <img id="ip-preview" src="" alt="" style="max-width:100%;max-height:300px;display:none;border-radius:6px;object-fit:contain;">
  6. </div>
  7. </div>
  8. <div class="field">
  9. <span class="field-label">Save Location</span>
  10. <div class="row">
  11. <input type="text" id="ip-savepath" placeholder="user:/Desktop" readonly style="flex:1;cursor:default;">
  12. <button class="btn btn-outline" id="ip-pickFolder">
  13. <svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
  14. <path d="M1 3h3.5l1.5 2H12v6.5H1z"/>
  15. </svg>
  16. Browse
  17. </button>
  18. </div>
  19. </div>
  20. <div class="field">
  21. <label style="display:flex;align-items:center;gap:7px;font-size:13px;cursor:pointer;user-select:none;">
  22. <input type="checkbox" id="ip-autoUpload" style="accent-color:var(--accent);width:15px;height:15px;">
  23. Upload automatically when an image is pasted
  24. </label>
  25. </div>
  26. <div class="row">
  27. <button class="btn-action" id="ip-uploadBtn" disabled>Upload Image</button>
  28. </div>
  29. <div id="ip-result"></div>
  30. <script>
  31. (function(){
  32. var registry = window.ProductivityToolModules = window.ProductivityToolModules || {};
  33. registry.imgpaste = {
  34. init: function(root) {
  35. var blob = null;
  36. var savePath = 'user:/Desktop';
  37. var autoUpload = false;
  38. var preview = root.querySelector('#ip-preview');
  39. var hint = root.querySelector('#ip-hint');
  40. var saveInp = root.querySelector('#ip-savepath');
  41. var autoCb = root.querySelector('#ip-autoUpload');
  42. var uploadBtn = root.querySelector('#ip-uploadBtn');
  43. var resultEl = root.querySelector('#ip-result');
  44. var pickBtn = root.querySelector('#ip-pickFolder');
  45. ao_module_storage.loadStorage('imgPaste', 'savepath', function(val){
  46. if (val){ savePath = val; saveInp.value = val; }
  47. else { saveInp.value = savePath; }
  48. });
  49. ao_module_storage.loadStorage('imgPaste', 'uploadOnPaste', function(val){
  50. if (val === 'true'){ autoCb.checked = true; autoUpload = true; }
  51. });
  52. autoCb.addEventListener('change', function(){
  53. autoUpload = this.checked;
  54. ao_module_storage.setStorage('imgPaste', 'uploadOnPaste', autoUpload ? 'true' : 'false');
  55. });
  56. pickBtn.addEventListener('click', function(){
  57. ao_module_openFileSelector('_ipFolderCb', savePath, 'folder', false);
  58. });
  59. uploadBtn.addEventListener('click', function(){ doUpload(); });
  60. function doUpload(){
  61. if (!blob) return;
  62. var now = new Date();
  63. var ts = Date.now() + '';
  64. var filename = 'ImagePaste ' + now.getUTCFullYear() + '-' + (now.getUTCMonth()+1) + '-' + now.getUTCDate() + ts.substr(ts.length - 6) + '.png';
  65. uploadBtn.disabled = true;
  66. ao_module_uploadFile(new File([blob], filename), savePath, function(data){
  67. uploadBtn.disabled = false;
  68. if (data && data.error){
  69. resultEl.innerHTML = '<div class="result-box result-err"><strong>Error:</strong> ' + escHtml(String(data.error)) + '</div>';
  70. } else {
  71. resultEl.innerHTML = '<div class="result-box result-ok"><strong>' + escHtml(filename) + '</strong> saved to ' + escHtml(savePath) + '</div>';
  72. }
  73. });
  74. }
  75. if (window._imgPasteDocHandler){
  76. document.removeEventListener('paste', window._imgPasteDocHandler);
  77. }
  78. window._imgPasteDocHandler = function(e){
  79. if (!document.body.contains(root)){
  80. document.removeEventListener('paste', window._imgPasteDocHandler);
  81. window._imgPasteDocHandler = null;
  82. return;
  83. }
  84. var items = (e.clipboardData || e.originalEvent.clipboardData).items;
  85. for (var i = 0; i < items.length; i++){
  86. if (items[i].kind === 'file'){
  87. var file = items[i].getAsFile();
  88. var reader = new FileReader();
  89. reader.onload = (function(b){
  90. return function(ev){
  91. blob = b;
  92. preview.src = ev.target.result;
  93. preview.style.display = 'block';
  94. hint.style.display = 'none';
  95. uploadBtn.disabled = false;
  96. resultEl.innerHTML = '';
  97. if (autoUpload){ doUpload(); }
  98. };
  99. })(file);
  100. reader.readAsDataURL(file);
  101. break;
  102. }
  103. }
  104. };
  105. document.addEventListener('paste', window._imgPasteDocHandler);
  106. window._ipFolderCb = function(files){
  107. if (!files || !files.length) return;
  108. savePath = files[0].filepath;
  109. saveInp.value = savePath;
  110. ao_module_storage.setStorage('imgPaste', 'savepath', savePath);
  111. };
  112. }
  113. };
  114. })();
  115. </script>