feature: search pageable

This commit is contained in:
wanxp 2023-02-16 11:11:44 +08:00
parent e19fbc648c
commit 980fae30ed
6 changed files with 54 additions and 50 deletions

@ -1,15 +1,15 @@
import {SearchHandleMode} from "../../../constant/Constsant";
import {Editor} from "obsidian";
import { DoubanPluginSetting } from "../../setting/model/DoubanPluginSetting";
import UserComponent from "../../user/UserComponent";
import NetFileHandler from "src/org/wanxp/net/NetFileHandler";
import DoubanPlugin from "../../../main"; import DoubanPlugin from "../../../main";
import SyncStatusHolder from "../../sync/model/SyncStatusHolder"; import { DoubanPluginSetting } from "../../setting/model/DoubanPluginSetting";
import {SyncConfig} from "../../sync/model/SyncConfig";
import DoubanSubject from "./DoubanSubject"; import DoubanSubject from "./DoubanSubject";
import {Editor} from "obsidian";
import GlobalStatusHolder from "../../model/GlobalStatusHolder"; import GlobalStatusHolder from "../../model/GlobalStatusHolder";
import {SearchResultsPage} from "schema-dts"; import NetFileHandler from "src/org/wanxp/net/NetFileHandler";
import {SearchHandleMode} from "../../../constant/Constsant";
import {SearchPageInfo} from "./SearchPageInfo"; import {SearchPageInfo} from "./SearchPageInfo";
import {SearchResultsPage} from "schema-dts";
import {SyncConfig} from "../../sync/model/SyncConfig";
import SyncStatusHolder from "../../sync/model/SyncStatusHolder";
import UserComponent from "../../user/UserComponent";
export default interface HandleContext { export default interface HandleContext {
plugin:DoubanPlugin; plugin:DoubanPlugin;
@ -24,5 +24,6 @@ export default interface HandleContext {
syncConfig?: SyncConfig; syncConfig?: SyncConfig;
listItem?:DoubanSubject; listItem?:DoubanSubject;
searchPage:SearchPageInfo; searchPage?:SearchPageInfo;
} }

@ -5,13 +5,12 @@ export class SearchPage extends SearchPageInfo{
private _list:any[]; private _list:any[];
constructor(total: number, pageNum: number, pageSize: number, hasNext: boolean, list: any[]) { constructor(total: number, pageNum: number, pageSize: number, list: any[]) {
super(total, pageNum, pageSize, hasNext); super(total, pageNum, pageSize);
this._list = list; this._list = list;
} }
public get list() { public get list() {
return this._list; return this._list;
} }
} }

@ -1,25 +1,23 @@
export class SearchPageInfo { export class SearchPageInfo {
private _total: number; private _total: number;
private _hasNext: boolean;
private _pageSize: number; private _pageSize: number;
private _pageNum: number; private _pageNum: number;
constructor(total: number, pageNum: number, pageSize: number, hasNext: boolean) { private _hasNext: boolean;
constructor(total: number, pageNum: number, pageSize: number) {
this._total = total; this._total = total;
this._pageNum = pageNum; this._pageNum = pageNum;
this._pageSize = pageSize; this._pageSize = pageSize;
this._hasNext = hasNext; this._hasNext = ((pageNum + 1) * pageSize) < total;
} }
public nextPage(): SearchPageInfo { public nextPage(): SearchPageInfo {
if (!this._hasNext) { if (!this._hasNext) {
return this; return this;
} }
if (((this._pageNum + 1) * this._pageSize) > this.total) {
return this;
}
return new SearchPageInfo(this.total, this._pageNum + 1, return new SearchPageInfo(this.total, this._pageNum + 1,
this._pageSize, ((this._pageNum + 2) * this._pageSize) > this.total); this._pageSize);
} }
public previousPage(): SearchPageInfo { public previousPage(): SearchPageInfo {
@ -27,7 +25,7 @@ export class SearchPageInfo {
return this; return this;
} }
return new SearchPageInfo(this.total, this._pageNum - 1, return new SearchPageInfo(this.total, this._pageNum - 1,
this._pageSize, true); this._pageSize);
} }

@ -1,21 +1,23 @@
import {FuzzySuggestModal, request, RequestUrlParam} from "obsidian"; import {
DoubanSearchResultSubjectNextPage,
DoubanSearchResultSubjectNextPageNeedLogin,
DoubanSearchResultSubjectPreviousPage,
NavigateType
} from "../../../constant/Constsant";
import {FuzzySuggestModal, RequestUrlParam, request} from "obsidian";
import DoubanPlugin from "../../../main"; import DoubanPlugin from "../../../main";
import DoubanSearchResultSubject from "../model/DoubanSearchResultSubject"; import DoubanSearchResultSubject from "../model/DoubanSearchResultSubject";
import {log} from "src/org/wanxp/utils/Logutil";
import {i18nHelper} from "../../../lang/helper";
import HandleContext from "../model/HandleContext"; import HandleContext from "../model/HandleContext";
import {init} from "cjs-module-lexer";
import {
DoubanSearchResultSubjectNextPage,
DoubanSearchResultSubjectNextPageNeedLogin, DoubanSearchResultSubjectPreviousPage, NavigateType
} from "../../../constant/Constsant";
import {SearchPageInfo} from "../model/SearchPageInfo";
import {flat} from "builtin-modules";
import User from "../../user/User";
import {load} from "cheerio";
import Searcher from "./Search";
import {SearchPage} from "../model/SearchPage"; import {SearchPage} from "../model/SearchPage";
import {SearchPageInfo} from "../model/SearchPageInfo";
import Searcher from "./Search";
import User from "../../user/User";
import {flat} from "builtin-modules";
import {i18nHelper} from "../../../lang/helper";
import {init} from "cjs-module-lexer";
import {load} from "cheerio";
import {log} from "src/org/wanxp/utils/Logutil";
export {DoubanFuzzySuggester} export {DoubanFuzzySuggester}
@ -52,9 +54,9 @@ class DoubanFuzzySuggester extends FuzzySuggestModal<DoubanSearchResultSubject>
return item.type == "navigate"; return item.type == "navigate";
} }
onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent): void { async onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent):Promise<void> {
if(this.isNavigate(item)) { if(this.isNavigate(item)) {
if (this.handleNavigate(item)) { if (await this.handleNavigate(item)) {
this.start(); this.start();
} }
return; return;
@ -84,9 +86,12 @@ class DoubanFuzzySuggester extends FuzzySuggestModal<DoubanSearchResultSubject>
log.warn(i18nHelper.getMessage("140304")); log.warn(i18nHelper.getMessage("140304"));
break; break;
} }
const searchPageResult:SearchPage = await Searcher.loadSearchItem(this.searchItem, currentPage.start, this.plugin.settings, this.plugin.settingsManager); if (result) {
const searchPageResult: SearchPage =
await Searcher.loadSearchItem(this.searchItem, currentPage.start, this.plugin.settings, this.plugin.settingsManager);
this.updatePageResult(searchPageResult); this.updatePageResult(searchPageResult);
this.context.searchPage = new SearchPageInfo(searchPageResult.total, currentPage.pageNum, searchPageResult.pageSize, searchPageResult.hasNext); this.context.searchPage = new SearchPageInfo(searchPageResult.total, currentPage.pageNum, searchPageResult.pageSize);
}
return result; return result;
} }

@ -1,15 +1,15 @@
import {RequestUrlParam, request, requestUrl} from "obsidian";
import DoubanSearchResultSubject from '../model/DoubanSearchResultSubject';
import SearchParserHandler from './SearchParser';
import {log} from 'src/org/wanxp/utils/Logutil';
import {request, requestUrl, RequestUrlParam} from "obsidian";
import {i18nHelper} from "../../../lang/helper";
import {load} from 'cheerio';
import {DoubanPluginSetting} from "../../setting/model/DoubanPluginSetting";
import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings"; import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings";
import {DoubanPluginSetting} from "../../setting/model/DoubanPluginSetting";
import DoubanSearchResultSubject from '../model/DoubanSearchResultSubject';
import {SearchPage} from "../model/SearchPage";
import SearchParserHandler from './SearchParser';
import SettingsManager from "../../setting/SettingsManager"; import SettingsManager from "../../setting/SettingsManager";
import User from "../../user/User"; import User from "../../user/User";
import {SearchPage} from "../model/SearchPage"; import {i18nHelper} from "../../../lang/helper";
import {load} from 'cheerio';
import {log} from 'src/org/wanxp/utils/Logutil';
export default class Searcher { export default class Searcher {
static search(searchItem: string, doubanSettings: DoubanPluginSetting, settingsManager:SettingsManager): Promise<DoubanSearchResultSubject[]> { static search(searchItem: string, doubanSettings: DoubanPluginSetting, settingsManager:SettingsManager): Promise<DoubanSearchResultSubject[]> {
@ -48,9 +48,10 @@ export default class Searcher {
if (doubanSettings.loginCookiesContent) { if (doubanSettings.loginCookiesContent) {
myHeaders.Cookie = doubanSettings.loginCookiesContent myHeaders.Cookie = doubanSettings.loginCookiesContent
} }
log.debug("请求更多页面"); const url:string = `https://www.douban.com/j/search?q=${searchItem}&start=${start}&subtype=item`;
log.debug(`请求更多页面:${url}`);
let requestUrlParam: RequestUrlParam = { let requestUrlParam: RequestUrlParam = {
url: `https://www.douban.com/j/search?q=${searchItem}&start=${start}&subtype=item`, url: url,
method: "GET", method: "GET",
headers: myHeaders, headers: myHeaders,
throw: true throw: true

@ -45,7 +45,7 @@ export default class SearchParserHandler {
.map(e => load(e)) .map(e => load(e))
.map(e=>this.parseSearch(e)) .map(e=>this.parseSearch(e))
.map(e => e? e[0]:null); .map(e => e? e[0]:null);
return new SearchPage(data.total, start / SEARCH_ITEM_PAGE_SIZE, data.limit, data.more, resultList); return new SearchPage(data.total, start / data.limit, data.limit, resultList);
}; };
} }