import { deepFlat } from "@daybrush/utils"; import Selecto from "lit-selecto"; import Moveable, { MoveableTargetGroupsType } from "lit-moveable"; import { GroupManager, TargetList } from "@moveable/helper"; import { LitElement, html } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { ref, createRef } from "lit/directives/ref.js"; import { repeat } from "lit/directives/repeat.js"; @customElement("lit-app") export default class App extends LitElement { groupManager: GroupManager = new GroupManager([]); @state() targets: MoveableTargetGroupsType = []; moveableRef: Ref = createRef(null); selectoRef: Ref = createRef(null); cubes: any = []; constructor() { super(); this.groupManager = new GroupManager([]); for (let i = 0; i < 30; ++i) { this.cubes.push(i); } } render() { return html `
 
${repeat( this.cubes, i => i, i => html `
${i}
` )}
`; } firstUpdated() { const elements = this.selectoRef.value!.getSelectableElements(); this.groupManager.set([], elements); } setSelectedTargets(nextTargetes: MoveableTargetGroupsType) { this.selectoRef.value!.setSelectedTargets(deepFlat(nextTargetes)); this.targets = nextTargetes; } onClick() { const nextGroup = this.groupManager.group(this.targets, true); if (nextGroup) { this.targets = nextGroup; } } onClick$0() { const nextGroup = this.groupManager.ungroup(this.targets); if (nextGroup) { this.targets = nextGroup; } } onDrag(e) { e.target.style.transform = e.transform; } onRenderGroup(e) { e.events.forEach(ev => { ev.target.style.cssText += ev.cssText; }); } onClickGroup(e) { if (!e.moveableTarget) { this.setSelectedTargets([]); return; } if (e.isDouble) { const childs = this.groupManager.selectSubChilds( this.targets, e.moveableTarget ); this.setSelectedTargets(childs.targets()); return; } if (e.isTrusted) { this.selectoRef.value!.clickTarget( e.inputEvent, e.moveableTarget ); } } onDragStart(e) { const moveable = this.moveableRef.value!; const target = e.inputEvent.target; const flatted = deepFlat(this.targets); if (target.tagName === "BUTTON" || moveable.isMoveableElement(target) || flatted.some(t => t === target || t.contains(target)) ) { e.stop(); } e.data.startTargets = this.targets; } onSelect(e) { const { startAdded, startRemoved, isDragStartEnd } = e; if (isDragStartEnd) { return; } const nextChilds = this.groupManager.selectSameDepthChilds( e.data.startTargets, startAdded, startRemoved ); this.setSelectedTargets(nextChilds.targets()); } onSelectEnd(e) { const { isDragStartEnd, isClick, added, removed, inputEvent } = e; const moveable = this.moveableRef.value!; if (isDragStartEnd) { inputEvent.preventDefault(); moveable.waitToChangeTarget().then(() => { moveable.dragStart(inputEvent); }); } let nextChilds: TargetList; if (isDragStartEnd || isClick) { nextChilds = this.groupManager.selectCompletedChilds( e.data.startTargets, added, removed ); } else { nextChilds = this.groupManager.selectSameDepthChilds( e.data.startTargets, added, removed ); } e.currentTarget.setSelectedTargets(nextChilds.flatten()); this.setSelectedTargets(nextChilds.targets()); } }