mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-24 18:02:47 +08:00
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 -->
83 lines
2.0 KiB
TypeScript
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;
|
|
}
|
|
}
|