Browse Source

implemented fetching of previous month/year

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
main
Stephan Richter 10 months ago
parent
commit
5b05b85717
  1. 13
      de.srsoftware.cal.db/src/main/java/de/srsoftware/cal/db/MariaDB.java
  2. 3
      de.srsoftware.cal.web/src/main/resources/event.html
  3. 4
      de.srsoftware.cal.web/src/main/resources/index.html
  4. 0
      de.srsoftware.cal.web/src/main/resources/script/common.js
  5. 52
      de.srsoftware.cal.web/src/main/resources/script/event.js
  6. 118
      de.srsoftware.cal.web/src/main/resources/script/index.js

13
de.srsoftware.cal.db/src/main/java/de/srsoftware/cal/db/MariaDB.java

@ -4,8 +4,7 @@ package de.srsoftware.cal.db;
import static de.srsoftware.tools.Optionals.*; import static de.srsoftware.tools.Optionals.*;
import static de.srsoftware.tools.Result.transform; import static de.srsoftware.tools.Result.transform;
import static de.srsoftware.tools.Strings.camelCase; import static de.srsoftware.tools.Strings.camelCase;
import static de.srsoftware.tools.jdbc.Condition.equal; import static de.srsoftware.tools.jdbc.Condition.*;
import static de.srsoftware.tools.jdbc.Condition.moreThan;
import static de.srsoftware.tools.jdbc.Query.MARK; import static de.srsoftware.tools.jdbc.Query.MARK;
import static java.lang.System.Logger.Level.*; import static java.lang.System.Logger.Level.*;
@ -221,15 +220,17 @@ public class MariaDB implements Database {
@Override @Override
public List<Appointment> list(LocalDateTime from, LocalDateTime till) throws SQLException { public List<Appointment> list(LocalDateTime from, LocalDateTime till) throws SQLException {
var list = new ArrayList<Appointment>(); var list = new ArrayList<Appointment>();
var results = Query // var query = Query //
.select("appointments.*", "GROUP_CONCAT(keyword) AS tags") .select("appointments.*", "GROUP_CONCAT(keyword) AS tags")
.from(APPOINTMENTS) .from(APPOINTMENTS)
.leftJoin(AID, "appointment_tags", AID) .leftJoin(AID, "appointment_tags", AID)
.leftJoin("tid", "tags", "tid") .leftJoin("tid", "tags", "tid")
.groupBy(AID) .groupBy(AID)
.sort("start") .sort("start DESC");
.where("start", moreThan(from)) nullable(from).ifPresent(start -> query.where("start", moreThan(start)));
.exec(connection); nullable(till).ifPresent(end -> query.where("end",lessThan(end)));
var results = query.exec(connection);
while (results.next()) createAppointmentOf(results).optional().ifPresent(list::add); while (results.next()) createAppointmentOf(results).optional().ifPresent(list::add);
results.close(); results.close();
return list; return list;

3
de.srsoftware.cal.web/src/main/resources/event.html

@ -3,7 +3,8 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<title>SRSoftware OpenCloudCal</title> <title>SRSoftware OpenCloudCal</title>
<link rel="stylesheet" href="occ.css" /> <link rel="stylesheet" href="occ.css" />
<script src="/static/script/occ.js"></script> <script src="/static/script/common.js"></script>
<script src="/static/script/event.js"></script>
</head> </head>
<body class="event"> <body class="event">
<nav /> <nav />

4
de.srsoftware.cal.web/src/main/resources/index.html

@ -3,12 +3,14 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<title>SRSoftware OpenCloudCal</title> <title>SRSoftware OpenCloudCal</title>
<link rel="stylesheet" href="/static/occ.css" /> <link rel="stylesheet" href="/static/occ.css" />
<script src="/static/script/occ.js"></script> <script src="/static/script/common.js"></script>
<script src="/static/script/index.js"></script>
</head> </head>
<body> <body>
<nav /> <nav />
<div> <div>
<h1>Event List</h1> <h1>Event List</h1>
<div id="eventnav"></div>
<table id="eventlist"> <table id="eventlist">
<tr> <tr>
<th>ID</th> <th>ID</th>

0
de.srsoftware.cal.web/src/main/resources/script/common.js

52
de.srsoftware.cal.web/src/main/resources/script/event.js

@ -0,0 +1,52 @@
function addDescription(json){
var desc = json.description ? json.description : '';
if (desc.indexOf('<')<0) desc = desc.replace(/\r?\n|\r/g,'<br/>');
document.getElementById('description').innerHTML = desc;
}
function attachmentList(json){
var attachments = document.getElementById('attachments');
attachments.innerHTML = '';
for (var attachment of json){
if (attachment.mime.startsWith('image')){
var img = document.createElement('img');
img.src = attachment.url;
attachments.appendChild(img);
}
}
}
async function handleEventData(response){
if (response.ok){
var json = await response.json();
document.getElementsByTagName('h1')[0].innerHTML = json.title ? json.title : '';
document.getElementById('time').innerHTML = json.start + (json.end ? '…'+json.end : '');
addDescription(json);
document.getElementById('tags').innerHTML = "Tags: "+json.tags.join(" ");
var links = document.getElementById('links');
links.innerHTML = "";
links.appendChild(linkList(json.links));
attachmentList(json.attachments);
}
}
function linkList(json){
var ul = document.createElement('ul');
for (var inner of json) {
var a = document.createElement('a');
a.href = inner.url;
a.innerHTML = inner.description;
a.target = '_blank';
var li = document.createElement('li')
li.appendChild(a);
ul.appendChild(li);
}
return ul;
}
function loadEventData(){
const urlParams = new URLSearchParams(window.location.search);
var id = urlParams.get('id');
if (id) fetch('/api/event?id='+id).then(handleEventData);
}

118
de.srsoftware.cal.web/src/main/resources/script/occ.js → de.srsoftware.cal.web/src/main/resources/script/index.js

@ -1,15 +1,6 @@
var start = null; var start = null;
var end = null; var end = null;
function fetchEvents(start, end){
var path = '/api/events/list';
if (start) {
path += '?start='+start;
if (end) path+= '&end='+end;
}
fetch(path).then(handleEvents);
}
function addCell(row,content,id){ function addCell(row,content,id){
var a = document.createElement('a'); var a = document.createElement('a');
if (content){ if (content){
@ -19,18 +10,9 @@ function addCell(row,content,id){
row.insertCell().appendChild(a); row.insertCell().appendChild(a);
} }
function showOverlay(url){
var div = document.getElementById('overlay');
var iframe = document.createElement('iframe');
iframe.src = url;
div.appendChild(iframe);
div.style.display = 'block';
div.onclick = e => div.style.display = 'none';
}
function addRow(json){ function addRow(json){
var table = document.getElementById('eventlist'); var table = document.getElementById('eventlist');
var row = table.insertRow(); var row = table.insertRow(1);
addCell(row,json.id,json.id); addCell(row,json.id,json.id);
addCell(row,json.start,json.id); addCell(row,json.start,json.id);
addCell(row,json.end,json.id); addCell(row,json.end,json.id);
@ -51,51 +33,41 @@ function createTags(tagList){
return td; return td;
} }
async function handleEventData(response){ function fetchEvents(start, end){
if (response.ok){ var path = '/api/events/list';
var json = await response.json(); if (start) {
document.getElementsByTagName('h1')[0].innerHTML = json.title ? json.title : ''; path += '?start='+start;
document.getElementById('time').innerHTML = json.start + (json.end ? '…'+json.end : ''); if (end) path+= '&end='+end;
addDescription(json);
document.getElementById('tags').innerHTML = "Tags: "+json.tags.join(" ");
var links = document.getElementById('links');
links.innerHTML = "";
links.appendChild(linkList(json.links));
attachmentList(json.attachments);
}
} }
fetch(path).then(handleEvents);
function addDescription(json){
var desc = json.description ? json.description : '';
if (desc.indexOf('<')<0) desc = desc.replace(/\r?\n|\r/g,'<br/>');
document.getElementById('description').innerHTML = desc;
} }
function attachmentList(json){ function fetchLastMonth(){
var attachments = document.getElementById('attachments'); console.log('fetchLastMonth, start = ',start);
attachments.innerHTML = ''; var startDate = new Date(Date.parse(start+'-01'));
for (var attachment of json){ var month = startDate.getMonth() +1;
if (attachment.mime.startsWith('image')){ var year = startDate.getFullYear();
var img = document.createElement('img'); console.log({start:start,month:month,year:year});
img.src = attachment.url; month -= 1;
attachments.appendChild(img); if (month < 1) {
} year--;
} month+=12;
}
end = start;
start = year + '-' + (month<10 ? '0' : '') + month;
console.log({start:start,month:month,year:year});
fetchEvents(start,end);
} }
function linkList(json){ function fetchLastYear(){
var ul = document.createElement('ul'); console.log('fetchLastYear');
for (var inner of json) { var startDate = new Date(Date.parse(start+'-01'));
var a = document.createElement('a'); var month = startDate.getMonth() +1;
a.href = inner.url; var year = startDate.getFullYear();
a.innerHTML = inner.description; if (month <= 1) year --;
a.target = '_blank'; month = 1;
var li = document.createElement('li') start = year + '-' + (month<10 ? '0' : '') + month;
li.appendChild(a); fetchEvents(start,end);
ul.appendChild(li);
}
return ul;
} }
async function handleEvents(response){ async function handleEvents(response){
@ -111,19 +83,33 @@ function loadCurrentEvents(){
var year = now.getFullYear(); var year = now.getFullYear();
var month = now.getMonth() + 1; var month = now.getMonth() + 1;
start = year + '-' + (month < 10 ? '0' : '') + month; start = year + '-' + (month < 10 ? '0' : '') + month;
updateLoader(start);
fetchEvents(start,end); fetchEvents(start,end);
} }
} }
function loadEventData(){ function showOverlay(url){
const urlParams = new URLSearchParams(window.location.search); var div = document.getElementById('overlay');
var id = urlParams.get('id'); var iframe = document.createElement('iframe');
if (id){ iframe.src = url;
fetch('/api/event?id='+id).then(handleEventData) div.appendChild(iframe);
} div.style.display = 'block';
div.onclick = e => div.style.display = 'none';
} }
function toggleTag(tag){ function toggleTag(tag){
alert(`toggleTag(${tag})`); alert(`toggleTag(${tag})`);
} }
function updateLoader(){
var nav = document.getElementById('eventnav');
nav.innerHTML = '';
var lastMonth = document.createElement('button');
lastMonth.innerHTML = 'Load previous month';
lastMonth.onclick = e => fetchLastMonth();
var lastYear = document.createElement('button');
lastYear.innerHTML = 'Load previous year';
lastYear.onclick = e => fetchLastYear();
nav.appendChild(lastMonth);
nav.appendChild(lastYear);
}
Loading…
Cancel
Save