blob: 864110e5177b171a653d7aafa9f502157668ed13 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
import { reactive, computed, readonly } from 'vue';
import AjaxHelper from '../AjaxHelper/AjaxHelper';
import { Widget } from '../Widget/Widgets.store';
interface CategoryRef {
id: string;
name: string;
}
interface SubcategoryRef {
id: string;
name: string;
}
export interface Page {
category: CategoryRef;
subcategory: SubcategoryRef;
widgets: Widget[];
}
interface ReportingPagesStoreState {
pages: Page[];
}
export class ReportingPagesStore {
private privateState = reactive<ReportingPagesStoreState>({
pages: [],
});
private state = readonly(this.privateState);
private fetchAllPagesPromise?: Promise<Page[]>;
readonly pages = computed(() => this.state.pages);
findPageInCategory(categoryId: string): Page {
// happens when user switches between sites, in this case check if the same category exists and
// if so, select first entry from that category
return this.pages.value.find((p) => p
&& p.category && p.category.id === categoryId && p.subcategory && p.subcategory.id);
}
findPage(categoryId: string, subcategoryId: string): Page {
return this.pages.value.find((p) => p
&& p.category && p.subcategory && p.category.id === categoryId
&& `${p.subcategory.id}` === subcategoryId);
}
reloadAllPages(): Promise<typeof ReportingPagesStore['pages']['value']> {
this.fetchAllPagesPromise = null;
return this.getAllPages();
}
getAllPages(): Promise<typeof ReportingPagesStore['pages']['value']> {
if (!this.fetchAllPagesPromise) {
this.fetchAllPagesPromise = AjaxHelper.fetch({
method: 'API.getReportPagesMetadata',
filter_limit: '-1',
}).then((response) => {
this.privateState.pages = response;
});
}
return this.fetchAllPagesPromise.then(() => this.pages.value);
}
}
export default new ReportingPagesStore();
|