@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.
- package/README.md +27 -0
- package/dist/dts/components/components.d.ts +4 -0
- package/dist/dts/components/components.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/component/document-grid/column-config.d.ts +83 -0
- package/dist/dts/components/foundation-document-manager/component/document-grid/column-config.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.d.ts +11 -0
- package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.styles.d.ts +3 -0
- package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.styles.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.template.d.ts +3 -0
- package/dist/dts/components/foundation-document-manager/component/document-grid/document-grid.template.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.d.ts +14 -0
- package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.styles.d.ts +3 -0
- package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.styles.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.template.d.ts +3 -0
- package/dist/dts/components/foundation-document-manager/component/document-tile/document-tile.template.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.d.ts +35 -0
- package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.styles.d.ts +3 -0
- package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.styles.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.template.d.ts +3 -0
- package/dist/dts/components/foundation-document-manager/component/document-upload/document-upload.template.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/document-manager.d.ts +45 -0
- package/dist/dts/components/foundation-document-manager/document-manager.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/document-manager.styles.d.ts +3 -0
- package/dist/dts/components/foundation-document-manager/document-manager.styles.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/document-manager.template.d.ts +3 -0
- package/dist/dts/components/foundation-document-manager/document-manager.template.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/index.d.ts +2 -0
- package/dist/dts/components/foundation-document-manager/index.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/utils/action-cell-renderer.d.ts +19 -0
- package/dist/dts/components/foundation-document-manager/utils/action-cell-renderer.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/utils/file-type-cell-renderer.d.ts +9 -0
- package/dist/dts/components/foundation-document-manager/utils/file-type-cell-renderer.d.ts.map +1 -0
- package/dist/dts/components/foundation-document-manager/utils/icons.d.ts +16 -0
- package/dist/dts/components/foundation-document-manager/utils/icons.d.ts.map +1 -0
- package/dist/dts/components/index.d.ts +2 -0
- package/dist/dts/components/index.d.ts.map +1 -0
- package/dist/dts/index.d.ts +3 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/dts/index.federated.d.ts +1 -0
- package/dist/dts/index.federated.d.ts.map +1 -0
- package/dist/dts/services/document.service.d.ts +8 -0
- package/dist/dts/services/document.service.d.ts.map +1 -0
- package/dist/dts/utils/dataserver.d.ts +2 -0
- package/dist/dts/utils/dataserver.d.ts.map +1 -0
- package/dist/dts/utils/endpoint.d.ts +2 -0
- package/dist/dts/utils/endpoint.d.ts.map +1 -0
- package/dist/dts/utils/formatting.d.ts +6 -0
- package/dist/dts/utils/formatting.d.ts.map +1 -0
- package/dist/dts/utils/index.d.ts +2 -0
- package/dist/dts/utils/index.d.ts.map +1 -0
- package/dist/dts/utils/logger.d.ts +2 -0
- package/dist/dts/utils/logger.d.ts.map +1 -0
- package/dist/dts/utils/types.d.ts +12 -0
- package/dist/dts/utils/types.d.ts.map +1 -0
- package/dist/esm/components/components.js +41 -0
- package/dist/esm/components/components.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/component/document-grid/column-config.js +107 -0
- package/dist/esm/components/foundation-document-manager/component/document-grid/column-config.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.js +42 -0
- package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.styles.js +10 -0
- package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.styles.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.template.js +10 -0
- package/dist/esm/components/foundation-document-manager/component/document-grid/document-grid.template.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.js +108 -0
- package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.styles.js +137 -0
- package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.styles.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.template.js +55 -0
- package/dist/esm/components/foundation-document-manager/component/document-tile/document-tile.template.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.js +143 -0
- package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.styles.js +157 -0
- package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.styles.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.template.js +61 -0
- package/dist/esm/components/foundation-document-manager/component/document-upload/document-upload.template.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/document-manager.js +130 -0
- package/dist/esm/components/foundation-document-manager/document-manager.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/document-manager.styles.js +245 -0
- package/dist/esm/components/foundation-document-manager/document-manager.styles.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/document-manager.template.js +93 -0
- package/dist/esm/components/foundation-document-manager/document-manager.template.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/index.js +2 -0
- package/dist/esm/components/foundation-document-manager/index.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/utils/action-cell-renderer.js +39 -0
- package/dist/esm/components/foundation-document-manager/utils/action-cell-renderer.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/utils/file-type-cell-renderer.js +26 -0
- package/dist/esm/components/foundation-document-manager/utils/file-type-cell-renderer.js.map +1 -0
- package/dist/esm/components/foundation-document-manager/utils/icons.js +238 -0
- package/dist/esm/components/foundation-document-manager/utils/icons.js.map +1 -0
- package/dist/esm/components/index.js +2 -0
- package/dist/esm/components/index.js.map +1 -0
- package/dist/esm/index.federated.js +2 -0
- package/dist/esm/index.federated.js.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/services/document.service.js +69 -0
- package/dist/esm/services/document.service.js.map +1 -0
- package/dist/esm/utils/dataserver.js +35 -0
- package/dist/esm/utils/dataserver.js.map +1 -0
- package/dist/esm/utils/endpoint.js +22 -0
- package/dist/esm/utils/endpoint.js.map +1 -0
- package/dist/esm/utils/formatting.js +49 -0
- package/dist/esm/utils/formatting.js.map +1 -0
- package/dist/esm/utils/index.js +2 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/logger.js +3 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/utils/types.js +2 -0
- package/dist/esm/utils/types.js.map +1 -0
- package/index.html +14 -0
- package/license.txt +46 -0
- package/package.json +132 -0
- package/src/components/components.ts +49 -0
- package/src/components/foundation-document-manager/component/document-grid/column-config.ts +108 -0
- package/src/components/foundation-document-manager/component/document-grid/document-grid.styles.ts +10 -0
- package/src/components/foundation-document-manager/component/document-grid/document-grid.template.ts +14 -0
- package/src/components/foundation-document-manager/component/document-grid/document-grid.ts +39 -0
- package/src/components/foundation-document-manager/component/document-tile/document-tile.styles.ts +137 -0
- package/src/components/foundation-document-manager/component/document-tile/document-tile.template.ts +71 -0
- package/src/components/foundation-document-manager/component/document-tile/document-tile.ts +119 -0
- package/src/components/foundation-document-manager/component/document-upload/document-upload.styles.ts +157 -0
- package/src/components/foundation-document-manager/component/document-upload/document-upload.template.ts +82 -0
- package/src/components/foundation-document-manager/component/document-upload/document-upload.ts +146 -0
- package/src/components/foundation-document-manager/document-manager.styles.ts +245 -0
- package/src/components/foundation-document-manager/document-manager.template.ts +111 -0
- package/src/components/foundation-document-manager/document-manager.ts +128 -0
- package/src/components/foundation-document-manager/index.ts +1 -0
- package/src/components/foundation-document-manager/utils/action-cell-renderer.ts +55 -0
- package/src/components/foundation-document-manager/utils/file-type-cell-renderer.ts +33 -0
- package/src/components/foundation-document-manager/utils/icons.ts +251 -0
- package/src/components/index.ts +1 -0
- package/src/index.federated.ts +1 -0
- package/src/index.ts +3 -0
- package/src/services/document.service.ts +83 -0
- package/src/utils/dataserver.ts +42 -0
- package/src/utils/endpoint.ts +19 -0
- package/src/utils/formatting.ts +59 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/logger.ts +2 -0
- package/src/utils/types.ts +11 -0
package/src/components/foundation-document-manager/component/document-tile/document-tile.template.ts
ADDED
|
@@ -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
|
+
`;
|
package/src/components/foundation-document-manager/component/document-upload/document-upload.ts
ADDED
|
@@ -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
|
+
}
|