implemented fetching of previous month/year
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -4,8 +4,7 @@ package de.srsoftware.cal.db;
|
||||
import static de.srsoftware.tools.Optionals.*;
|
||||
import static de.srsoftware.tools.Result.transform;
|
||||
import static de.srsoftware.tools.Strings.camelCase;
|
||||
import static de.srsoftware.tools.jdbc.Condition.equal;
|
||||
import static de.srsoftware.tools.jdbc.Condition.moreThan;
|
||||
import static de.srsoftware.tools.jdbc.Condition.*;
|
||||
import static de.srsoftware.tools.jdbc.Query.MARK;
|
||||
import static java.lang.System.Logger.Level.*;
|
||||
|
||||
@@ -221,15 +220,17 @@ public class MariaDB implements Database {
|
||||
@Override
|
||||
public List<Appointment> list(LocalDateTime from, LocalDateTime till) throws SQLException {
|
||||
var list = new ArrayList<Appointment>();
|
||||
var results = Query //
|
||||
.select("appointments.*", "GROUP_CONCAT(keyword) AS tags")
|
||||
.from(APPOINTMENTS)
|
||||
.leftJoin(AID, "appointment_tags", AID)
|
||||
.leftJoin("tid", "tags", "tid")
|
||||
.groupBy(AID)
|
||||
.sort("start")
|
||||
.where("start", moreThan(from))
|
||||
.exec(connection);
|
||||
var query = Query //
|
||||
.select("appointments.*", "GROUP_CONCAT(keyword) AS tags")
|
||||
.from(APPOINTMENTS)
|
||||
.leftJoin(AID, "appointment_tags", AID)
|
||||
.leftJoin("tid", "tags", "tid")
|
||||
.groupBy(AID)
|
||||
.sort("start DESC");
|
||||
nullable(from).ifPresent(start -> query.where("start", moreThan(start)));
|
||||
nullable(till).ifPresent(end -> query.where("end",lessThan(end)));
|
||||
|
||||
var results = query.exec(connection);
|
||||
while (results.next()) createAppointmentOf(results).optional().ifPresent(list::add);
|
||||
results.close();
|
||||
return list;
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
<meta charset="UTF-8" />
|
||||
<title>SRSoftware OpenCloudCal</title>
|
||||
<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>
|
||||
<body class="event">
|
||||
<nav />
|
||||
|
||||
@@ -3,12 +3,14 @@
|
||||
<meta charset="UTF-8" />
|
||||
<title>SRSoftware OpenCloudCal</title>
|
||||
<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>
|
||||
<body>
|
||||
<nav />
|
||||
<div>
|
||||
<h1>Event List</h1>
|
||||
<div id="eventnav"></div>
|
||||
<table id="eventlist">
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
|
||||
52
de.srsoftware.cal.web/src/main/resources/script/event.js
Normal file
52
de.srsoftware.cal.web/src/main/resources/script/event.js
Normal file
@@ -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);
|
||||
}
|
||||
|
||||
@@ -1,15 +1,6 @@
|
||||
var start = 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){
|
||||
var a = document.createElement('a');
|
||||
if (content){
|
||||
@@ -19,18 +10,9 @@ function addCell(row,content,id){
|
||||
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){
|
||||
var table = document.getElementById('eventlist');
|
||||
var row = table.insertRow();
|
||||
var row = table.insertRow(1);
|
||||
addCell(row,json.id,json.id);
|
||||
addCell(row,json.start,json.id);
|
||||
addCell(row,json.end,json.id);
|
||||
@@ -51,51 +33,41 @@ function createTags(tagList){
|
||||
return td;
|
||||
}
|
||||
|
||||
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 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);
|
||||
}
|
||||
function fetchEvents(start, end){
|
||||
var path = '/api/events/list';
|
||||
if (start) {
|
||||
path += '?start='+start;
|
||||
if (end) path+= '&end='+end;
|
||||
}
|
||||
fetch(path).then(handleEvents);
|
||||
}
|
||||
|
||||
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 fetchLastMonth(){
|
||||
console.log('fetchLastMonth, start = ',start);
|
||||
var startDate = new Date(Date.parse(start+'-01'));
|
||||
var month = startDate.getMonth() +1;
|
||||
var year = startDate.getFullYear();
|
||||
console.log({start:start,month:month,year:year});
|
||||
month -= 1;
|
||||
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 fetchLastYear(){
|
||||
console.log('fetchLastYear');
|
||||
var startDate = new Date(Date.parse(start+'-01'));
|
||||
var month = startDate.getMonth() +1;
|
||||
var year = startDate.getFullYear();
|
||||
if (month <= 1) year --;
|
||||
month = 1;
|
||||
start = year + '-' + (month<10 ? '0' : '') + month;
|
||||
fetchEvents(start,end);
|
||||
}
|
||||
|
||||
async function handleEvents(response){
|
||||
@@ -111,19 +83,33 @@ function loadCurrentEvents(){
|
||||
var year = now.getFullYear();
|
||||
var month = now.getMonth() + 1;
|
||||
start = year + '-' + (month < 10 ? '0' : '') + month;
|
||||
updateLoader(start);
|
||||
fetchEvents(start,end);
|
||||
}
|
||||
}
|
||||
|
||||
function loadEventData(){
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
var id = urlParams.get('id');
|
||||
if (id){
|
||||
fetch('/api/event?id='+id).then(handleEventData)
|
||||
}
|
||||
|
||||
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 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);
|
||||
}
|
||||
Reference in New Issue
Block a user