@dnncommunity/dnn-elements 0.15.0-beta.7 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/dist/cjs/dnn-button_17.cjs.entry.js +1 -1
  2. package/dist/cjs/dnn-button_17.cjs.entry.js.map +1 -1
  3. package/dist/cjs/dnn.cjs.js +4 -116
  4. package/dist/cjs/dnn.cjs.js.map +1 -1
  5. package/dist/cjs/loader.cjs.js +2 -18
  6. package/dist/cjs/loader.cjs.js.map +1 -1
  7. package/dist/collection/components/dnn-tabs/dnn-tabs.css +0 -1
  8. package/dist/collection/components/dnn-tabs/dnn-tabs.stories.js +5 -0
  9. package/dist/collection/components/dnn-tabs/dnn-tabs.stories.js.map +1 -1
  10. package/dist/dnn/dnn.esm.js +1 -130
  11. package/dist/dnn/dnn.esm.js.map +1 -1
  12. package/dist/dnn/dnn.js +1 -1
  13. package/dist/dnn/index.esm.js +1 -46
  14. package/dist/dnn/index.esm.js.map +1 -1
  15. package/dist/dnn/{p-c222c8b7.entry.js → p-058a3145.entry.js} +2 -2
  16. package/dist/dnn/{p-c222c8b7.entry.js.map → p-058a3145.entry.js.map} +1 -1
  17. package/dist/dnn/{p-31dc68a7.system.entry.js → p-1893c229.system.entry.js} +2 -2
  18. package/dist/dnn/{p-31dc68a7.system.entry.js.map → p-1893c229.system.entry.js.map} +1 -1
  19. package/dist/dnn/p-5bcf3629.system.js +1 -1
  20. package/dist/esm/dnn-button_17.entry.js +1 -1
  21. package/dist/esm/dnn-button_17.entry.js.map +1 -1
  22. package/dist/esm/dnn.js +4 -116
  23. package/dist/esm/dnn.js.map +1 -1
  24. package/dist/esm/loader.js +2 -18
  25. package/dist/esm/loader.js.map +1 -1
  26. package/dist/esm-es5/dnn-button_17.entry.js +1 -1
  27. package/dist/esm-es5/dnn-button_17.entry.js.map +1 -1
  28. package/dist/index.js +1 -1
  29. package/package.json +6 -3
  30. package/dist/cjs/app-globals-3a1e7e63.js +0 -7
  31. package/dist/cjs/app-globals-3a1e7e63.js.map +0 -1
  32. package/dist/cjs/css-shim-aaf4fec9.js +0 -8
  33. package/dist/cjs/css-shim-aaf4fec9.js.map +0 -1
  34. package/dist/cjs/dnn-button.cjs.entry.js +0 -92
  35. package/dist/cjs/dnn-button.cjs.entry.js.map +0 -1
  36. package/dist/cjs/dnn-checkbox.cjs.entry.js +0 -58
  37. package/dist/cjs/dnn-checkbox.cjs.entry.js.map +0 -1
  38. package/dist/cjs/dnn-chevron.cjs.entry.js +0 -34
  39. package/dist/cjs/dnn-chevron.cjs.entry.js.map +0 -1
  40. package/dist/cjs/dnn-collapsible.cjs.entry.js +0 -69
  41. package/dist/cjs/dnn-collapsible.cjs.entry.js.map +0 -1
  42. package/dist/cjs/dnn-color-picker.cjs.entry.js +0 -508
  43. package/dist/cjs/dnn-color-picker.cjs.entry.js.map +0 -1
  44. package/dist/cjs/dnn-dropzone.cjs.entry.js +0 -153
  45. package/dist/cjs/dnn-dropzone.cjs.entry.js.map +0 -1
  46. package/dist/cjs/dnn-image-cropper.cjs.entry.js +0 -408
  47. package/dist/cjs/dnn-image-cropper.cjs.entry.js.map +0 -1
  48. package/dist/cjs/dnn-modal.cjs.entry.js +0 -65
  49. package/dist/cjs/dnn-modal.cjs.entry.js.map +0 -1
  50. package/dist/cjs/dnn-permissions-grid.cjs.entry.js +0 -320
  51. package/dist/cjs/dnn-permissions-grid.cjs.entry.js.map +0 -1
  52. package/dist/cjs/dnn-searchbox.cjs.entry.js +0 -66
  53. package/dist/cjs/dnn-searchbox.cjs.entry.js.map +0 -1
  54. package/dist/cjs/dnn-sort-icon.cjs.entry.js +0 -43
  55. package/dist/cjs/dnn-sort-icon.cjs.entry.js.map +0 -1
  56. package/dist/cjs/dnn-tab.cjs.entry.js +0 -31
  57. package/dist/cjs/dnn-tab.cjs.entry.js.map +0 -1
  58. package/dist/cjs/dnn-tabs.cjs.entry.js +0 -52
  59. package/dist/cjs/dnn-tabs.cjs.entry.js.map +0 -1
  60. package/dist/cjs/dnn-toggle.cjs.entry.js +0 -37
  61. package/dist/cjs/dnn-toggle.cjs.entry.js.map +0 -1
  62. package/dist/cjs/dnn-treeview-item.cjs.entry.js +0 -68
  63. package/dist/cjs/dnn-treeview-item.cjs.entry.js.map +0 -1
  64. package/dist/cjs/dnn-vertical-overflow-menu.cjs.entry.js +0 -124
  65. package/dist/cjs/dnn-vertical-overflow-menu.cjs.entry.js.map +0 -1
  66. package/dist/cjs/dnn-vertical-splitview.cjs.entry.js +0 -133
  67. package/dist/cjs/dnn-vertical-splitview.cjs.entry.js.map +0 -1
  68. package/dist/cjs/dom-14886762.js +0 -77
  69. package/dist/cjs/dom-14886762.js.map +0 -1
  70. package/dist/cjs/index-d53702a3.js +0 -3095
  71. package/dist/cjs/index-d53702a3.js.map +0 -1
  72. package/dist/cjs/mouseUtilities-ecd5ecf7.js +0 -25
  73. package/dist/cjs/mouseUtilities-ecd5ecf7.js.map +0 -1
  74. package/dist/cjs/shadow-css-c44ea13a.js +0 -392
  75. package/dist/cjs/shadow-css-c44ea13a.js.map +0 -1
  76. package/dist/dnn/app-globals-0f993ce5.js +0 -5
  77. package/dist/dnn/app-globals-0f993ce5.js.map +0 -1
  78. package/dist/dnn/app-globals-497eb362.system.js +0 -2
  79. package/dist/dnn/app-globals-497eb362.system.js.map +0 -1
  80. package/dist/dnn/css-shim-091f949f.js +0 -6
  81. package/dist/dnn/css-shim-091f949f.js.map +0 -1
  82. package/dist/dnn/css-shim-c5bffe6b.system.js +0 -2
  83. package/dist/dnn/css-shim-c5bffe6b.system.js.map +0 -1
  84. package/dist/dnn/debounce-6be67abd.js +0 -22
  85. package/dist/dnn/debounce-6be67abd.js.map +0 -1
  86. package/dist/dnn/debounce-db438a09.system.js +0 -2
  87. package/dist/dnn/debounce-db438a09.system.js.map +0 -1
  88. package/dist/dnn/dnn-button.entry.js +0 -88
  89. package/dist/dnn/dnn-button.entry.js.map +0 -1
  90. package/dist/dnn/dnn-button.system.entry.js +0 -2
  91. package/dist/dnn/dnn-button.system.entry.js.map +0 -1
  92. package/dist/dnn/dnn-checkbox.entry.js +0 -54
  93. package/dist/dnn/dnn-checkbox.entry.js.map +0 -1
  94. package/dist/dnn/dnn-checkbox.system.entry.js +0 -2
  95. package/dist/dnn/dnn-checkbox.system.entry.js.map +0 -1
  96. package/dist/dnn/dnn-chevron.entry.js +0 -30
  97. package/dist/dnn/dnn-chevron.entry.js.map +0 -1
  98. package/dist/dnn/dnn-chevron.system.entry.js +0 -2
  99. package/dist/dnn/dnn-chevron.system.entry.js.map +0 -1
  100. package/dist/dnn/dnn-collapsible.entry.js +0 -65
  101. package/dist/dnn/dnn-collapsible.entry.js.map +0 -1
  102. package/dist/dnn/dnn-collapsible.system.entry.js +0 -2
  103. package/dist/dnn/dnn-collapsible.system.entry.js.map +0 -1
  104. package/dist/dnn/dnn-color-picker.entry.js +0 -504
  105. package/dist/dnn/dnn-color-picker.entry.js.map +0 -1
  106. package/dist/dnn/dnn-color-picker.system.entry.js +0 -12
  107. package/dist/dnn/dnn-color-picker.system.entry.js.map +0 -1
  108. package/dist/dnn/dnn-dropzone.entry.js +0 -149
  109. package/dist/dnn/dnn-dropzone.entry.js.map +0 -1
  110. package/dist/dnn/dnn-dropzone.system.entry.js +0 -2
  111. package/dist/dnn/dnn-dropzone.system.entry.js.map +0 -1
  112. package/dist/dnn/dnn-image-cropper.entry.js +0 -404
  113. package/dist/dnn/dnn-image-cropper.entry.js.map +0 -1
  114. package/dist/dnn/dnn-image-cropper.system.entry.js +0 -2
  115. package/dist/dnn/dnn-image-cropper.system.entry.js.map +0 -1
  116. package/dist/dnn/dnn-modal.entry.js +0 -61
  117. package/dist/dnn/dnn-modal.entry.js.map +0 -1
  118. package/dist/dnn/dnn-modal.system.entry.js +0 -2
  119. package/dist/dnn/dnn-modal.system.entry.js.map +0 -1
  120. package/dist/dnn/dnn-permissions-grid.entry.js +0 -316
  121. package/dist/dnn/dnn-permissions-grid.entry.js.map +0 -1
  122. package/dist/dnn/dnn-permissions-grid.system.entry.js +0 -2
  123. package/dist/dnn/dnn-permissions-grid.system.entry.js.map +0 -1
  124. package/dist/dnn/dnn-searchbox.entry.js +0 -62
  125. package/dist/dnn/dnn-searchbox.entry.js.map +0 -1
  126. package/dist/dnn/dnn-searchbox.system.entry.js +0 -2
  127. package/dist/dnn/dnn-searchbox.system.entry.js.map +0 -1
  128. package/dist/dnn/dnn-sort-icon.entry.js +0 -39
  129. package/dist/dnn/dnn-sort-icon.entry.js.map +0 -1
  130. package/dist/dnn/dnn-sort-icon.system.entry.js +0 -2
  131. package/dist/dnn/dnn-sort-icon.system.entry.js.map +0 -1
  132. package/dist/dnn/dnn-tab.entry.js +0 -27
  133. package/dist/dnn/dnn-tab.entry.js.map +0 -1
  134. package/dist/dnn/dnn-tab.system.entry.js +0 -2
  135. package/dist/dnn/dnn-tab.system.entry.js.map +0 -1
  136. package/dist/dnn/dnn-tabs.entry.js +0 -48
  137. package/dist/dnn/dnn-tabs.entry.js.map +0 -1
  138. package/dist/dnn/dnn-tabs.system.entry.js +0 -2
  139. package/dist/dnn/dnn-tabs.system.entry.js.map +0 -1
  140. package/dist/dnn/dnn-toggle.entry.js +0 -33
  141. package/dist/dnn/dnn-toggle.entry.js.map +0 -1
  142. package/dist/dnn/dnn-toggle.system.entry.js +0 -2
  143. package/dist/dnn/dnn-toggle.system.entry.js.map +0 -1
  144. package/dist/dnn/dnn-treeview-item.entry.js +0 -64
  145. package/dist/dnn/dnn-treeview-item.entry.js.map +0 -1
  146. package/dist/dnn/dnn-treeview-item.system.entry.js +0 -2
  147. package/dist/dnn/dnn-treeview-item.system.entry.js.map +0 -1
  148. package/dist/dnn/dnn-vertical-overflow-menu.entry.js +0 -120
  149. package/dist/dnn/dnn-vertical-overflow-menu.entry.js.map +0 -1
  150. package/dist/dnn/dnn-vertical-overflow-menu.system.entry.js +0 -2
  151. package/dist/dnn/dnn-vertical-overflow-menu.system.entry.js.map +0 -1
  152. package/dist/dnn/dnn-vertical-splitview.entry.js +0 -129
  153. package/dist/dnn/dnn-vertical-splitview.entry.js.map +0 -1
  154. package/dist/dnn/dnn-vertical-splitview.system.entry.js +0 -2
  155. package/dist/dnn/dnn-vertical-splitview.system.entry.js.map +0 -1
  156. package/dist/dnn/dnn.system.js +0 -2
  157. package/dist/dnn/dnn.system.js.map +0 -1
  158. package/dist/dnn/dom-99eb7b76.system.js +0 -22
  159. package/dist/dnn/dom-99eb7b76.system.js.map +0 -1
  160. package/dist/dnn/dom-a385e381.js +0 -75
  161. package/dist/dnn/dom-a385e381.js.map +0 -1
  162. package/dist/dnn/index-20e42ad7.js +0 -3059
  163. package/dist/dnn/index-20e42ad7.js.map +0 -1
  164. package/dist/dnn/index-c3cc3b5b.system.js +0 -2
  165. package/dist/dnn/index-c3cc3b5b.system.js.map +0 -1
  166. package/dist/dnn/index.system.js +0 -2
  167. package/dist/dnn/index.system.js.map +0 -1
  168. package/dist/dnn/mouseUtilities-233ad7e3.system.js +0 -2
  169. package/dist/dnn/mouseUtilities-233ad7e3.system.js.map +0 -1
  170. package/dist/dnn/mouseUtilities-b261ca4f.js +0 -23
  171. package/dist/dnn/mouseUtilities-b261ca4f.js.map +0 -1
  172. package/dist/dnn/shadow-css-27708fdd.system.js +0 -14
  173. package/dist/dnn/shadow-css-27708fdd.system.js.map +0 -1
  174. package/dist/dnn/shadow-css-ef431969.js +0 -390
  175. package/dist/dnn/shadow-css-ef431969.js.map +0 -1
  176. package/dist/esm/app-globals-0f993ce5.js +0 -5
  177. package/dist/esm/app-globals-0f993ce5.js.map +0 -1
  178. package/dist/esm/css-shim-091f949f.js +0 -6
  179. package/dist/esm/css-shim-091f949f.js.map +0 -1
  180. package/dist/esm/dnn-button.entry.js +0 -88
  181. package/dist/esm/dnn-button.entry.js.map +0 -1
  182. package/dist/esm/dnn-checkbox.entry.js +0 -54
  183. package/dist/esm/dnn-checkbox.entry.js.map +0 -1
  184. package/dist/esm/dnn-chevron.entry.js +0 -30
  185. package/dist/esm/dnn-chevron.entry.js.map +0 -1
  186. package/dist/esm/dnn-collapsible.entry.js +0 -65
  187. package/dist/esm/dnn-collapsible.entry.js.map +0 -1
  188. package/dist/esm/dnn-color-picker.entry.js +0 -504
  189. package/dist/esm/dnn-color-picker.entry.js.map +0 -1
  190. package/dist/esm/dnn-dropzone.entry.js +0 -149
  191. package/dist/esm/dnn-dropzone.entry.js.map +0 -1
  192. package/dist/esm/dnn-image-cropper.entry.js +0 -404
  193. package/dist/esm/dnn-image-cropper.entry.js.map +0 -1
  194. package/dist/esm/dnn-modal.entry.js +0 -61
  195. package/dist/esm/dnn-modal.entry.js.map +0 -1
  196. package/dist/esm/dnn-permissions-grid.entry.js +0 -316
  197. package/dist/esm/dnn-permissions-grid.entry.js.map +0 -1
  198. package/dist/esm/dnn-searchbox.entry.js +0 -62
  199. package/dist/esm/dnn-searchbox.entry.js.map +0 -1
  200. package/dist/esm/dnn-sort-icon.entry.js +0 -39
  201. package/dist/esm/dnn-sort-icon.entry.js.map +0 -1
  202. package/dist/esm/dnn-tab.entry.js +0 -27
  203. package/dist/esm/dnn-tab.entry.js.map +0 -1
  204. package/dist/esm/dnn-tabs.entry.js +0 -48
  205. package/dist/esm/dnn-tabs.entry.js.map +0 -1
  206. package/dist/esm/dnn-toggle.entry.js +0 -33
  207. package/dist/esm/dnn-toggle.entry.js.map +0 -1
  208. package/dist/esm/dnn-treeview-item.entry.js +0 -64
  209. package/dist/esm/dnn-treeview-item.entry.js.map +0 -1
  210. package/dist/esm/dnn-vertical-overflow-menu.entry.js +0 -120
  211. package/dist/esm/dnn-vertical-overflow-menu.entry.js.map +0 -1
  212. package/dist/esm/dnn-vertical-splitview.entry.js +0 -129
  213. package/dist/esm/dnn-vertical-splitview.entry.js.map +0 -1
  214. package/dist/esm/dom-a385e381.js +0 -75
  215. package/dist/esm/dom-a385e381.js.map +0 -1
  216. package/dist/esm/index-20e42ad7.js +0 -3059
  217. package/dist/esm/index-20e42ad7.js.map +0 -1
  218. package/dist/esm/mouseUtilities-b261ca4f.js +0 -23
  219. package/dist/esm/mouseUtilities-b261ca4f.js.map +0 -1
  220. package/dist/esm/shadow-css-ef431969.js +0 -390
  221. package/dist/esm/shadow-css-ef431969.js.map +0 -1
@@ -1,149 +0,0 @@
1
- import { r as registerInstance, e as createEvent, h, f as Host } from './index-20e42ad7.js';
2
-
3
- const dnnDropzoneCss = ":host{--border-color:var(--dnn-color-tertiary-contrast, lightgray);--border-radius:var(--dnn-controls-radius, 5px);--drop-background-color:var(--dnn-color-tertiary, lightblue);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;gap:1rem;text-align:center;border:2px dashed var(--border-color);border-radius:var(--border-radius);padding:1rem;-webkit-transition:all 300ms ease-in-out;transition:all 300ms ease-in-out}:host(.dropping){background-color:var(--drop-background-color)}p{margin:0;padding:0}button{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;border:0px;margin:0;padding:0;background-color:transparent}button:hover{cursor:pointer}button svg{margin-right:0.5rem}label.upload-file{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;cursor:pointer}label.upload-file input{display:none}.video-preview{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center}.video-preview button{margin:1rem}";
4
-
5
- const DnnDropzone = class {
6
- constructor(hostRef) {
7
- registerInstance(this, hostRef);
8
- this.filesSelected = createEvent(this, "filesSelected", 7);
9
- /** Localization strings */
10
- this.resx = {
11
- dragAndDropFile: "Drag and drop a file",
12
- capture: "Capture",
13
- or: "or",
14
- takePicture: "Take a picture",
15
- uploadFile: "Upload a file",
16
- };
17
- /**
18
- * If true, will allow the user to take a snapshot
19
- * using the device camera. (only works over https).
20
- */
21
- this.allowCameraMode = false;
22
- /**
23
- * Specifies the jpeg quality for when the device
24
- * camera is used to generate a picture.
25
- * Needs to be a number between 0 and 1 and defaults to 0.8
26
- */
27
- this.captureQuality = 0.8;
28
- this.canTakeSnapshots = false;
29
- this.takingPicture = false;
30
- this.handleDragOver = (event) => {
31
- event.stopPropagation();
32
- event.preventDefault();
33
- event.dataTransfer.dropEffect = "copy";
34
- this.dropzone.classList.add("dropping");
35
- };
36
- this.handleDrop = (dropEvent) => {
37
- dropEvent.stopPropagation();
38
- dropEvent.preventDefault();
39
- const files = dropEvent.dataTransfer.files;
40
- if (this.hasInvalidExtensions(files)) {
41
- return;
42
- }
43
- var fileList = this.getFilesFromFileList(files);
44
- this.filesSelected.emit(fileList);
45
- };
46
- }
47
- componentDidLoad() {
48
- if (this.allowCameraMode) {
49
- this.checkIfBrowserCanTakeSnapshots()
50
- .then(result => this.canTakeSnapshots = result);
51
- }
52
- if (this.allowedExtensions != undefined && this.allowedExtensions.length > 0) {
53
- var extensionsWithDots = this.allowedExtensions.map(e => `.${e}`);
54
- var extensionsList = extensionsWithDots.join(",");
55
- this.fileInput.accept = extensionsList;
56
- }
57
- }
58
- checkIfBrowserCanTakeSnapshots() {
59
- return new Promise((resolve) => {
60
- const mediaDevices = navigator.mediaDevices;
61
- if (mediaDevices == undefined || mediaDevices.enumerateDevices == undefined) {
62
- resolve(false);
63
- }
64
- mediaDevices.enumerateDevices()
65
- .then(devices => {
66
- var result = devices.some(device => device.kind == "videoinput");
67
- resolve(result);
68
- });
69
- });
70
- }
71
- getFilesFromFileList(files) {
72
- var fileList = [];
73
- for (let index = 0; index < files.length; index++) {
74
- const file = files[index];
75
- fileList.push(file);
76
- }
77
- return fileList;
78
- }
79
- handleUploadButton(element) {
80
- let files = this.getFilesFromFileList(element.files);
81
- this.filesSelected.emit(files);
82
- }
83
- hasInvalidExtensions(files) {
84
- var hasInvalid = false;
85
- for (let fileIndex = 0; fileIndex < files.length; fileIndex++) {
86
- const file = files[fileIndex];
87
- var regex = /(?:\.([^.]+))?$/;
88
- const fileExtension = regex.exec(file.name)[1];
89
- if (fileExtension == undefined) {
90
- hasInvalid = true;
91
- }
92
- if (this.allowedExtensions != undefined && !this.allowedExtensions.includes(fileExtension)) {
93
- hasInvalid = true;
94
- }
95
- return hasInvalid;
96
- }
97
- }
98
- takeSnapshot() {
99
- this.takingPicture = true;
100
- navigator.mediaDevices.getUserMedia({ video: true, audio: false })
101
- .then(stream => {
102
- stream;
103
- this.videoPreview.srcObject = stream;
104
- this.videoPreview.play()
105
- .then(() => {
106
- this.videoSettings = stream.getVideoTracks()[0].getSettings();
107
- });
108
- })
109
- .catch(error => alert(error));
110
- }
111
- applySnapshot() {
112
- var canvas = document.createElement("canvas");
113
- const context = canvas.getContext("2d");
114
- canvas.width = this.videoSettings.width;
115
- canvas.height = this.videoSettings.height;
116
- context.drawImage(this.videoPreview, 0, 0);
117
- canvas.toBlob(blob => {
118
- var file = new File([blob], "image.jpeg", { type: "image/jpeg" });
119
- this.takingPicture = false;
120
- var fileList = [file];
121
- this.filesSelected.emit(fileList);
122
- }, "image/jpeg", this.captureQuality);
123
- }
124
- render() {
125
- var _a, _b, _c, _d, _e, _f;
126
- return (h(Host, { ref: e => this.dropzone = e, class: "dropzone", onDragOver: this.handleDragOver, onDrop: this.handleDrop, onDragLeave: () => this.dropzone.classList.remove("dropping") }, !this.takingPicture &&
127
- [
128
- h("p", null, (_a = this.resx) === null || _a === void 0 ? void 0 : _a.dragAndDropFile),
129
- h("p", null, "- ", (_b = this.resx) === null || _b === void 0 ? void 0 :
130
- _b.or, " -"),
131
- h("label", { class: "upload-file" }, h("input", { type: "file", ref: el => this.fileInput = el, onChange: e => this.handleUploadButton(e.target) }), h("span", null, h("svg", { xmlns: "http://www.w3.org/2000/svg", "enable-background": "new 0 0 24 24", height: "24px", viewBox: "0 0 24 24", width: "24px", fill: "#000000" }, h("g", null, h("rect", { fill: "none", height: "24", width: "24" })), h("g", null, h("path", { d: "M5,20h14v-2H5V20z M5,10h4v6h6v-6h4l-7-7L5,10z" })))), "\u00A0", (_c = this.resx) === null || _c === void 0 ? void 0 :
132
- _c.uploadFile),
133
- this.canTakeSnapshots &&
134
- [
135
- h("p", null, "- ", (_d = this.resx) === null || _d === void 0 ? void 0 :
136
- _d.or, " -"),
137
- h("button", { onClick: () => this.takeSnapshot() }, h("svg", { xmlns: "http://www.w3.org/2000/svg", height: "24px", viewBox: "0 0 24 24", width: "24px", fill: "#000000" }, h("path", { d: "M0 0h24v24H0z", fill: "none" }), h("circle", { cx: "12", cy: "12", r: "3.2" }), h("path", { d: "M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z" })), (_e = this.resx) === null || _e === void 0 ? void 0 :
138
- _e.takePicture)
139
- ]
140
- ], this.takingPicture &&
141
- h("div", { class: "video-preview" }, h("video", { ref: e => this.videoPreview = e }), h("button", { onClick: () => this.applySnapshot() }, h("svg", { xmlns: "http://www.w3.org/2000/svg", height: "24px", viewBox: "0 0 24 24", width: "24px", fill: "#000000" }, h("path", { d: "M0 0h24v24H0z", fill: "none" }), h("circle", { cx: "12", cy: "12", r: "3.2" }), h("path", { d: "M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z" })), "\u00A0", (_f = this.resx) === null || _f === void 0 ? void 0 :
142
- _f.capture))));
143
- }
144
- };
145
- DnnDropzone.style = dnnDropzoneCss;
146
-
147
- export { DnnDropzone as dnn_dropzone };
148
-
149
- //# sourceMappingURL=dnn-dropzone.entry.js.map
@@ -1 +0,0 @@
1
- {"file":"dnn-dropzone.entry.js","mappings":"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","names":[],"sources":["./src/components/dnn-dropzone/dnn-dropzone.scss?tag=dnn-dropzone&encapsulation=shadow","./src/components/dnn-dropzone/dnn-dropzone.tsx"],"sourcesContent":["\n:host {\n /** \n * @prop --border-color: The color of the border.\n * @prop --border-radius: The radius of the controls borders.\n * @prop --drop-background-color: The color of the background when a file is dropping.\n */\n --border-color: var(--dnn-color-tertiary-contrast, lightgray);\n --border-radius: var(--dnn-controls-radius, 5px);\n --drop-background-color: var(--dnn-color-tertiary, lightblue);\n\n display: flex;\n flex-direction: column;\n gap: 1rem;\n text-align: center;\n border: 2px dashed var(--border-color);\n border-radius: var(--border-radius);\n padding: 1rem;\n transition: all 300ms ease-in-out;\n}\n\n:host(.dropping){\n background-color: var(--drop-background-color);\n}\np{\n margin: 0;\n padding: 0;\n}\nbutton{\n display: flex;\n justify-content: center;\n align-items: center;\n border: 0px;\n margin: 0;\n padding: 0;\n background-color: transparent;\n &:hover{\n cursor: pointer;\n }\n svg{\n margin-right: 0.5rem;\n }\n}\nlabel.upload-file{\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n input{\n display: none;\n }\n}\n.video-preview{\n display: flex;\n flex-direction: column;\n align-items: center;\n button{\n margin: 1rem;\n }\n}\n","import { Component, Host, h, Prop, State, Event, EventEmitter } from '@stencil/core';\n\n@Component({\n tag: 'dnn-dropzone',\n styleUrl: 'dnn-dropzone.scss',\n shadow: true,\n})\nexport class DnnDropzone {\n /** Localization strings */\n @Prop() resx:{\n dragAndDropFile: string;\n capture: string;\n or: string;\n takePicture: string;\n uploadFile: string;\n } = {\n dragAndDropFile: \"Drag and drop a file\",\n capture: \"Capture\",\n or: \"or\",\n takePicture: \"Take a picture\",\n uploadFile: \"Upload a file\",\n }\n\n /** A list of allowed file extensions.\n * If not specified, any file is allowed.\n * Ex: [\"jpg\", \"jped\", \"gif\", \"png\"]\n */\n @Prop() allowedExtensions: string[];\n\n /**\n * If true, will allow the user to take a snapshot\n * using the device camera. (only works over https).\n */\n @Prop() allowCameraMode: boolean = false;\n\n /**\n * Specifies the jpeg quality for when the device\n * camera is used to generate a picture.\n * Needs to be a number between 0 and 1 and defaults to 0.8\n */\n @Prop() captureQuality: number = 0.8;\n\n /** Fires when file were selected. */\n @Event() filesSelected: EventEmitter<File[]>;\n \n @State() canTakeSnapshots: boolean = false;\n\n @State() takingPicture: boolean = false;\n \n private dropzone: HTMLElement;\n private fileInput: HTMLInputElement;\n private videoPreview: HTMLVideoElement;\n private videoSettings!: MediaTrackSettings;\n\n\n componentDidLoad() {\n if (this.allowCameraMode){\n this.checkIfBrowserCanTakeSnapshots()\n .then(result => this.canTakeSnapshots = result);\n }\n if (this.allowedExtensions != undefined && this.allowedExtensions.length > 0){\n var extensionsWithDots = this.allowedExtensions.map(e => `.${e}`);\n var extensionsList = extensionsWithDots.join(\",\");\n this.fileInput.accept = extensionsList;\n }\n }\n\n private checkIfBrowserCanTakeSnapshots(): Promise<boolean> {\n return new Promise((resolve) => {\n const mediaDevices = navigator.mediaDevices;\n if (mediaDevices == undefined || mediaDevices.enumerateDevices == undefined) {\n resolve(false);\n }\n mediaDevices.enumerateDevices()\n .then(devices => {\n var result = devices.some(device => device.kind == \"videoinput\");\n resolve(result);\n });\n });\n }\n\n private getFilesFromFileList(files: FileList) : File[] {\n var fileList: File[] = [];\n for (let index = 0; index < files.length; index++) {\n const file = files[index];\n fileList.push(file);\n }\n\n return fileList;\n }\n\n private handleUploadButton(element: HTMLInputElement): void {\n let files = this.getFilesFromFileList(element.files);\n\n this.filesSelected.emit(files);\n }\n\n private handleDragOver = (event: DragEvent) => \n {\n event.stopPropagation();\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n this.dropzone.classList.add(\"dropping\");\n };\n\n private hasInvalidExtensions(files: FileList): boolean{\n var hasInvalid = false;\n for (let fileIndex = 0; fileIndex < files.length; fileIndex++) {\n const file = files[fileIndex];\n var regex = /(?:\\.([^.]+))?$/;\n const fileExtension = regex.exec(file.name)[1];\n if (fileExtension == undefined){\n hasInvalid = true;\n }\n\n if (this.allowedExtensions != undefined && !this.allowedExtensions.includes(fileExtension)){\n hasInvalid = true;\n }\n\n return hasInvalid;\n }\n }\n\n private handleDrop = (dropEvent: DragEvent) => {\n dropEvent.stopPropagation();\n dropEvent.preventDefault();\n const files = dropEvent.dataTransfer.files;\n\n if (this.hasInvalidExtensions(files)){\n return;\n }\n var fileList = this.getFilesFromFileList(files);\n this.filesSelected.emit(fileList);\n };\n\n private takeSnapshot(): void {\n this.takingPicture = true;\n navigator.mediaDevices.getUserMedia({video: true, audio: false})\n .then(stream => {\n stream\n this.videoPreview.srcObject = stream;\n this.videoPreview.play()\n .then(() => {\n this.videoSettings = stream.getVideoTracks()[0].getSettings();\n });\n })\n .catch(error => alert(error));\n }\n\n private applySnapshot(): void {\n var canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n canvas.width = this.videoSettings.width;\n canvas.height = this.videoSettings.height;\n context.drawImage(this.videoPreview, 0, 0);\n canvas.toBlob(blob => {\n var file = new File([blob], \"image.jpeg\", {type:\"image/jpeg\"});\n this.takingPicture = false;\n \n var fileList = [file];\n this.filesSelected.emit(fileList)\n }, \"image/jpeg\", this.captureQuality);\n }\n \n render() {\n return (\n <Host\n ref={e => this.dropzone = e}\n class=\"dropzone\"\n onDragOver={this.handleDragOver}\n onDrop={this.handleDrop}\n onDragLeave={() => this.dropzone.classList.remove(\"dropping\")}\n >\n {!this.takingPicture &&\n [\n <p>{this.resx?.dragAndDropFile}</p>\n ,\n <p>- {this.resx?.or} -</p>\n ,\n <label class=\"upload-file\">\n <input\n type=\"file\"\n ref={el => this.fileInput = el}\n onChange={e => this.handleUploadButton(e.target as HTMLInputElement)}\n >\n </input>\n <span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" enable-background=\"new 0 0 24 24\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><g><rect fill=\"none\" height=\"24\" width=\"24\"/></g><g><path d=\"M5,20h14v-2H5V20z M5,10h4v6h6v-6h4l-7-7L5,10z\"/></g></svg>\n </span>\n &nbsp;\n {this.resx?.uploadFile}\n </label>\n ,\n this.canTakeSnapshots &&\n [\n <p>- {this.resx?.or} -</p>\n ,\n <button\n onClick={() => this.takeSnapshot()}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"3.2\"/><path d=\"M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z\"/></svg>\n {this.resx?.takePicture}\n </button>\n ]\n ]\n }\n {this.takingPicture &&\n <div class=\"video-preview\">\n <video ref={e => this.videoPreview = e} />\n <button\n onClick={() => this.applySnapshot()}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"3.2\"/><path d=\"M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z\"/></svg>&nbsp;\n {this.resx?.capture}\n </button>\n </div>\n }\n </Host>\n );\n }\n\n}\n"],"version":3}
@@ -1,404 +0,0 @@
1
- import { r as registerInstance, e as createEvent, h, f as Host } from './index-20e42ad7.js';
2
- import { g as getMovementFromEvent } from './mouseUtilities-b261ca4f.js';
3
-
4
- var CornerType;
5
- (function (CornerType) {
6
- CornerType[CornerType["nw"] = 0] = "nw";
7
- CornerType[CornerType["ne"] = 1] = "ne";
8
- CornerType[CornerType["se"] = 2] = "se";
9
- CornerType[CornerType["sw"] = 3] = "sw";
10
- })(CornerType || (CornerType = {}));
11
- ;
12
-
13
- const dnnImageCropperCss = ":host{display:block}canvas{display:none}.view{visibility:hidden;opacity:0;height:0;overflow:hidden;-webkit-transition:all 300ms ease-in-out;transition:all 300ms ease-in-out}.view.visible{visibility:visible;opacity:1;height:initial;overflow:visible}.view .cropper{position:relative;width:100%}.view .cropper img{width:100%;display:block;margin:0 auto}.view .cropper .backdrop{-webkit-backdrop-filter:saturate(0.5);backdrop-filter:saturate(0.5);-webkit-backdrop-filter:brightness(0.5);backdrop-filter:brightness(0.5);position:absolute;left:0;top:0;width:100%;height:100%}.view .cropper .crop{position:absolute;top:0;left:0;width:100%;height:100%;outline:2px dashed white;-webkit-box-shadow:black 0 0 0px 2px;box-shadow:black 0 0 0px 2px;-webkit-backdrop-filter:saturate(2);backdrop-filter:saturate(2);-webkit-backdrop-filter:brightness(2);backdrop-filter:brightness(2);cursor:move}.view .cropper .crop>div{width:20px;height:20px;background-color:white;border:2px solid rgba(0, 0, 0, 0.5);position:absolute}.view .cropper .crop>div.nw,.view .cropper .crop>div.ne{top:-17px}.view .cropper .crop>div.ne,.view .cropper .crop>div.se{right:-17px}.view .cropper .crop>div.se,.view .cropper .crop>div.sw{bottom:-17px}.view .cropper .crop>div.sw,.view .cropper .crop>div.nw{left:-17px}.view .cropper .crop>div.nw,.view .cropper .crop>div.se{cursor:nwse-resize}.view .cropper .crop>div.ne,.view .cropper .crop>div.sw{cursor:nesw-resize}dnn-modal{--max-width:512px}";
14
-
15
- const DnnImageCropper = class {
16
- constructor(hostRef) {
17
- registerInstance(this, hostRef);
18
- this.imageCropChanged = createEvent(this, "imageCropChanged", 7);
19
- /** Sets the desired final image width. */
20
- this.width = 600;
21
- /** Sets the desired final image height. */
22
- this.height = 600;
23
- /** Can be used to customize controls text.
24
- * Some values support tokens, see default values for examples.
25
- */
26
- this.resx = {
27
- capture: "Capture",
28
- dragAndDropFile: "Drag and drop an image",
29
- or: "or",
30
- takePicture: "Take a picture",
31
- uploadFile: "Upload an image",
32
- imageTooSmall: "The image you are attempting to upload does not meet the minimum size requirement of {width} pixels by {height} pixels. Please upload a larger image.",
33
- modalCloseText: "Close",
34
- };
35
- /** Sets the output quality of the corpped image (number between 0 and 1). */
36
- this.quality = 0.8;
37
- /** When set to true, prevents cropping an image smaller than the required size, which would blow pixel and make the final picture look blurry. */
38
- this.preventUndersized = false;
39
- this.handleCropMouseDown = (event) => {
40
- event.stopPropagation();
41
- event.preventDefault();
42
- const element = event.target;
43
- const className = element.classList[0];
44
- document.addEventListener("mouseup", this.handleImageCropFinished, false);
45
- document.addEventListener("touchend", this.handleImageCropFinished, false);
46
- switch (className) {
47
- case "crop":
48
- document.addEventListener("mousemove", this.handleCropDrag, false);
49
- document.addEventListener("touchmove", this.handleCropDrag, false);
50
- document.addEventListener("mouseup", () => document.removeEventListener("mousemove", this.handleCropDrag));
51
- document.addEventListener("touchend", () => document.removeEventListener("touchmove", this.handleCropDrag));
52
- break;
53
- case "nw":
54
- document.addEventListener("mousemove", this.handleNwMouseMove, false);
55
- document.addEventListener("touchmove", this.handleNwMouseMove, false);
56
- document.addEventListener("mouseup", () => document.removeEventListener("mousemove", this.handleNwMouseMove));
57
- document.addEventListener("touchend", () => document.removeEventListener("touchmove", this.handleNwMouseMove));
58
- break;
59
- case "ne":
60
- document.addEventListener("mousemove", this.handleNeMouseMove, false);
61
- document.addEventListener("touchmove", this.handleNeMouseMove, false);
62
- document.addEventListener("mouseup", () => document.removeEventListener("mousemove", this.handleNeMouseMove));
63
- document.addEventListener("touchend", () => document.removeEventListener("touchmove", this.handleNeMouseMove));
64
- break;
65
- case "se":
66
- document.addEventListener("mousemove", this.handleSeMouseMove, false);
67
- document.addEventListener("touchmove", this.handleSeMouseMove, false);
68
- document.addEventListener("mouseup", () => document.removeEventListener("mousemove", this.handleSeMouseMove));
69
- document.addEventListener("touchend", () => document.removeEventListener("touchmove", this.handleSeMouseMove));
70
- break;
71
- case "sw":
72
- document.addEventListener("mousemove", this.handleSwMouseMove, false);
73
- document.addEventListener("touchmove", this.handleSwMouseMove, false);
74
- document.addEventListener("mouseup", () => document.removeEventListener("mousemove", this.handleSwMouseMove));
75
- document.addEventListener("touchend", () => document.removeEventListener("touchmove", this.handleSwMouseMove));
76
- break;
77
- default:
78
- break;
79
- }
80
- };
81
- this.handleImageCropFinished = (_ev) => {
82
- this.emitImage();
83
- document.removeEventListener("mouseup", this.handleImageCropFinished);
84
- this.previousTouch = undefined;
85
- };
86
- this.handleNwMouseMove = (event) => {
87
- this.handleCornerDrag(event, CornerType.nw);
88
- };
89
- this.handleNeMouseMove = (event) => {
90
- this.handleCornerDrag(event, CornerType.ne);
91
- };
92
- this.handleSeMouseMove = (event) => {
93
- this.handleCornerDrag(event, CornerType.se);
94
- };
95
- this.handleSwMouseMove = (event) => {
96
- this.handleCornerDrag(event, CornerType.sw);
97
- };
98
- this.handleCornerDrag = (event, corner) => {
99
- if (!this.isMouseStillInTarget(event)) {
100
- return;
101
- }
102
- let { left, top } = this.getCornerLeftTop(corner);
103
- let newWidth = 0;
104
- let newHeight = 0;
105
- let orientation = "horizontal";
106
- const wantedRatio = this.width / this.height;
107
- const cropRect = this.crop.getBoundingClientRect();
108
- const imageRect = this.image.getBoundingClientRect();
109
- let { movementX, movementY } = getMovementFromEvent(event, this.previousTouch);
110
- if (Math.abs(movementX) < Math.abs(movementY)) {
111
- orientation = "vertical";
112
- }
113
- if (orientation == "horizontal") {
114
- switch (corner) {
115
- case CornerType.nw:
116
- case CornerType.sw:
117
- newWidth = cropRect.width - movementX;
118
- newHeight = newWidth / wantedRatio;
119
- break;
120
- case CornerType.ne:
121
- case CornerType.se:
122
- newWidth = cropRect.width + movementX;
123
- newHeight = newWidth / wantedRatio;
124
- break;
125
- default:
126
- break;
127
- }
128
- }
129
- else {
130
- switch (corner) {
131
- case CornerType.nw:
132
- case CornerType.ne:
133
- newHeight = cropRect.height - movementY;
134
- newWidth = newHeight * wantedRatio;
135
- break;
136
- case CornerType.se:
137
- case CornerType.sw:
138
- newHeight = cropRect.height + movementY;
139
- newWidth = newHeight * wantedRatio;
140
- break;
141
- default:
142
- break;
143
- }
144
- }
145
- switch (corner) {
146
- case CornerType.ne:
147
- case CornerType.nw:
148
- const topOffset = cropRect.height - newHeight;
149
- top = this.crop.offsetTop + topOffset;
150
- default:
151
- break;
152
- }
153
- switch (corner) {
154
- case CornerType.nw:
155
- case CornerType.sw:
156
- const leftOffset = cropRect.width - newWidth;
157
- left = this.crop.offsetLeft + leftOffset;
158
- if (left < 0)
159
- left = 0;
160
- if (left > imageRect.width)
161
- left = imageRect.width;
162
- if (top < 0)
163
- top = 0;
164
- if (top > imageRect.height)
165
- top = imageRect.height;
166
- if (left + newWidth > imageRect.width)
167
- newWidth = imageRect.width - left;
168
- if (top + newHeight > imageRect.height)
169
- newHeight = imageRect.height - top;
170
- break;
171
- case CornerType.ne:
172
- case CornerType.se:
173
- if (top < 0)
174
- top = 0;
175
- if (top > imageRect.height)
176
- top = imageRect.height;
177
- if (left + newWidth > imageRect.width)
178
- newWidth = imageRect.width - left;
179
- if (top + newHeight > imageRect.height)
180
- newHeight = imageRect.height - top;
181
- break;
182
- default:
183
- break;
184
- }
185
- if (newWidth / newHeight != wantedRatio) {
186
- return;
187
- }
188
- if (this.preventUndersized) {
189
- const zoomRatio = this.image.width / this.image.naturalWidth;
190
- if (newWidth / zoomRatio < this.width || newHeight / zoomRatio < this.height) {
191
- return;
192
- }
193
- }
194
- switch (corner) {
195
- case CornerType.ne:
196
- this.crop.style.top = `${top}px`;
197
- this.crop.style.width = `${newWidth}px`;
198
- this.crop.style.height = `${newHeight}px`;
199
- break;
200
- case CornerType.nw:
201
- this.crop.style.left = `${left}px`;
202
- this.crop.style.top = `${top}px`;
203
- this.crop.style.width = `${newWidth}px`;
204
- this.crop.style.height = `${newHeight}px`;
205
- break;
206
- case CornerType.se:
207
- this.crop.style.width = `${newWidth}px`;
208
- this.crop.style.height = `${newHeight}px`;
209
- break;
210
- case CornerType.sw:
211
- this.crop.style.left = `${left}px`;
212
- this.crop.style.width = `${newWidth}px`;
213
- this.crop.style.height = `${newHeight}px`;
214
- break;
215
- default:
216
- break;
217
- }
218
- };
219
- this.handleCropDrag = (ev) => {
220
- if (!this.isMouseStillInTarget(ev)) {
221
- return;
222
- }
223
- let { movementX, movementY } = getMovementFromEvent(ev, this.previousTouch);
224
- let newLeft = this.crop.offsetLeft + movementX;
225
- let newTop = this.crop.offsetTop + movementY;
226
- var imageRect = this.image.getBoundingClientRect();
227
- var cropRect = this.crop.getBoundingClientRect();
228
- if (newLeft < 0) {
229
- newLeft = 0;
230
- }
231
- if (newTop < 0) {
232
- newTop = 0;
233
- }
234
- if (newLeft + cropRect.width > imageRect.width) {
235
- newLeft = this.crop.offsetLeft;
236
- }
237
- if (newTop + cropRect.height > imageRect.height) {
238
- newTop = this.crop.offsetTop;
239
- }
240
- this.crop.style.left = newLeft + "px";
241
- this.crop.style.top = newTop + "px";
242
- };
243
- }
244
- componentDidLoad() {
245
- requestAnimationFrame(() => {
246
- this.setView("noPictureView");
247
- });
248
- }
249
- setView(newView) {
250
- const views = this.host.shadowRoot.querySelectorAll(".view");
251
- views.forEach(v => v.classList.remove("visible"));
252
- switch (newView) {
253
- case "noPictureView":
254
- this.noPictureView.classList.add("visible");
255
- break;
256
- case "hasPictureView":
257
- this.hasPictureView.classList.add("visible");
258
- break;
259
- default:
260
- break;
261
- }
262
- this.view = newView;
263
- }
264
- initCrop() {
265
- var wantedRatio = this.width / this.height;
266
- var imageRect = this.image.getBoundingClientRect();
267
- var imageRatio = imageRect.width / imageRect.height;
268
- if (wantedRatio > imageRatio) {
269
- var wantedHeight = imageRect.width / wantedRatio;
270
- var diff = imageRect.height - wantedHeight;
271
- this.crop.style.top = Math.round(diff / 2).toString() + "px";
272
- this.crop.style.height = Math.round(wantedHeight).toString() + "px";
273
- }
274
- else {
275
- var wantedWidth = imageRect.height * wantedRatio;
276
- var diff = imageRect.width - wantedWidth;
277
- this.crop.style.left = Math.round(diff / 2).toString() + "px";
278
- this.crop.style.width = Math.round(wantedWidth).toString() + "px";
279
- }
280
- }
281
- setImage() {
282
- this.image.addEventListener('load', () => {
283
- this.initCrop();
284
- this.emitImage();
285
- });
286
- this.image.src = this.canvas.toDataURL();
287
- }
288
- handleNewFile(file) {
289
- if (file.type.split('/')[0] != "image") {
290
- return;
291
- }
292
- var reader = new FileReader();
293
- reader.onload = readerLoadEvent => {
294
- var img = new Image();
295
- img.onload = () => {
296
- this.canvas.width = img.width;
297
- this.canvas.height = img.height;
298
- if (this.preventUndersized && (img.width < this.width || img.height < this.height)) {
299
- this.imageTooSmallModal.show();
300
- return;
301
- }
302
- var ctx = this.canvas.getContext("2d");
303
- ctx.drawImage(img, 0, 0);
304
- this.setView("hasPictureView");
305
- this.setImage();
306
- };
307
- img.src = readerLoadEvent.target.result.toString();
308
- };
309
- reader.readAsDataURL(file);
310
- }
311
- emitImage() {
312
- var x = this.crop.offsetLeft / this.image.width * this.image.naturalWidth;
313
- var y = this.crop.offsetTop / this.image.height * this.image.naturalHeight;
314
- var cropRect = this.crop.getBoundingClientRect();
315
- var width = cropRect.width / this.image.width * this.image.naturalWidth;
316
- var height = cropRect.height / this.image.height * this.image.naturalHeight;
317
- if (x < 0)
318
- x = 0;
319
- if (x > this.image.naturalWidth)
320
- x = this.image.naturalWidth;
321
- if (y < 0)
322
- y = 0;
323
- if (y > this.image.naturalWidth)
324
- y = this.image.naturalWidth;
325
- if (width > this.image.naturalWidth)
326
- width = this.image.naturalWidth;
327
- if (height > this.image.naturalHeight)
328
- height = this.image.naturalHeight;
329
- var dataUrl = this.generateCroppedImage(x, y, width, height, this.width, this.height);
330
- this.imageCropChanged.emit(dataUrl);
331
- }
332
- generateCroppedImage(x, y, width, height, desiredWidth, desiredHeight) {
333
- this.canvas.width = desiredWidth;
334
- this.canvas.height = desiredHeight;
335
- const context = this.canvas.getContext("2d");
336
- context.clearRect(0, 0, desiredWidth, desiredHeight);
337
- context.drawImage(this.image, x, y, width, height, 0, 0, desiredWidth, desiredHeight);
338
- return this.canvas.toDataURL("image/jpeg", this.quality);
339
- }
340
- getCornerLeftTop(corner) {
341
- let left = 0;
342
- let top = 0;
343
- switch (corner) {
344
- case CornerType.se:
345
- left = this.crop.offsetLeft;
346
- top = this.crop.offsetTop;
347
- break;
348
- case CornerType.sw:
349
- top = this.crop.offsetTop;
350
- break;
351
- default:
352
- break;
353
- }
354
- return { top, left };
355
- }
356
- isMouseStillInTarget(event) {
357
- var inside = false;
358
- let mouseX;
359
- let mouseY;
360
- const imageRect = this.image.getBoundingClientRect();
361
- if (event instanceof MouseEvent) {
362
- mouseX = event.clientX;
363
- mouseY = event.clientY;
364
- }
365
- if (typeof TouchEvent !== "undefined") {
366
- if (event instanceof TouchEvent) {
367
- var touch = event.touches[0];
368
- mouseX = touch.clientX;
369
- mouseY = touch.clientY;
370
- }
371
- }
372
- if (mouseX >= imageRect.x &&
373
- mouseY >= imageRect.y &&
374
- mouseX <= imageRect.left + imageRect.width &&
375
- mouseY <= imageRect.top + imageRect.height) {
376
- inside = true;
377
- }
378
- var corners = this.crop.querySelectorAll("div");
379
- corners.forEach(corner => {
380
- var cornerRect = corner.getBoundingClientRect();
381
- if (mouseX >= cornerRect.x &&
382
- mouseY >= cornerRect.y &&
383
- mouseX <= cornerRect.left + cornerRect.width &&
384
- mouseY <= cornerRect.top + cornerRect.height) {
385
- inside = true;
386
- }
387
- });
388
- return inside;
389
- }
390
- render() {
391
- return (h(Host, { ref: el => this.host = el }, h("canvas", { ref: el => this.canvas = el }), h("div", { class: "view", ref: el => this.hasPictureView = el }, h("div", { class: "cropper" }, h("img", { ref: el => this.image = el }), h("div", { class: "backdrop" }), h("div", { class: "crop", ref: e => this.crop = e, onMouseDown: this.handleCropMouseDown, onTouchStart: this.handleCropMouseDown }, h("div", { class: "nw" }), h("div", { class: "ne" }), h("div", { class: "se" }), h("div", { class: "sw" })))), h("div", { class: "view", ref: el => this.noPictureView = el }, h("dnn-dropzone", { allowCameraMode: true, onFilesSelected: e => this.handleNewFile(e.detail[0]), resx: {
392
- capture: this.resx.capture,
393
- dragAndDropFile: this.resx.dragAndDropFile,
394
- or: this.resx.or,
395
- takePicture: this.resx.takePicture,
396
- uploadFile: this.resx.uploadFile,
397
- } })), h("dnn-modal", { ref: el => this.imageTooSmallModal = el, "close-text": this.resx.modalCloseText }, h("p", null, this.resx.imageTooSmall.replace("{width}", this.width.toString()).replace("{height}", this.height.toString())))));
398
- }
399
- };
400
- DnnImageCropper.style = dnnImageCropperCss;
401
-
402
- export { DnnImageCropper as dnn_image_cropper };
403
-
404
- //# sourceMappingURL=dnn-image-cropper.entry.js.map