import { menu, popMenu, popupTargetFromElement, } from '@blocksuite/affine-components/context-menu'; import type { InsertToPosition } from '@blocksuite/affine-shared/utils'; import { AddCursorIcon } from '@blocksuite/icons/lit'; import { signal } from '@preact/signals-core'; import type { TemplateResult } from 'lit'; import { repeat } from 'lit/directives/repeat.js'; import { styleMap } from 'lit/directives/style-map.js'; import { html } from 'lit/static-html.js'; import type { GroupTrait } from '../../../core/group-by/trait.js'; import { createUniComponentFromWebComponent, renderUniLit, } from '../../../core/index.js'; import { DataViewUIBase, DataViewUILogicBase, } from '../../../core/view/data-view-base.js'; import { LEFT_TOOL_BAR_WIDTH } from '../consts.js'; import type { TableViewSelectionWithType } from '../selection'; import type { TableSingleView } from '../table-view-manager.js'; import { mobileTableViewContainer, mobileTableViewWrapper, } from './table-view-style.js'; export class MobileTableViewUILogic extends DataViewUILogicBase< TableSingleView, TableViewSelectionWithType > { ui$ = signal(undefined); private get readonly() { return this.view.readonly$.value; } clearSelection = () => {}; addRow = (position: InsertToPosition) => { if (this.readonly) return; return this.view.rowAdd(position); }; focusFirstCell = () => {}; showIndicator = (_evt: MouseEvent) => { return false; }; hideIndicator = () => {}; moveTo = () => {}; renderAddGroup = (groupHelper: GroupTrait) => { const addGroup = groupHelper.addGroup; if (!addGroup) { return; } const add = (e: MouseEvent) => { const ele = e.currentTarget as HTMLElement; popMenu(popupTargetFromElement(ele), { options: { items: [ menu.input({ onComplete: text => { const column = groupHelper.property$.value; if (column) { column.dataUpdate(() => addGroup({ text, oldData: column.data$.value, dataSource: this.view.manager.dataSource, }) ); } }, }), ], }, }); }; return html`
${AddCursorIcon()}
New Group
`; }; renderer = createUniComponentFromWebComponent(MobileTableViewUI); } export class MobileTableViewUI extends DataViewUIBase { override connectedCallback(): void { super.connectedCallback(); this.logic.ui$.value = this; this.classList.add(mobileTableViewWrapper); } private renderTable() { const groups = this.logic.view.groupTrait.groupsDataList$.value; if (groups) { return html`
${repeat( groups, v => v.key, group => { return html` `; } )} ${this.logic.renderAddGroup(this.logic.view.groupTrait)}
`; } return html` `; } override render(): TemplateResult { const vPadding = this.logic.root.config.virtualPadding$.value; const wrapperStyle = styleMap({ marginLeft: `-${vPadding}px`, marginRight: `-${vPadding}px`, }); const containerStyle = styleMap({ paddingLeft: `${vPadding}px`, paddingRight: `${vPadding}px`, }); return html` ${renderUniLit(this.logic.root.config.headerWidget, { dataViewLogic: this.logic, })}
${this.renderTable()}
`; } } declare global { interface HTMLElementTagNameMap { 'mobile-data-view-table-ui': MobileTableViewUI; } }