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.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,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 />
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
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 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
fetch(path).then(handleEvents);
|
||||||
}
|
}
|
||||||
|
|
||||||
function linkList(json){
|
function fetchLastMonth(){
|
||||||
var ul = document.createElement('ul');
|
console.log('fetchLastMonth, start = ',start);
|
||||||
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;
|
console.log({start:start,month:month,year:year});
|
||||||
a.target = '_blank';
|
month -= 1;
|
||||||
var li = document.createElement('li')
|
if (month < 1) {
|
||||||
li.appendChild(a);
|
year--;
|
||||||
ul.appendChild(li);
|
month+=12;
|
||||||
}
|
}
|
||||||
return ul;
|
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){
|
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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user