125 lines
3.0 KiB
TypeScript
125 lines
3.0 KiB
TypeScript
import {
|
|
customElement,
|
|
DeesElement,
|
|
TemplateResult,
|
|
property,
|
|
html,
|
|
css,
|
|
unsafeCSS,
|
|
cssManager,
|
|
} from '@designestate/dees-element';
|
|
|
|
declare global {
|
|
interface HTMLElementTagNameMap {
|
|
'dees-input-fileupload': DeesInputFileupload;
|
|
}
|
|
}
|
|
|
|
@customElement('dees-input-fileupload')
|
|
export class DeesInputFileupload extends DeesElement {
|
|
public static demo = () => html`<dees-input-fileupload></dees-input-fileupload>`;
|
|
|
|
@property({
|
|
type: String,
|
|
})
|
|
public label: string = null;
|
|
|
|
@property({
|
|
type: String,
|
|
})
|
|
public key: string;
|
|
|
|
@property({
|
|
attribute: false,
|
|
})
|
|
public value: File[] = [];
|
|
|
|
@property()
|
|
public state: 'idle' | 'dragOver' | 'dropped' | 'uploading' | 'completed' = 'idle';
|
|
|
|
public static styles = [
|
|
cssManager.defaultStyles,
|
|
css`
|
|
:host {
|
|
position: relative;
|
|
display: grid;
|
|
margin: 10px 0px;
|
|
margin-bottom: 24px;
|
|
}
|
|
|
|
.maincontainer {
|
|
color: ${cssManager.bdTheme('#333', '#ccc')};
|
|
}
|
|
|
|
.label {
|
|
font-size: 14px;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.uploadButton {
|
|
position: relative;
|
|
cursor: pointer;
|
|
padding: 20px 20px;
|
|
max-width: 200px;
|
|
background: ${cssManager.bdTheme('#fafafa', '#333333')};
|
|
border-radius: 3px;
|
|
text-align: center;
|
|
}
|
|
.uploadButton::after {
|
|
top: 7px;
|
|
right: 7px;
|
|
left: 7px;
|
|
bottom: 7px;
|
|
transform: scale3d(0.9, 0.9, 1);
|
|
position: absolute;
|
|
content: '';
|
|
display: block;
|
|
border: 4px dashed rgba(255, 255, 255, 0);
|
|
transition: all 0.2s;
|
|
}
|
|
.uploadButton.dragOver::after {
|
|
transform: scale3d(1, 1, 1);
|
|
border: 4px dashed rgba(255, 255, 255, 0.3);
|
|
}
|
|
`,
|
|
];
|
|
|
|
public render(): TemplateResult {
|
|
return html`
|
|
<div class="maincontainer">
|
|
${this.label ? html`<div class="label">${this.label}</div>` : null}
|
|
<div class="uploadButton ${this.state === 'dragOver' ? 'dragOver' : ''}">Upload File! (Drag/Drop enabled)</div>
|
|
</div>
|
|
`;
|
|
}
|
|
|
|
public async updateValue(eventArg: Event) {
|
|
const target: any = eventArg.target;
|
|
this.value = target.value;
|
|
}
|
|
|
|
public firstUpdated() {
|
|
const dropArea = this.shadowRoot.querySelector('.uploadButton');
|
|
const handlerFunction = (eventArg: DragEvent) => {
|
|
eventArg.preventDefault();
|
|
switch(eventArg.type) {
|
|
case 'dragover':
|
|
this.state = 'dragOver';
|
|
break;
|
|
case 'dragleave':
|
|
this.state = 'idle';
|
|
break;
|
|
}
|
|
console.log(eventArg);
|
|
for (const file of Array.from(eventArg.dataTransfer.files)) {
|
|
this.value.push(file);
|
|
};
|
|
console.log(`Got ${this.value.length} files!`);
|
|
};
|
|
dropArea.addEventListener('dragenter', handlerFunction, false);
|
|
dropArea.addEventListener('dragleave', handlerFunction, false);
|
|
dropArea.addEventListener('dragover', handlerFunction, false);
|
|
dropArea.addEventListener('drop', handlerFunction, false);
|
|
}
|
|
}
|