@w0s/input-file-preview 3.0.5 → 3.0.6

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.
package/README.md CHANGED
@@ -25,12 +25,12 @@
25
25
  inputFilePreview(document.querySelectorAll('.js-input-file-preview')); // `getElementById()` or `getElementsByClassName()` or `getElementsByTagName()` or `querySelector()` or `querySelectorAll()`
26
26
  </script>
27
27
 
28
- <input type="file" class="js-input-file-preview"
28
+ <input type="file" id="input-file" class="js-input-file-preview"
29
29
  data-preview="preview"
30
30
  data-max-size="1048576"
31
31
  />
32
32
  <template id="preview">
33
- <output><code>${name}</code> (<data value="${size}">${size} byte</data>) cannot be previewed.</output>
33
+ <output for="input-file"><code>${name}</code> (<data value="${size}">${size} byte</data>) cannot be previewed.</output>
34
34
  </template>
35
35
  ```
36
36
 
@@ -49,7 +49,9 @@
49
49
 
50
50
  - `<template>` element must have one `<output>` element.
51
51
  - 🆗 `<template> <output>Message</output> </template>`
52
+ - 🆗 `<template> <output>Message</output> <!-- comment --> </template>`
52
53
  - 🆗 `<ul> <template> <li> <output>Message</output> </li> </template> </ul>`
54
+ - 🆖 `<template> <output>Message</output> text </template>` (Text node other than empty string are not permitted as child nodes)
53
55
  - 🆖 `<template> <p>Message</p> </template>`
54
56
  - Include the error message in the `<output>` element.
55
57
  - `${name}` in the `<output>` element is converted to the file name, and `${size}` is converted to the file size (in bytes).
@@ -1 +1 @@
1
- {"version":3,"file":"Preview.d.ts","sourceRoot":"","sources":["../../src/attribute/Preview.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO;;IAKb;;OAEG;gBACS,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAqB5C,IAAI,QAAQ,IAAI,mBAAmB,CAElC;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;CACD"}
1
+ {"version":3,"file":"Preview.d.ts","sourceRoot":"","sources":["../../src/attribute/Preview.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO;;IAKb;;OAEG;gBACS,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAyC5C,IAAI,QAAQ,IAAI,mBAAmB,CAElC;IAED,IAAI,UAAU,IAAI,MAAM,CAKvB;CACD"}
@@ -19,17 +19,33 @@ export default class {
19
19
  throw new Error(`Element \`#${value}\` must be a \`<template>\` element.`);
20
20
  }
21
21
  this.#template = template;
22
- const output = template.content.querySelector('output');
23
- if (output === null) {
22
+ const templateContent = template.content;
23
+ if (Array.from(templateContent.childNodes).some((node) => {
24
+ const { nodeType, nodeValue } = node;
25
+ if ([Node.ELEMENT_NODE, Node.COMMENT_NODE].includes(nodeType)) {
26
+ return false;
27
+ }
28
+ if (nodeType === Node.TEXT_NODE && nodeValue?.trim() === '') {
29
+ return false;
30
+ }
31
+ return true;
32
+ })) {
33
+ throw new Error('There must be only Element node, comment node, or empty text node within the `<template>` element.');
34
+ }
35
+ const outputElement = templateContent.querySelector('output');
36
+ if (outputElement === null) {
24
37
  throw new Error('There must be one `<output>` element within the `<template>` element.');
25
38
  }
26
- this.#output = output;
39
+ this.#output = outputElement;
27
40
  }
28
41
  get template() {
29
42
  return this.#template;
30
43
  }
31
44
  get outputHtml() {
32
- return 'getHTML' in this.#output ? this.#output.getHTML() : this.#output.innerHTML;
45
+ if ('getHTML' in HTMLOutputElement) {
46
+ return this.#output.getHTML();
47
+ }
48
+ return this.#output.innerHTML;
33
49
  }
34
50
  }
35
51
  //# sourceMappingURL=Preview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Preview.js","sourceRoot":"","sources":["../../src/attribute/Preview.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO;IACJ,SAAS,CAAsB;IAE/B,OAAO,CAAoB;IAEpC;;OAEG;IACH,YAAY,KAAgC;QAC3C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,eAAe,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,YAAY,mBAAmB,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,sCAAsC,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAE1B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,IAAI,UAAU;QACb,OAAO,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAE,IAAI,CAAC,OAA6B,CAAC,SAAS,CAAC;IAC3G,CAAC;CACD"}
1
+ {"version":3,"file":"Preview.js","sourceRoot":"","sources":["../../src/attribute/Preview.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO;IACJ,SAAS,CAAsB;IAE/B,OAAO,CAAoB;IAEpC;;OAEG;IACH,YAAY,KAAgC;QAC3C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,eAAe,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,YAAY,mBAAmB,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,sCAAsC,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAE1B,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC;QACzC,IACC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACpD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;YAErC,IAAK,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7E,OAAO,KAAK,CAAC;YACd,CAAC;YAED,IAAI,QAAQ,KAAK,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC7D,OAAO,KAAK,CAAC;YACd,CAAC;YAED,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,EACD,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,oGAAoG,CAAC,CAAC;QACvH,CAAC;QAED,MAAM,aAAa,GAAG,eAAe,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;IAC9B,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,IAAI,UAAU;QACb,IAAI,SAAS,IAAI,iBAAiB,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAC/B,CAAC;CACD"}
@@ -0,0 +1,15 @@
1
+ import type MaxSize from '../attribute/MaxSize.ts';
2
+ import type Preview from '../attribute/Preview.ts';
3
+ /**
4
+ * `submit` event
5
+ *
6
+ * @param ev - Event
7
+ * @param data - Elements, attributes and others
8
+ * @param data.previewElements -
9
+ */
10
+ declare const _default: (ev: Event, data: Readonly<{
11
+ preview: Preview;
12
+ maxSize: MaxSize;
13
+ }>) => void;
14
+ export default _default;
15
+ //# sourceMappingURL=change.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../../src/event/change.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AACnD,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AAEnD;;;;;;GAMG;yBAEF,IAAI,KAAK,EACT,MAAM,QAAQ,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CACjB,CAAC,KACA,IAAI;AANP,wBAoFE"}
@@ -0,0 +1,76 @@
1
+ import MIMEType from 'whatwg-mimetype';
2
+ import { convert } from "../util/errorMessage.js";
3
+ /**
4
+ * `submit` event
5
+ *
6
+ * @param ev - Event
7
+ * @param data - Elements, attributes and others
8
+ * @param data.previewElements -
9
+ */
10
+ export default (ev, data) => {
11
+ const inputFileElement = ev.currentTarget;
12
+ const { files } = inputFileElement;
13
+ const { parentNode: templateParentNode } = data.preview.template;
14
+ if (templateParentNode === null) {
15
+ throw new Error('The parent element of the `<template>` element does not exist.'); // `<template>` 要素がルート要素ないし `DocumentFragment` であることはあり得ないのでここには到達しない
16
+ }
17
+ /* 既存のプレビューをクリア */
18
+ Array.from(templateParentNode.querySelectorAll(':scope > [data-cloned="template"]')).forEach((element) => {
19
+ element.remove();
20
+ });
21
+ const fragment = document.createDocumentFragment();
22
+ [...files].forEach((file) => {
23
+ const templateElementClone = data.preview.template.content.cloneNode(true);
24
+ /* 次の change イベント発生時に子要素を削除するために目印を付ける */
25
+ Array.from(templateElementClone.children).forEach((element) => {
26
+ element.dataset['cloned'] = 'template';
27
+ });
28
+ const outputElement = templateElementClone.querySelector('output');
29
+ outputElement?.replaceChildren();
30
+ fragment.appendChild(templateElementClone);
31
+ const { name: fileName, size: fileSize, type: fileType } = file;
32
+ const type = fileType !== '' ? new MIMEType(fileType).type : undefined;
33
+ /* ファイルが読み込み対象であるかどうかのチェック */
34
+ if ((data.maxSize.value !== undefined && fileSize > data.maxSize.value) || type === undefined || !['image', 'audio', 'video'].includes(type)) {
35
+ outputElement?.insertAdjacentHTML('beforeend', convert(data.preview.outputHtml, file));
36
+ return;
37
+ }
38
+ const fileReader = new FileReader();
39
+ fileReader.readAsDataURL(file);
40
+ fileReader.addEventListener('load', () => {
41
+ const fileReaderResult = fileReader.result;
42
+ if (fileReaderResult === null) {
43
+ throw new Error('File load failed.');
44
+ }
45
+ let mediaElement;
46
+ switch (type) {
47
+ case 'image': {
48
+ mediaElement = document.createElement('img');
49
+ mediaElement.src = fileReaderResult;
50
+ mediaElement.alt = fileName;
51
+ break;
52
+ }
53
+ case 'audio': {
54
+ mediaElement = document.createElement('audio');
55
+ mediaElement.src = fileReaderResult;
56
+ mediaElement.controls = true;
57
+ mediaElement.textContent = fileName;
58
+ break;
59
+ }
60
+ case 'video': {
61
+ mediaElement = document.createElement('video');
62
+ mediaElement.src = fileReaderResult;
63
+ mediaElement.controls = true;
64
+ mediaElement.textContent = fileName;
65
+ break;
66
+ }
67
+ default:
68
+ /* 文字列チェックを行っているのでここには来ない */
69
+ throw new Error();
70
+ }
71
+ outputElement?.appendChild(mediaElement);
72
+ });
73
+ });
74
+ templateParentNode.insertBefore(fragment, data.preview.template);
75
+ };
76
+ //# sourceMappingURL=change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change.js","sourceRoot":"","sources":["../../src/event/change.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import InputFilePreview from "./InputFilePreview.js";
1
+ import inputFilePreview from "./inputFilePreview.js";
2
2
  const validate = (element) => {
3
3
  if (!(element instanceof HTMLInputElement)) {
4
4
  throw new Error('Element must be a `HTMLInputElement`');
@@ -13,11 +13,11 @@ export default (elementOrElements) => {
13
13
  return;
14
14
  }
15
15
  if (elementOrElements instanceof Element) {
16
- new InputFilePreview(validate(elementOrElements));
16
+ inputFilePreview(validate(elementOrElements));
17
17
  }
18
18
  else {
19
19
  Array.from(elementOrElements).forEach((element) => {
20
- new InputFilePreview(validate(element));
20
+ inputFilePreview(validate(element));
21
21
  });
22
22
  }
23
23
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AAErD,MAAM,QAAQ,GAAG,CAAC,OAAgB,EAAwB,EAAE;IAC3D,IAAI,CAAC,CAAC,OAAO,YAAY,gBAAgB,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,OAA+B,CAAC;AACxC,CAAC,CAAC;AAEF,eAAe,CAAC,iBAAmF,EAAQ,EAAE;IAC5G,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO;IACR,CAAC;IAED,IAAI,iBAAiB,YAAY,OAAO,EAAE,CAAC;QAC1C,IAAI,gBAAgB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACjD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACJ,CAAC;AACF,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AAErD,MAAM,QAAQ,GAAG,CAAC,OAAgB,EAAwB,EAAE;IAC3D,IAAI,CAAC,CAAC,OAAO,YAAY,gBAAgB,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,OAA+B,CAAC;AACxC,CAAC,CAAC;AAEF,eAAe,CAAC,iBAAmF,EAAQ,EAAE;IAC5G,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO;IACR,CAAC;IAED,IAAI,iBAAiB,YAAY,OAAO,EAAE,CAAC;QAC1C,gBAAgB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACjD,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACJ,CAAC;AACF,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { HTMLInputFileElement } from '../@types/lib.dom.ts';
2
+ /**
3
+ * Show preview with `<input type=file>`
4
+ *
5
+ * @param thisElement - Target element
6
+ */
7
+ declare const _default: (thisElement: HTMLInputFileElement) => void;
8
+ export default _default;
9
+ //# sourceMappingURL=inputFilePreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputFilePreview.d.ts","sourceRoot":"","sources":["../src/inputFilePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAKjE;;;;GAIG;yBACa,aAAa,oBAAoB,KAAG,IAAI;AAAxD,wBAiBE"}
@@ -0,0 +1,20 @@
1
+ import Preview from "./attribute/Preview.js";
2
+ import MaxSize from "./attribute/MaxSize.js";
3
+ import changeEvent from "./event/change.js";
4
+ /**
5
+ * Show preview with `<input type=file>`
6
+ *
7
+ * @param thisElement - Target element
8
+ */
9
+ export default (thisElement) => {
10
+ const { preview: previewAttribute, maxSize: maxSizeAttribute } = thisElement.dataset;
11
+ const preview = new Preview(previewAttribute);
12
+ const maxSize = new MaxSize(maxSizeAttribute ?? '10485760');
13
+ thisElement.addEventListener('change', (ev) => {
14
+ changeEvent(ev, {
15
+ preview: preview,
16
+ maxSize: maxSize,
17
+ });
18
+ }, { passive: true });
19
+ };
20
+ //# sourceMappingURL=inputFilePreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputFilePreview.js","sourceRoot":"","sources":["../src/inputFilePreview.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAE5C;;;;GAIG;AACH,eAAe,CAAC,WAAiC,EAAQ,EAAE;IAC1D,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC;IAErF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,gBAAgB,IAAI,UAAU,CAAC,CAAC;IAE5D,WAAW,CAAC,gBAAgB,CAC3B,QAAQ,EACR,CAAC,EAAS,EAAE,EAAE;QACb,WAAW,CAAC,EAAE,EAAE;YACf,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,OAAO;SAChB,CAAC,CAAC;IACJ,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CACjB,CAAC;AACH,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w0s/input-file-preview",
3
- "version": "3.0.5",
3
+ "version": "3.0.6",
4
4
  "description": "Show preview with `<input type=file>`",
5
5
  "keywords": [
6
6
  "file"
@@ -1,12 +0,0 @@
1
- import type { HTMLInputFileElement } from '../@types/lib.dom.d.ts';
2
- /**
3
- * Show preview with `<input type=file>`
4
- */
5
- export default class {
6
- #private;
7
- /**
8
- * @param thisElement - Target element
9
- */
10
- constructor(thisElement: HTMLInputFileElement);
11
- }
12
- //# sourceMappingURL=InputFilePreview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InputFilePreview.d.ts","sourceRoot":"","sources":["../src/InputFilePreview.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAKnE;;GAEG;AACH,MAAM,CAAC,OAAO;;IASb;;OAEG;gBACS,WAAW,EAAE,oBAAoB;CA6F7C"}
@@ -1,89 +0,0 @@
1
- import MIMEType from 'whatwg-mimetype';
2
- import { convert } from "./util/errorMessage.js";
3
- import Preview from "./attribute/Preview.js";
4
- import MaxSize from "./attribute/MaxSize.js";
5
- /**
6
- * Show preview with `<input type=file>`
7
- */
8
- export default class {
9
- #inputFileElement;
10
- #preview; // プレビューを表示するテンプレート
11
- #maxSize; // プレビューを行う最大サイズ
12
- #previewElements = []; // プレビューを表示する要素
13
- /**
14
- * @param thisElement - Target element
15
- */
16
- constructor(thisElement) {
17
- this.#inputFileElement = thisElement;
18
- const { preview: previewAttribute, maxSize: maxSizeAttribute } = thisElement.dataset;
19
- this.#preview = new Preview(previewAttribute);
20
- this.#maxSize = new MaxSize(maxSizeAttribute ?? '10485760');
21
- thisElement.addEventListener('change', this.#changeEvent, { passive: true });
22
- }
23
- /**
24
- * ファイル選択時の処理
25
- */
26
- #changeEvent = () => {
27
- const { files } = this.#inputFileElement;
28
- /* 既存のプレビューをリセット */
29
- this.#previewElements.forEach((element) => {
30
- element.remove();
31
- });
32
- const fragment = document.createDocumentFragment();
33
- [...files].forEach((file) => {
34
- const templateElementClone = this.#preview.template.content.cloneNode(true);
35
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
36
- const outputElement = templateElementClone.querySelector('output'); // Preview.ts にて存在チェック済み
37
- outputElement.replaceChildren();
38
- fragment.appendChild(templateElementClone);
39
- const { name: fileName, size: fileSize, type: fileType } = file;
40
- const { type } = new MIMEType(fileType);
41
- /* ファイルが読み込み対象であるかどうかのチェック */
42
- if ((this.#maxSize.value !== undefined && fileSize > this.#maxSize.value) || !['image', 'audio', 'video'].includes(type)) {
43
- outputElement.insertAdjacentHTML('beforeend', convert(this.#preview.outputHtml, file));
44
- return;
45
- }
46
- const fileReader = new FileReader();
47
- fileReader.readAsDataURL(file);
48
- fileReader.addEventListener('load', () => {
49
- const fileReaderResult = fileReader.result;
50
- if (fileReaderResult === null) {
51
- throw new Error('File load failed.');
52
- }
53
- let mediaElement;
54
- switch (type) {
55
- case 'image': {
56
- mediaElement = document.createElement('img');
57
- mediaElement.src = fileReaderResult;
58
- mediaElement.alt = fileName;
59
- break;
60
- }
61
- case 'audio': {
62
- mediaElement = document.createElement('audio');
63
- mediaElement.src = fileReaderResult;
64
- mediaElement.controls = true;
65
- mediaElement.textContent = fileName;
66
- break;
67
- }
68
- case 'video': {
69
- mediaElement = document.createElement('video');
70
- mediaElement.src = fileReaderResult;
71
- mediaElement.controls = true;
72
- mediaElement.textContent = fileName;
73
- break;
74
- }
75
- default:
76
- /* 文字列チェックを行っているのでここには来ない */
77
- throw new Error();
78
- }
79
- outputElement.appendChild(mediaElement);
80
- });
81
- });
82
- const { parentNode } = this.#preview.template;
83
- if (parentNode !== null) {
84
- parentNode.insertBefore(fragment, this.#preview.template);
85
- this.#previewElements.splice(0, this.#previewElements.length, ...Array.from(parentNode.querySelectorAll(':scope > *')).filter((element) => element !== this.#preview.template));
86
- }
87
- };
88
- }
89
- //# sourceMappingURL=InputFilePreview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InputFilePreview.js","sourceRoot":"","sources":["../src/InputFilePreview.ts"],"names":[],"mappings":"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"}