@genesislcap/pbc-documents-ui 0.0.1

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 (144) hide show
  1. package/README.md +27 -0
  2. package/dist/dts/components/components.d.ts +4 -0
  3. package/dist/dts/components/components.d.ts.map +1 -0
  4. package/dist/dts/components/foundation-document-manager/component/document-grid/column-config.d.ts +83 -0
  5. package/dist/dts/components/foundation-document-manager/component/document-grid/column-config.d.ts.map +1 -0
  6. package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.d.ts +11 -0
  7. package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.d.ts.map +1 -0
  8. package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.styles.d.ts +3 -0
  9. package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.styles.d.ts.map +1 -0
  10. package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.template.d.ts +3 -0
  11. package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.template.d.ts.map +1 -0
  12. package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.d.ts +14 -0
  13. package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.d.ts.map +1 -0
  14. package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.styles.d.ts +3 -0
  15. package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.styles.d.ts.map +1 -0
  16. package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.template.d.ts +3 -0
  17. package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.template.d.ts.map +1 -0
  18. package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.d.ts +35 -0
  19. package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.d.ts.map +1 -0
  20. package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.styles.d.ts +3 -0
  21. package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.styles.d.ts.map +1 -0
  22. package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.template.d.ts +3 -0
  23. package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.template.d.ts.map +1 -0
  24. package/dist/dts/components/foundation-document-manager/document-manager.d.ts +45 -0
  25. package/dist/dts/components/foundation-document-manager/document-manager.d.ts.map +1 -0
  26. package/dist/dts/components/foundation-document-manager/document-manager.styles.d.ts +3 -0
  27. package/dist/dts/components/foundation-document-manager/document-manager.styles.d.ts.map +1 -0
  28. package/dist/dts/components/foundation-document-manager/document-manager.template.d.ts +3 -0
  29. package/dist/dts/components/foundation-document-manager/document-manager.template.d.ts.map +1 -0
  30. package/dist/dts/components/foundation-document-manager/index.d.ts +2 -0
  31. package/dist/dts/components/foundation-document-manager/index.d.ts.map +1 -0
  32. package/dist/dts/components/foundation-document-manager/utils/action-cell-renderer.d.ts +19 -0
  33. package/dist/dts/components/foundation-document-manager/utils/action-cell-renderer.d.ts.map +1 -0
  34. package/dist/dts/components/foundation-document-manager/utils/file-type-cell-renderer.d.ts +9 -0
  35. package/dist/dts/components/foundation-document-manager/utils/file-type-cell-renderer.d.ts.map +1 -0
  36. package/dist/dts/components/foundation-document-manager/utils/icons.d.ts +16 -0
  37. package/dist/dts/components/foundation-document-manager/utils/icons.d.ts.map +1 -0
  38. package/dist/dts/components/index.d.ts +2 -0
  39. package/dist/dts/components/index.d.ts.map +1 -0
  40. package/dist/dts/index.d.ts +3 -0
  41. package/dist/dts/index.d.ts.map +1 -0
  42. package/dist/dts/index.federated.d.ts +1 -0
  43. package/dist/dts/index.federated.d.ts.map +1 -0
  44. package/dist/dts/services/document.service.d.ts +8 -0
  45. package/dist/dts/services/document.service.d.ts.map +1 -0
  46. package/dist/dts/utils/dataserver.d.ts +2 -0
  47. package/dist/dts/utils/dataserver.d.ts.map +1 -0
  48. package/dist/dts/utils/endpoint.d.ts +2 -0
  49. package/dist/dts/utils/endpoint.d.ts.map +1 -0
  50. package/dist/dts/utils/formatting.d.ts +6 -0
  51. package/dist/dts/utils/formatting.d.ts.map +1 -0
  52. package/dist/dts/utils/index.d.ts +2 -0
  53. package/dist/dts/utils/index.d.ts.map +1 -0
  54. package/dist/dts/utils/logger.d.ts +2 -0
  55. package/dist/dts/utils/logger.d.ts.map +1 -0
  56. package/dist/dts/utils/types.d.ts +12 -0
  57. package/dist/dts/utils/types.d.ts.map +1 -0
  58. package/dist/esm/components/components.js +41 -0
  59. package/dist/esm/components/components.js.map +1 -0
  60. package/dist/esm/components/foundation-document-manager/component/document-grid/column-config.js +107 -0
  61. package/dist/esm/components/foundation-document-manager/component/document-grid/column-config.js.map +1 -0
  62. package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.js +42 -0
  63. package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.js.map +1 -0
  64. package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.styles.js +10 -0
  65. package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.styles.js.map +1 -0
  66. package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.template.js +10 -0
  67. package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.template.js.map +1 -0
  68. package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.js +108 -0
  69. package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.js.map +1 -0
  70. package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.styles.js +137 -0
  71. package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.styles.js.map +1 -0
  72. package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.template.js +55 -0
  73. package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.template.js.map +1 -0
  74. package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.js +143 -0
  75. package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.js.map +1 -0
  76. package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.styles.js +157 -0
  77. package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.styles.js.map +1 -0
  78. package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.template.js +61 -0
  79. package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.template.js.map +1 -0
  80. package/dist/esm/components/foundation-document-manager/document-manager.js +130 -0
  81. package/dist/esm/components/foundation-document-manager/document-manager.js.map +1 -0
  82. package/dist/esm/components/foundation-document-manager/document-manager.styles.js +245 -0
  83. package/dist/esm/components/foundation-document-manager/document-manager.styles.js.map +1 -0
  84. package/dist/esm/components/foundation-document-manager/document-manager.template.js +93 -0
  85. package/dist/esm/components/foundation-document-manager/document-manager.template.js.map +1 -0
  86. package/dist/esm/components/foundation-document-manager/index.js +2 -0
  87. package/dist/esm/components/foundation-document-manager/index.js.map +1 -0
  88. package/dist/esm/components/foundation-document-manager/utils/action-cell-renderer.js +39 -0
  89. package/dist/esm/components/foundation-document-manager/utils/action-cell-renderer.js.map +1 -0
  90. package/dist/esm/components/foundation-document-manager/utils/file-type-cell-renderer.js +26 -0
  91. package/dist/esm/components/foundation-document-manager/utils/file-type-cell-renderer.js.map +1 -0
  92. package/dist/esm/components/foundation-document-manager/utils/icons.js +238 -0
  93. package/dist/esm/components/foundation-document-manager/utils/icons.js.map +1 -0
  94. package/dist/esm/components/index.js +2 -0
  95. package/dist/esm/components/index.js.map +1 -0
  96. package/dist/esm/index.federated.js +2 -0
  97. package/dist/esm/index.federated.js.map +1 -0
  98. package/dist/esm/index.js +3 -0
  99. package/dist/esm/index.js.map +1 -0
  100. package/dist/esm/services/document.service.js +69 -0
  101. package/dist/esm/services/document.service.js.map +1 -0
  102. package/dist/esm/utils/dataserver.js +35 -0
  103. package/dist/esm/utils/dataserver.js.map +1 -0
  104. package/dist/esm/utils/endpoint.js +22 -0
  105. package/dist/esm/utils/endpoint.js.map +1 -0
  106. package/dist/esm/utils/formatting.js +49 -0
  107. package/dist/esm/utils/formatting.js.map +1 -0
  108. package/dist/esm/utils/index.js +2 -0
  109. package/dist/esm/utils/index.js.map +1 -0
  110. package/dist/esm/utils/logger.js +3 -0
  111. package/dist/esm/utils/logger.js.map +1 -0
  112. package/dist/esm/utils/types.js +2 -0
  113. package/dist/esm/utils/types.js.map +1 -0
  114. package/index.html +14 -0
  115. package/license.txt +46 -0
  116. package/package.json +132 -0
  117. package/src/components/components.ts +49 -0
  118. package/src/components/foundation-document-manager/component/document-grid/column-config.ts +108 -0
  119. package/src/components/foundation-document-manager/component/document-grid/document-grid.styles.ts +10 -0
  120. package/src/components/foundation-document-manager/component/document-grid/document-grid.template.ts +14 -0
  121. package/src/components/foundation-document-manager/component/document-grid/document-grid.ts +39 -0
  122. package/src/components/foundation-document-manager/component/document-tile/document-tile.styles.ts +137 -0
  123. package/src/components/foundation-document-manager/component/document-tile/document-tile.template.ts +71 -0
  124. package/src/components/foundation-document-manager/component/document-tile/document-tile.ts +119 -0
  125. package/src/components/foundation-document-manager/component/document-upload/document-upload.styles.ts +157 -0
  126. package/src/components/foundation-document-manager/component/document-upload/document-upload.template.ts +82 -0
  127. package/src/components/foundation-document-manager/component/document-upload/document-upload.ts +146 -0
  128. package/src/components/foundation-document-manager/document-manager.styles.ts +245 -0
  129. package/src/components/foundation-document-manager/document-manager.template.ts +111 -0
  130. package/src/components/foundation-document-manager/document-manager.ts +128 -0
  131. package/src/components/foundation-document-manager/index.ts +1 -0
  132. package/src/components/foundation-document-manager/utils/action-cell-renderer.ts +55 -0
  133. package/src/components/foundation-document-manager/utils/file-type-cell-renderer.ts +33 -0
  134. package/src/components/foundation-document-manager/utils/icons.ts +251 -0
  135. package/src/components/index.ts +1 -0
  136. package/src/index.federated.ts +1 -0
  137. package/src/index.ts +3 -0
  138. package/src/services/document.service.ts +83 -0
  139. package/src/utils/dataserver.ts +42 -0
  140. package/src/utils/endpoint.ts +19 -0
  141. package/src/utils/formatting.ts +59 -0
  142. package/src/utils/index.ts +1 -0
  143. package/src/utils/logger.ts +2 -0
  144. package/src/utils/types.ts +11 -0
@@ -0,0 +1,71 @@
1
+ import { html, ref, repeat } from '@microsoft/fast-element';
2
+ import { DocumentTile } from './document-tile';
3
+ import { IFileStorage } from '../../../../utils/types';
4
+ import {
5
+ formatBytes,
6
+ formatDateLong,
7
+ getFileColor,
8
+ getFileType,
9
+ } from '../../../../utils/formatting';
10
+ import { downloadIcon, optionsIcon } from '../../utils/icons';
11
+
12
+ const tileTemplate = (hidden = false) => html<IFileStorage>`
13
+ <div class="tile" id="id-${(x) => x.FILE_STORAGE_ID}${() => (hidden ? '-temp' : '')}">
14
+ <div class="top-section">
15
+ <div
16
+ class="file-type"
17
+ style="background-color: ${(x) => getFileColor(getFileType(x.FILE_NAME))}"
18
+ >
19
+ ${(x) => getFileType(x.FILE_NAME)}
20
+ </div>
21
+ <span
22
+ class="options-icon"
23
+ title="Options"
24
+ @click=${(x, c) => c.parent.$emit('remove-document', x.FILE_STORAGE_ID)}
25
+ >
26
+ ${optionsIcon}
27
+ </span>
28
+ </div>
29
+ <div class="file-icon">${(x, c) => c.parent.getFileIcon(getFileType(x.FILE_NAME))}</div>
30
+ <a class="file-name">${(x) => x.FILE_NAME}</a>
31
+ <div class="footer">
32
+ <div class="footer-left">
33
+ <a>${(x) => x.CREATED_BY}</a>
34
+ <a>${(x) => formatDateLong(x.CREATED_AT)}</a>
35
+ <a>${(x) => formatBytes(x.FILE_SIZE, 0)}</a>
36
+ </div>
37
+ <div class="footer-actions">
38
+ <span
39
+ title="Download"
40
+ @click=${(x, c) => c.parent.$emit('download-document', x.FILE_STORAGE_ID)}
41
+ >
42
+ ${downloadIcon}
43
+ </span>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ `;
48
+
49
+ export const DocumentTileTemplate = html<DocumentTile>`
50
+ <div ${ref('tileContainer')} class="tile-container">
51
+ ${repeat(
52
+ (x) => x.dataAfterTransition,
53
+ html<IFileStorage>`
54
+ ${tileTemplate()}
55
+ `,
56
+ { recycle: false },
57
+ )}
58
+ </div>
59
+ <div ${ref('tileContainerTemp')} class="tile-container-temp">
60
+ ${repeat(
61
+ (x) => x.tempData,
62
+ html<IFileStorage>`
63
+ ${tileTemplate(true)}
64
+ `,
65
+ { recycle: true },
66
+ )}
67
+ </div>
68
+ <zero-anchored-region vertical-positioning-mode="right" vertical-default-position="top">
69
+ <zero-button>Click me</zero-button>
70
+ </zero-anchored-region>
71
+ `;
@@ -0,0 +1,119 @@
1
+ import { FASTElement, attr, customElement, observable } from '@microsoft/fast-element';
2
+ import { DocumentTileTemplate } from './document-tile.template';
3
+ import { DocumentTileStyles } from './document-tile.styles';
4
+ import { IFileStorage } from '../../../../utils/types';
5
+ import { csvIcon, jpgIcon, pdfIcon } from '../../utils/icons';
6
+
7
+ @customElement({
8
+ name: 'document-tile',
9
+ template: DocumentTileTemplate,
10
+ styles: DocumentTileStyles,
11
+ })
12
+ export class DocumentTile extends FASTElement {
13
+ public tileContainer: HTMLElement;
14
+ public tileContainerTemp: HTMLElement;
15
+
16
+ @attr data: IFileStorage[] = [];
17
+ @observable tempData: IFileStorage[] = [];
18
+ @observable dataAfterTransition: IFileStorage[] = [];
19
+
20
+ connectedCallback() {
21
+ super.connectedCallback();
22
+ }
23
+
24
+ public dataChanged(old: IFileStorage[], newData: IFileStorage[]) {
25
+ if (old && old.length > 0) {
26
+ this.tempData = newData;
27
+ const animationTime = 500;
28
+
29
+ const tempnewData = newData.filter(
30
+ (x) => old.findIndex((y) => y.FILE_STORAGE_ID === x.FILE_STORAGE_ID) == -1,
31
+ );
32
+
33
+ setTimeout(() => {
34
+ const map = new Map<string, any>();
35
+ Array.from(this.tileContainer.children).forEach((x: HTMLElement) =>
36
+ map.set(x.id, { left: x.offsetLeft, top: x.offsetTop }),
37
+ );
38
+ Array.from(this.tileContainer.children).forEach(async (x: HTMLElement) => {
39
+ const position = map.get(x.id);
40
+ x.setAttribute(
41
+ 'style',
42
+ `position: absolute; left: ${position.left}px; top: ${position.top}px`,
43
+ );
44
+ });
45
+
46
+ old.forEach((doc, index) => {
47
+ const newIndex = newData.findIndex((x) => x.FILE_STORAGE_ID === doc.FILE_STORAGE_ID);
48
+ const element: HTMLElement = this.tileContainer.querySelector(
49
+ `#id-${doc.FILE_STORAGE_ID}`,
50
+ );
51
+ const newEle: HTMLElement = this.tileContainerTemp.querySelector(
52
+ `#id-${doc.FILE_STORAGE_ID}-temp`,
53
+ );
54
+
55
+ if (newIndex === -1) {
56
+ const animation = element.animate({ opacity: [1, 0] }, { duration: animationTime });
57
+ if (index === old.length - 1 && tempnewData.length === 0) {
58
+ animation.onfinish = () => {
59
+ this.animationFinish(newData);
60
+ };
61
+ }
62
+ } else if (index != newIndex) {
63
+ const animation = element.animate(
64
+ [
65
+ {
66
+ left: `${element.offsetLeft}px`,
67
+ top: `${element.offsetTop}px`,
68
+ },
69
+ {
70
+ left: `${newEle.offsetLeft}px`,
71
+ top: `${newEle.offsetTop}px`,
72
+ },
73
+ ],
74
+ { duration: animationTime },
75
+ );
76
+ if (index === old.length - 1 && tempnewData.length === 0) {
77
+ animation.onfinish = () => {
78
+ this.animationFinish(newData);
79
+ };
80
+ }
81
+ }
82
+ });
83
+
84
+ tempnewData.forEach((doc, index) => {
85
+ const newEle: HTMLElement = this.tileContainerTemp.querySelector(
86
+ `#id-${doc.FILE_STORAGE_ID}-temp`,
87
+ );
88
+ const animation = newEle.animate({ opacity: [0, 1] }, { duration: animationTime });
89
+ if (index === tempnewData.length - 1) {
90
+ animation.onfinish = () => {
91
+ this.animationFinish(newData);
92
+ };
93
+ }
94
+ });
95
+ }, 0);
96
+ } else {
97
+ this.dataAfterTransition = newData;
98
+ this.tempData = [];
99
+ }
100
+ }
101
+
102
+ private animationFinish(newData) {
103
+ this.dataAfterTransition = newData;
104
+ this.tempData = [];
105
+ }
106
+
107
+ public getFileIcon(fileType: string) {
108
+ switch (fileType) {
109
+ case 'CSV':
110
+ return csvIcon;
111
+ case 'JPG':
112
+ return jpgIcon;
113
+ case 'PDF':
114
+ return pdfIcon;
115
+ default:
116
+ return '';
117
+ }
118
+ }
119
+ }
@@ -0,0 +1,157 @@
1
+ import { ElementStyles, css } from '@microsoft/fast-element';
2
+
3
+ export const DocumentUploadStyles: ElementStyles = css`
4
+ :host {
5
+ height: 100%;
6
+ width: 100%;
7
+ padding: calc(var(--design-unit) * 3px);
8
+ position: absolute;
9
+ background-color: var(--neutral-layer-4);
10
+ box-sizing: border-box;
11
+ }
12
+
13
+ .container {
14
+ display: flex;
15
+ justify-content: center;
16
+ align-items: center;
17
+ height: 100%;
18
+ border-radius: calc(var(--control-corner-radius) * 1px);
19
+ border: calc(var(--stroke-width) * 1px) dashed var(--accent-fill-rest);
20
+ background-color: var(--neutral-layer-3);
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ .clickable {
25
+ cursor: pointer;
26
+ }
27
+
28
+ .dialog {
29
+ display: flex;
30
+ flex-direction: column;
31
+ align-items: center;
32
+ gap: calc(var(--design-unit) * 3px);
33
+ }
34
+
35
+ .document-name {
36
+ font-size: var(--type-ramp-minus-1-font-size);
37
+ color: var(--neutral-stroke-hover);
38
+ text-align: center;
39
+ line-height: var(--type-ramp-base-line-height);
40
+ }
41
+
42
+ .document-size {
43
+ color: var(--neutral-foreground-hint);
44
+ font-size: var(--type-ramp-minus-1-font-size);
45
+ text-align: center;
46
+ line-height: normal;
47
+ }
48
+
49
+ .drag-prompt {
50
+ font-size: var(--type-ramp-minus-1-font-size);;
51
+ color: var(--neutral-foreground-rest);
52
+ text-align: center;
53
+ line-height: normal;
54
+ }
55
+
56
+ .drag-prompt > span {
57
+ color: var(--accent-fill-rest);
58
+ }
59
+
60
+ .progress {
61
+ width: 261px;
62
+ height: calc(var(--design-unit) * 1px);
63
+ }
64
+
65
+ .error-progress::part(determinate) {
66
+ background-color: var(--error-color);
67
+ }
68
+
69
+ .type-prompt {
70
+ font-size: var(--type-ramp-minus-1-font-size);
71
+ color: var(--neutral-foreground-hint);
72
+ text-align: center;
73
+ line-height: normal;
74
+ }
75
+
76
+ .upload-icon,
77
+ .error-icon {
78
+ fill: var(--neutral-foreground-rest);
79
+ -webkit-animation: animation-upload-icon 3s infinite;
80
+ -moz-animation: animation-upload-icon 3s infinite;
81
+ -o-animation: animation-upload-icon 3s infinite;
82
+ animation: animation-upload-icon 3s infinite;
83
+ }
84
+
85
+ .upload-successfull::part(determinate) {
86
+ background-color: var(--success-color);
87
+ }
88
+
89
+ .uploading-prompt {
90
+ width: 134px;
91
+ margin-left: 75px;
92
+ font-size: var(--type-ramp-minus-1-font-size);
93
+ color: var(--neutral-foreground-rest);
94
+ line-height: normal;
95
+ }
96
+
97
+ .uploading-prompt:after {
98
+ overflow: hidden;
99
+ display: inline-block;
100
+ vertical-align: bottom;
101
+ -webkit-animation: ellipsis steps(4, end) 2s infinite;
102
+ animation: ellipsis steps(4, end) 2s infinite;
103
+ content: '...';
104
+ width: 0px;
105
+ }
106
+
107
+ .success-icon {
108
+ position: relative;
109
+ height: calc(var(--base-height-multiplier) * 5px);
110
+ }
111
+
112
+ .success-icon > svg {
113
+ position: absolute;
114
+ top: 50%;
115
+ left: 50%;
116
+ transform: translate(-50%, -50%);
117
+ }
118
+
119
+ @keyframes ellipsis {
120
+ to {
121
+ width: 14px;
122
+ }
123
+ }
124
+
125
+ @-webkit-keyframes ellipsis {
126
+ to {
127
+ width: 14px;
128
+ }
129
+ }
130
+
131
+ .error-icon {
132
+ fill: var(--error-color);
133
+ }
134
+
135
+ @-webkit-keyframes animation-upload-icon {
136
+ 0% {
137
+ opacity: 1;
138
+ }
139
+ 50% {
140
+ opacity: 0.3;
141
+ }
142
+ 100% {
143
+ opacity: 1;
144
+ }
145
+ }
146
+ @keyframes animation-upload-icon {
147
+ 0% {
148
+ opacity: 1;
149
+ }
150
+ 50% {
151
+ opacity: 0.3;
152
+ }
153
+ 100% {
154
+ opacity: 1;
155
+ }
156
+ }
157
+ `;
@@ -0,0 +1,82 @@
1
+ import { html, ref, when } from '@microsoft/fast-element';
2
+ import { DocumentUpload, UploadState } from './document-upload';
3
+ import {
4
+ checkmark,
5
+ checkmarkBackground,
6
+ checkmarkCircle,
7
+ uploadIcon,
8
+ uploadIconLarge,
9
+ } from '../../utils/icons';
10
+ import { formatBytes } from '../../../../utils/formatting';
11
+
12
+ export const DocumentUploadTemplate = html<DocumentUpload>`
13
+ <div class="container" ${ref('dropArea')}>
14
+ ${when(
15
+ (x) => x.currentState === UploadState.START,
16
+ html<DocumentUpload>`
17
+ <div class="dialog">
18
+ <span class="upload-icon">${uploadIconLarge}</span>
19
+ <a class="drag-prompt clickable" @click=${(x) => x.fileClick()}>
20
+ Drag and drop or
21
+ <span>select</span>
22
+ a file to upload.
23
+ </a>
24
+ <a class="type-prompt">Allows file type: PDF, CSV, JPG, PNG</a>
25
+ </div>
26
+ `,
27
+ )}
28
+ ${when(
29
+ (x) =>
30
+ x.currentState === UploadState.UPLOADING ||
31
+ x.currentState === UploadState.UPLOADING_UPLOADED,
32
+ html<DocumentUpload>`
33
+ <div class="dialog">
34
+ <span class="upload-icon">${uploadIconLarge}</span>
35
+ <a
36
+ class="${(x) =>
37
+ x.currentState === UploadState.UPLOADING ? 'uploading-prompt' : 'drag-prompt'}"
38
+ >
39
+ ${(x) => (x.currentState === UploadState.UPLOADING ? 'Uploading' : 'File Uploaded')}
40
+ </a>
41
+ <a class="document-name">${(x) => x.fileName}</a>
42
+ <a class="document-size">${(x) => formatBytes(x.fileSize, 2)}</a>
43
+ <zero-progress
44
+ class="progress ${(x) =>
45
+ x.currentState === UploadState.UPLOADING_UPLOADED || x.fileUploadProgress >= 100
46
+ ? 'upload-successfull'
47
+ : ''}"
48
+ min="0"
49
+ max="100"
50
+ value=${(x) => x.fileUploadProgress}
51
+ ></zero-progress>
52
+ </div>
53
+ `,
54
+ )}
55
+ ${when(
56
+ (x) => x.currentState === UploadState.UPLOADED,
57
+ html<DocumentUpload>`
58
+ <div class="dialog">
59
+ <span class="success-icon">${checkmarkBackground} ${checkmarkCircle} ${checkmark}</span>
60
+ <a class="drag-prompt">Document successfully uploaded</a>
61
+ </div>
62
+ `,
63
+ )}
64
+ ${when(
65
+ (x) => x.currentState === UploadState.ERROR,
66
+ html<DocumentUpload>`
67
+ <div class="dialog">
68
+ <span class="error-icon">${uploadIconLarge}</span>
69
+ <a class="drag-prompt">Error uploading file. Please try again.</a>
70
+ <a class="document-name">${(x) => x.fileName}</a>
71
+ <a class="document-size">${(x) => formatBytes(x.fileSize, 2)}</a>
72
+ <zero-progress
73
+ class="progress error-progress"
74
+ min="0"
75
+ max="100"
76
+ value="100"
77
+ ></zero-progress>
78
+ </div>
79
+ `,
80
+ )}
81
+ </div>
82
+ `;
@@ -0,0 +1,146 @@
1
+ import { DOM, FASTElement, customElement, observable } from '@microsoft/fast-element';
2
+ import { DocumentUploadTemplate } from './document-upload.template';
3
+ import { DocumentUploadStyles } from './document-upload.styles';
4
+ import { IDocumentService } from '../../../../services/document.service';
5
+ import { logger } from '../../../../utils';
6
+
7
+ export enum UploadState {
8
+ START = 'START',
9
+ ERROR = 'ERROR',
10
+ UPLOADING = 'UPLOADING',
11
+ UPLOADING_UPLOADED = 'UPLOADING_UPLOADED',
12
+ UPLOADED = 'UPLOADED',
13
+ }
14
+
15
+ @customElement({
16
+ name: 'document-upload',
17
+ template: DocumentUploadTemplate,
18
+ styles: DocumentUploadStyles,
19
+ })
20
+ export class DocumentUpload extends FASTElement {
21
+ @IDocumentService docService: IDocumentService;
22
+
23
+ @observable currentState: UploadState = UploadState.START;
24
+ @observable fileName: string;
25
+ @observable fileSize: number;
26
+ @observable fileUploadProgress: number = 0;
27
+
28
+ public dropArea: HTMLDivElement;
29
+ public fileSelect: HTMLInputElement;
30
+ public endpoint: string = '';
31
+
32
+ private readonly errorViewTime: number = 7000;
33
+ private readonly uploadingUploadedViewTime: number = 3000;
34
+ private readonly uploadedViewTime: number = 3000;
35
+
36
+ private file: any;
37
+
38
+ connectedCallback() {
39
+ super.connectedCallback();
40
+
41
+ DOM.queueUpdate(() => {
42
+ this.createFileUploadInput();
43
+
44
+ ['dragenter', 'dragover', 'dragleave', 'drop'].forEach((eventName) => {
45
+ this.dropArea.addEventListener(eventName, this.preventDefaults, false);
46
+ });
47
+ this.dropArea.addEventListener('drop', this.handleDrop.bind(this), false);
48
+ });
49
+ }
50
+
51
+ public fileClick() {
52
+ this.fileSelect.click();
53
+ }
54
+
55
+ private handleDrop(e) {
56
+ if (this.currentState === UploadState.START) {
57
+ const dt = e.dataTransfer;
58
+ const files = dt.files;
59
+ const contentTypes = [
60
+ 'text/csv',
61
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
62
+ 'application/pdf',
63
+ 'image/jpg',
64
+ 'image/png',
65
+ ];
66
+
67
+ const firstElement = 0;
68
+
69
+ if (files[firstElement] && contentTypes.includes(files[firstElement].type)) {
70
+ const file = files[firstElement];
71
+ this.updateSelectedFile(file);
72
+ }
73
+ }
74
+ }
75
+
76
+ private createFileUploadInput() {
77
+ this.fileSelect = document.createElement('input') as HTMLInputElement;
78
+ this.fileSelect.type = 'file';
79
+ this.fileSelect.accept =
80
+ 'application/pdf,image/jpg,image/png,.csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
81
+ this.fileSelect.onchange = (event) => {
82
+ logger.debug('file upload click');
83
+ this.fileSelected(event);
84
+ };
85
+ }
86
+
87
+ private fileSelected(event) {
88
+ // Only take the first file
89
+ const file = event.target.files[0];
90
+ this.updateSelectedFile(file);
91
+ }
92
+
93
+ private updateSelectedFile(file: any) {
94
+ this.file = file;
95
+ this.fileName = this.file.name;
96
+ this.fileSize = this.file.size;
97
+ this.fileSelect.value = '';
98
+ this.fileUploadProgress = 0;
99
+ this.uploadedFile();
100
+ }
101
+
102
+ private uploadedFile() {
103
+ this.currentState = UploadState.UPLOADING;
104
+ this.docService.uploadDocument(this.file).then((x) => {
105
+ if (!x.ERROR) {
106
+ this.fileUploadProgress = 100;
107
+ this.handleFinishUpload();
108
+ } else {
109
+ this.handleError(); // Add logging later
110
+ }
111
+ });
112
+ }
113
+
114
+ public cleanData() {
115
+ this.file = undefined;
116
+ this.fileName = undefined;
117
+ this.fileSize = undefined;
118
+ this.fileSelect.value = '';
119
+ this.fileUploadProgress = 0;
120
+ this.currentState = UploadState.START;
121
+ }
122
+
123
+ private preventDefaults(e) {
124
+ e.preventDefault();
125
+ e.stopPropagation();
126
+ }
127
+
128
+ private handleError() {
129
+ this.currentState = UploadState.ERROR;
130
+ setTimeout(() => {
131
+ this.currentState = UploadState.START;
132
+ }, this.errorViewTime);
133
+ }
134
+
135
+ private handleFinishUpload() {
136
+ this.currentState = UploadState.UPLOADING_UPLOADED;
137
+ setTimeout(() => {
138
+ if (this.currentState === UploadState.UPLOADING_UPLOADED) {
139
+ this.currentState = UploadState.UPLOADED;
140
+ setTimeout(() => {
141
+ this.cleanData();
142
+ }, this.uploadedViewTime);
143
+ }
144
+ }, this.uploadingUploadedViewTime);
145
+ }
146
+ }