From 5226d6c568eeeb484231d85ab219bbed407e3e77 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Tue, 24 Oct 2023 13:54:37 +0800 Subject: [PATCH] feat(core): add search result highlighting (#4667) Co-authored-by: Peng Xiao --- packages/common/infra/src/command/command.ts | 32 ++- .../affine-banner/browser-warning.tsx | 4 +- .../src/components/share-menu/share-menu.tsx | 6 +- packages/frontend/core/src/atoms/settings.ts | 6 +- .../core/src/commands/affine-creation.tsx | 8 +- .../core/src/commands/affine-help.tsx | 6 +- .../core/src/commands/affine-layout.tsx | 13 +- .../core/src/commands/affine-navigation.tsx | 12 +- .../core/src/commands/affine-settings.tsx | 189 +++++------------- .../core/src/commands/affine-updates.tsx | 2 +- .../src/components/affine/app-container.tsx | 4 +- .../components/affine/language-menu/index.tsx | 5 +- .../new-workspace-setting-detail/publish.tsx | 7 +- .../general-setting/about/index.tsx | 15 +- .../appearance/date-format-setting.tsx | 12 +- .../general-setting/appearance/index.tsx | 28 +-- .../src/components/page-detail-editor.tsx | 5 +- .../core/src/components/pure/cmdk/data.tsx | 60 +++--- .../src/components/pure/cmdk/highlight.css.ts | 33 +++ .../src/components/pure/cmdk/highlight.tsx | 78 ++++++++ .../core/src/components/pure/cmdk/main.css.ts | 6 +- .../core/src/components/pure/cmdk/main.tsx | 15 +- .../src/components/pure/cmdk/not-found.css.ts | 40 ++++ .../src/components/pure/cmdk/not-found.tsx | 31 +++ .../core/src/components/pure/cmdk/types.ts | 7 +- .../pure/trash-button-group/index.tsx | 4 +- .../src/components/root-app-sidebar/index.tsx | 4 +- .../hooks/affine/use-app-setting-helper.ts | 23 +++ .../src/hooks/affine/use-language-helper.ts | 6 +- .../src/hooks/affine/use-sidebar-status.ts | 19 ++ .../hooks/use-register-workspace-commands.ts | 2 +- .../core/src/layouts/workspace-layout.tsx | 6 +- packages/frontend/i18n/src/resources/en.json | 22 +- tests/affine-local/e2e/quick-search.spec.ts | 51 +++-- .../quick-search-main.stories.tsx | 23 ++- 35 files changed, 479 insertions(+), 305 deletions(-) create mode 100644 packages/frontend/core/src/components/pure/cmdk/highlight.css.ts create mode 100644 packages/frontend/core/src/components/pure/cmdk/highlight.tsx create mode 100644 packages/frontend/core/src/components/pure/cmdk/not-found.css.ts create mode 100644 packages/frontend/core/src/components/pure/cmdk/not-found.tsx create mode 100644 packages/frontend/core/src/hooks/affine/use-app-setting-helper.ts create mode 100644 packages/frontend/core/src/hooks/affine/use-sidebar-status.ts diff --git a/packages/common/infra/src/command/command.ts b/packages/common/infra/src/command/command.ts index f57f8ad518..130d39b1e5 100644 --- a/packages/common/infra/src/command/command.ts +++ b/packages/common/infra/src/command/command.ts @@ -40,8 +40,18 @@ export interface AffineCommandOptions { preconditionStrategy?: PreconditionStrategy | (() => boolean); // main text on the left.. // make text a function so that we can do i18n and interpolation when we need to - label?: string | (() => string) | ReactNode | (() => ReactNode); - icon: React.ReactNode; // todo: need a mapping from string -> React element/SVG + label: + | string + | (() => string) + | { + title: string; + subTitle?: string; + } + | (() => { + title: string; + subTitle?: string; + }); + icon: ReactNode; // todo: need a mapping from string -> React element/SVG category?: CommandCategory; // we use https://github.com/jamiebuilds/tinykeys so that we can use the same keybinding definition // for both mac and windows @@ -53,8 +63,11 @@ export interface AffineCommandOptions { export interface AffineCommand { readonly id: string; readonly preconditionStrategy: PreconditionStrategy | (() => boolean); - readonly label?: ReactNode | string; - readonly icon?: React.ReactNode; // icon name + readonly label: { + title: string; + subTitle?: string; + }; + readonly icon?: ReactNode; // icon name readonly category: CommandCategory; readonly keyBinding?: KeybindingOptions; run(): void | Promise; @@ -71,8 +84,15 @@ export function createAffineCommand( options.preconditionStrategy ?? PreconditionStrategy.Always, category: options.category ?? 'affine:general', get label() { - const label = options.label; - return typeof label === 'function' ? label?.() : label; + let label = options.label; + label = typeof label === 'function' ? label?.() : label; + label = + typeof label === 'string' + ? { + title: label, + } + : label; + return label; }, keyBinding: typeof options.keyBinding === 'string' diff --git a/packages/frontend/component/src/components/affine-banner/browser-warning.tsx b/packages/frontend/component/src/components/affine-banner/browser-warning.tsx index 9168f3efe4..4a6cbbb5f9 100644 --- a/packages/frontend/component/src/components/affine-banner/browser-warning.tsx +++ b/packages/frontend/component/src/components/affine-banner/browser-warning.tsx @@ -1,5 +1,5 @@ import { CloseIcon } from '@blocksuite/icons'; -import type React from 'react'; +import type { ReactNode } from 'react'; import { browserWarningStyle, @@ -14,7 +14,7 @@ export const BrowserWarning = ({ }: { show: boolean; onClose: () => void; - message: React.ReactNode; + message: ReactNode; }) => { if (!show) { return null; diff --git a/packages/frontend/component/src/components/share-menu/share-menu.tsx b/packages/frontend/component/src/components/share-menu/share-menu.tsx index 81400c235d..a40c42adfa 100644 --- a/packages/frontend/component/src/components/share-menu/share-menu.tsx +++ b/packages/frontend/component/src/components/share-menu/share-menu.tsx @@ -88,11 +88,7 @@ const CloudShareMenu = (props: ShareMenuProps) => { modal: false, }} > -