Compare commits

...

6 commits

Author SHA1 Message Date
PhieF e6735f1256
Merge 6e7d024b40 into 9be861dbc0 2024-09-14 18:07:45 +02:00
Maarten 9be861dbc0
Merge pull request #1749 from hguilbert/patch-29
Update user.json
2024-09-14 17:10:25 +02:00
hguilbert c58b89d74a
Update user.json 2024-09-14 14:59:30 +02:00
Phie 6e7d024b40 adding back organizer 2024-09-11 14:34:24 +02:00
Phie 26c1bc13c0 design fix + location 2024-09-09 17:44:54 +02:00
Phie 68720f283d use ical lib in view ics 2024-09-09 16:35:38 +02:00
4 changed files with 33 additions and 49 deletions

File diff suppressed because one or more lines are too long

View file

@ -14,6 +14,7 @@ class ViewICSPlugin extends \RainLoop\Plugins\AbstractPlugin
{
// $this->UseLangs(true);
$this->addJs('message.js');
$this->addJs('ical.es5.min.cjs');
$this->addJs('windowsZones.js');
}
}

View file

@ -36,13 +36,13 @@
<details data-bind="if: viewICS, visible: viewICS">
<summary data-icon="📅" data-bind="text: viewICS().SUMMARY"></summary>
<table><tbody style="white-space:pre">
<tr data-bind="visible: viewICS().ORGANIZER"><td>Organizer</td><td data-bind="text: viewICS().ORGANIZER"></td></tr>
<tr><td>Start</td><td data-bind="text: viewICS().DTSTART"></td></tr>
<tr><td>End</td><td data-bind="text: viewICS().DTEND"></td></tr>
<tr data-bind="visible: viewICS().ORGANIZER_TXT"><td>Organizer: </td><td><a data-bind="text: viewICS().ORGANIZER_TXT, attr: { href: viewICS().ORGANIZER_MAIL }"></a></td></tr>
<tr><td>Start: </td><td data-bind="text: viewICS().DTSTART"></td></tr>
<tr><td>End: </td><td data-bind="text: viewICS().DTEND"></td></tr>
<tr data-bind="visible: viewICS().LOCATION"><td>Location: </td><td data-bind="text: viewICS().LOCATION"></td></tr>
<!-- <tr><td>Transparency</td><td data-bind="text: viewICS().TRANSP"></td></tr>-->
<tr data-bind="foreach: viewICS().ATTENDEE">
<td></td><td data-bind="text: $data.replace(/;/g,';\\n')"></td>
</tr>
<tr><td>Attendees: </td><td data-bind="foreach: viewICS().ATTENDEE"><span data-bind="text: $data.replace(/;/g,';\\n')"></span> </td>
</tbody></table>
</details>`));
@ -88,55 +88,33 @@
});
// ICS attachment
// let ics = msg.attachments.find(attachment => 'application/ics' == attachment.mimeType);
let ics = msg.attachments.find(attachment => 'text/calendar' == attachment.mimeType);
if (ics && ics.download) {
// fetch it and parse the VEVENT
rl.fetch(ics.linkDownload())
.then(response => (response.status < 400) ? response.text() : Promise.reject(new Error({ response })))
.then(text => {
let VEVENT,
VALARM,
multiple = ['ATTACH','ATTENDEE','CATEGORIES','COMMENT','CONTACT','EXDATE',
'EXRULE','RSTATUS','RELATED','RESOURCES','RDATE','RRULE'],
lines = text.split(/\r?\n/),
i = lines.length;
while (i--) {
let line = lines[i];
if (VEVENT) {
while (line.startsWith(' ') && i--) {
line = lines[i] + line.slice(1);
}
if (line.startsWith('END:VALARM')) {
VALARM = {};
continue;
} else if (line.startsWith('BEGIN:VALARM')) {
VEVENT.VALARM || (VEVENT.VALARM = []);
VEVENT.VALARM.push(VALARM);
VALARM = null;
continue;
} else if (line.startsWith('BEGIN:VEVENT')) {
break;
}
line = line.match(/^([^:;]+)[:;](.+)$/);
if (line) {
if (VALARM) {
VALARM[line[1]] = line[2];
} else if (multiple.includes(line[1]) || 'X-' == line[1].slice(0,2)) {
VEVENT[line[1]] || (VEVENT[line[1]] = []);
VEVENT[line[1]].push(line[2]);
} else {
if ('DTSTART' === line[1] || 'DTEND' === line[1]) {
line[2] = parseDate(line[2]);
}
VEVENT[line[1]] = line[2];
}
}
} else if (line.startsWith('END:VEVENT')) {
VEVENT = {};
}
let jcalData = ICAL.parse(text)
var comp = new ICAL.Component(jcalData);
var vevent = comp.getFirstSubcomponent("vevent");
var event = new ICAL.Event(vevent);
let VEVENT = {};
if(event.organizer.startsWith("mailto:")){
VEVENT.ORGANIZER_TXT=event.organizer.substr(7)
VEVENT.ORGANIZER_MAIL = event.organizer
} else
VEVENT.ORGANIZER_TXT=event.organizer
VEVENT.SUMMARY = event.summary;
VEVENT.DTSTART = parseDate(vevent.getFirstPropertyValue("dtstart"));
VEVENT.DTEND = parseDate(vevent.getFirstPropertyValue("dtend"));
VEVENT.LOCATION = event.location;
VEVENT.ATTENDEE = []
for(let attendee of event.attendees){
VEVENT.ATTENDEE.push(attendee.getFirstParameter("cn"));
}
// METHOD:REPLY || METHOD:REQUEST
// console.dir({VEVENT:VEVENT});
if (VEVENT) {
VEVENT.rawText = text;
VEVENT.isCancelled = () => VEVENT.STATUS?.includes('CANCELLED');

View file

@ -500,7 +500,7 @@
"IMAGES_WHITELIST": "Liste blanche Images",
"MESSAGE_POPUP_WINDOW": "Popup dans une nouvelle fenêtre au lieu d'un onglet",
"MAILTO": "Inscrivez-vous en tant que gestionnaire de liens 'mailto:'",
"HTML_TO_MD": "Convert HTML to Markdown instead of plain text"
"HTML_TO_MD": "Convertir HTML en Markdown au lieu du texte brut"
},
"SETTINGS_CONTACTS": {
"LABEL_CONTACTS_AUTOSAVE": "Ajouter automatiquement les destinataires à votre carnet d'adresses",