mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-20 19:46:32 +08:00
0f5778ac89
fix #13663 #### PR Dependency Tree * **PR #14984** 👈 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** * Calendar view for database blocks (month layout, entry cards, external-source support) * Workspace calendar integration and new slash-menu "Calendar View" * **Improvements** * Create/manage database rows from calendar UI; preserve durations when moving/resizing ranges * Drag-and-drop, drop-preview, and hit-testing support for calendar and docs * Redesigned in-menu View settings with multi-page navigation * Context-menu input autofocus toggle and conditional back-navigation * **Tests** * New unit and E2E suites covering calendar layout, interactions, sources, and slash-menu integration <!-- end of auto-generated comment: release notes by coderabbit.ai -->
114 lines
3.6 KiB
TypeScript
114 lines
3.6 KiB
TypeScript
import { getSelectedModelsCommand } from '@blocksuite/affine-shared/commands';
|
|
import { TelemetryProvider } from '@blocksuite/affine-shared/services';
|
|
import { isInsideBlockByFlavour } from '@blocksuite/affine-shared/utils';
|
|
import { type SlashMenuConfig } from '@blocksuite/affine-widget-slash-menu';
|
|
import { viewPresets } from '@blocksuite/data-view/view-presets';
|
|
import {
|
|
DatabaseKanbanViewIcon,
|
|
DatabaseTableViewIcon,
|
|
TodayIcon,
|
|
} from '@blocksuite/icons/lit';
|
|
|
|
import { insertDatabaseBlockCommand } from '../commands';
|
|
import { KanbanViewTooltip, TableViewTooltip } from './tooltips';
|
|
|
|
export const databaseSlashMenuConfig: SlashMenuConfig = {
|
|
disableWhen: ({ model }) => model.flavour === 'affine:database',
|
|
items: [
|
|
{
|
|
name: 'Table View',
|
|
description: 'Display items in a table format.',
|
|
searchAlias: ['database'],
|
|
icon: DatabaseTableViewIcon(),
|
|
tooltip: {
|
|
figure: TableViewTooltip,
|
|
caption: 'Table View',
|
|
},
|
|
group: '7_Database@0',
|
|
when: ({ model }) =>
|
|
!isInsideBlockByFlavour(model.store, model, 'affine:edgeless-text'),
|
|
action: ({ std }) => {
|
|
std.command
|
|
.chain()
|
|
.pipe(getSelectedModelsCommand)
|
|
.pipe(insertDatabaseBlockCommand, {
|
|
viewType: viewPresets.tableViewMeta.type,
|
|
place: 'after',
|
|
removeEmptyLine: true,
|
|
})
|
|
.pipe(({ insertedDatabaseBlockId }) => {
|
|
if (insertedDatabaseBlockId) {
|
|
const telemetry = std.getOptional(TelemetryProvider);
|
|
telemetry?.track('BlockCreated', {
|
|
blockType: 'affine:database',
|
|
});
|
|
}
|
|
})
|
|
.run();
|
|
},
|
|
},
|
|
|
|
{
|
|
name: 'Calendar View',
|
|
description: 'Display items by date in a calendar.',
|
|
searchAlias: ['database', 'calendar'],
|
|
icon: TodayIcon(),
|
|
group: '7_Database@1',
|
|
when: ({ model }) =>
|
|
!isInsideBlockByFlavour(model.store, model, 'affine:edgeless-text'),
|
|
action: ({ std }) => {
|
|
std.command
|
|
.chain()
|
|
.pipe(getSelectedModelsCommand)
|
|
.pipe(insertDatabaseBlockCommand, {
|
|
viewType: viewPresets.calendarViewMeta.type,
|
|
place: 'after',
|
|
removeEmptyLine: true,
|
|
})
|
|
.pipe(({ insertedDatabaseBlockId }) => {
|
|
if (insertedDatabaseBlockId) {
|
|
const telemetry = std.getOptional(TelemetryProvider);
|
|
telemetry?.track('BlockCreated', {
|
|
blockType: 'affine:database',
|
|
});
|
|
}
|
|
})
|
|
.run();
|
|
},
|
|
},
|
|
|
|
{
|
|
name: 'Kanban View',
|
|
description: 'Visualize data in a dashboard.',
|
|
searchAlias: ['database'],
|
|
icon: DatabaseKanbanViewIcon(),
|
|
tooltip: {
|
|
figure: KanbanViewTooltip,
|
|
caption: 'Kanban View',
|
|
},
|
|
group: '7_Database@2',
|
|
when: ({ model }) =>
|
|
!isInsideBlockByFlavour(model.store, model, 'affine:edgeless-text'),
|
|
action: ({ std }) => {
|
|
std.command
|
|
.chain()
|
|
.pipe(getSelectedModelsCommand)
|
|
.pipe(insertDatabaseBlockCommand, {
|
|
viewType: viewPresets.kanbanViewMeta.type,
|
|
place: 'after',
|
|
removeEmptyLine: true,
|
|
})
|
|
.pipe(({ insertedDatabaseBlockId }) => {
|
|
if (insertedDatabaseBlockId) {
|
|
const telemetry = std.getOptional(TelemetryProvider);
|
|
telemetry?.track('BlockCreated', {
|
|
blockType: 'affine:database',
|
|
});
|
|
}
|
|
})
|
|
.run();
|
|
},
|
|
},
|
|
],
|
|
};
|