chore(core): remove template doc feature flag (#10252)

This commit is contained in:
L-Sun
2025-02-18 09:25:06 +00:00
parent e639f08b71
commit 4e546c78ef
11 changed files with 14 additions and 85 deletions

View File

@@ -1,5 +1,5 @@
import { AIChatBlockSpec } from '@affine/core/blocksuite/presets/blocks/ai-chat-block'; import { AIChatBlockSpec } from '@affine/core/blocksuite/presets/blocks/ai-chat-block';
import { PeekViewService } from '@affine/core/modules/peek-view'; import { PeekViewService } from '@affine/core/modules/peek-view/services/peek-view';
import { AppThemeService } from '@affine/core/modules/theme'; import { AppThemeService } from '@affine/core/modules/theme';
import { import {
type BlockStdScope, type BlockStdScope,

View File

@@ -66,9 +66,6 @@ const StarterBarNotEmpty = ({ doc }: { doc: Store }) => {
) )
); );
const enableAI = useLiveData(featureFlagService.flags.enable_ai.$); const enableAI = useLiveData(featureFlagService.flags.enable_ai.$);
const enableTemplateDoc = useLiveData(
featureFlagService.flags.enable_template_doc.$
);
const handleSelectTemplate = useAsyncCallback( const handleSelectTemplate = useAsyncCallback(
async (templateId: string) => { async (templateId: string) => {
@@ -109,7 +106,7 @@ const StarterBarNotEmpty = ({ doc }: { doc: Store }) => {
} }
}, [editorService.editor]); }, [editorService.editor]);
const showTemplate = !isTemplate && enableTemplateDoc; const showTemplate = !isTemplate;
if (!enableAI && !showTemplate) { if (!enableAI && !showTemplate) {
return null; return null;

View File

@@ -15,7 +15,6 @@ import type {
DatabaseRow, DatabaseRow,
DatabaseValueCell, DatabaseValueCell,
} from '@affine/core/modules/doc-info/types'; } from '@affine/core/modules/doc-info/types';
import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import { GuardService } from '@affine/core/modules/permissions'; import { GuardService } from '@affine/core/modules/permissions';
import { ViewService, WorkbenchService } from '@affine/core/modules/workbench'; import { ViewService, WorkbenchService } from '@affine/core/modules/workbench';
import type { AffineDNDData } from '@affine/core/types/dnd'; import type { AffineDNDData } from '@affine/core/types/dnd';
@@ -132,13 +131,10 @@ export const DocPropertyRow = ({
const t = useI18n(); const t = useI18n();
const docService = useService(DocService); const docService = useService(DocService);
const docsService = useService(DocsService); const docsService = useService(DocsService);
const featureFlagService = useService(FeatureFlagService);
const customPropertyValue = useLiveData( const customPropertyValue = useLiveData(
docService.doc.customProperty$(propertyInfo.id) docService.doc.customProperty$(propertyInfo.id)
); );
const enableTemplateDoc = useLiveData(
featureFlagService.flags.enable_template_doc.$
);
const typeInfo = isSupportedDocPropertyType(propertyInfo.type) const typeInfo = isSupportedDocPropertyType(propertyInfo.type)
? DocPropertyTypes[propertyInfo.type] ? DocPropertyTypes[propertyInfo.type]
: undefined; : undefined;
@@ -215,9 +211,6 @@ export const DocPropertyRow = ({
); );
if (!ValueRenderer || typeof ValueRenderer !== 'function') return null; if (!ValueRenderer || typeof ValueRenderer !== 'function') return null;
if (propertyInfo.id === 'template' && !enableTemplateDoc) {
return null;
}
return ( return (
<PropertyRoot <PropertyRoot

View File

@@ -1,21 +1,18 @@
import { Menu, MenuItem, MenuSeparator } from '@affine/component'; import { Menu, MenuItem, MenuSeparator } from '@affine/component';
import { MenuItem as SidebarMenuItem } from '@affine/core/modules/app-sidebar/views'; import { MenuItem as SidebarMenuItem } from '@affine/core/modules/app-sidebar/views';
import { DocsService } from '@affine/core/modules/doc'; import { DocsService } from '@affine/core/modules/doc';
import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import { TemplateListMenuContentScrollable } from '@affine/core/modules/template-doc/view/template-list-menu'; import { TemplateListMenuContentScrollable } from '@affine/core/modules/template-doc/view/template-list-menu';
import { WorkbenchService } from '@affine/core/modules/workbench'; import { WorkbenchService } from '@affine/core/modules/workbench';
import { inferOpenMode } from '@affine/core/utils'; import { inferOpenMode } from '@affine/core/utils';
import { useI18n } from '@affine/i18n'; import { useI18n } from '@affine/i18n';
import track from '@affine/track'; import track from '@affine/track';
import { TemplateIcon } from '@blocksuite/icons/rc'; import { TemplateIcon } from '@blocksuite/icons/rc';
import { useLiveData, useService } from '@toeverything/infra'; import { useService } from '@toeverything/infra';
import { useCallback, useState } from 'react'; import { useCallback, useState } from 'react';
export const TemplateDocEntrance = () => { export const TemplateDocEntrance = () => {
const t = useI18n(); const t = useI18n();
const [menuOpen, setMenuOpen] = useState(false); const [menuOpen, setMenuOpen] = useState(false);
const featureFlagService = useService(FeatureFlagService);
const enabled = useLiveData(featureFlagService.flags.enable_template_doc.$);
const toggleMenu = useCallback(() => { const toggleMenu = useCallback(() => {
setMenuOpen(prev => !prev); setMenuOpen(prev => !prev);
@@ -26,10 +23,6 @@ export const TemplateDocEntrance = () => {
setMenuOpen(open); setMenuOpen(open);
}, []); }, []);
if (!enabled) {
return null;
}
return ( return (
<SidebarMenuItem <SidebarMenuItem
data-testid="sidebar-template-doc-entrance" data-testid="sidebar-template-doc-entrance"

View File

@@ -10,25 +10,18 @@ import {
} from '@affine/component/setting-components'; } from '@affine/component/setting-components';
import { DocsService } from '@affine/core/modules/doc'; import { DocsService } from '@affine/core/modules/doc';
import { DocDisplayMetaService } from '@affine/core/modules/doc-display-meta'; import { DocDisplayMetaService } from '@affine/core/modules/doc-display-meta';
import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import { TemplateDocService } from '@affine/core/modules/template-doc'; import { TemplateDocService } from '@affine/core/modules/template-doc';
import { TemplateListMenu } from '@affine/core/modules/template-doc/view/template-list-menu'; import { TemplateListMenu } from '@affine/core/modules/template-doc/view/template-list-menu';
import { useI18n } from '@affine/i18n'; import { useI18n } from '@affine/i18n';
import { DeleteIcon } from '@blocksuite/icons/rc'; import { DeleteIcon } from '@blocksuite/icons/rc';
import { useLiveData, useService, useServices } from '@toeverything/infra'; import { useLiveData, useService } from '@toeverything/infra';
import { useCallback } from 'react'; import { useCallback } from 'react';
import * as styles from './template.css'; import * as styles from './template.css';
export const TemplateDocSetting = () => { export const TemplateDocSetting = () => {
const t = useI18n(); const t = useI18n();
const { featureFlagService, templateDocService } = useServices({ const setting = useService(TemplateDocService).setting;
FeatureFlagService,
TemplateDocService,
});
const setting = templateDocService.setting;
const enabled = useLiveData(featureFlagService.flags.enable_template_doc.$);
const enablePageTemplate = useLiveData(setting.enablePageTemplate$); const enablePageTemplate = useLiveData(setting.enablePageTemplate$);
const pageTemplateDocId = useLiveData(setting.pageTemplateDocId$); const pageTemplateDocId = useLiveData(setting.pageTemplateDocId$);
@@ -55,8 +48,6 @@ export const TemplateDocSetting = () => {
[setting] [setting]
); );
if (!enabled) return null;
return ( return (
<SettingWrapper title={t['com.affine.settings.workspace.template.title']()}> <SettingWrapper title={t['com.affine.settings.workspace.template.title']()}>
<SettingRow <SettingRow

View File

@@ -1,5 +1,4 @@
import { Button, IconButton, Menu } from '@affine/component'; import { Button, IconButton, Menu } from '@affine/component';
import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import { GlobalStateService } from '@affine/core/modules/storage'; import { GlobalStateService } from '@affine/core/modules/storage';
import { TemplateDocService } from '@affine/core/modules/template-doc'; import { TemplateDocService } from '@affine/core/modules/template-doc';
import { TemplateListMenuContentScrollable } from '@affine/core/modules/template-doc/view/template-list-menu'; import { TemplateListMenuContentScrollable } from '@affine/core/modules/template-doc/view/template-list-menu';
@@ -19,11 +18,7 @@ let animationPlayed = false;
export const JournalTemplateOnboarding = () => { export const JournalTemplateOnboarding = () => {
const containerRef = useRef<HTMLDivElement>(null); const containerRef = useRef<HTMLDivElement>(null);
const globalState = useService(GlobalStateService).globalState; const globalState = useService(GlobalStateService).globalState;
const featureFlagService = useService(FeatureFlagService);
const templateDocService = useService(TemplateDocService); const templateDocService = useService(TemplateDocService);
const enableTemplate = useLiveData(
featureFlagService.flags.enable_template_doc.$
);
const t = useI18n(); const t = useI18n();
const dismissed = useLiveData( const dismissed = useLiveData(
@@ -65,7 +60,7 @@ export const JournalTemplateOnboarding = () => {
[templateDocService.setting] [templateDocService.setting]
); );
if (dismissed || !enableTemplate) return null; if (dismissed) return null;
return ( return (
<div <div

View File

@@ -1,7 +1,6 @@
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils'; import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks'; import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks';
import { DocsService } from '@affine/core/modules/doc'; import { DocsService } from '@affine/core/modules/doc';
import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import { TemplateDocService } from '@affine/core/modules/template-doc'; import { TemplateDocService } from '@affine/core/modules/template-doc';
import { WorkbenchService } from '@affine/core/modules/workbench'; import { WorkbenchService } from '@affine/core/modules/workbench';
import { WorkspaceService } from '@affine/core/modules/workspace'; import { WorkspaceService } from '@affine/core/modules/workspace';
@@ -15,15 +14,11 @@ import { TabItem } from './tab-item';
export const AppTabCreate = ({ tab }: AppTabCustomFCProps) => { export const AppTabCreate = ({ tab }: AppTabCustomFCProps) => {
const workbench = useService(WorkbenchService).workbench; const workbench = useService(WorkbenchService).workbench;
const workspaceService = useService(WorkspaceService); const workspaceService = useService(WorkspaceService);
const featureFlagService = useService(FeatureFlagService);
const templateDocService = useService(TemplateDocService); const templateDocService = useService(TemplateDocService);
const docsService = useService(DocsService); const docsService = useService(DocsService);
const currentWorkspace = workspaceService.workspace; const currentWorkspace = workspaceService.workspace;
const pageHelper = usePageHelper(currentWorkspace.docCollection); const pageHelper = usePageHelper(currentWorkspace.docCollection);
const enableTemplateDoc = useLiveData(
featureFlagService.flags.enable_template_doc.$
);
const enablePageTemplate = useLiveData( const enablePageTemplate = useLiveData(
templateDocService.setting.enablePageTemplate$ templateDocService.setting.enablePageTemplate$
); );
@@ -34,7 +29,7 @@ export const AppTabCreate = ({ tab }: AppTabCustomFCProps) => {
const createPage = useAsyncCallback( const createPage = useAsyncCallback(
async (isActive: boolean) => { async (isActive: boolean) => {
if (isActive) return; if (isActive) return;
if (enableTemplateDoc && enablePageTemplate && pageTemplateDocId) { if (enablePageTemplate && pageTemplateDocId) {
const docId = const docId =
await docsService.duplicateFromTemplate(pageTemplateDocId); await docsService.duplicateFromTemplate(pageTemplateDocId);
workbench.openDoc({ docId, fromTab: 'true' }); workbench.openDoc({ docId, fromTab: 'true' });
@@ -44,14 +39,7 @@ export const AppTabCreate = ({ tab }: AppTabCustomFCProps) => {
} }
track.$.navigationPanel.$.createDoc(); track.$.navigationPanel.$.createDoc();
}, },
[ [docsService, enablePageTemplate, pageHelper, pageTemplateDocId, workbench]
docsService,
enablePageTemplate,
enableTemplateDoc,
pageHelper,
pageTemplateDocId,
workbench,
]
); );
return ( return (

View File

@@ -3,7 +3,6 @@ import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-pa
import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks'; import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks';
import { DocsService } from '@affine/core/modules/doc'; import { DocsService } from '@affine/core/modules/doc';
import { EditorSettingService } from '@affine/core/modules/editor-setting'; import { EditorSettingService } from '@affine/core/modules/editor-setting';
import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import { TemplateDocService } from '@affine/core/modules/template-doc'; import { TemplateDocService } from '@affine/core/modules/template-doc';
import { TemplateListMenuContentScrollable } from '@affine/core/modules/template-doc/view/template-list-menu'; import { TemplateListMenuContentScrollable } from '@affine/core/modules/template-doc/view/template-list-menu';
import { WorkbenchService } from '@affine/core/modules/workbench'; import { WorkbenchService } from '@affine/core/modules/workbench';
@@ -30,16 +29,11 @@ import * as styles from './index.css';
* @return a function to create a new doc, will duplicate the template doc if the page template is enabled * @return a function to create a new doc, will duplicate the template doc if the page template is enabled
*/ */
const useNewDoc = () => { const useNewDoc = () => {
const featureFlagService = useService(FeatureFlagService);
const workspaceService = useService(WorkspaceService); const workspaceService = useService(WorkspaceService);
const templateDocService = useService(TemplateDocService); const templateDocService = useService(TemplateDocService);
const docsService = useService(DocsService); const docsService = useService(DocsService);
const workbench = useService(WorkbenchService).workbench; const workbench = useService(WorkbenchService).workbench;
const enableTemplateDoc = useLiveData(
featureFlagService.flags.enable_template_doc.$
);
const currentWorkspace = workspaceService.workspace; const currentWorkspace = workspaceService.workspace;
const enablePageTemplate = useLiveData( const enablePageTemplate = useLiveData(
templateDocService.setting.enablePageTemplate$ templateDocService.setting.enablePageTemplate$
@@ -52,7 +46,7 @@ const useNewDoc = () => {
const createPage = useAsyncCallback( const createPage = useAsyncCallback(
async (e?: MouseEvent, mode?: DocMode) => { async (e?: MouseEvent, mode?: DocMode) => {
if (enableTemplateDoc && enablePageTemplate && pageTemplateDocId) { if (enablePageTemplate && pageTemplateDocId) {
const docId = const docId =
await docsService.duplicateFromTemplate(pageTemplateDocId); await docsService.duplicateFromTemplate(pageTemplateDocId);
workbench.openDoc(docId, { at: inferOpenMode(e) }); workbench.openDoc(docId, { at: inferOpenMode(e) });
@@ -60,14 +54,7 @@ const useNewDoc = () => {
pageHelper.createPage(mode, { at: inferOpenMode(e) }); pageHelper.createPage(mode, { at: inferOpenMode(e) });
} }
}, },
[ [docsService, enablePageTemplate, pageHelper, pageTemplateDocId, workbench]
docsService,
enablePageTemplate,
enableTemplateDoc,
pageHelper,
pageTemplateDocId,
workbench,
]
); );
return createPage; return createPage;

View File

@@ -222,15 +222,6 @@ export const AFFINE_FLAGS = {
configurable: !isMobile, configurable: !isMobile,
defaultState: false, defaultState: false,
}, },
// TODO(@CatsJuice): remove this flag when ready
enable_template_doc: {
category: 'affine',
displayName: 'Enable template doc',
description:
'Allow users to mark a doc as a template, and create new docs from it',
configurable: true,
defaultState: isCanaryBuild,
},
enable_editor_rtl: { enable_editor_rtl: {
category: 'affine', category: 'affine',
displayName: displayName:

View File

@@ -2,7 +2,6 @@ import { type Framework } from '@toeverything/infra';
import { DocScope, DocService, DocsService } from '../doc'; import { DocScope, DocService, DocsService } from '../doc';
import { EditorSettingService } from '../editor-setting'; import { EditorSettingService } from '../editor-setting';
import { FeatureFlagService } from '../feature-flag';
import { TemplateDocService } from '../template-doc'; import { TemplateDocService } from '../template-doc';
import { WorkspaceScope } from '../workspace'; import { WorkspaceScope } from '../workspace';
import { JournalService } from './services/journal'; import { JournalService } from './services/journal';
@@ -25,7 +24,6 @@ export function configureJournalModule(framework: Framework) {
DocsService, DocsService,
EditorSettingService, EditorSettingService,
TemplateDocService, TemplateDocService,
FeatureFlagService,
]) ])
.store(JournalStore, [DocsService]) .store(JournalStore, [DocsService])
.scope(DocScope) .scope(DocScope)

View File

@@ -8,7 +8,6 @@ import {
} from '../../../blocksuite/initialization'; } from '../../../blocksuite/initialization';
import type { DocsService } from '../../doc'; import type { DocsService } from '../../doc';
import type { EditorSettingService } from '../../editor-setting'; import type { EditorSettingService } from '../../editor-setting';
import type { FeatureFlagService } from '../../feature-flag';
import type { TemplateDocService } from '../../template-doc'; import type { TemplateDocService } from '../../template-doc';
import type { JournalStore } from '../store/journal'; import type { JournalStore } from '../store/journal';
@@ -21,8 +20,7 @@ export class JournalService extends Service {
private readonly store: JournalStore, private readonly store: JournalStore,
private readonly docsService: DocsService, private readonly docsService: DocsService,
private readonly editorSettingService: EditorSettingService, private readonly editorSettingService: EditorSettingService,
private readonly templateDocService: TemplateDocService, private readonly templateDocService: TemplateDocService
private readonly featureFlagService: FeatureFlagService
) { ) {
super(); super();
} }
@@ -66,8 +64,6 @@ export class JournalService extends Service {
.getTime(), .getTime(),
}); });
const enableTemplateDoc =
this.featureFlagService.flags.enable_template_doc.value;
const enablePageTemplate = const enablePageTemplate =
this.templateDocService.setting.enablePageTemplate$.value; this.templateDocService.setting.enablePageTemplate$.value;
const pageTemplateDocId = const pageTemplateDocId =
@@ -75,13 +71,13 @@ export class JournalService extends Service {
const journalTemplateDocId = const journalTemplateDocId =
this.templateDocService.setting.journalTemplateDocId$.value; this.templateDocService.setting.journalTemplateDocId$.value;
// if journal template configured // if journal template configured
if (enableTemplateDoc && journalTemplateDocId) { if (journalTemplateDocId) {
this.docsService this.docsService
.duplicateFromTemplate(journalTemplateDocId, docRecord.id) .duplicateFromTemplate(journalTemplateDocId, docRecord.id)
.catch(console.error); .catch(console.error);
} }
// journal template not configured, use page template // journal template not configured, use page template
else if (enableTemplateDoc && enablePageTemplate && pageTemplateDocId) { else if (enablePageTemplate && pageTemplateDocId) {
this.docsService this.docsService
.duplicateFromTemplate(pageTemplateDocId, docRecord.id) .duplicateFromTemplate(pageTemplateDocId, docRecord.id)
.catch(console.error); .catch(console.error);