Files
AFFiNE-Mirror/blocksuite/affine/data-view/src/view-presets/kanban/pc/header.ts
DarkSky 8192a492d9 feat: improve kanban grouping & data materialization (#14393)
fix #13512 
fix #13255
fix #9743 

#### PR Dependency Tree


* **PR #14393** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Enhanced Kanban view grouping support for additional property types:
checkboxes, select fields, multi-select fields, members, and created-by
information.
* Improved drag-and-drop visual feedback with more precise drop
indicators in Kanban views.

* **Bug Fixes**
* Refined grouping logic to ensure only compatible properties appear in
group-by options.
* Enhanced column visibility and ordering consistency when managing
Kanban views.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-02-08 03:48:12 +08:00

83 lines
2.0 KiB
TypeScript

import {
menu,
popMenu,
popupTargetFromElement,
} from '@blocksuite/affine-components/context-menu';
import { SignalWatcher, WithDisposable } from '@blocksuite/global/lit';
import { ShadowlessElement } from '@blocksuite/std';
import { css } from 'lit';
import { property } from 'lit/decorators.js';
import { html } from 'lit/static-html.js';
import { groupTraitKey } from '../../../core/group-by/trait.js';
import type { SingleView } from '../../../core/index.js';
import { canGroupable } from '../group-by-utils.js';
const styles = css`
affine-data-view-kanban-header {
display: flex;
justify-content: space-between;
padding: 4px;
}
.select-group {
border-radius: 8px;
padding: 4px 8px;
cursor: pointer;
}
.select-group:hover {
background-color: var(--affine-hover-color);
}
`;
export class KanbanHeader extends SignalWatcher(
WithDisposable(ShadowlessElement)
) {
static override styles = styles;
private readonly clickGroup = (e: MouseEvent) => {
const groupTrait = this.view.traitGet(groupTraitKey);
if (!groupTrait) {
return;
}
popMenu(popupTargetFromElement(e.target as HTMLElement), {
options: {
items: this.view.properties$.value
.filter(column => {
if (column.id === groupTrait.property$.value?.id) {
return false;
}
return canGroupable(this.view.manager.dataSource, column.id);
})
.map(column => {
return menu.action({
name: column.name$.value,
select: () => {
groupTrait.changeGroup(column.id);
},
});
}),
},
});
};
override render() {
return html`
<div></div>
<div>
<div class="select-group" @click="${this.clickGroup}">Group</div>
</div>
`;
}
@property({ attribute: false })
accessor view!: SingleView;
}
declare global {
interface HTMLElementTagNameMap {
'affine-data-view-kanban-header': KanbanHeader;
}
}