5 Commits

Author SHA1 Message Date
d22acff11f Version Tag added. 2023-12-28 00:44:20 +01:00
09962d8720 Bug in the reminder fixed:
The reminder was entered one day too early.
2023-12-28 00:36:15 +01:00
Max P
f8a78060c9 Merge pull request #5 from PxaMMaxP/dev/link-trash-calender-arnsberg
More scripts added.
2023-12-28 00:04:59 +01:00
Max P
73145637c6 Update README.md 2023-12-27 23:59:02 +01:00
Max P
877f36fa55 Merge pull request #4 from PxaMMaxP/dev/link-trash-calender-arnsberg
Download link added.
2023-12-27 23:56:18 +01:00
9 changed files with 27 additions and 12 deletions

View File

@@ -3,10 +3,10 @@
## Hauptmerkmale ## Hauptmerkmale
- **Einfaches Hochladen**: Benutzer können ihre bestehenden iCalendar-Dateien des Abfallkalenders direkt in die App hochladen. - **Einfaches Hochladen**: Benutzer können ihre bestehenden iCalendar-Dateien des Abfallkalenders direkt in die App hochladen.
**Flexible Erinnerungseinstellungen**: Benutzer haben die Möglichkeit, Erinnerungszeiten individuell anzupassen, um ihren persönlichen Bedürfnissen gerecht zu werden. - **Flexible Erinnerungseinstellungen**: Benutzer haben die Möglichkeit, Erinnerungszeiten individuell anzupassen, um ihren persönlichen Bedürfnissen gerecht zu werden.
**Automatische Aktualisierung**: Die App fügt automatisch Erinnerungen zu allen Ereignissen in der iCalendar-Datei hinzu und generiert eine neue Datei zur einfachen Integration in persönliche Kalenderanwendungen. - **Automatische Aktualisierung**: Die App fügt automatisch Erinnerungen zu allen Ereignissen in der iCalendar-Datei hinzu und generiert eine neue Datei zur einfachen Integration in persönliche Kalenderanwendungen.
**Benutzerfreundliches Interface**: Eine klare und einfache Benutzeroberfläche macht die Bedienung der App für jedermann leicht und intuitiv. - **Benutzerfreundliches Interface**: Eine klare und einfache Benutzeroberfläche macht die Bedienung der App für jedermann leicht und intuitiv.
**Datenschutzorientiert**: Keine Speicherung persönlicher Daten. Die Verarbeitung erfolgt clientseitig, und die Dateien werden nicht auf dem Server gespeichert. - **Datenschutzorientiert**: Keine Speicherung persönlicher Daten. Die Verarbeitung erfolgt clientseitig, und die Dateien werden nicht auf dem Server gespeichert.
## Zielsetzung ## Zielsetzung
Unser Ziel ist es, den Bürgern von Arnsberg einen bequemen und effizienten Weg zu bieten, um ihre Abfallentsorgung zu planen und zu verwalten. Durch die Bereitstellung einer zuverlässigen Erinnerungsfunktion wollen wir das städtische Recycling- und Abfallmanagement fördern und dadurch einen Beitrag zum Umweltschutz leisten. Unser Ziel ist es, den Bürgern von Arnsberg einen bequemen und effizienten Weg zu bieten, um ihre Abfallentsorgung zu planen und zu verwalten. Durch die Bereitstellung einer zuverlässigen Erinnerungsfunktion wollen wir das städtische Recycling- und Abfallmanagement fördern und dadurch einen Beitrag zum Umweltschutz leisten.

View File

@@ -31,3 +31,7 @@ packageJson.version = versionParts.join('.');
// Zurückschreiben der package.json // Zurückschreiben der package.json
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)); fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
console.log(`Version updated to ${packageJson.version}`); console.log(`Version updated to ${packageJson.version}`);
// Versionsnummer in Datei schreiben..
const content = `export const version = '${packageJson.version}';\n`;
fs.writeFileSync(path.join(__dirname, 'src', 'version.ts'), content);

View File

@@ -1,2 +1,2 @@
(()=>{"use strict";var e={953:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=class{constructor(e,t,n){this.reminderPrefix="Erinnerung: ",this.icsContent=e,this.reminderDays=t,this.reminderHours=n}modifyEvents(){return this.icsContent.replace(/BEGIN:VEVENT.*?END:VEVENT/gs,(e=>{const t=e.match(/SUMMARY:(.*)\r\n/),n=t?t[1]:"",r=this.createTriggerValue(),o=this.createVAlarmString(this.reminderPrefix+n,r);return e.replace(/END:VEVENT/,o+"END:VEVENT")}))}createVAlarmString(e,t){let n="BEGIN:VALARM\r\n";return n+="ACTION:DISPLAY\r\n",n+=`DESCRIPTION:${e}\r\n`,n+=`TRIGGER:${t}\r\n`,n+="END:VALARM\r\n",n}createTriggerValue(){const e=0===this.reminderHours?0:24-this.reminderHours;return`-P${this.reminderDays}DT${e}H0M0S`}}},519:function(e,t,n){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const o=r(n(953));function s(e){!function(){const e=document.getElementById("download-area");e&&e.classList.remove("show-download-area")}();const t=document.getElementById("ical-upload"),n=document.getElementById("reminder-days-select"),r=document.getElementById("reminder-hours-select"),s=parseInt(n.value,10),d=parseInt(r.value,10),i=t.files?t.files[0]:null;if(i){console.log("File uploaded:",i.name);const e=new FileReader;e.onload=e=>{var t;const n=null===(t=e.target)||void 0===t?void 0:t.result;if("string"==typeof n){console.log("File content readable..");const e=new o.default(n,s,d).modifyEvents(),t=function(e){const t=e.lastIndexOf(".");return-1===t?e+" with reminders":e.substring(0,t)+" with reminders"+e.substring(t)}(i.name),r=new Blob([e],{type:"text/calendar"});!function(e,t){const n=document.getElementById("download-area"),r=document.getElementById("download-button");n&&r&&(r.href=t,r.download=e,setTimeout((()=>n.classList.add("show-download-area")),0),document.getElementById("work-button").disabled=!0)}(t,URL.createObjectURL(r))}},e.readAsText(i)}}document.addEventListener("DOMContentLoaded",(()=>{console.log("Loading the WebApp...");const e=document.getElementById("work-button");document.getElementById("ical-upload").addEventListener("change",(()=>{e.disabled=!1})),e.addEventListener("click",s)}))}},t={};!function n(r){var o=t[r];if(void 0!==o)return o.exports;var s=t[r]={exports:{}};return e[r].call(s.exports,s,s.exports,n),s.exports}(519)})(); (()=>{"use strict";var e={953:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=class{constructor(e,t,n){this.reminderPrefix="Erinnerung: ",this.icsContent=e,this.reminderDays=t,this.reminderHours=n}modifyEvents(){return this.icsContent.replace(/BEGIN:VEVENT.*?END:VEVENT/gs,(e=>{const t=e.match(/SUMMARY:(.*)\r\n/),n=t?t[1]:"",r=this.createTriggerValue(),o=this.createVAlarmString(this.reminderPrefix+n,r);return e.replace(/END:VEVENT/,o+"END:VEVENT")}))}createVAlarmString(e,t){let n="BEGIN:VALARM\r\n";return n+="ACTION:DISPLAY\r\n",n+=`DESCRIPTION:${e}\r\n`,n+=`TRIGGER:${t}\r\n`,n+="END:VALARM\r\n",n}createTriggerValue(){const e=0===this.reminderHours?0:24-this.reminderHours;let t=this.reminderDays;return 1===t&&(t=0),`-P${t}DT${e}H0M0S`}}},519:function(e,t,n){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const o=r(n(953)),s=n(412);function d(e){!function(){const e=document.getElementById("download-area");e&&e.classList.remove("show-download-area")}();const t=document.getElementById("ical-upload"),n=document.getElementById("reminder-days-select"),r=document.getElementById("reminder-hours-select"),s=parseInt(n.value,10),d=parseInt(r.value,10),i=t.files?t.files[0]:null;if(i){console.log("File uploaded:",i.name);const e=new FileReader;e.onload=e=>{var t;const n=null===(t=e.target)||void 0===t?void 0:t.result;if("string"==typeof n){console.log("File content readable..");const e=new o.default(n,s,d).modifyEvents(),t=function(e){const t=e.lastIndexOf(".");return-1===t?e+" with reminders":e.substring(0,t)+" with reminders"+e.substring(t)}(i.name),r=new Blob([e],{type:"text/calendar"});!function(e,t){const n=document.getElementById("download-area"),r=document.getElementById("download-button");n&&r&&(r.href=t,r.download=e,setTimeout((()=>n.classList.add("show-download-area")),0),document.getElementById("work-button").disabled=!0)}(t,URL.createObjectURL(r))}},e.readAsText(i)}}document.addEventListener("DOMContentLoaded",(()=>{console.log("Loading the WebApp Version "+s.version+"..."),document.getElementById("footer-version").innerText=`Version: ${s.version}`;const e=document.getElementById("work-button");document.getElementById("ical-upload").addEventListener("change",(()=>{e.disabled=!1})),e.addEventListener("click",d)}))},412:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.version=void 0,t.version="0.1.3"}},t={};!function n(r){var o=t[r];if(void 0!==o)return o.exports;var s=t[r]={exports:{}};return e[r].call(s.exports,s,s.exports,n),s.exports}(519)})();
//# sourceMappingURL=bundle.js.map //# sourceMappingURL=bundle.js.map

View File

@@ -61,7 +61,6 @@
<label for="reminder-days-select">Tage vor Abfuhr erinnern:</label> <label for="reminder-days-select">Tage vor Abfuhr erinnern:</label>
<select id="reminder-days-select"> <select id="reminder-days-select">
<!-- Options for days --> <!-- Options for days -->
<option value="0">Am Tag selbst</option>
<option value="1" selected>1 Tag</option> <option value="1" selected>1 Tag</option>
<option value="2">2 Tage</option> <option value="2">2 Tage</option>
<option value="3">3 Tage</option> <option value="3">3 Tage</option>
@@ -125,6 +124,8 @@
<!-- Footer Section --> <!-- Footer Section -->
<div id="footer"> <div id="footer">
M. Passarello | <a href="https://github.com/PxaMMaxP" target="_blank">Github Profil</a> M. Passarello | <a href="https://github.com/PxaMMaxP" target="_blank">Github Profil</a>
<br>
<span id="footer-version"></span>
</div> </div>
</div> </div>

View File

@@ -1,7 +1,7 @@
{ {
"name": "abfallalarm", "name": "abfallalarm",
"displayName": "AbfallAlarm", "displayName": "AbfallAlarm",
"version": "0.1.2", "version": "0.1.4",
"description": "AbfallAlarm ist eine intuitive und benutzerfreundliche WebApp, die darauf abzielt, das Leben der Bürger von Arnsberg zu vereinfachen, indem sie eine zuverlässige Erinnerungsfunktion für den städtischen Abfallkalender bietet.", "description": "AbfallAlarm ist eine intuitive und benutzerfreundliche WebApp, die darauf abzielt, das Leben der Bürger von Arnsberg zu vereinfachen, indem sie eine zuverlässige Erinnerungsfunktion für den städtischen Abfallkalender bietet.",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {

View File

@@ -61,7 +61,6 @@
<label for="reminder-days-select">Tage vor Abfuhr erinnern:</label> <label for="reminder-days-select">Tage vor Abfuhr erinnern:</label>
<select id="reminder-days-select"> <select id="reminder-days-select">
<!-- Options for days --> <!-- Options for days -->
<option value="0">Am Tag selbst</option>
<option value="1" selected>1 Tag</option> <option value="1" selected>1 Tag</option>
<option value="2">2 Tage</option> <option value="2">2 Tage</option>
<option value="3">3 Tage</option> <option value="3">3 Tage</option>
@@ -125,6 +124,8 @@
<!-- Footer Section --> <!-- Footer Section -->
<div id="footer"> <div id="footer">
M. Passarello | <a href="https://github.com/PxaMMaxP" target="_blank">Github Profil</a> M. Passarello | <a href="https://github.com/PxaMMaxP" target="_blank">Github Profil</a>
<br>
<span id="footer-version"></span>
</div> </div>
</div> </div>

View File

@@ -51,7 +51,11 @@ export default class IcsModifier {
const hoursUntilMidnight = this.reminderHours === 0 ? 0 : 24 - this.reminderHours; const hoursUntilMidnight = this.reminderHours === 0 ? 0 : 24 - this.reminderHours;
// Use reminderDays directly as daysPart // Use reminderDays directly as daysPart
const daysPart = this.reminderDays; let daysPart = this.reminderDays;
// daysPart is 1 set to 0
if (daysPart === 1) {
daysPart = 0;
}
// Create the trigger string // Create the trigger string
const trigger = `-P${daysPart}DT${hoursUntilMidnight}H0M0S`; const trigger = `-P${daysPart}DT${hoursUntilMidnight}H0M0S`;

View File

@@ -1,9 +1,13 @@
// main.ts // main.ts
import IcsModifier from './IcsModifier'; import IcsModifier from './IcsModifier';
import { version } from './version';
// Event listener for DOMContentLoaded to initialize the application // Event listener for DOMContentLoaded to initialize the application
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
console.log('Loading the WebApp...'); console.log('Loading the WebApp Version ' + version + '...');
const versionTag = document.getElementById('footer-version') as HTMLSpanElement;
versionTag.innerText = `Version: ${version}`;
const workButton = document.getElementById('work-button') as HTMLButtonElement; const workButton = document.getElementById('work-button') as HTMLButtonElement;
const fileInput = document.getElementById('ical-upload') as HTMLInputElement; const fileInput = document.getElementById('ical-upload') as HTMLInputElement;

1
src/version.ts Normal file
View File

@@ -0,0 +1 @@
export const version = '0.1.4';