import { menu, type MenuConfig, type MenuOptions, popMenu, type PopupTarget, } from '@blocksuite/affine-components/context-menu'; import { SignalWatcher, WithDisposable } from '@blocksuite/global/lit'; import { DeleteIcon } from '@blocksuite/icons/lit'; import { ShadowlessElement } from '@blocksuite/std'; import { computed } from '@preact/signals-core'; import { css, html, unsafeCSS } from 'lit'; import { property, query } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; import { KanbanSingleView } from '../../view-presets/kanban/kanban-view-manager.js'; import { TableSingleView } from '../../view-presets/table/table-view-manager.js'; import { dataViewCssVariable } from '../common/css-variable.js'; import { renderUniLit } from '../utils/uni-component/uni-component.js'; import { dragHandler } from '../utils/wc-dnd/dnd-context.js'; import { defaultActivators } from '../utils/wc-dnd/sensors/index.js'; import { createSortContext, sortable, } from '../utils/wc-dnd/sort/sort-context.js'; import { verticalListSortingStrategy } from '../utils/wc-dnd/sort/strategies/index.js'; import { getGroupByService } from './matcher.js'; import type { GroupTrait } from './trait.js'; import type { GroupRenderProps } from './types.js'; export class GroupSetting extends SignalWatcher( WithDisposable(ShadowlessElement) ) { static override styles = css` data-view-group-setting { display: flex; flex-direction: column; gap: 4px; ${unsafeCSS(dataViewCssVariable())}; } .group-item { display: flex; padding: 4px 12px; position: relative; cursor: grab; } .group-item-drag-bar { width: 4px; height: 12px; border-radius: 1px; background-color: #efeff0; position: absolute; left: 4px; top: 0; bottom: 0; margin: auto; } .group-item:hover .group-item-drag-bar { background-color: #c0bfc1; } `; @property({ attribute: false }) accessor groupTrait!: GroupTrait; groups$ = computed(() => { return this.groupTrait.groupsDataList$.value; }); sortContext = createSortContext({ activators: defaultActivators, container: this, onDragEnd: evt => { const over = evt.over; const activeId = evt.active.id; const groups = this.groups$.value; if (over && over.id !== activeId && groups) { const activeIndex = groups.findIndex(data => data?.key === activeId); const overIndex = groups.findIndex(data => data?.key === over.id); this.groupTrait.moveGroupTo( activeId, activeIndex > overIndex ? { before: true, id: over.id, } : { before: false, id: over.id, } ); } }, modifiers: [ ({ transform }) => { return { ...transform, x: 0, }; }, ], items: computed(() => { return ( this.groupTrait.groupsDataList$.value?.map( v => v?.key ?? 'default key' ) ?? [] ); }), strategy: verticalListSortingStrategy, }); override connectedCallback() { super.connectedCallback(); this._disposables.addFromEvent(this, 'pointerdown', e => { e.stopPropagation(); }); } protected override render(): unknown { const groups = this.groupTrait.groupsDataList$.value; if (!groups) { return; } return html`