move some code around (no logic changes)
This commit is contained in:
@@ -251,31 +251,6 @@ export default class EntityGrid extends Vue {
|
||||
@Prop({ required: true })
|
||||
entityType!: "people" | "projects";
|
||||
|
||||
// Search state
|
||||
searchTerm = "";
|
||||
isSearching = false;
|
||||
searchTimeout: NodeJS.Timeout | null = null;
|
||||
filteredEntities: Contact[] | PlanData[] = [];
|
||||
searchBeforeId: string | undefined = undefined;
|
||||
isLoadingSearchMore = false;
|
||||
|
||||
// API server for project searches
|
||||
apiServer = "";
|
||||
|
||||
// Internal project state (when entities prop not provided for projects)
|
||||
allProjects: PlanData[] = [];
|
||||
loadBeforeId: string | undefined = undefined;
|
||||
isLoadingProjects = false;
|
||||
|
||||
// Infinite scroll state
|
||||
displayedCount = INITIAL_BATCH_SIZE;
|
||||
infiniteScrollReset?: () => void;
|
||||
scrollContainer?: HTMLElement;
|
||||
|
||||
// Starred projects state (for showing recently starred projects)
|
||||
starredPlanHandleIds: string[] = [];
|
||||
recentStarredProjects: PlanData[] = [];
|
||||
|
||||
/**
|
||||
* Array of entities to display
|
||||
*
|
||||
@@ -327,6 +302,31 @@ export default class EntityGrid extends Vue {
|
||||
@Prop({ default: "other party" })
|
||||
conflictContext!: string;
|
||||
|
||||
// Search state
|
||||
searchTerm = "";
|
||||
isSearching = false;
|
||||
searchTimeout: NodeJS.Timeout | null = null;
|
||||
filteredEntities: Contact[] | PlanData[] = [];
|
||||
searchBeforeId: string | undefined = undefined;
|
||||
isLoadingSearchMore = false;
|
||||
|
||||
// API server for project searches
|
||||
apiServer = "";
|
||||
|
||||
// Internal project state (when entities prop not provided for projects)
|
||||
allProjects: PlanData[] = [];
|
||||
loadBeforeId: string | undefined = undefined;
|
||||
isLoadingProjects = false;
|
||||
|
||||
// Infinite scroll state
|
||||
displayedCount = INITIAL_BATCH_SIZE;
|
||||
infiniteScrollReset?: () => void;
|
||||
scrollContainer?: HTMLElement;
|
||||
|
||||
// Starred projects state (for showing recently starred projects)
|
||||
starredPlanHandleIds: string[] = [];
|
||||
recentStarredProjects: PlanData[] = [];
|
||||
|
||||
/**
|
||||
* CSS classes for the empty state message
|
||||
*/
|
||||
@@ -716,57 +716,6 @@ export default class EntityGrid extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the most recently starred projects
|
||||
* The starredPlanHandleIds array order represents starred order (newest at the end)
|
||||
*/
|
||||
async loadRecentStarredProjects(): Promise<void> {
|
||||
if (
|
||||
this.entityType !== "projects" ||
|
||||
this.searchTerm.trim() ||
|
||||
this.starredPlanHandleIds.length === 0
|
||||
) {
|
||||
this.recentStarredProjects = [];
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the last 3 starred IDs (most recently starred)
|
||||
const recentStarredIds = this.starredPlanHandleIds.slice(
|
||||
-RECENT_STARRED_PROJECTS_COUNT,
|
||||
);
|
||||
|
||||
// Find projects matching those IDs, sorting with newest first
|
||||
const projects = this.entitiesToUse as PlanData[];
|
||||
const recentProjects = recentStarredIds
|
||||
.map((id) => projects.find((p) => p.handleId === id))
|
||||
.filter((p): p is PlanData => p !== undefined)
|
||||
.reverse();
|
||||
|
||||
// If any projects are not found, fetch them from the API server
|
||||
if (recentProjects.length < recentStarredIds.length) {
|
||||
const missingIds = recentStarredIds.filter(
|
||||
(id) => !recentProjects.some((p) => p.handleId === id),
|
||||
);
|
||||
const missingProjects = await this.fetchProjectsByIds(missingIds);
|
||||
recentProjects.push(...missingProjects);
|
||||
}
|
||||
this.recentStarredProjects = recentProjects;
|
||||
}
|
||||
|
||||
async fetchProjectsByIds(ids: string[]): Promise<PlanData[]> {
|
||||
const idsString = encodeURIComponent(JSON.stringify(ids));
|
||||
const url = `${this.apiServer}/api/v2/report/plans?planHandleIds=${idsString}`;
|
||||
const response = await fetch(url, {
|
||||
method: "GET",
|
||||
headers: await getHeaders(this.activeDid),
|
||||
});
|
||||
if (response.status !== 200) {
|
||||
throw new Error("Failed to fetch projects");
|
||||
}
|
||||
const results = await response.json();
|
||||
return results.data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch projects from API server
|
||||
* Unified method for both loading all projects and searching projects.
|
||||
@@ -920,6 +869,57 @@ export default class EntityGrid extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the most recently starred projects
|
||||
* The starredPlanHandleIds array order represents starred order (newest at the end)
|
||||
*/
|
||||
async loadRecentStarredProjects(): Promise<void> {
|
||||
if (
|
||||
this.entityType !== "projects" ||
|
||||
this.searchTerm.trim() ||
|
||||
this.starredPlanHandleIds.length === 0
|
||||
) {
|
||||
this.recentStarredProjects = [];
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the last 3 starred IDs (most recently starred)
|
||||
const recentStarredIds = this.starredPlanHandleIds.slice(
|
||||
-RECENT_STARRED_PROJECTS_COUNT,
|
||||
);
|
||||
|
||||
// Find projects matching those IDs, sorting with newest first
|
||||
const projects = this.entitiesToUse as PlanData[];
|
||||
const recentProjects = recentStarredIds
|
||||
.map((id) => projects.find((p) => p.handleId === id))
|
||||
.filter((p): p is PlanData => p !== undefined)
|
||||
.reverse();
|
||||
|
||||
// If any projects are not found, fetch them from the API server
|
||||
if (recentProjects.length < recentStarredIds.length) {
|
||||
const missingIds = recentStarredIds.filter(
|
||||
(id) => !recentProjects.some((p) => p.handleId === id),
|
||||
);
|
||||
const missingProjects = await this.fetchProjectsByIds(missingIds);
|
||||
recentProjects.push(...missingProjects);
|
||||
}
|
||||
this.recentStarredProjects = recentProjects;
|
||||
}
|
||||
|
||||
async fetchProjectsByIds(ids: string[]): Promise<PlanData[]> {
|
||||
const idsString = encodeURIComponent(JSON.stringify(ids));
|
||||
const url = `${this.apiServer}/api/v2/report/plans?planHandleIds=${idsString}`;
|
||||
const response = await fetch(url, {
|
||||
method: "GET",
|
||||
headers: await getHeaders(this.activeDid),
|
||||
});
|
||||
if (response.status !== 200) {
|
||||
throw new Error("Failed to fetch projects");
|
||||
}
|
||||
const results = await response.json();
|
||||
return results.data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Client-side contact search
|
||||
* Assumes entities prop contains complete contact list from local database
|
||||
|
||||
Reference in New Issue
Block a user