appscms-tools-theme 4.5.5 → 4.5.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/_data/about/en/about.json +16 -16
  3. data/_data/blog/nav.json +14 -14
  4. data/_data/feature/en/batch-conversion.json +192 -192
  5. data/_data/feature/en/compress-pdf.json +305 -305
  6. data/_data/feature/en/devtools.json +321 -321
  7. data/_data/feature/en/face-detection.json +156 -156
  8. data/_data/feature/en/split-pdf.json +221 -221
  9. data/_data/feature/en/theframe.json +160 -160
  10. data/_data/footer/en/data.json +2 -2
  11. data/_data/header/en/data.json +412 -412
  12. data/_data/home/en/en.json +356 -356
  13. data/_data/home/en/posters.json +322 -322
  14. data/_includes/appscms/customblog/contenttool-recent-posts.html +94 -94
  15. data/_includes/appscms/customblog/pageRelatedPosts.html +62 -62
  16. data/_includes/appscms/customblog/recentposts.html +67 -67
  17. data/_includes/appscms/customblog/relatedBlogs.html +82 -82
  18. data/_includes/appscms/customblog/relatedposts.html +193 -193
  19. data/_includes/appscms/extras/appscms-postbox.html +57 -57
  20. data/_includes/appscms/featurePageAuthors/featurePageAuthors.html +85 -85
  21. data/_includes/appscms/head/bloghead.html +128 -128
  22. data/_includes/appscms/headings/contenttool-headings.html +33 -33
  23. data/_includes/appscms/headings/devtool-headings.html +38 -38
  24. data/_includes/appscms/home/contenttool-feature-boxes.html +19 -19
  25. data/_includes/appscms/home/devtool-feature-boxes.html +70 -70
  26. data/_includes/appscms/infographics/infographics.html +166 -160
  27. data/_includes/appscms/loaders/loader.html +4 -4
  28. data/_includes/appscms/navbars/devtool-navbar.html +50 -50
  29. data/_includes/appscms/navbars/devtool-toolbar.html +100 -100
  30. data/_includes/appscms/recent-posts/recent_posts.html +90 -90
  31. data/_includes/appscms/recent-posts/related_categories_post.html +194 -194
  32. data/_includes/appscms/searchbar/devtool-searchbar.html +63 -63
  33. data/_includes/appscms/usp/usp.html +90 -90
  34. data/_includes/author_bio.html +41 -41
  35. data/_includes/authorpagehead/index.html +47 -47
  36. data/_includes/authors/authors.html +39 -39
  37. data/_includes/batch-conversion.html +141 -141
  38. data/_includes/bookmark.html +6 -6
  39. data/_includes/cssfile/links.html +54 -54
  40. data/_includes/custom-head.html +138 -138
  41. data/_includes/customCode.html +1 -1
  42. data/_includes/customScripts.html +1 -1
  43. data/_includes/customblog/pageRelatedPosts.html +87 -87
  44. data/_includes/customblog/recentposts.html +67 -67
  45. data/_includes/customblog/relatedBlogs.html +86 -86
  46. data/_includes/customblog/relatedposts.html +201 -201
  47. data/_includes/dropdown/langdropdown.html +32 -32
  48. data/_includes/feature.html +39 -39
  49. data/_includes/featurePageAuthors/featurePageAuthors.html +101 -101
  50. data/_includes/footer/index.html +537 -537
  51. data/_includes/google-analytics.html +32 -32
  52. data/_includes/head/index.html +623 -623
  53. data/_includes/header/blogHeader.html +34 -34
  54. data/_includes/header/index.html +192 -192
  55. data/_includes/infographics/infographics.html +241 -241
  56. data/_includes/paginationBlogPage.html +70 -70
  57. data/_includes/postbox.html +65 -65
  58. data/_includes/script.html +493 -493
  59. data/_includes/section/count.html +32 -32
  60. data/_includes/section/recent_posts.html +94 -94
  61. data/_includes/section/related_categories_post.html +196 -196
  62. data/_includes/share/socialshare.html +21 -21
  63. data/_includes/userTracking.html +14 -14
  64. data/_layouts/aboutUs.html +175 -175
  65. data/_layouts/allAuthors.html +131 -131
  66. data/_layouts/appscms-about.html +163 -163
  67. data/_layouts/appscms-audio.html +33 -33
  68. data/_layouts/appscms-author.html +436 -436
  69. data/_layouts/appscms-authors.html +145 -145
  70. data/_layouts/appscms-batch.html +141 -141
  71. data/_layouts/appscms-calculator.html +93 -93
  72. data/_layouts/appscms-categories.html +26 -26
  73. data/_layouts/appscms-contact.html +132 -132
  74. data/_layouts/appscms-disclaimer.html +124 -124
  75. data/_layouts/appscms-download.html +289 -289
  76. data/_layouts/appscms-feature-result.html +96 -96
  77. data/_layouts/appscms-help.html +25 -25
  78. data/_layouts/appscms-imagekit.html +96 -96
  79. data/_layouts/appscms-post.html +243 -243
  80. data/_layouts/appscms-privacy-policy.html +781 -781
  81. data/_layouts/appscms-terms-and-conditions.html +646 -646
  82. data/_layouts/appscms-video.html +33 -33
  83. data/_layouts/audio.html +33 -33
  84. data/_layouts/author.html +409 -409
  85. data/_layouts/batch.html +177 -177
  86. data/_layouts/blog-1.html +116 -116
  87. data/_layouts/blog.html +131 -131
  88. data/_layouts/calculator.html +99 -99
  89. data/_layouts/contenttool-feature.html +45 -45
  90. data/_layouts/contenttool-home.html +53 -53
  91. data/_layouts/devtool-blog.html +132 -132
  92. data/_layouts/devtool-feature.html +54 -54
  93. data/_layouts/devtool-home.html +53 -53
  94. data/_layouts/devtools.html +57 -57
  95. data/_layouts/feature-1.html +406 -406
  96. data/_layouts/feature.html +351 -351
  97. data/_layouts/featureResultPage.html +82 -82
  98. data/_layouts/frame.html +222 -222
  99. data/_layouts/home.html +281 -281
  100. data/_layouts/homeResultPage.html +32 -32
  101. data/_layouts/imagekit.html +308 -308
  102. data/_layouts/photo-effects-home.html +190 -190
  103. data/_layouts/post.html +233 -233
  104. data/assets/app.js +75 -75
  105. data/assets/css/appscms-blog.css +505 -505
  106. data/assets/css/appscms-contenttool.css +1384 -1384
  107. data/assets/css/appscms-home.css +5 -5
  108. data/assets/css/appscms-imagekit.css +855 -855
  109. data/assets/css/appscms-variables.css +19 -19
  110. data/assets/css/blog.css +510 -510
  111. data/assets/css/calculators.css +46 -46
  112. data/assets/css/devtool-main.css +1350 -1350
  113. data/assets/css/devtools.css +105 -105
  114. data/assets/css/feature-1.css +293 -293
  115. data/assets/css/imagekit copy.css +848 -848
  116. data/assets/css/imagekit.css +848 -848
  117. data/assets/css/tools.css +1847 -1847
  118. data/assets/images/close-button.svg +31 -31
  119. data/assets/images/digipaint.svg +6 -6
  120. data/assets/images/logo.svg +2 -2
  121. data/assets/images/manthink.svg +3552 -3552
  122. data/assets/images/search-icon.svg +2 -2
  123. data/assets/js/batch.js +256 -256
  124. data/assets/js/devtools.js +81 -81
  125. data/assets/js/sharePage.js +65 -65
  126. data/assets/js/usageTracking.js +143 -143
  127. data/assets/js/usageTrackingEvents.js +6 -6
  128. data/assets/js/webvitals.js +4 -4
  129. metadata +3 -3
@@ -1,3 +1,3 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
2
- <path fill-rule="evenodd" clip-rule="evenodd" d="M4 11C4 7.13401 7.13401 4 11 4C14.866 4 18 7.13401 18 11C18 14.866 14.866 18 11 18C7.13401 18 4 14.866 4 11ZM11 2C6.02944 2 2 6.02944 2 11C2 15.9706 6.02944 20 11 20C13.125 20 15.078 19.2635 16.6177 18.0319L20.2929 21.7071C20.6834 22.0976 21.3166 22.0976 21.7071 21.7071C22.0976 21.3166 22.0976 20.6834 21.7071 20.2929L18.0319 16.6177C19.2635 15.078 20 13.125 20 11C20 6.02944 15.9706 2 11 2Z" fill="#000000"/>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M4 11C4 7.13401 7.13401 4 11 4C14.866 4 18 7.13401 18 11C18 14.866 14.866 18 11 18C7.13401 18 4 14.866 4 11ZM11 2C6.02944 2 2 6.02944 2 11C2 15.9706 6.02944 20 11 20C13.125 20 15.078 19.2635 16.6177 18.0319L20.2929 21.7071C20.6834 22.0976 21.3166 22.0976 21.7071 21.7071C22.0976 21.3166 22.0976 20.6834 21.7071 20.2929L18.0319 16.6177C19.2635 15.078 20 13.125 20 11C20 6.02944 15.9706 2 11 2Z" fill="#000000"/>
3
3
  </svg>
data/assets/js/batch.js CHANGED
@@ -1,256 +1,256 @@
1
- const getScript = document.currentScript
2
- const pageTool = getScript.dataset.tool
3
- const lang = getScript.dataset.lang
4
- const inputBox = document.querySelector('#Inputbox')
5
- const addFiles = document.querySelector('.add-more-files')
6
- const gdrive = document.querySelector('#filepicker')
7
- const fileDropBox = document.querySelector('.custom-box')
8
- const workspace = document.querySelector('.workspace')
9
- const selectedFilesList = document.querySelector('.selectedFilesList')
10
- const downloadButton = document.querySelector('#download-button')
11
- const submitButton = document.querySelector('#submit-button')
12
- const showProcessingFiles = document.querySelector('.files-processing-list')
13
- let zipFileType = null
14
- let renderFileTypes = null
15
- let root = document.querySelector(':root')
16
- root.style.setProperty('--maincolor', fileDropBox.dataset.color)
17
-
18
-
19
- const showLoader = () => {
20
- showLoading()
21
- }
22
- const closeLoader = () => { }
23
- const mimeTypes = 'image/png,image/jpg,image/jpeg,image/webp'
24
- const filemimes = ['.png', '.webp', '.jpg', '.jpeg']
25
- gdrive.addEventListener(
26
- 'click',
27
- (getFile, mimeTypes, showLoader, closeLoader) => {
28
- const data = loadPicker()
29
- }
30
- )
31
- const dropbox = document.getElementById('dropbox')
32
- dropbox.addEventListener(
33
- 'click',
34
- async (getDropBoxFile, showLoader, closeLoader) => {
35
- const getFile = chooseFromDropbox()
36
- }
37
- )
38
-
39
-
40
- const getFile = (file) => {
41
- handleFile(file)
42
- }
43
- fileDropBox.addEventListener('dragover', (e) => {
44
- e.preventDefault()
45
- })
46
- fileDropBox.addEventListener('drop', (e) => {
47
- e.preventDefault()
48
- handleFile(e.dataTransfer.files[0])
49
- })
50
- const fileOnChange = () => {
51
- handleFile(file.files)
52
- }
53
- inputBox.onclick = function () {
54
- document.querySelector('#file').click()
55
- }
56
- const fileOnChange2 = () => {
57
- addMoreFiles(document.querySelector('#file2').files)
58
- }
59
- addFiles.onclick = function () {
60
- document.querySelector('#file2').click()
61
- }
62
- var files = []
63
- let fileName = ''
64
- let blobList = []
65
- const addMoreFiles = (addFiles) => {
66
- handleFile(addFiles)
67
- }
68
- const onSubmit = (files) => {
69
- blobList = []
70
- Promise.all(
71
- files.map((item, index) => {
72
- document.querySelector(
73
- `#loader-${index}`
74
- ).innerHTML = `<span class="processing">processing</span>
75
- <div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>`
76
- return new Promise((resolve, reject) => {
77
- batchConversion(item, index).then(([indexValue, blob, type]) => {
78
- blobList.push({ blob: blob, fileName: item })
79
- document.querySelector(
80
- `#loader-${indexValue}`
81
- ).innerHTML = `<span class="done">finished</span>`
82
- document.querySelector(`#download-${indexValue}`).style.display =
83
- 'inline-block'
84
- resolve()
85
- })
86
- }).catch((error) => {
87
- console.log(error)
88
- })
89
- })
90
- ).then(() => {
91
- document.querySelector('.bottom-section-container').style.display = 'flex'
92
- document.querySelector('.bottom-section-container').style.padding =
93
- '20px .75rem'
94
- document.querySelector('#download-zip').style.display = 'block'
95
- let zip = new JSZip()
96
- let zipFiles = zip.folder(`safeimagekit-batch-images`)
97
- blobList.map((item) => {
98
- zipFiles.file(
99
- `safeimagekit-batch-${item.fileName.name.split('.')[0]}.${zipFileType ? zipFileType : 'png'
100
- }`,
101
- getBase64String(item.blob),
102
- { base64: true }
103
- )
104
- })
105
-
106
- document.querySelector('#download-zip').addEventListener('click', () => {
107
- zip.generateAsync({ type: 'blob' }).then(function (content) {
108
- saveAs(content, `safeimagekit-batch-conversion.zip`)
109
- if (lang === 'en') {
110
- window.location.href = `/download?tool=${pageTool}`
111
- } else {
112
- window.location.href = `/${lang}/download?tool=${pageTool}`
113
- }
114
- })
115
- })
116
- })
117
- }
118
- let renderFileTypesHtml = ` <option value="png">png</option>
119
- <option value="jpg">jpg</option>
120
- <option value="jpeg">jpeg</option>
121
- <option value="webp">webp</option>
122
- `
123
-
124
- const renderFiles = (files) => {
125
- if (renderFileTypes !== null) {
126
- renderFileTypesHtml = ''
127
- renderFileTypes.map((i) => {
128
- renderFileTypesHtml += `<option value="${i}">${i}</option>`
129
- })
130
- }
131
- files.map((file, index) => {
132
- if (file) {
133
- let filename = file.name
134
- if (file.name.split(".")[0].length > 10) {
135
- let fName = file.name.split(".")[0]
136
- let fExtention = file.name.split(".")[1]
137
- filename = fName.substr(0, 9) + "..." + fName.substr(-3) + "." + fExtention
138
-
139
- }
140
- let loader = 'Ready'
141
- showProcessingFiles.innerHTML += `
142
- <tr>
143
- <th scope="row" class="file-icon-row">
144
- <img src="/assets/images/file.png" alt="file" class="file-icon">
145
- </th>
146
- <td class="fileName">${filename}</td>
147
- <td id=loader-${index} class="file-processing"><span class="ready">${loader}</span></td>
148
- <td>
149
- <div class="download-format ">
150
- <select name="image-format" id="image-format">
151
- ${renderFileTypesHtml}
152
- </select>
153
- </div>
154
-
155
- </td>
156
- <td class="file-download-button text-right">
157
- <button style="display:none;" id=download-${index} data-type="image" onclick="handleDownload(this)" class="btn download-file-btn">
158
- <svg class="download-icon" width="16px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"
159
- fill="currentColor">
160
- <path
161
- d="M18 20H5V15H6V19H17V15H18V20ZM12 4V15.19L14.3 13L15 13.6667L11.5 17L8 13.6667L8.7 13L11 15.19V4H12Z">
162
- </path>
163
- </svg> Download
164
- </button>
165
- </td>
166
- </tr>
167
- `
168
- }
169
- })
170
- }
171
-
172
- const handleFile = (file) => {
173
- showProcessingFiles.innerHTML = ''
174
- if (file) {
175
- for (let i = 0; i < file.length; i++) {
176
- files.push(file[i])
177
- stopLoading()
178
- workspace.style.display = 'block'
179
- document.querySelector('#file').style.display = 'block'
180
- let listItem = document.createElement('li')
181
- listItem.style.listStyle = 'none'
182
- let getFileSize = formatBytes(file[i].size)
183
- listItem.innerHTML = `${file[i].name} (${getFileSize})`
184
- // selectedFilesList.appendChild(listItem)
185
- }
186
- }
187
- renderFiles(files)
188
- submitButton.addEventListener('click', () => onSubmit(files))
189
- }
190
- function formatBytes(bytes, decimals = 2) {
191
- if (bytes === 0) return '0 Bytes'
192
-
193
- const k = 1024
194
- const dm = decimals < 0 ? 0 : decimals
195
- const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
196
-
197
- const i = Math.floor(Math.log(bytes) / Math.log(k))
198
-
199
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]
200
- }
201
- const handleDownload = (e) => {
202
- let find = blobList[Number(e.id.replace(/^\D+/g, ''))].blob
203
- let fileName = blobList[Number(e.id.replace(/^\D+/g, ''))].fileName.name
204
-
205
- let format = document.querySelector('#image-format').value
206
-
207
- switch (e.dataset.type) {
208
- case 'image':
209
- let a = document.createElement('a')
210
- a.href = find
211
- a.download = `safeimagekit-batch-${fileName.split('.')[0]}.${format}`
212
- document.body.appendChild(a)
213
- a.click()
214
- break
215
- default:
216
- break
217
- }
218
- }
219
- const showLoading = () => {
220
- document.querySelector('#file-loader').style.display = 'flex'
221
- document.querySelector('.file-input').style.display = 'none'
222
- }
223
- const stopLoading = () => {
224
- fileDropBox.style.display = 'none'
225
- }
226
- const showDropDown = document.querySelector('.file-pick-dropdown')
227
- const icon = document.querySelector('.arrow-sign')
228
- const dropDown = document.querySelector('.file-picker-dropdown')
229
- showDropDown.addEventListener('click', () => {
230
- addScripts()
231
- if (dropDown.style.display !== 'none') {
232
- dropDown.style.display = 'none'
233
- icon.classList.remove('fa-angle-up')
234
- icon.classList.add('fa-angle-down')
235
- } else {
236
- dropDown.style.display = 'block'
237
- icon.classList.remove('fa-angle-down')
238
- icon.classList.add('fa-angle-up')
239
- }
240
- })
241
-
242
- const getBase64String = (dataURL) => {
243
- const idx = dataURL.indexOf('base64,') + 'base64,'.length
244
- return dataURL.substring(idx)
245
- }
246
- const dataURLtoBlob = (dataurl) => {
247
- let arr = dataurl.split(','),
248
- mime = arr[0].match(/:(.*?);/)[1],
249
- bstr = atob(arr[1]),
250
- n = bstr.length,
251
- u8arr = new Uint8Array(n)
252
- while (n--) {
253
- u8arr[n] = bstr.charCodeAt(n)
254
- }
255
- return new Blob([u8arr], { type: mime })
256
- }
1
+ const getScript = document.currentScript
2
+ const pageTool = getScript.dataset.tool
3
+ const lang = getScript.dataset.lang
4
+ const inputBox = document.querySelector('#Inputbox')
5
+ const addFiles = document.querySelector('.add-more-files')
6
+ const gdrive = document.querySelector('#filepicker')
7
+ const fileDropBox = document.querySelector('.custom-box')
8
+ const workspace = document.querySelector('.workspace')
9
+ const selectedFilesList = document.querySelector('.selectedFilesList')
10
+ const downloadButton = document.querySelector('#download-button')
11
+ const submitButton = document.querySelector('#submit-button')
12
+ const showProcessingFiles = document.querySelector('.files-processing-list')
13
+ let zipFileType = null
14
+ let renderFileTypes = null
15
+ let root = document.querySelector(':root')
16
+ root.style.setProperty('--maincolor', fileDropBox.dataset.color)
17
+
18
+
19
+ const showLoader = () => {
20
+ showLoading()
21
+ }
22
+ const closeLoader = () => { }
23
+ const mimeTypes = 'image/png,image/jpg,image/jpeg,image/webp'
24
+ const filemimes = ['.png', '.webp', '.jpg', '.jpeg']
25
+ gdrive.addEventListener(
26
+ 'click',
27
+ (getFile, mimeTypes, showLoader, closeLoader) => {
28
+ const data = loadPicker()
29
+ }
30
+ )
31
+ const dropbox = document.getElementById('dropbox')
32
+ dropbox.addEventListener(
33
+ 'click',
34
+ async (getDropBoxFile, showLoader, closeLoader) => {
35
+ const getFile = chooseFromDropbox()
36
+ }
37
+ )
38
+
39
+
40
+ const getFile = (file) => {
41
+ handleFile(file)
42
+ }
43
+ fileDropBox.addEventListener('dragover', (e) => {
44
+ e.preventDefault()
45
+ })
46
+ fileDropBox.addEventListener('drop', (e) => {
47
+ e.preventDefault()
48
+ handleFile(e.dataTransfer.files[0])
49
+ })
50
+ const fileOnChange = () => {
51
+ handleFile(file.files)
52
+ }
53
+ inputBox.onclick = function () {
54
+ document.querySelector('#file').click()
55
+ }
56
+ const fileOnChange2 = () => {
57
+ addMoreFiles(document.querySelector('#file2').files)
58
+ }
59
+ addFiles.onclick = function () {
60
+ document.querySelector('#file2').click()
61
+ }
62
+ var files = []
63
+ let fileName = ''
64
+ let blobList = []
65
+ const addMoreFiles = (addFiles) => {
66
+ handleFile(addFiles)
67
+ }
68
+ const onSubmit = (files) => {
69
+ blobList = []
70
+ Promise.all(
71
+ files.map((item, index) => {
72
+ document.querySelector(
73
+ `#loader-${index}`
74
+ ).innerHTML = `<span class="processing">processing</span>
75
+ <div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>`
76
+ return new Promise((resolve, reject) => {
77
+ batchConversion(item, index).then(([indexValue, blob, type]) => {
78
+ blobList.push({ blob: blob, fileName: item })
79
+ document.querySelector(
80
+ `#loader-${indexValue}`
81
+ ).innerHTML = `<span class="done">finished</span>`
82
+ document.querySelector(`#download-${indexValue}`).style.display =
83
+ 'inline-block'
84
+ resolve()
85
+ })
86
+ }).catch((error) => {
87
+ console.log(error)
88
+ })
89
+ })
90
+ ).then(() => {
91
+ document.querySelector('.bottom-section-container').style.display = 'flex'
92
+ document.querySelector('.bottom-section-container').style.padding =
93
+ '20px .75rem'
94
+ document.querySelector('#download-zip').style.display = 'block'
95
+ let zip = new JSZip()
96
+ let zipFiles = zip.folder(`safeimagekit-batch-images`)
97
+ blobList.map((item) => {
98
+ zipFiles.file(
99
+ `safeimagekit-batch-${item.fileName.name.split('.')[0]}.${zipFileType ? zipFileType : 'png'
100
+ }`,
101
+ getBase64String(item.blob),
102
+ { base64: true }
103
+ )
104
+ })
105
+
106
+ document.querySelector('#download-zip').addEventListener('click', () => {
107
+ zip.generateAsync({ type: 'blob' }).then(function (content) {
108
+ saveAs(content, `safeimagekit-batch-conversion.zip`)
109
+ if (lang === 'en') {
110
+ window.location.href = `/download?tool=${pageTool}`
111
+ } else {
112
+ window.location.href = `/${lang}/download?tool=${pageTool}`
113
+ }
114
+ })
115
+ })
116
+ })
117
+ }
118
+ let renderFileTypesHtml = ` <option value="png">png</option>
119
+ <option value="jpg">jpg</option>
120
+ <option value="jpeg">jpeg</option>
121
+ <option value="webp">webp</option>
122
+ `
123
+
124
+ const renderFiles = (files) => {
125
+ if (renderFileTypes !== null) {
126
+ renderFileTypesHtml = ''
127
+ renderFileTypes.map((i) => {
128
+ renderFileTypesHtml += `<option value="${i}">${i}</option>`
129
+ })
130
+ }
131
+ files.map((file, index) => {
132
+ if (file) {
133
+ let filename = file.name
134
+ if (file.name.split(".")[0].length > 10) {
135
+ let fName = file.name.split(".")[0]
136
+ let fExtention = file.name.split(".")[1]
137
+ filename = fName.substr(0, 9) + "..." + fName.substr(-3) + "." + fExtention
138
+
139
+ }
140
+ let loader = 'Ready'
141
+ showProcessingFiles.innerHTML += `
142
+ <tr>
143
+ <th scope="row" class="file-icon-row">
144
+ <img src="/assets/images/file.png" alt="file" class="file-icon">
145
+ </th>
146
+ <td class="fileName">${filename}</td>
147
+ <td id=loader-${index} class="file-processing"><span class="ready">${loader}</span></td>
148
+ <td>
149
+ <div class="download-format ">
150
+ <select name="image-format" id="image-format">
151
+ ${renderFileTypesHtml}
152
+ </select>
153
+ </div>
154
+
155
+ </td>
156
+ <td class="file-download-button text-right">
157
+ <button style="display:none;" id=download-${index} data-type="image" onclick="handleDownload(this)" class="btn download-file-btn">
158
+ <svg class="download-icon" width="16px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"
159
+ fill="currentColor">
160
+ <path
161
+ d="M18 20H5V15H6V19H17V15H18V20ZM12 4V15.19L14.3 13L15 13.6667L11.5 17L8 13.6667L8.7 13L11 15.19V4H12Z">
162
+ </path>
163
+ </svg> Download
164
+ </button>
165
+ </td>
166
+ </tr>
167
+ `
168
+ }
169
+ })
170
+ }
171
+
172
+ const handleFile = (file) => {
173
+ showProcessingFiles.innerHTML = ''
174
+ if (file) {
175
+ for (let i = 0; i < file.length; i++) {
176
+ files.push(file[i])
177
+ stopLoading()
178
+ workspace.style.display = 'block'
179
+ document.querySelector('#file').style.display = 'block'
180
+ let listItem = document.createElement('li')
181
+ listItem.style.listStyle = 'none'
182
+ let getFileSize = formatBytes(file[i].size)
183
+ listItem.innerHTML = `${file[i].name} (${getFileSize})`
184
+ // selectedFilesList.appendChild(listItem)
185
+ }
186
+ }
187
+ renderFiles(files)
188
+ submitButton.addEventListener('click', () => onSubmit(files))
189
+ }
190
+ function formatBytes(bytes, decimals = 2) {
191
+ if (bytes === 0) return '0 Bytes'
192
+
193
+ const k = 1024
194
+ const dm = decimals < 0 ? 0 : decimals
195
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
196
+
197
+ const i = Math.floor(Math.log(bytes) / Math.log(k))
198
+
199
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]
200
+ }
201
+ const handleDownload = (e) => {
202
+ let find = blobList[Number(e.id.replace(/^\D+/g, ''))].blob
203
+ let fileName = blobList[Number(e.id.replace(/^\D+/g, ''))].fileName.name
204
+
205
+ let format = document.querySelector('#image-format').value
206
+
207
+ switch (e.dataset.type) {
208
+ case 'image':
209
+ let a = document.createElement('a')
210
+ a.href = find
211
+ a.download = `safeimagekit-batch-${fileName.split('.')[0]}.${format}`
212
+ document.body.appendChild(a)
213
+ a.click()
214
+ break
215
+ default:
216
+ break
217
+ }
218
+ }
219
+ const showLoading = () => {
220
+ document.querySelector('#file-loader').style.display = 'flex'
221
+ document.querySelector('.file-input').style.display = 'none'
222
+ }
223
+ const stopLoading = () => {
224
+ fileDropBox.style.display = 'none'
225
+ }
226
+ const showDropDown = document.querySelector('.file-pick-dropdown')
227
+ const icon = document.querySelector('.arrow-sign')
228
+ const dropDown = document.querySelector('.file-picker-dropdown')
229
+ showDropDown.addEventListener('click', () => {
230
+ addScripts()
231
+ if (dropDown.style.display !== 'none') {
232
+ dropDown.style.display = 'none'
233
+ icon.classList.remove('fa-angle-up')
234
+ icon.classList.add('fa-angle-down')
235
+ } else {
236
+ dropDown.style.display = 'block'
237
+ icon.classList.remove('fa-angle-down')
238
+ icon.classList.add('fa-angle-up')
239
+ }
240
+ })
241
+
242
+ const getBase64String = (dataURL) => {
243
+ const idx = dataURL.indexOf('base64,') + 'base64,'.length
244
+ return dataURL.substring(idx)
245
+ }
246
+ const dataURLtoBlob = (dataurl) => {
247
+ let arr = dataurl.split(','),
248
+ mime = arr[0].match(/:(.*?);/)[1],
249
+ bstr = atob(arr[1]),
250
+ n = bstr.length,
251
+ u8arr = new Uint8Array(n)
252
+ while (n--) {
253
+ u8arr[n] = bstr.charCodeAt(n)
254
+ }
255
+ return new Blob([u8arr], { type: mime })
256
+ }