1*cf78ab8cSAndroid Build Coastguard Workerimport {html, LitElement} from 'lit'; 2*cf78ab8cSAndroid Build Coastguard Workerimport {customElement, property} from 'lit/decorators.js'; 3*cf78ab8cSAndroid Build Coastguard Worker 4*cf78ab8cSAndroid Build Coastguard Workerimport {simulationState} from './device-observer.js'; 5*cf78ab8cSAndroid Build Coastguard Worker 6*cf78ab8cSAndroid Build Coastguard Worker@customElement('ns-device-dragzone') 7*cf78ab8cSAndroid Build Coastguard Workerexport class DeviceDragZone extends LitElement { 8*cf78ab8cSAndroid Build Coastguard Worker static dragged: EventTarget|null; 9*cf78ab8cSAndroid Build Coastguard Worker 10*cf78ab8cSAndroid Build Coastguard Worker @property({type: String, attribute: 'action'}) action = 'move'; 11*cf78ab8cSAndroid Build Coastguard Worker 12*cf78ab8cSAndroid Build Coastguard Worker constructor() { 13*cf78ab8cSAndroid Build Coastguard Worker super(); 14*cf78ab8cSAndroid Build Coastguard Worker this.addEventListener('dragstart', this.handleDragStart); 15*cf78ab8cSAndroid Build Coastguard Worker this.addEventListener('dragend', this.handleDragEnd); 16*cf78ab8cSAndroid Build Coastguard Worker this.addEventListener('click', this.handleSelect); 17*cf78ab8cSAndroid Build Coastguard Worker } 18*cf78ab8cSAndroid Build Coastguard Worker 19*cf78ab8cSAndroid Build Coastguard Worker connectedCallback() { 20*cf78ab8cSAndroid Build Coastguard Worker this.draggable = true; 21*cf78ab8cSAndroid Build Coastguard Worker } 22*cf78ab8cSAndroid Build Coastguard Worker 23*cf78ab8cSAndroid Build Coastguard Worker handleDragStart(ev: DragEvent) { 24*cf78ab8cSAndroid Build Coastguard Worker this.style.opacity = '0.4'; 25*cf78ab8cSAndroid Build Coastguard Worker if (ev.dataTransfer && ev.target) { 26*cf78ab8cSAndroid Build Coastguard Worker simulationState.patchSelected((ev.target as Element).id); 27*cf78ab8cSAndroid Build Coastguard Worker DeviceDragZone.dragged = ev.target; 28*cf78ab8cSAndroid Build Coastguard Worker // eslint-disable-next-line no-param-reassign 29*cf78ab8cSAndroid Build Coastguard Worker ev.dataTransfer.effectAllowed = this.action === 'move' ? 'move' : 'copy'; 30*cf78ab8cSAndroid Build Coastguard Worker } 31*cf78ab8cSAndroid Build Coastguard Worker } 32*cf78ab8cSAndroid Build Coastguard Worker 33*cf78ab8cSAndroid Build Coastguard Worker handleDragEnd() { 34*cf78ab8cSAndroid Build Coastguard Worker this.style.opacity = '1'; 35*cf78ab8cSAndroid Build Coastguard Worker DeviceDragZone.dragged = null; 36*cf78ab8cSAndroid Build Coastguard Worker } 37*cf78ab8cSAndroid Build Coastguard Worker 38*cf78ab8cSAndroid Build Coastguard Worker // Allow the information panel to figure what has been selected. 39*cf78ab8cSAndroid Build Coastguard Worker handleSelect(ev: Event) { 40*cf78ab8cSAndroid Build Coastguard Worker this.style.opacity = '1'; 41*cf78ab8cSAndroid Build Coastguard Worker if (ev.target) { 42*cf78ab8cSAndroid Build Coastguard Worker simulationState.patchSelected((ev.target as Element).id); 43*cf78ab8cSAndroid Build Coastguard Worker // We can add a feature for visually showing a selected object (i.e. 44*cf78ab8cSAndroid Build Coastguard Worker // bolded borders) 45*cf78ab8cSAndroid Build Coastguard Worker } 46*cf78ab8cSAndroid Build Coastguard Worker } 47*cf78ab8cSAndroid Build Coastguard Worker 48*cf78ab8cSAndroid Build Coastguard Worker render() { 49*cf78ab8cSAndroid Build Coastguard Worker return html` <slot></slot> `; 50*cf78ab8cSAndroid Build Coastguard Worker } 51*cf78ab8cSAndroid Build Coastguard Worker} 52