357 lines
12 KiB
TypeScript
357 lines
12 KiB
TypeScript
import type { SearchKeywordOption } from '../../../components/search';
|
|
import type { LoadedSampleEntry } from '../../../samples/registry';
|
|
import {
|
|
buildApisPath,
|
|
buildChatPath,
|
|
buildDocsPath,
|
|
buildPlansPath,
|
|
buildPlayPath,
|
|
buildSavedLayoutPath,
|
|
getDocsSectionLabel,
|
|
PLAN_FILTER_LABELS,
|
|
PLAN_GROUP_LABEL,
|
|
PLAN_SIDEBAR_LABELS,
|
|
} from '../routes';
|
|
import { compactKeywords, scrollToElement } from '../mainView/utils';
|
|
|
|
type BuildSearchOptionsParams = {
|
|
componentSamples: LoadedSampleEntry[];
|
|
widgetSamples: LoadedSampleEntry[];
|
|
docFolders: string[];
|
|
docsDocuments: Array<{
|
|
id: string;
|
|
title: string;
|
|
folder: string;
|
|
preview?: string;
|
|
}>;
|
|
savedLayouts: Array<{
|
|
id: string;
|
|
name: string;
|
|
}>;
|
|
hasAccess: boolean;
|
|
navigateTo: (path: string) => void;
|
|
setFocusedComponentId: (value: string | null) => void;
|
|
requestPlanQuickFilter: (filter: 'working' | 'release-pending-main' | 'automation-failed' | null) => void;
|
|
};
|
|
|
|
export function buildSearchOptions({
|
|
componentSamples,
|
|
widgetSamples,
|
|
docFolders,
|
|
docsDocuments,
|
|
savedLayouts,
|
|
hasAccess,
|
|
navigateTo,
|
|
setFocusedComponentId,
|
|
requestPlanQuickFilter,
|
|
}: BuildSearchOptionsParams): SearchKeywordOption[] {
|
|
const onSelectWindow = () => {
|
|
setFocusedComponentId(null);
|
|
};
|
|
|
|
return [
|
|
{
|
|
id: 'page:apis:components',
|
|
label: 'APIs / Components',
|
|
group: 'Page',
|
|
keywords: ['api', 'components', '컴포넌트'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildApisPath('components'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
{
|
|
id: 'page:apis:widgets',
|
|
label: 'APIs / Widgets',
|
|
group: 'Page',
|
|
keywords: ['api', 'widgets', '위젯'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildApisPath('widgets'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
{
|
|
id: 'page:plans:all',
|
|
label: `${PLAN_GROUP_LABEL} / ${PLAN_FILTER_LABELS.all}`,
|
|
group: 'Page',
|
|
keywords: ['plans', 'automation', '자동화', '실행', '현황', 'worker'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildPlansPath('all'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
...(hasAccess
|
|
? [
|
|
{
|
|
id: 'page:plans:board',
|
|
label: `${PLAN_GROUP_LABEL} / ${PLAN_SIDEBAR_LABELS.board}`,
|
|
group: 'Page',
|
|
keywords: ['plans', 'plan', '플랜', '게시판', 'board', '요청', '작업 요청', '접수', '계획'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildPlansPath('board'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
} satisfies SearchKeywordOption,
|
|
{
|
|
id: 'page:plans:server-command',
|
|
label: `Servers / ${PLAN_SIDEBAR_LABELS['server-command']}`,
|
|
group: 'Page',
|
|
keywords: ['plans', 'plan', 'server', 'command', 'server command', '서버', '명령', '재기동'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildPlansPath('server-command'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
} satisfies SearchKeywordOption,
|
|
]
|
|
: []),
|
|
{
|
|
id: 'page:plans:release-review',
|
|
label: `${PLAN_GROUP_LABEL} / ${PLAN_SIDEBAR_LABELS['release-review']}`,
|
|
group: 'Page',
|
|
keywords: ['release', 'review', '검수', '릴리즈', 'release 검수'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildPlansPath('release-review'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
{
|
|
id: 'page:plans:charts',
|
|
label: `${PLAN_GROUP_LABEL} / ${PLAN_SIDEBAR_LABELS.charts}`,
|
|
group: 'Page',
|
|
keywords: ['plans', 'plan', '차트', 'chart', '스케줄 차트'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildPlansPath('charts'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
{
|
|
id: 'page:plans:schedule',
|
|
label: `${PLAN_GROUP_LABEL} / ${PLAN_SIDEBAR_LABELS.schedule}`,
|
|
group: 'Page',
|
|
keywords: ['plans', 'plan', '스케줄', 'schedule', '반복 작업'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildPlansPath('schedule'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
...(hasAccess
|
|
? [
|
|
{
|
|
id: 'page:plans:automation-type',
|
|
label: `${PLAN_GROUP_LABEL} / ${PLAN_SIDEBAR_LABELS['automation-type']}`,
|
|
group: 'Page',
|
|
keywords: ['plans', 'plan', 'automation type', '자동화 유형', '자동화 처리', '유형 관리'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildPlansPath('automation-type'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
} satisfies SearchKeywordOption,
|
|
{
|
|
id: 'page:plans:automation-context',
|
|
label: `${PLAN_GROUP_LABEL} / ${PLAN_SIDEBAR_LABELS['automation-context']}`,
|
|
group: 'Page',
|
|
keywords: ['plans', 'plan', 'context', 'context type', '컨텍스트', 'Context 유형', '부모 context'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildPlansPath('automation-context'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
} satisfies SearchKeywordOption,
|
|
{
|
|
id: 'page:plans:history',
|
|
label: `${PLAN_GROUP_LABEL} / ${PLAN_SIDEBAR_LABELS.history}`,
|
|
group: 'Page',
|
|
keywords: ['plans', 'plan', '히스토리', 'history', '방문자 이력'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildPlansPath('history'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
} satisfies SearchKeywordOption,
|
|
]
|
|
: []),
|
|
{
|
|
id: 'page:preview:app',
|
|
label: 'Preview App / 모바일 앱 열기',
|
|
group: 'Page',
|
|
keywords: ['preview', 'iframe', '미리보기', 'preview app', '프리뷰 앱', '모바일 앱', 'cbt app'],
|
|
description: 'preview.sm-home.cloud에서 실제 앱 컨테이너 화면을 모바일 해상도로 엽니다.',
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildPlayPath('cbt'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
{
|
|
id: 'page:chat:live',
|
|
label: 'Codex Live / Codex Live',
|
|
group: 'Page',
|
|
keywords: ['codex live', 'chat', 'codex', '채팅', '대화', '메시지'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildChatPath('live'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
{
|
|
id: 'page:chat:changes',
|
|
label: 'Codex Live / 변경 이력',
|
|
group: 'Page',
|
|
keywords: ['codex live', 'changes', 'source', 'diff', '변경', '소스', '채팅 변경', '채팅 diff'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildChatPath('changes'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
{
|
|
id: 'page:chat:resources',
|
|
label: '리소스 관리 / 리소스 관리',
|
|
group: 'Page',
|
|
keywords: ['codex live', 'resource', 'resources', 'file', 'files', '리소스', '파일', '파일 시스템'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildChatPath('resources'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
{
|
|
id: 'page:chat:errors',
|
|
label: '앱로그 / 에러 로그',
|
|
group: 'Page',
|
|
keywords: ['app log', 'applog', '앱로그', 'error', 'errors', '에러', '로그'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildChatPath('errors'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
{
|
|
id: 'page:chat:manage',
|
|
label: '채팅 관리 / 유형 권한 관리',
|
|
group: 'Page',
|
|
keywords: ['chat manage', 'chat type', 'permission', '권한', '채팅 유형', '채팅 관리'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildChatPath('manage'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
},
|
|
{
|
|
id: 'page:chat:manage-defaults',
|
|
label: '채팅 관리 / 공통 문맥 관리',
|
|
group: 'Page',
|
|
keywords: ['chat manage', 'default type', 'default context', '기본 유형', '공통 문맥', '기본 context', '채팅 관리'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildChatPath('manage-defaults'));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
} satisfies SearchKeywordOption,
|
|
...docFolders.map((folder) => ({
|
|
id: `docs-folder:${folder}`,
|
|
label: `Docs / ${getDocsSectionLabel(folder)}`,
|
|
group: 'Docs Folder',
|
|
keywords: [folder, 'docs', '문서'],
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildDocsPath(folder));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
})),
|
|
...docsDocuments.map((document) => ({
|
|
id: `doc:${document.id}`,
|
|
label: document.title,
|
|
group: `Docs / ${getDocsSectionLabel(document.folder)}`,
|
|
keywords: [document.folder, document.id, document.title],
|
|
description: document.preview,
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildDocsPath(document.folder));
|
|
setFocusedComponentId(`doc:${document.id}`);
|
|
scrollToElement(`document-preview-${document.id}`);
|
|
},
|
|
onSelectWindow,
|
|
})),
|
|
...savedLayouts.map((layout) => ({
|
|
id: `page:play:layout-record:${layout.id}`,
|
|
label: `Play / ${layout.name}`,
|
|
group: 'Play Layout',
|
|
keywords: compactKeywords([layout.name, layout.id, 'play', 'layout', 'saved layout', '저장 레이아웃', '메모']),
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildSavedLayoutPath(layout.id));
|
|
setFocusedComponentId(null);
|
|
},
|
|
onSelectWindow,
|
|
})),
|
|
...componentSamples.map((entry) => ({
|
|
id: `component:${entry.sampleMeta.componentId}:${entry.sampleMeta.id}`,
|
|
label: entry.sampleMeta.title,
|
|
group: 'Component',
|
|
keywords: compactKeywords([
|
|
entry.sampleMeta.componentId,
|
|
entry.sampleMeta.id,
|
|
entry.sampleMeta.category,
|
|
entry.sampleMeta.kind,
|
|
entry.sampleMeta.variantLabel ?? '',
|
|
]),
|
|
description: entry.sampleMeta.description,
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildApisPath('components'));
|
|
setFocusedComponentId(`component:${entry.sampleMeta.componentId}`);
|
|
scrollToElement(`component-sample-${entry.sampleMeta.componentId}`);
|
|
},
|
|
onSelectWindow,
|
|
})),
|
|
...widgetSamples.map((entry) => ({
|
|
id: `widget:${entry.sampleMeta.componentId}:${entry.sampleMeta.id}`,
|
|
label: entry.sampleMeta.title,
|
|
group: 'Widget',
|
|
keywords: compactKeywords([
|
|
entry.sampleMeta.componentId,
|
|
entry.sampleMeta.id,
|
|
entry.sampleMeta.category,
|
|
entry.sampleMeta.kind,
|
|
entry.sampleMeta.variantLabel ?? '',
|
|
]),
|
|
description: entry.sampleMeta.description,
|
|
onSelect: () => {
|
|
requestPlanQuickFilter(null);
|
|
navigateTo(buildApisPath('widgets'));
|
|
setFocusedComponentId(`widget:${entry.sampleMeta.componentId}`);
|
|
},
|
|
onSelectWindow,
|
|
})),
|
|
];
|
|
}
|