summaryrefslogtreecommitdiff
path: root/p/scripts/global_view.js
blob: b1581614ae285016474c24cb59987c26f2106cc1 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
"use strict";
/* globals context, init_load_more, init_posts, init_stream */
/* jshint esversion:6, strict:global */

var panel_loading = false;

function load_panel(link) {
	if (panel_loading) {
		return;
	}

	panel_loading = true;

	const req = new XMLHttpRequest();
	req.open('GET', link, true);
	req.responseType = 'document';
	req.onload = function (e) {
			if (this.status != 200) {
				return;
			}
			const html = this.response,
				foreign = html.querySelectorAll('.nav_menu, #stream .day, #stream .flux, #stream .pagination, #stream.prompt'),
				panel = document.getElementById('panel');
			foreign.forEach(function (el) {
					panel.appendChild(document.adoptNode(el));
				});
			panel.querySelectorAll('.nav_menu > :not([id="nav_menu_read_all"])').forEach(function (el) {
					el.remove();
				});

			init_load_more(panel);
			init_posts();

			document.getElementById('overlay').classList.add('visible');
			panel.classList.add('visible');

			// force le démarrage du scroll en haut.
			// Sans ça, si l'on scroll en lisant une catégorie par exemple,
			// en en ouvrant une autre ensuite, on se retrouve au même point de scroll
			panel.scrollTop = 0;
			document.documentElement.scrollTop = 0;

			//We already have a click listener in main.js
			panel.addEventListener('click', function (ev) {
					const b = ev.target.closest('#nav_menu_read_all button, #bigMarkAsRead');
					if (b) {
						console.log(b.formAction);

						const req2 = new XMLHttpRequest();
						req2.open('POST', b.formAction, false);
						req2.setRequestHeader('Content-Type', 'application/json');
						req2.send(JSON.stringify({
								_csrf: context.csrf,
							}));
						if (req2.status == 200) {
							location.reload(false);
							return false;
						}
					}
				});

			panel_loading = false;
		};
	req.send();
}

function init_close_panel() {
	const panel = document.getElementById('panel');
	document.querySelector('#overlay .close').onclick = function (ev) {
			panel.innerHTML = '';
			panel.classList.remove('visible');
			document.getElementById('overlay').classList.remove('visible');
			return false;
		};
}

function init_global_view() {
	// TODO: should be based on generic classes
	document.querySelectorAll('.box a').forEach(function (a) {
			a.onclick = function (ev) {
					load_panel(a.href);
					return false;
				};
		});

	document.querySelectorAll('.nav_menu #nav_menu_read_all, .nav_menu .toggle_aside').forEach(function (el) {
			el.remove();
		});

	const panel = document.getElementById('panel');
	init_stream(panel);
}

function init_all_global_view() {
	if (!window.context) {
		if (window.console) {
			console.log('FreshRSS Global view waiting for JS…');
		}
		window.setTimeout(init_all_global_view, 50);	//Wait for all js to be loaded
		return;
	}
	init_global_view();
	init_close_panel();
}

if (document.readyState && document.readyState !== 'loading') {
	init_all_global_view();
} else {
	document.addEventListener('DOMContentLoaded', function () {
		init_all_global_view();
	}, false);
}