Mercurial Hosting > linkmystyle
comparison src/analytics.html.luan @ 0:8f4df159f06b
start public repo
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 11 Jul 2025 20:57:49 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:8f4df159f06b |
---|---|
1 local Luan = require "luan:Luan.luan" | |
2 local error = Luan.error | |
3 local Parsers = require "luan:Parsers.luan" | |
4 local json_string = Parsers.json_string or error() | |
5 local Io = require "luan:Io.luan" | |
6 local Http = require "luan:http/Http.luan" | |
7 local Shared = require "site:/lib/Shared.luan" | |
8 local head = Shared.head or error() | |
9 local body_header = Shared.body_header or error() | |
10 local footer = Shared.footer or error() | |
11 local compressed = Shared.compressed or error() | |
12 local User = require "site:/lib/User.luan" | |
13 local Reporting = require "site:/lib/Reporting.luan" | |
14 local get_data = Reporting.get_data or error() | |
15 local Logging = require "luan:logging/Logging.luan" | |
16 local logger = Logging.logger "analytics_new.html" | |
17 | |
18 | |
19 return function() | |
20 local user = User.current_required() | |
21 if user==nil then return end | |
22 local user_name = user.name | |
23 Io.stdout = Http.response.text_writer() | |
24 %> | |
25 <!doctype html> | |
26 <html lang="en"> | |
27 <head> | |
28 <% head() %> | |
29 <title>Link My Style</title> | |
30 <style> | |
31 h1 { | |
32 text-align: center; | |
33 margin-bottom: 0; | |
34 } | |
35 p[top] { | |
36 text-align: center; | |
37 } | |
38 div[report] { | |
39 max-width: 600px; | |
40 margin-left: auto; | |
41 margin-right: auto; | |
42 margin-top: 20px; | |
43 margin-bottom: 20px; | |
44 } | |
45 @media (max-width: 700px) { | |
46 div[report] { | |
47 max-width: 90%; | |
48 } | |
49 } | |
50 </style> | |
51 <script src="https://cdn.jsdelivr.net/npm/apexcharts"></script> | |
52 <script> | |
53 <% | |
54 do | |
55 local data = get_data( "+type:visit +owner:"..user_name ) | |
56 %> | |
57 function initTraffic() { | |
58 let options = { | |
59 chart: { | |
60 type: 'line' | |
61 }, | |
62 series: [{ | |
63 name: 'Visitors', | |
64 data: <%=json_string(data,compressed)%>, | |
65 }], | |
66 xaxis: { | |
67 type: 'datetime' | |
68 }, | |
69 title: { | |
70 text: 'Traffic' | |
71 } | |
72 }; | |
73 let div = document.querySelector('div[report="traffic"]'); | |
74 let chart = new ApexCharts( div, options ); | |
75 chart.render(); | |
76 } | |
77 <% | |
78 end_do | |
79 do | |
80 local data = get_data( "+type:page_view +owner:"..user_name, "value" ) | |
81 %> | |
82 function initPages() { | |
83 let data = <%=json_string(data,compressed)%>; | |
84 let options = { | |
85 chart: { | |
86 type: 'bar', | |
87 height: barChartHeight(data.length) | |
88 }, | |
89 plotOptions: { | |
90 bar: { | |
91 horizontal: true | |
92 } | |
93 }, | |
94 series: [{ | |
95 name: 'Visitors', | |
96 data: data, | |
97 }], | |
98 title: { | |
99 text: 'Pages' | |
100 } | |
101 }; | |
102 let div = document.querySelector('div[report="pages"]'); | |
103 let chart = new ApexCharts( div, options ); | |
104 chart.render(); | |
105 } | |
106 <% | |
107 end_do | |
108 do | |
109 local data = get_data( "+type:link_click +owner:"..user_name, "value" ) | |
110 %> | |
111 function initClicks() { | |
112 let data = <%=json_string(data,compressed)%>; | |
113 let options = { | |
114 chart: { | |
115 type: 'bar', | |
116 height: barChartHeight(data.length) | |
117 }, | |
118 plotOptions: { | |
119 bar: { | |
120 horizontal: true | |
121 } | |
122 }, | |
123 series: [{ | |
124 name: 'Clicks', | |
125 data: data, | |
126 }], | |
127 title: { | |
128 text: 'Clicks by page and link' | |
129 } | |
130 }; | |
131 let div = document.querySelector('div[report="clicks"]'); | |
132 let chart = new ApexCharts( div, options ); | |
133 chart.render(); | |
134 } | |
135 <% | |
136 end_do | |
137 do | |
138 local data = get_data( "+type:referrer +owner:"..user_name, "value" ) | |
139 %> | |
140 function initReferrers() { | |
141 let data = <%=json_string(data,compressed)%>; | |
142 let options = { | |
143 chart: { | |
144 type: 'bar', | |
145 height: barChartHeight(data.length) | |
146 }, | |
147 plotOptions: { | |
148 bar: { | |
149 horizontal: true | |
150 } | |
151 }, | |
152 series: [{ | |
153 name: 'Visitors', | |
154 data: data, | |
155 }], | |
156 title: { | |
157 text: 'Referring Domains' | |
158 } | |
159 }; | |
160 let div = document.querySelector('div[report="referrers"]'); | |
161 let chart = new ApexCharts( div, options ); | |
162 chart.render(); | |
163 } | |
164 <% | |
165 end_do | |
166 %> | |
167 function init() { | |
168 initTraffic(); | |
169 initPages(); | |
170 initClicks(); | |
171 initReferrers(); | |
172 } | |
173 </script> | |
174 </head> | |
175 <body onload="init()"> | |
176 <div full> | |
177 <% body_header() %> | |
178 <h1>Analytics</h1> | |
179 <p top>For the last 30 days</p> | |
180 <div report=traffic></div> | |
181 <div report=pages></div> | |
182 <div report=clicks></div> | |
183 <div report=referrers></div> | |
184 <% footer() %> | |
185 </div> | |
186 </body> | |
187 </html> | |
188 <% | |
189 end |