diff --git a/blocksuite/affine/blocks/database/src/data-source.ts b/blocksuite/affine/blocks/database/src/data-source.ts index 3301d3819..fa06298d4 100644 --- a/blocksuite/affine/blocks/database/src/data-source.ts +++ b/blocksuite/affine/blocks/database/src/data-source.ts @@ -164,8 +164,10 @@ export class DatabaseBlockDataSource extends DataSourceBase { readonly$: ReadonlySignal = computed(() => { return ( this._model.store.readonly || - // TODO(@L-Sun): use block level readonly - IS_MOBILE + (IS_MOBILE && + !this._model.store.provider + .get(FeatureFlagService) + .getFlag('enable_mobile_database_editing')) ); }); diff --git a/blocksuite/affine/blocks/database/src/database-block.ts b/blocksuite/affine/blocks/database/src/database-block.ts index dce944c1f..45c763d80 100644 --- a/blocksuite/affine/blocks/database/src/database-block.ts +++ b/blocksuite/affine/blocks/database/src/database-block.ts @@ -13,6 +13,7 @@ import { BlockElementCommentManager, CommentProviderIdentifier, DocModeProvider, + FeatureFlagService, NotificationProvider, type TelemetryEventMap, TelemetryProvider, @@ -34,6 +35,7 @@ import { uniMap, } from '@blocksuite/data-view'; import { widgetPresets } from '@blocksuite/data-view/widget-presets'; +import { IS_MOBILE } from '@blocksuite/global/env'; import { Rect } from '@blocksuite/global/gfx'; import { CommentIcon, @@ -48,6 +50,7 @@ import { autoUpdate } from '@floating-ui/dom'; import { computed, signal } from '@preact/signals-core'; import { html, nothing } from 'lit'; import { repeat } from 'lit/directives/repeat.js'; +import { styleMap } from 'lit/directives/style-map.js'; import { popSideDetail } from './components/layout.js'; import { DatabaseConfigExtension } from './config.js'; @@ -349,6 +352,7 @@ export class DatabaseBlockComponent extends CaptionedBlockComponent { + if ( + !this.std + .get(FeatureFlagService) + .getFlag('enable_mobile_database_editing') + ) { + const notification = this.std.getOptional(NotificationProvider); + if (notification) { + notification.notify({ + title: html`
+ Mobile database editing is not supported yet. You can open it in + experimental features, or edit it in desktop mode. +
`, + accent: 'warning', + }); + } + this.removeEventListener('click', handler); + } + }; + + this.addEventListener('click', handler); + this.disposables.add(() => { + this.removeEventListener('click', handler); + }); + } + private readonly dataViewRootLogic = lazy( () => new DataViewRootUILogic({ diff --git a/blocksuite/affine/data-view/src/core/view/data-view-base.ts b/blocksuite/affine/data-view/src/core/view/data-view-base.ts index 04490f1e5..2d784db65 100644 --- a/blocksuite/affine/data-view/src/core/view/data-view-base.ts +++ b/blocksuite/affine/data-view/src/core/view/data-view-base.ts @@ -65,7 +65,7 @@ export abstract class DataViewUILogicBase< return handler(context); }); } - setSelection(selection?: Selection): void { + setSelection(selection?: Selection) { this.root.setSelection(selection); } diff --git a/blocksuite/affine/data-view/src/view-presets/kanban/mobile/cell.ts b/blocksuite/affine/data-view/src/view-presets/kanban/mobile/cell.ts index 97c845f2c..189a97b05 100644 --- a/blocksuite/affine/data-view/src/view-presets/kanban/mobile/cell.ts +++ b/blocksuite/affine/data-view/src/view-presets/kanban/mobile/cell.ts @@ -73,7 +73,9 @@ export class MobileKanbanCell extends SignalWatcher( if (this.view.readonly$.value) { return; } - const setSelection = this.kanbanViewLogic.setSelection; + const setSelection = this.kanbanViewLogic.setSelection.bind( + this.kanbanViewLogic + ); const viewId = this.kanbanViewLogic.view.id; if (setSelection && viewId) { if (editing && this.cell?.beforeEnterEditMode() === false) { diff --git a/blocksuite/affine/data-view/src/view-presets/kanban/mobile/kanban-view-ui-logic.ts b/blocksuite/affine/data-view/src/view-presets/kanban/mobile/kanban-view-ui-logic.ts index faa70c0bf..48aa745f2 100644 --- a/blocksuite/affine/data-view/src/view-presets/kanban/mobile/kanban-view-ui-logic.ts +++ b/blocksuite/affine/data-view/src/view-presets/kanban/mobile/kanban-view-ui-logic.ts @@ -86,6 +86,9 @@ export class MobileKanbanViewUILogic extends DataViewUILogicBase< } renderAddGroup = () => { + if (this.readonly) { + return; + } const addGroup = this.groupManager.addGroup; if (!addGroup) { return; diff --git a/blocksuite/affine/data-view/src/view-presets/table/mobile/cell.ts b/blocksuite/affine/data-view/src/view-presets/table/mobile/cell.ts index c7a5dbf8c..3cf3a5ded 100644 --- a/blocksuite/affine/data-view/src/view-presets/table/mobile/cell.ts +++ b/blocksuite/affine/data-view/src/view-presets/table/mobile/cell.ts @@ -68,7 +68,9 @@ export class MobileTableCell extends SignalWatcher( if (this.view.readonly$.value) { return; } - const setSelection = this.tableViewLogic.setSelection; + const setSelection = this.tableViewLogic.setSelection.bind( + this.tableViewLogic + ); const viewId = this.tableViewLogic.view.id; if (setSelection && viewId) { if (editing && this.cell?.beforeEnterEditMode() === false) { diff --git a/blocksuite/affine/data-view/src/view-presets/table/mobile/table-view-style.ts b/blocksuite/affine/data-view/src/view-presets/table/mobile/table-view-style.ts index 5aa84e1d7..d419bd494 100644 --- a/blocksuite/affine/data-view/src/view-presets/table/mobile/table-view-style.ts +++ b/blocksuite/affine/data-view/src/view-presets/table/mobile/table-view-style.ts @@ -1,3 +1,4 @@ +import { IS_IOS } from '@blocksuite/global/env'; import { css } from '@emotion/css'; import { cssVarV2 } from '@toeverything/theme/v2'; @@ -10,7 +11,7 @@ export const mobileTableViewWrapper = css({ * See https://github.com/toeverything/AFFiNE/pull/12203 * and https://github.com/toeverything/blocksuite/pull/8784 */ - overflowX: 'hidden', + overflowX: IS_IOS ? 'hidden' : undefined, overflowY: 'hidden', }); diff --git a/blocksuite/affine/data-view/src/widget-presets/quick-setting-bar/filter/list-view.ts b/blocksuite/affine/data-view/src/widget-presets/quick-setting-bar/filter/list-view.ts index 85dbd9524..fe96628e1 100644 --- a/blocksuite/affine/data-view/src/widget-presets/quick-setting-bar/filter/list-view.ts +++ b/blocksuite/affine/data-view/src/widget-presets/quick-setting-bar/filter/list-view.ts @@ -88,6 +88,9 @@ export class FilterBar extends SignalWatcher(ShadowlessElement) { }; private readonly addFilter = (e: MouseEvent) => { + if (this.dataViewLogic.root.config.dataSource.readonly$.peek()) { + return; + } const element = popupTargetFromElement(e.target as HTMLElement); popCreateFilter(element, { vars: this.vars, diff --git a/blocksuite/affine/shared/src/services/feature-flag-service.ts b/blocksuite/affine/shared/src/services/feature-flag-service.ts index bdbf5c55b..d31050d16 100644 --- a/blocksuite/affine/shared/src/services/feature-flag-service.ts +++ b/blocksuite/affine/shared/src/services/feature-flag-service.ts @@ -15,6 +15,7 @@ export interface BlockSuiteFlags { enable_shape_shadow_blur: boolean; enable_mobile_keyboard_toolbar: boolean; enable_mobile_linked_doc_menu: boolean; + enable_mobile_database_editing: boolean; enable_block_meta: boolean; enable_callout: boolean; enable_edgeless_scribbled_style: boolean; @@ -41,6 +42,7 @@ export class FeatureFlagService extends StoreExtension { enable_mobile_keyboard_toolbar: false, enable_mobile_linked_doc_menu: false, enable_block_meta: true, + enable_mobile_database_editing: false, enable_callout: false, enable_edgeless_scribbled_style: false, enable_table_virtual_scroll: false, diff --git a/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-tool-panel.ts b/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-tool-panel.ts index dc5df01d2..a485f527a 100644 --- a/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-tool-panel.ts +++ b/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-tool-panel.ts @@ -4,7 +4,7 @@ import { requiredProperties, ShadowlessElement, } from '@blocksuite/std'; -import { html, nothing, type PropertyValues } from 'lit'; +import { html, nothing } from 'lit'; import { property } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; @@ -80,18 +80,9 @@ export class AffineKeyboardToolPanel extends SignalWatcher( `; } - protected override willUpdate(changedProperties: PropertyValues) { - if (changedProperties.has('height')) { - this.style.height = this.height; - } - } - @property({ attribute: false }) accessor config: KeyboardToolPanelConfig | null = null; @property({ attribute: false }) accessor context!: KeyboardToolbarContext; - - @property({ attribute: false }) - accessor height = ''; } diff --git a/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts b/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts index 19a7e2855..06720f88c 100644 --- a/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts +++ b/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts @@ -377,7 +377,10 @@ export class AffineKeyboardToolbar extends SignalWatcher( `; } diff --git a/packages/frontend/component/src/ui/notification/mobile/styles.css.ts b/packages/frontend/component/src/ui/notification/mobile/styles.css.ts index 0242690ea..cdc866cfe 100644 --- a/packages/frontend/component/src/ui/notification/mobile/styles.css.ts +++ b/packages/frontend/component/src/ui/notification/mobile/styles.css.ts @@ -26,7 +26,7 @@ globalStyle(`${sonner} li[data-sonner-toast]`, { export const toastRoot = style({ width: 'fit-content', - height: 44, + minHeight: 44, borderRadius: 22, margin: '0px auto', padding: 10, diff --git a/packages/frontend/core/src/modules/feature-flag/constant.ts b/packages/frontend/core/src/modules/feature-flag/constant.ts index 04ea7e1b8..598f08aa2 100644 --- a/packages/frontend/core/src/modules/feature-flag/constant.ts +++ b/packages/frontend/core/src/modules/feature-flag/constant.ts @@ -288,6 +288,14 @@ export const AFFINE_FLAGS = { configurable: isCanaryBuild, defaultState: false, }, + enable_mobile_database_editing: { + category: 'blocksuite', + bsFlag: 'enable_mobile_database_editing', + displayName: 'Enable Mobile Database Editing', + description: 'Enable mobile database editing', + configurable: isMobile, + defaultState: false, + }, } satisfies { [key in string]: FlagInfo }; // oxlint-disable-next-line no-redeclare