diff --git a/apps/web/__e2e__/models/app.model.ts b/apps/web/__e2e__/models/app.model.ts index b361e9ed0..b6386657c 100644 --- a/apps/web/__e2e__/models/app.model.ts +++ b/apps/web/__e2e__/models/app.model.ts @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -import { Page } from "@playwright/test"; +import { Page, Locator } from "@playwright/test"; import { getTestId } from "../utils"; import { AuthModel } from "./auth.model"; import { CheckoutModel } from "./checkout.model"; @@ -25,6 +25,7 @@ import { ItemsViewModel } from "./items-view.model"; import { NavigationMenuModel } from "./navigation-menu.model"; import { NotebooksViewModel } from "./notebooks-view.model"; import { NotesViewModel } from "./notes-view.model"; +import { SearchViewModel } from "./search-view-model"; import { SettingsViewModel } from "./settings-view.model"; import { ToastsModel } from "./toasts.model"; import { TrashViewModel } from "./trash-view.model"; @@ -112,4 +113,15 @@ export class AppModel { .locator(getTestId(`sync-status-${state}`), { hasText: text }) .waitFor({ state: "visible" }); } + + async search(query: string) { + const searchinput = this.page.locator(getTestId("search-input")); + const searchButton = this.page.locator(getTestId("search-button")); + const openSearch = this.page.locator(getTestId("open-search")); + + await openSearch.click(); + await searchinput.fill(query); + await searchButton.click(); + return new SearchViewModel(this.page); + } } diff --git a/apps/web/__e2e__/models/items-view.model.ts b/apps/web/__e2e__/models/items-view.model.ts index 7649f6d2a..af72415aa 100644 --- a/apps/web/__e2e__/models/items-view.model.ts +++ b/apps/web/__e2e__/models/items-view.model.ts @@ -21,6 +21,7 @@ import { Locator, Page } from "@playwright/test"; import { getTestId } from "../utils"; import { BaseViewModel } from "./base-view.model"; import { ItemModel } from "./item.model"; +import { SearchViewModel } from "./search-view-model"; import { Item } from "./types"; import { fillItemDialog } from "./utils"; diff --git a/apps/web/__e2e__/models/search-view-model.ts b/apps/web/__e2e__/models/search-view-model.ts new file mode 100644 index 000000000..47f0e54c8 --- /dev/null +++ b/apps/web/__e2e__/models/search-view-model.ts @@ -0,0 +1,39 @@ +/* +This file is part of the Notesnook project (https://notesnook.com/) + +Copyright (C) 2022 Streetwriters (Private) Limited + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +import { Page } from "@playwright/test"; +import { BaseViewModel } from "./base-view.model"; +import { ItemModel } from "./item.model"; +import { Item } from "./types"; + +export class SearchViewModel extends BaseViewModel { + constructor(page: Page) { + super(page, "general"); + } + + async findItem(item: Item) { + const titleToCompare = item.title; + for await (const _item of this.iterateItems()) { + const itemModel = new ItemModel(_item); + const title = await itemModel.getTitle(); + if (title === titleToCompare) return itemModel; + } + return undefined; + } +} diff --git a/apps/web/__e2e__/topics.test.ts b/apps/web/__e2e__/topics.test.ts index b3f78ae20..b96b4d27d 100644 --- a/apps/web/__e2e__/topics.test.ts +++ b/apps/web/__e2e__/topics.test.ts @@ -121,3 +121,19 @@ test(`sort topics`, async ({ page }, info) => { } } }); + +test("search topics", async ({ page }) => { + const app = new AppModel(page); + await app.goto(); + const notebooks = await app.goToNotebooks(); + const notebook = await notebooks.createNotebook({ + ...NOTEBOOK, + topics: ["title1", "title2", "title3", "title4", "title5"] + }); + await notebook?.openNotebook(); + + const search = await app.search("1"); + const topic = await search?.findItem({ title: "title1" }); + + expect((await topic?.getTitle()) === "title1").toBeTruthy(); +}); diff --git a/apps/web/src/components/list-container/list-profiles.tsx b/apps/web/src/components/list-container/list-profiles.tsx index 87bc17378..8e544e38e 100644 --- a/apps/web/src/components/list-container/list-profiles.tsx +++ b/apps/web/src/components/list-container/list-profiles.tsx @@ -84,13 +84,11 @@ const TagsProfile: ItemWrapper = ({ index, item }) => ( ); -const TopicsProfile: ItemWrapper = ({ index, item, context }) => ( +const TopicsProfile: ItemWrapper = ({ index, item }) => ( - context ? navigate(`/notebooks/${context.notebookId}/${item.id}`) : null - } + onClick={() => navigate(`/notebooks/${item.notebookId}/${item.id}`)} /> ); diff --git a/apps/web/src/components/route-container/index.js b/apps/web/src/components/route-container/index.js index 0fa3bca43..51ad85625 100644 --- a/apps/web/src/components/route-container/index.js +++ b/apps/web/src/components/route-container/index.js @@ -99,6 +99,7 @@ function Header(props) { {buttons?.search && ( navigate(`/search/${type}`)} diff --git a/apps/web/src/components/search/index.js b/apps/web/src/components/search/index.js index de88a6f92..1c090e177 100644 --- a/apps/web/src/components/search/index.js +++ b/apps/web/src/components/search/index.js @@ -24,6 +24,7 @@ import Field from "../field"; function SearchBox(props) { return ( { const searchField = document.getElementById("search"); if (searchField && searchField.value && searchField.value.length) {