feat(core): add new doc default mode setting (#7990)
https://github.com/user-attachments/assets/523b14f3-ee42-4061-8ca2-221e071d5cc9
This commit is contained in:
@@ -32,7 +32,7 @@ export function registerAffineCreationCommands({
|
|||||||
run() {
|
run() {
|
||||||
track.$.cmdk.creation.createDoc({ mode: 'page' });
|
track.$.cmdk.creation.createDoc({ mode: 'page' });
|
||||||
|
|
||||||
pageHelper.createPage();
|
pageHelper.createPage('page');
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ import {
|
|||||||
useCallback,
|
useCallback,
|
||||||
useEffect,
|
useEffect,
|
||||||
useMemo,
|
useMemo,
|
||||||
useState,
|
|
||||||
} from 'react';
|
} from 'react';
|
||||||
import { Virtuoso } from 'react-virtuoso';
|
import { Virtuoso } from 'react-virtuoso';
|
||||||
|
|
||||||
@@ -275,7 +274,8 @@ const CustomFontFamilySettings = () => {
|
|||||||
};
|
};
|
||||||
const NewDocDefaultModeSettings = () => {
|
const NewDocDefaultModeSettings = () => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const [value, setValue] = useState<DocMode>('page');
|
const { editorSettingService } = useServices({ EditorSettingService });
|
||||||
|
const settings = useLiveData(editorSettingService.editorSetting.settings$);
|
||||||
const radioItems = useMemo<RadioItem[]>(
|
const radioItems = useMemo<RadioItem[]>(
|
||||||
() => [
|
() => [
|
||||||
{
|
{
|
||||||
@@ -291,13 +291,19 @@ const NewDocDefaultModeSettings = () => {
|
|||||||
],
|
],
|
||||||
[t]
|
[t]
|
||||||
);
|
);
|
||||||
|
const updateNewDocDefaultMode = useCallback(
|
||||||
|
(value: DocMode) => {
|
||||||
|
editorSettingService.editorSetting.set('newDocDefaultMode', value);
|
||||||
|
},
|
||||||
|
[editorSettingService.editorSetting]
|
||||||
|
);
|
||||||
return (
|
return (
|
||||||
<RadioGroup
|
<RadioGroup
|
||||||
items={radioItems}
|
items={radioItems}
|
||||||
value={value}
|
value={settings.newDocDefaultMode}
|
||||||
width={250}
|
width={250}
|
||||||
className={styles.settingWrapper}
|
className={styles.settingWrapper}
|
||||||
onChange={setValue}
|
onChange={updateNewDocDefaultMode}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,29 +1,42 @@
|
|||||||
import { toast } from '@affine/component';
|
import { toast } from '@affine/component';
|
||||||
import { useDocCollectionHelper } from '@affine/core/hooks/use-block-suite-workspace-helper';
|
import { useDocCollectionHelper } from '@affine/core/hooks/use-block-suite-workspace-helper';
|
||||||
|
import { EditorSettingService } from '@affine/core/modules/editor-settting';
|
||||||
import { WorkbenchService } from '@affine/core/modules/workbench';
|
import { WorkbenchService } from '@affine/core/modules/workbench';
|
||||||
import { DocsService, initEmptyPage, useService } from '@toeverything/infra';
|
import {
|
||||||
|
type DocMode,
|
||||||
|
DocsService,
|
||||||
|
initEmptyPage,
|
||||||
|
useLiveData,
|
||||||
|
useServices,
|
||||||
|
} from '@toeverything/infra';
|
||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
|
|
||||||
import type { DocCollection } from '../../../shared';
|
import type { DocCollection } from '../../../shared';
|
||||||
|
|
||||||
export const usePageHelper = (docCollection: DocCollection) => {
|
export const usePageHelper = (docCollection: DocCollection) => {
|
||||||
const workbench = useService(WorkbenchService).workbench;
|
const { docsService, workbenchService, editorSettingService } = useServices({
|
||||||
|
DocsService,
|
||||||
|
WorkbenchService,
|
||||||
|
EditorSettingService,
|
||||||
|
});
|
||||||
|
const workbench = workbenchService.workbench;
|
||||||
const { createDoc } = useDocCollectionHelper(docCollection);
|
const { createDoc } = useDocCollectionHelper(docCollection);
|
||||||
const docsService = useService(DocsService);
|
|
||||||
const docRecordList = docsService.list;
|
const docRecordList = docsService.list;
|
||||||
|
const settings = useLiveData(editorSettingService.editorSetting.settings$);
|
||||||
|
|
||||||
const createPageAndOpen = useCallback(
|
const createPageAndOpen = useCallback(
|
||||||
(mode?: 'page' | 'edgeless', open?: boolean | 'new-tab') => {
|
(mode?: DocMode, open?: boolean | 'new-tab') => {
|
||||||
const page = createDoc();
|
const page = createDoc();
|
||||||
initEmptyPage(page);
|
initEmptyPage(page);
|
||||||
docRecordList.doc$(page.id).value?.setPrimaryMode(mode || 'page');
|
const primaryMode = mode || settings.newDocDefaultMode;
|
||||||
|
docRecordList.doc$(page.id).value?.setPrimaryMode(primaryMode);
|
||||||
if (open !== false)
|
if (open !== false)
|
||||||
workbench.openDoc(page.id, {
|
workbench.openDoc(page.id, {
|
||||||
at: open === 'new-tab' ? 'new-tab' : 'active',
|
at: open === 'new-tab' ? 'new-tab' : 'active',
|
||||||
});
|
});
|
||||||
return page;
|
return page;
|
||||||
},
|
},
|
||||||
[createDoc, docRecordList, workbench]
|
[createDoc, docRecordList, settings.newDocDefaultMode, workbench]
|
||||||
);
|
);
|
||||||
|
|
||||||
const createEdgelessAndOpen = useCallback(
|
const createEdgelessAndOpen = useCallback(
|
||||||
@@ -77,8 +90,8 @@ export const usePageHelper = (docCollection: DocCollection) => {
|
|||||||
|
|
||||||
return useMemo(() => {
|
return useMemo(() => {
|
||||||
return {
|
return {
|
||||||
createPage: (open?: boolean | 'new-tab') =>
|
createPage: (mode?: DocMode, open?: boolean | 'new-tab') =>
|
||||||
createPageAndOpen('page', open),
|
createPageAndOpen(mode, open),
|
||||||
createEdgeless: createEdgelessAndOpen,
|
createEdgeless: createEdgelessAndOpen,
|
||||||
importFile: importFileAndOpen,
|
importFile: importFileAndOpen,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { useCallback, useState } from 'react';
|
|||||||
import { menuContent } from './new-page-button.css';
|
import { menuContent } from './new-page-button.css';
|
||||||
|
|
||||||
type NewPageButtonProps = {
|
type NewPageButtonProps = {
|
||||||
|
createNewDoc: (e?: MouseEvent) => void;
|
||||||
createNewPage: (e?: MouseEvent) => void;
|
createNewPage: (e?: MouseEvent) => void;
|
||||||
createNewEdgeless: (e?: MouseEvent) => void;
|
createNewEdgeless: (e?: MouseEvent) => void;
|
||||||
importFile?: () => void;
|
importFile?: () => void;
|
||||||
@@ -61,6 +62,7 @@ export const CreateNewPagePopup = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const NewPageButton = ({
|
export const NewPageButton = ({
|
||||||
|
createNewDoc,
|
||||||
createNewPage,
|
createNewPage,
|
||||||
createNewEdgeless,
|
createNewEdgeless,
|
||||||
importFile,
|
importFile,
|
||||||
@@ -69,11 +71,20 @@ export const NewPageButton = ({
|
|||||||
}: PropsWithChildren<NewPageButtonProps>) => {
|
}: PropsWithChildren<NewPageButtonProps>) => {
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
|
|
||||||
|
const handleCreateNewDoc: NewPageButtonProps['createNewDoc'] = useCallback(
|
||||||
|
e => {
|
||||||
|
createNewDoc(e);
|
||||||
|
setOpen(false);
|
||||||
|
track.allDocs.header.actions.createDoc();
|
||||||
|
},
|
||||||
|
[createNewDoc]
|
||||||
|
);
|
||||||
|
|
||||||
const handleCreateNewPage: NewPageButtonProps['createNewPage'] = useCallback(
|
const handleCreateNewPage: NewPageButtonProps['createNewPage'] = useCallback(
|
||||||
e => {
|
e => {
|
||||||
createNewPage(e);
|
createNewPage(e);
|
||||||
setOpen(false);
|
setOpen(false);
|
||||||
track.allDocs.header.actions.createDoc();
|
track.allDocs.header.actions.createDoc({ mode: 'page' });
|
||||||
},
|
},
|
||||||
[createNewPage]
|
[createNewPage]
|
||||||
);
|
);
|
||||||
@@ -99,6 +110,7 @@ export const NewPageButton = ({
|
|||||||
<Menu
|
<Menu
|
||||||
items={
|
items={
|
||||||
<CreateNewPagePopup
|
<CreateNewPagePopup
|
||||||
|
createNewDoc={handleCreateNewDoc}
|
||||||
createNewPage={handleCreateNewPage}
|
createNewPage={handleCreateNewPage}
|
||||||
createNewEdgeless={handleCreateNewEdgeless}
|
createNewEdgeless={handleCreateNewEdgeless}
|
||||||
importFile={importFile ? handleImportFile : undefined}
|
importFile={importFile ? handleImportFile : undefined}
|
||||||
@@ -118,7 +130,7 @@ export const NewPageButton = ({
|
|||||||
>
|
>
|
||||||
<DropdownButton
|
<DropdownButton
|
||||||
size={size}
|
size={size}
|
||||||
onClick={handleCreateNewPage}
|
onClick={handleCreateNewDoc}
|
||||||
onAuxClick={handleCreateNewPage}
|
onAuxClick={handleCreateNewPage}
|
||||||
onClickDropDown={useCallback(() => setOpen(open => !open), [])}
|
onClickDropDown={useCallback(() => setOpen(open => !open), [])}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -19,7 +19,12 @@ import {
|
|||||||
ViewLayersIcon,
|
ViewLayersIcon,
|
||||||
} from '@blocksuite/icons/rc';
|
} from '@blocksuite/icons/rc';
|
||||||
import type { Doc as BlockSuiteDoc } from '@blocksuite/store';
|
import type { Doc as BlockSuiteDoc } from '@blocksuite/store';
|
||||||
import { useLiveData, useService, WorkspaceService } from '@toeverything/infra';
|
import {
|
||||||
|
useLiveData,
|
||||||
|
useService,
|
||||||
|
useServices,
|
||||||
|
WorkspaceService,
|
||||||
|
} from '@toeverything/infra';
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import { nanoid } from 'nanoid';
|
import { nanoid } from 'nanoid';
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
import { useCallback, useMemo, useState } from 'react';
|
||||||
@@ -38,7 +43,11 @@ import { PageListNewPageButton } from './page-list-new-page-button';
|
|||||||
|
|
||||||
export const PageListHeader = () => {
|
export const PageListHeader = () => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const workspace = useService(WorkspaceService).workspace;
|
const { workspaceService } = useServices({
|
||||||
|
WorkspaceService,
|
||||||
|
});
|
||||||
|
|
||||||
|
const workspace = workspaceService.workspace;
|
||||||
const { importFile, createEdgeless, createPage } = usePageHelper(
|
const { importFile, createEdgeless, createPage } = usePageHelper(
|
||||||
workspace.docCollection
|
workspace.docCollection
|
||||||
);
|
);
|
||||||
@@ -69,7 +78,12 @@ export const PageListHeader = () => {
|
|||||||
onCreateEdgeless={e =>
|
onCreateEdgeless={e =>
|
||||||
createEdgeless(isNewTabTrigger(e) ? 'new-tab' : true)
|
createEdgeless(isNewTabTrigger(e) ? 'new-tab' : true)
|
||||||
}
|
}
|
||||||
onCreatePage={e => createPage(isNewTabTrigger(e) ? 'new-tab' : true)}
|
onCreatePage={e =>
|
||||||
|
createPage('page', isNewTabTrigger(e) ? 'new-tab' : true)
|
||||||
|
}
|
||||||
|
onCreateDoc={e =>
|
||||||
|
createPage(undefined, isNewTabTrigger(e) ? 'new-tab' : true)
|
||||||
|
}
|
||||||
onImportFile={onImportFile}
|
onImportFile={onImportFile}
|
||||||
>
|
>
|
||||||
<div className={styles.buttonText}>{t['New Page']()}</div>
|
<div className={styles.buttonText}>{t['New Page']()}</div>
|
||||||
@@ -86,12 +100,15 @@ export const CollectionPageListHeader = ({
|
|||||||
}) => {
|
}) => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const { jumpToCollections } = useNavigateHelper();
|
const { jumpToCollections } = useNavigateHelper();
|
||||||
|
const { collectionService, workspaceService } = useServices({
|
||||||
|
CollectionService,
|
||||||
|
WorkspaceService,
|
||||||
|
});
|
||||||
|
|
||||||
const handleJumpToCollections = useCallback(() => {
|
const handleJumpToCollections = useCallback(() => {
|
||||||
jumpToCollections(workspaceId);
|
jumpToCollections(workspaceId);
|
||||||
}, [jumpToCollections, workspaceId]);
|
}, [jumpToCollections, workspaceId]);
|
||||||
|
|
||||||
const collectionService = useService(CollectionService);
|
|
||||||
const { node, open } = useEditCollection();
|
const { node, open } = useEditCollection();
|
||||||
|
|
||||||
const handleEdit = useAsyncCallback(async () => {
|
const handleEdit = useAsyncCallback(async () => {
|
||||||
@@ -99,7 +116,7 @@ export const CollectionPageListHeader = ({
|
|||||||
collectionService.updateCollection(collection.id, () => ret);
|
collectionService.updateCollection(collection.id, () => ret);
|
||||||
}, [collection, collectionService, open]);
|
}, [collection, collectionService, open]);
|
||||||
|
|
||||||
const workspace = useService(WorkspaceService).workspace;
|
const workspace = workspaceService.workspace;
|
||||||
const { createEdgeless, createPage } = usePageHelper(workspace.docCollection);
|
const { createEdgeless, createPage } = usePageHelper(workspace.docCollection);
|
||||||
const { openConfirmModal } = useConfirmModal();
|
const { openConfirmModal } = useConfirmModal();
|
||||||
|
|
||||||
@@ -127,14 +144,18 @@ export const CollectionPageListHeader = ({
|
|||||||
[openConfirmModal, t, createAndAddDocument]
|
[openConfirmModal, t, createAndAddDocument]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const createPageModeDoc = useCallback(() => createPage('page'), [createPage]);
|
||||||
|
|
||||||
const onCreateEdgeless = useCallback(
|
const onCreateEdgeless = useCallback(
|
||||||
() => onConfirmAddDocument(createEdgeless),
|
() => onConfirmAddDocument(createEdgeless),
|
||||||
[createEdgeless, onConfirmAddDocument]
|
[createEdgeless, onConfirmAddDocument]
|
||||||
);
|
);
|
||||||
const onCreatePage = useCallback(
|
const onCreatePage = useCallback(() => {
|
||||||
() => onConfirmAddDocument(createPage),
|
onConfirmAddDocument(createPageModeDoc);
|
||||||
[createPage, onConfirmAddDocument]
|
}, [createPageModeDoc, onConfirmAddDocument]);
|
||||||
);
|
const onCreateDoc = useCallback(() => {
|
||||||
|
onConfirmAddDocument(createPage);
|
||||||
|
}, [createPage, onConfirmAddDocument]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -154,6 +175,7 @@ export const CollectionPageListHeader = ({
|
|||||||
<PageListNewPageButton
|
<PageListNewPageButton
|
||||||
size="small"
|
size="small"
|
||||||
testId="new-page-button-trigger"
|
testId="new-page-button-trigger"
|
||||||
|
onCreateDoc={onCreateDoc}
|
||||||
onCreateEdgeless={onCreateEdgeless}
|
onCreateEdgeless={onCreateEdgeless}
|
||||||
onCreatePage={onCreatePage}
|
onCreatePage={onCreatePage}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ export const PageListNewPageButton = ({
|
|||||||
children,
|
children,
|
||||||
size,
|
size,
|
||||||
testId,
|
testId,
|
||||||
|
onCreateDoc,
|
||||||
onCreatePage,
|
onCreatePage,
|
||||||
onCreateEdgeless,
|
onCreateEdgeless,
|
||||||
onImportFile,
|
onImportFile,
|
||||||
@@ -15,6 +16,7 @@ export const PageListNewPageButton = ({
|
|||||||
className?: string;
|
className?: string;
|
||||||
size?: 'small' | 'default';
|
size?: 'small' | 'default';
|
||||||
testId?: string;
|
testId?: string;
|
||||||
|
onCreateDoc: (e?: MouseEvent) => void;
|
||||||
onCreatePage: (e?: MouseEvent) => void;
|
onCreatePage: (e?: MouseEvent) => void;
|
||||||
onCreateEdgeless: (e?: MouseEvent) => void;
|
onCreateEdgeless: (e?: MouseEvent) => void;
|
||||||
onImportFile?: (e?: MouseEvent) => void;
|
onImportFile?: (e?: MouseEvent) => void;
|
||||||
@@ -24,6 +26,7 @@ export const PageListNewPageButton = ({
|
|||||||
<NewPageButton
|
<NewPageButton
|
||||||
size={size}
|
size={size}
|
||||||
importFile={onImportFile}
|
importFile={onImportFile}
|
||||||
|
createNewDoc={onCreateDoc}
|
||||||
createNewEdgeless={onCreateEdgeless}
|
createNewEdgeless={onCreateEdgeless}
|
||||||
createNewPage={onCreatePage}
|
createNewPage={onCreatePage}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import type { DocMeta } from '@blocksuite/store';
|
|||||||
import {
|
import {
|
||||||
FeatureFlagService,
|
FeatureFlagService,
|
||||||
useLiveData,
|
useLiveData,
|
||||||
useService,
|
|
||||||
useServices,
|
useServices,
|
||||||
WorkspaceService,
|
WorkspaceService,
|
||||||
} from '@toeverything/infra';
|
} from '@toeverything/infra';
|
||||||
@@ -305,9 +304,12 @@ export const CollectionOperationCell = ({
|
|||||||
info,
|
info,
|
||||||
}: CollectionOperationCellProps) => {
|
}: CollectionOperationCellProps) => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
|
const { compatibleFavoriteItemsAdapter: favAdapter, workspaceService } =
|
||||||
const favAdapter = useService(CompatibleFavoriteItemsAdapter);
|
useServices({
|
||||||
const docCollection = useService(WorkspaceService).workspace.docCollection;
|
CompatibleFavoriteItemsAdapter,
|
||||||
|
WorkspaceService,
|
||||||
|
});
|
||||||
|
const docCollection = workspaceService.workspace.docCollection;
|
||||||
const { createPage } = usePageHelper(docCollection);
|
const { createPage } = usePageHelper(docCollection);
|
||||||
const { openConfirmModal } = useConfirmModal();
|
const { openConfirmModal } = useConfirmModal();
|
||||||
const favourite = useLiveData(
|
const favourite = useLiveData(
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { openSettingModalAtom } from '@affine/core/atoms';
|
import { openSettingModalAtom } from '@affine/core/atoms';
|
||||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||||
import { track } from '@affine/core/mixpanel';
|
import { track } from '@affine/core/mixpanel';
|
||||||
|
import { EditorSettingService } from '@affine/core/modules/editor-settting';
|
||||||
import {
|
import {
|
||||||
ExplorerCollections,
|
ExplorerCollections,
|
||||||
ExplorerFavorites,
|
ExplorerFavorites,
|
||||||
@@ -20,7 +21,11 @@ import {
|
|||||||
} from '@blocksuite/icons/rc';
|
} from '@blocksuite/icons/rc';
|
||||||
import type { Doc } from '@blocksuite/store';
|
import type { Doc } from '@blocksuite/store';
|
||||||
import type { Workspace } from '@toeverything/infra';
|
import type { Workspace } from '@toeverything/infra';
|
||||||
import { useLiveData, useService, WorkspaceService } from '@toeverything/infra';
|
import {
|
||||||
|
useLiveData,
|
||||||
|
useServices,
|
||||||
|
WorkspaceService,
|
||||||
|
} from '@toeverything/infra';
|
||||||
import { useSetAtom } from 'jotai';
|
import { useSetAtom } from 'jotai';
|
||||||
import type { MouseEvent, ReactElement } from 'react';
|
import type { MouseEvent, ReactElement } from 'react';
|
||||||
import { useCallback, useEffect } from 'react';
|
import { useCallback, useEffect } from 'react';
|
||||||
@@ -73,30 +78,45 @@ export type RootAppSidebarProps = {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export const RootAppSidebar = (): ReactElement => {
|
export const RootAppSidebar = (): ReactElement => {
|
||||||
const currentWorkspace = useService(WorkspaceService).workspace;
|
const {
|
||||||
|
workbenchService,
|
||||||
|
workspaceService,
|
||||||
|
cMDKQuickSearchService,
|
||||||
|
editorSettingService,
|
||||||
|
} = useServices({
|
||||||
|
WorkspaceService,
|
||||||
|
WorkbenchService,
|
||||||
|
CMDKQuickSearchService,
|
||||||
|
EditorSettingService,
|
||||||
|
});
|
||||||
|
const currentWorkspace = workspaceService.workspace;
|
||||||
const { appSettings } = useAppSettingHelper();
|
const { appSettings } = useAppSettingHelper();
|
||||||
const docCollection = currentWorkspace.docCollection;
|
const docCollection = currentWorkspace.docCollection;
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const workbench = useService(WorkbenchService).workbench;
|
const workbench = workbenchService.workbench;
|
||||||
const currentPath = useLiveData(
|
const currentPath = useLiveData(
|
||||||
workbench.location$.map(location => location.pathname)
|
workbench.location$.map(location => location.pathname)
|
||||||
);
|
);
|
||||||
const cmdkQuickSearchService = useService(CMDKQuickSearchService);
|
|
||||||
const onOpenQuickSearchModal = useCallback(() => {
|
const onOpenQuickSearchModal = useCallback(() => {
|
||||||
cmdkQuickSearchService.toggle();
|
cMDKQuickSearchService.toggle();
|
||||||
}, [cmdkQuickSearchService]);
|
}, [cMDKQuickSearchService]);
|
||||||
|
|
||||||
const allPageActive = currentPath === '/all';
|
const allPageActive = currentPath === '/all';
|
||||||
|
|
||||||
const pageHelper = usePageHelper(currentWorkspace.docCollection);
|
const pageHelper = usePageHelper(currentWorkspace.docCollection);
|
||||||
|
|
||||||
|
const settings = useLiveData(editorSettingService.editorSetting.settings$);
|
||||||
|
|
||||||
const onClickNewPage = useAsyncCallback(
|
const onClickNewPage = useAsyncCallback(
|
||||||
async (e?: MouseEvent) => {
|
async (e?: MouseEvent) => {
|
||||||
const page = pageHelper.createPage(isNewTabTrigger(e) ? 'new-tab' : true);
|
const page = pageHelper.createPage(
|
||||||
|
settings.newDocDefaultMode,
|
||||||
|
isNewTabTrigger(e) ? 'new-tab' : true
|
||||||
|
);
|
||||||
page.load();
|
page.load();
|
||||||
track.$.navigationPanel.$.createDoc();
|
track.$.navigationPanel.$.createDoc({ mode: settings.newDocDefaultMode });
|
||||||
},
|
},
|
||||||
[pageHelper]
|
[pageHelper, settings.newDocDefaultMode]
|
||||||
);
|
);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (environment.isDesktop) {
|
if (environment.isDesktop) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
MenuSeparator,
|
MenuSeparator,
|
||||||
useConfirmModal,
|
useConfirmModal,
|
||||||
} from '@affine/component';
|
} from '@affine/component';
|
||||||
|
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
|
||||||
import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
|
import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
|
||||||
import { useDeleteCollectionInfo } from '@affine/core/hooks/affine/use-delete-collection-info';
|
import { useDeleteCollectionInfo } from '@affine/core/hooks/affine/use-delete-collection-info';
|
||||||
import { track } from '@affine/core/mixpanel';
|
import { track } from '@affine/core/mixpanel';
|
||||||
@@ -19,10 +20,10 @@ import {
|
|||||||
SplitViewIcon,
|
SplitViewIcon,
|
||||||
} from '@blocksuite/icons/rc';
|
} from '@blocksuite/icons/rc';
|
||||||
import {
|
import {
|
||||||
DocsService,
|
|
||||||
FeatureFlagService,
|
FeatureFlagService,
|
||||||
useLiveData,
|
useLiveData,
|
||||||
useServices,
|
useServices,
|
||||||
|
WorkspaceService,
|
||||||
} from '@toeverything/infra';
|
} from '@toeverything/infra';
|
||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
|
|
||||||
@@ -36,19 +37,23 @@ export const useExplorerCollectionNodeOperations = (
|
|||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const {
|
const {
|
||||||
workbenchService,
|
workbenchService,
|
||||||
docsService,
|
workspaceService,
|
||||||
collectionService,
|
collectionService,
|
||||||
compatibleFavoriteItemsAdapter,
|
compatibleFavoriteItemsAdapter,
|
||||||
featureFlagService,
|
featureFlagService,
|
||||||
} = useServices({
|
} = useServices({
|
||||||
DocsService,
|
|
||||||
WorkbenchService,
|
WorkbenchService,
|
||||||
|
WorkspaceService,
|
||||||
CollectionService,
|
CollectionService,
|
||||||
CompatibleFavoriteItemsAdapter,
|
CompatibleFavoriteItemsAdapter,
|
||||||
FeatureFlagService,
|
FeatureFlagService,
|
||||||
});
|
});
|
||||||
const deleteInfo = useDeleteCollectionInfo();
|
const deleteInfo = useDeleteCollectionInfo();
|
||||||
|
|
||||||
|
const { createPage } = usePageHelper(
|
||||||
|
workspaceService.workspace.docCollection
|
||||||
|
);
|
||||||
|
|
||||||
const enableMultiView = useLiveData(
|
const enableMultiView = useLiveData(
|
||||||
featureFlagService.flags.enable_multi_view.$
|
featureFlagService.flags.enable_multi_view.$
|
||||||
);
|
);
|
||||||
@@ -62,7 +67,7 @@ export const useExplorerCollectionNodeOperations = (
|
|||||||
const { openConfirmModal } = useConfirmModal();
|
const { openConfirmModal } = useConfirmModal();
|
||||||
|
|
||||||
const createAndAddDocument = useCallback(() => {
|
const createAndAddDocument = useCallback(() => {
|
||||||
const newDoc = docsService.createDoc();
|
const newDoc = createPage();
|
||||||
collectionService.addPageToCollection(collectionId, newDoc.id);
|
collectionService.addPageToCollection(collectionId, newDoc.id);
|
||||||
track.$.navigationPanel.collections.createDoc();
|
track.$.navigationPanel.collections.createDoc();
|
||||||
track.$.navigationPanel.collections.addDocToCollection({
|
track.$.navigationPanel.collections.addDocToCollection({
|
||||||
@@ -73,7 +78,7 @@ export const useExplorerCollectionNodeOperations = (
|
|||||||
}, [
|
}, [
|
||||||
collectionId,
|
collectionId,
|
||||||
collectionService,
|
collectionService,
|
||||||
docsService,
|
createPage,
|
||||||
onOpenCollapsed,
|
onOpenCollapsed,
|
||||||
workbenchService.workbench,
|
workbenchService.workbench,
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import {
|
|||||||
toast,
|
toast,
|
||||||
useConfirmModal,
|
useConfirmModal,
|
||||||
} from '@affine/component';
|
} from '@affine/component';
|
||||||
|
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
|
||||||
import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
|
import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
|
||||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||||
import { track } from '@affine/core/mixpanel';
|
import { track } from '@affine/core/mixpanel';
|
||||||
@@ -24,6 +25,7 @@ import {
|
|||||||
FeatureFlagService,
|
FeatureFlagService,
|
||||||
useLiveData,
|
useLiveData,
|
||||||
useServices,
|
useServices,
|
||||||
|
WorkspaceService,
|
||||||
} from '@toeverything/infra';
|
} from '@toeverything/infra';
|
||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
|
|
||||||
@@ -39,12 +41,14 @@ export const useExplorerDocNodeOperations = (
|
|||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const {
|
const {
|
||||||
workbenchService,
|
workbenchService,
|
||||||
|
workspaceService,
|
||||||
docsService,
|
docsService,
|
||||||
compatibleFavoriteItemsAdapter,
|
compatibleFavoriteItemsAdapter,
|
||||||
featureFlagService,
|
featureFlagService,
|
||||||
} = useServices({
|
} = useServices({
|
||||||
DocsService,
|
DocsService,
|
||||||
WorkbenchService,
|
WorkbenchService,
|
||||||
|
WorkspaceService,
|
||||||
CompatibleFavoriteItemsAdapter,
|
CompatibleFavoriteItemsAdapter,
|
||||||
FeatureFlagService,
|
FeatureFlagService,
|
||||||
});
|
});
|
||||||
@@ -55,6 +59,10 @@ export const useExplorerDocNodeOperations = (
|
|||||||
|
|
||||||
const docRecord = useLiveData(docsService.list.doc$(docId));
|
const docRecord = useLiveData(docsService.list.doc$(docId));
|
||||||
|
|
||||||
|
const { createPage } = usePageHelper(
|
||||||
|
workspaceService.workspace.docCollection
|
||||||
|
);
|
||||||
|
|
||||||
const favorite = useLiveData(
|
const favorite = useLiveData(
|
||||||
useMemo(() => {
|
useMemo(() => {
|
||||||
return compatibleFavoriteItemsAdapter.isFavorite$(docId, 'doc');
|
return compatibleFavoriteItemsAdapter.isFavorite$(docId, 'doc');
|
||||||
@@ -109,14 +117,14 @@ export const useExplorerDocNodeOperations = (
|
|||||||
}, [docId, workbenchService.workbench]);
|
}, [docId, workbenchService.workbench]);
|
||||||
|
|
||||||
const handleAddLinkedPage = useAsyncCallback(async () => {
|
const handleAddLinkedPage = useAsyncCallback(async () => {
|
||||||
const newDoc = docsService.createDoc();
|
const newDoc = createPage();
|
||||||
// TODO: handle timeout & error
|
// TODO: handle timeout & error
|
||||||
await docsService.addLinkedDoc(docId, newDoc.id);
|
await docsService.addLinkedDoc(docId, newDoc.id);
|
||||||
track.$.navigationPanel.docs.createDoc({ control: 'linkDoc' });
|
track.$.navigationPanel.docs.createDoc({ control: 'linkDoc' });
|
||||||
track.$.navigationPanel.docs.linkDoc({ control: 'createDoc' });
|
track.$.navigationPanel.docs.linkDoc({ control: 'createDoc' });
|
||||||
workbenchService.workbench.openDoc(newDoc.id);
|
workbenchService.workbench.openDoc(newDoc.id);
|
||||||
options.openNodeCollapsed();
|
options.openNodeCollapsed();
|
||||||
}, [docsService, docId, workbenchService.workbench, options]);
|
}, [createPage, docsService, docId, workbenchService.workbench, options]);
|
||||||
|
|
||||||
const handleToggleFavoriteDoc = useCallback(() => {
|
const handleToggleFavoriteDoc = useCallback(() => {
|
||||||
compatibleFavoriteItemsAdapter.toggle(docId, 'doc');
|
compatibleFavoriteItemsAdapter.toggle(docId, 'doc');
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
MenuSub,
|
MenuSub,
|
||||||
notify,
|
notify,
|
||||||
} from '@affine/component';
|
} from '@affine/component';
|
||||||
|
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
|
||||||
import {
|
import {
|
||||||
useSelectCollection,
|
useSelectCollection,
|
||||||
useSelectDoc,
|
useSelectDoc,
|
||||||
@@ -34,10 +35,10 @@ import {
|
|||||||
TagsIcon,
|
TagsIcon,
|
||||||
} from '@blocksuite/icons/rc';
|
} from '@blocksuite/icons/rc';
|
||||||
import {
|
import {
|
||||||
DocsService,
|
|
||||||
FeatureFlagService,
|
FeatureFlagService,
|
||||||
useLiveData,
|
useLiveData,
|
||||||
useServices,
|
useServices,
|
||||||
|
WorkspaceService,
|
||||||
} from '@toeverything/infra';
|
} from '@toeverything/infra';
|
||||||
import { difference } from 'lodash-es';
|
import { difference } from 'lodash-es';
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
import { useCallback, useMemo, useState } from 'react';
|
||||||
@@ -186,12 +187,13 @@ export const ExplorerFolderNodeFolder = ({
|
|||||||
node: FolderNode;
|
node: FolderNode;
|
||||||
} & GenericExplorerNode) => {
|
} & GenericExplorerNode) => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const { docsService, workbenchService, featureFlagService } = useServices({
|
const { workbenchService, workspaceService, featureFlagService } =
|
||||||
DocsService,
|
useServices({
|
||||||
WorkbenchService,
|
WorkbenchService,
|
||||||
CompatibleFavoriteItemsAdapter,
|
WorkspaceService,
|
||||||
FeatureFlagService,
|
CompatibleFavoriteItemsAdapter,
|
||||||
});
|
FeatureFlagService,
|
||||||
|
});
|
||||||
const openDocsSelector = useSelectDoc();
|
const openDocsSelector = useSelectDoc();
|
||||||
const openTagsSelector = useSelectTag();
|
const openTagsSelector = useSelectTag();
|
||||||
const openCollectionsSelector = useSelectCollection();
|
const openCollectionsSelector = useSelectCollection();
|
||||||
@@ -202,6 +204,9 @@ export const ExplorerFolderNodeFolder = ({
|
|||||||
const [collapsed, setCollapsed] = useState(true);
|
const [collapsed, setCollapsed] = useState(true);
|
||||||
const [newFolderId, setNewFolderId] = useState<string | null>(null);
|
const [newFolderId, setNewFolderId] = useState<string | null>(null);
|
||||||
|
|
||||||
|
const { createPage } = usePageHelper(
|
||||||
|
workspaceService.workspace.docCollection
|
||||||
|
);
|
||||||
const handleDelete = useCallback(() => {
|
const handleDelete = useCallback(() => {
|
||||||
node.delete();
|
node.delete();
|
||||||
track.$.navigationPanel.organize.deleteOrganizeItem({
|
track.$.navigationPanel.organize.deleteOrganizeItem({
|
||||||
@@ -545,7 +550,7 @@ export const ExplorerFolderNodeFolder = ({
|
|||||||
);
|
);
|
||||||
|
|
||||||
const handleNewDoc = useCallback(() => {
|
const handleNewDoc = useCallback(() => {
|
||||||
const newDoc = docsService.createDoc();
|
const newDoc = createPage();
|
||||||
node.createLink('doc', newDoc.id, node.indexAt('before'));
|
node.createLink('doc', newDoc.id, node.indexAt('before'));
|
||||||
workbenchService.workbench.openDoc(newDoc.id);
|
workbenchService.workbench.openDoc(newDoc.id);
|
||||||
track.$.navigationPanel.folders.createDoc();
|
track.$.navigationPanel.folders.createDoc();
|
||||||
@@ -554,7 +559,7 @@ export const ExplorerFolderNodeFolder = ({
|
|||||||
target: 'doc',
|
target: 'doc',
|
||||||
});
|
});
|
||||||
setCollapsed(false);
|
setCollapsed(false);
|
||||||
}, [docsService, node, workbenchService.workbench]);
|
}, [createPage, node, workbenchService.workbench]);
|
||||||
|
|
||||||
const handleCreateSubfolder = useCallback(() => {
|
const handleCreateSubfolder = useCallback(() => {
|
||||||
const newFolderId = node.createFolder(
|
const newFolderId = node.createFolder(
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { IconButton, MenuItem, MenuSeparator, toast } from '@affine/component';
|
import { IconButton, MenuItem, MenuSeparator, toast } from '@affine/component';
|
||||||
|
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
|
||||||
import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
|
import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
|
||||||
import { track } from '@affine/core/mixpanel';
|
import { track } from '@affine/core/mixpanel';
|
||||||
import { FavoriteService } from '@affine/core/modules/favorite';
|
import { FavoriteService } from '@affine/core/modules/favorite';
|
||||||
@@ -16,6 +17,7 @@ import {
|
|||||||
FeatureFlagService,
|
FeatureFlagService,
|
||||||
useLiveData,
|
useLiveData,
|
||||||
useServices,
|
useServices,
|
||||||
|
WorkspaceService,
|
||||||
} from '@toeverything/infra';
|
} from '@toeverything/infra';
|
||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
|
|
||||||
@@ -31,13 +33,14 @@ export const useExplorerTagNodeOperations = (
|
|||||||
): NodeOperation[] => {
|
): NodeOperation[] => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const {
|
const {
|
||||||
docsService,
|
|
||||||
workbenchService,
|
workbenchService,
|
||||||
|
workspaceService,
|
||||||
tagService,
|
tagService,
|
||||||
favoriteService,
|
favoriteService,
|
||||||
featureFlagService,
|
featureFlagService,
|
||||||
} = useServices({
|
} = useServices({
|
||||||
WorkbenchService,
|
WorkbenchService,
|
||||||
|
WorkspaceService,
|
||||||
TagService,
|
TagService,
|
||||||
DocsService,
|
DocsService,
|
||||||
FavoriteService,
|
FavoriteService,
|
||||||
@@ -52,15 +55,19 @@ export const useExplorerTagNodeOperations = (
|
|||||||
featureFlagService.flags.enable_multi_view.$
|
featureFlagService.flags.enable_multi_view.$
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { createPage } = usePageHelper(
|
||||||
|
workspaceService.workspace.docCollection
|
||||||
|
);
|
||||||
|
|
||||||
const handleNewDoc = useCallback(() => {
|
const handleNewDoc = useCallback(() => {
|
||||||
if (tagRecord) {
|
if (tagRecord) {
|
||||||
const newDoc = docsService.createDoc();
|
const newDoc = createPage();
|
||||||
tagRecord?.tag(newDoc.id);
|
tagRecord?.tag(newDoc.id);
|
||||||
track.$.navigationPanel.tags.createDoc();
|
track.$.navigationPanel.tags.createDoc();
|
||||||
workbenchService.workbench.openDoc(newDoc.id);
|
workbenchService.workbench.openDoc(newDoc.id);
|
||||||
openNodeCollapsed();
|
openNodeCollapsed();
|
||||||
}
|
}
|
||||||
}, [docsService, openNodeCollapsed, tagRecord, workbenchService.workbench]);
|
}, [createPage, openNodeCollapsed, tagRecord, workbenchService.workbench]);
|
||||||
|
|
||||||
const handleMoveToTrash = useCallback(() => {
|
const handleMoveToTrash = useCallback(() => {
|
||||||
tagService.tagList.deleteTag(tagId);
|
tagService.tagList.deleteTag(tagId);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import {
|
|||||||
IconButton,
|
IconButton,
|
||||||
useDropTarget,
|
useDropTarget,
|
||||||
} from '@affine/component';
|
} from '@affine/component';
|
||||||
|
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
|
||||||
import { track } from '@affine/core/mixpanel';
|
import { track } from '@affine/core/mixpanel';
|
||||||
import {
|
import {
|
||||||
DropEffect,
|
DropEffect,
|
||||||
@@ -18,7 +19,11 @@ import type { AffineDNDData } from '@affine/core/types/dnd';
|
|||||||
import { isNewTabTrigger } from '@affine/core/utils';
|
import { isNewTabTrigger } from '@affine/core/utils';
|
||||||
import { useI18n } from '@affine/i18n';
|
import { useI18n } from '@affine/i18n';
|
||||||
import { PlusIcon } from '@blocksuite/icons/rc';
|
import { PlusIcon } from '@blocksuite/icons/rc';
|
||||||
import { DocsService, useLiveData, useServices } from '@toeverything/infra';
|
import {
|
||||||
|
useLiveData,
|
||||||
|
useServices,
|
||||||
|
WorkspaceService,
|
||||||
|
} from '@toeverything/infra';
|
||||||
import { type MouseEventHandler, useCallback } from 'react';
|
import { type MouseEventHandler, useCallback } from 'react';
|
||||||
|
|
||||||
import { ExplorerService } from '../../../services/explorer';
|
import { ExplorerService } from '../../../services/explorer';
|
||||||
@@ -36,13 +41,17 @@ import {
|
|||||||
import { RootEmpty } from './empty';
|
import { RootEmpty } from './empty';
|
||||||
|
|
||||||
export const ExplorerFavorites = () => {
|
export const ExplorerFavorites = () => {
|
||||||
const { favoriteService, docsService, workbenchService, explorerService } =
|
const {
|
||||||
useServices({
|
favoriteService,
|
||||||
FavoriteService,
|
workspaceService,
|
||||||
DocsService,
|
workbenchService,
|
||||||
WorkbenchService,
|
explorerService,
|
||||||
ExplorerService,
|
} = useServices({
|
||||||
});
|
FavoriteService,
|
||||||
|
WorkbenchService,
|
||||||
|
WorkspaceService,
|
||||||
|
ExplorerService,
|
||||||
|
});
|
||||||
|
|
||||||
const explorerSection = explorerService.sections.favorites;
|
const explorerSection = explorerService.sections.favorites;
|
||||||
|
|
||||||
@@ -52,6 +61,10 @@ export const ExplorerFavorites = () => {
|
|||||||
|
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
|
|
||||||
|
const { createPage } = usePageHelper(
|
||||||
|
workspaceService.workspace.docCollection
|
||||||
|
);
|
||||||
|
|
||||||
const handleDrop = useCallback(
|
const handleDrop = useCallback(
|
||||||
(data: DropTargetDropEvent<AffineDNDData>) => {
|
(data: DropTargetDropEvent<AffineDNDData>) => {
|
||||||
if (
|
if (
|
||||||
@@ -75,7 +88,7 @@ export const ExplorerFavorites = () => {
|
|||||||
|
|
||||||
const handleCreateNewFavoriteDoc: MouseEventHandler = useCallback(
|
const handleCreateNewFavoriteDoc: MouseEventHandler = useCallback(
|
||||||
e => {
|
e => {
|
||||||
const newDoc = docsService.createDoc();
|
const newDoc = createPage();
|
||||||
favoriteService.favoriteList.add(
|
favoriteService.favoriteList.add(
|
||||||
'doc',
|
'doc',
|
||||||
newDoc.id,
|
newDoc.id,
|
||||||
@@ -87,7 +100,7 @@ export const ExplorerFavorites = () => {
|
|||||||
explorerSection.setCollapsed(false);
|
explorerSection.setCollapsed(false);
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
docsService,
|
createPage,
|
||||||
explorerSection,
|
explorerSection,
|
||||||
favoriteService.favoriteList,
|
favoriteService.favoriteList,
|
||||||
workbenchService.workbench,
|
workbenchService.workbench,
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { track } from '@affine/core/mixpanel';
|
|||||||
import { isNewTabTrigger } from '@affine/core/utils';
|
import { isNewTabTrigger } from '@affine/core/utils';
|
||||||
import type { Filter } from '@affine/env/filter';
|
import type { Filter } from '@affine/env/filter';
|
||||||
import { PlusIcon } from '@blocksuite/icons/rc';
|
import { PlusIcon } from '@blocksuite/icons/rc';
|
||||||
import { useService, WorkspaceService } from '@toeverything/infra';
|
import { useServices, WorkspaceService } from '@toeverything/infra';
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
|
|
||||||
import * as styles from './all-page.css';
|
import * as styles from './all-page.css';
|
||||||
@@ -25,7 +25,10 @@ export const AllPageHeader = ({
|
|||||||
filters: Filter[];
|
filters: Filter[];
|
||||||
onChangeFilters: (filters: Filter[]) => void;
|
onChangeFilters: (filters: Filter[]) => void;
|
||||||
}) => {
|
}) => {
|
||||||
const workspace = useService(WorkspaceService).workspace;
|
const { workspaceService } = useServices({
|
||||||
|
WorkspaceService,
|
||||||
|
});
|
||||||
|
const workspace = workspaceService.workspace;
|
||||||
const { importFile, createEdgeless, createPage } = usePageHelper(
|
const { importFile, createEdgeless, createPage } = usePageHelper(
|
||||||
workspace.docCollection
|
workspace.docCollection
|
||||||
);
|
);
|
||||||
@@ -64,7 +67,10 @@ export const AllPageHeader = ({
|
|||||||
createEdgeless(isNewTabTrigger(e) ? 'new-tab' : true)
|
createEdgeless(isNewTabTrigger(e) ? 'new-tab' : true)
|
||||||
}
|
}
|
||||||
onCreatePage={e =>
|
onCreatePage={e =>
|
||||||
createPage(isNewTabTrigger(e) ? 'new-tab' : true)
|
createPage('page', isNewTabTrigger(e) ? 'new-tab' : true)
|
||||||
|
}
|
||||||
|
onCreateDoc={e =>
|
||||||
|
createPage(undefined, isNewTabTrigger(e) ? 'new-tab' : true)
|
||||||
}
|
}
|
||||||
onImportFile={onImportFile}
|
onImportFile={onImportFile}
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user