Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/CoreHome/vue/src/SiteSelector/SitesStore.ts')
-rw-r--r--plugins/CoreHome/vue/src/SiteSelector/SitesStore.ts46
1 files changed, 42 insertions, 4 deletions
diff --git a/plugins/CoreHome/vue/src/SiteSelector/SitesStore.ts b/plugins/CoreHome/vue/src/SiteSelector/SitesStore.ts
index 536103494e..38e905b693 100644
--- a/plugins/CoreHome/vue/src/SiteSelector/SitesStore.ts
+++ b/plugins/CoreHome/vue/src/SiteSelector/SitesStore.ts
@@ -20,24 +20,60 @@ interface SitesStoreState {
isInitialized: boolean;
}
+interface SitesStoreStateFiltered extends SitesStoreState {
+ excludedSites: number[];
+}
+
class SitesStore {
private state = reactive<SitesStoreState>({
initialSites: [],
isInitialized: false,
});
+ private stateFiltered = reactive<SitesStoreStateFiltered>({
+ initialSites: [],
+ isInitialized: false,
+ excludedSites: [],
+ });
+
private currentRequestAbort: AbortController | null = null;
private limitRequest?: Promise<{ value: number|string }>;
public readonly initialSites = computed(() => readonly(this.state.initialSites));
- loadInitialSites(onlySitesWithAdminAccess = false): Promise<DeepReadonly<Site[]>|null> {
+ public readonly initialSitesFiltered = computed(() => readonly(this.stateFiltered.initialSites));
+
+ loadInitialSites(onlySitesWithAdminAccess = false,
+ sitesToExclude: number[] = []): Promise<DeepReadonly<Site[]>|null> {
+ if (this.state.isInitialized && sitesToExclude.length === 0) {
+ return Promise.resolve(readonly(this.state.initialSites));
+ }
+
+ // If the filtered state has already been initialized with the same sites, return that.
+ if (this.stateFiltered.isInitialized
+ && sitesToExclude.length === this.stateFiltered.excludedSites.length
+ && (sitesToExclude.every((val, index) => val === this.stateFiltered.excludedSites[index]))) {
+ return Promise.resolve(readonly(this.stateFiltered.initialSites));
+ }
+
+ // If we want to exclude certain sites, perform the search for that.
+ if (sitesToExclude.length > 0) {
+ this.searchSite('%', onlySitesWithAdminAccess, sitesToExclude).then((sites) => {
+ this.stateFiltered.isInitialized = true;
+ this.stateFiltered.excludedSites = sitesToExclude;
+ if (sites !== null) {
+ this.stateFiltered.initialSites = sites;
+ }
+ });
+ }
+
+ // If the main state has already been initialized, no need to continue.
if (this.state.isInitialized) {
return Promise.resolve(readonly(this.state.initialSites));
}
- return this.searchSite('%', onlySitesWithAdminAccess).then((sites) => {
+ return this.searchSite('%', onlySitesWithAdminAccess, sitesToExclude).then((sites) => {
this.state.isInitialized = true;
if (sites !== null) {
this.state.initialSites = sites;
@@ -68,9 +104,10 @@ class SitesStore {
}
}
- searchSite(term?: string, onlySitesWithAdminAccess = false): Promise<DeepReadonly<Site[]>|null> {
+ searchSite(term?: string, onlySitesWithAdminAccess = false,
+ sitesToExclude: number[] = []): Promise<DeepReadonly<Site[]>|null> {
if (!term) {
- return this.loadInitialSites();
+ return this.loadInitialSites(onlySitesWithAdminAccess, sitesToExclude);
}
if (this.currentRequestAbort) {
@@ -94,6 +131,7 @@ class SitesStore {
method: methodToCall,
limit,
pattern: term,
+ sitesToExclude,
}, {
abortController: this.currentRequestAbort,
});