Knowledge Base

Preserving for the future: Shell scripts, AoC, and more

My Radicale improvements

I added to RadicaleInfCloud (the web interface InfCloud ostensibly configured to work with Radicale) a "Download" button which exports the current calendar item as a .ics file.

This patch also adds a stub button for importing. It operates by dropping a .ics file onto it. It doesn't actually load anything from the file yet; I don't have that functionality built yet. I could use guidance on that.

The patch:

diff --git a/radicale_infcloud/web/forms.js b/radicale_infcloud/web/forms.js
index 0e4c816..c733b6d 100644
--- a/radicale_infcloud/web/forms.js
+++ b/radicale_infcloud/web/forms.js
@@ -31,6 +31,35 @@ function updateTodoFormDimensions(setHeight)
    }
 }

+function dragOverHandler(event) {
+   //if (window.console) {
+   //  console.log("dragOverHandler",event);
+   //}
+   event.preventDefault();
+   event.stopPropagation();
+}
+
+/* Incomplete import process. The function logs to console but does not use the vcard contents. */
+function dropHandler(event) {
+   if (event) {
+       event.preventDefault();
+       event.stopPropagation();
+       if (window.console) {
+           console.log("dropHandler",event);
+       }
+       if(event.dataTransfer && event.dataTransfer && event.dataTransfer.files.length > 0) {
+           if(window.console){console.log("files",event.dataTransfer.files);}
+           for (let f of event.dataTransfer.files) {
+               if(window.console){console.log("file:",f)};
+               let reader = new FileReader();
+               reader.readAsText(f);
+               reader.onload = function(){if(window.console){console.log(reader.result)}};
+               reader.onerror = function(){if(window.console){console.log(reader.error)}};
+           }
+       }
+   }
+}
+
 function updateEventFormDimensions(setHeight)
 {
    $('#CAEvent').css('width','');
@@ -51,6 +80,7 @@ function setFormPosition(jsEvent, confirmRepeat)
    dist_y;

    $('#event_details_template').css('max-height','');
+   document.getElementById('uploadButton').addEventListener("drop", dropHandler(event));

    if(jsEvent)
    {
@@ -2316,6 +2346,7 @@ function showEventForm(date, allDay, calEvent, jsEvent, mod, repeatOne, confirmR
    if(mod=='show')
    {
        $('#saveButton').hide();
+       $('#uploadButton').hide();
        $('#resetButton').hide();
        $('#deleteButton').hide();
        if($('#ResourceCalDAVList').find('[data-id="'+calEvent.res_id+'"]').hasClass("resourceCalDAV_item_ro"))
@@ -2622,6 +2653,22 @@ function bindEventForm()
        });
    });

+   $('#downloadButton').click(function(e){
+       if($('#uid').val()!='') {
+           var dlname = $('#name').val();
+           var dlhref = $('#uid').val().replace(/(:\/\/)\w*@/,"$1");
+           function downloadIt(){
+               if (dlname && dlname != '' && dlhref && dlhref != '') {
+                   var link = document.createElement('a');
+                   link.download = dlname;
+                   link.href = dlhref;
+                   link.dispatchEvent(new MouseEvent("click"));
+               }
+           }
+           downloadIt();
+       }
+   });
+
    $('#resetButton').click(function(){
        $('#event_details_template').find('img[data-type=invalidSmall]').css('display','none');
        var uid=$('#uid').val();
@@ -2828,6 +2875,7 @@ function startEditModeEvent()
    $('#saveButton').show();
    $('#resetButton').show();
    $('#deleteButton').show();
+   $('#uploadButton').show();
    $('#show').val('');
    $('#eventDetailsTable :input[disabled]').prop('disabled', false);
    $('#eventDetailsTable :input[type="text"]').prop('readonly', false);
diff --git a/radicale_infcloud/web/index.html b/radicale_infcloud/web/index.html
index a62ccb8..6a2deb5 100644
--- a/radicale_infcloud/web/index.html
+++ b/radicale_infcloud/web/index.html
@@ -631,6 +631,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
                                <input id="editOptionsButton" type="button" value="edit repeat" data-type="editOptions" />
                                <input id="resetButton" type="button" value="Reset" data-type="reset" />
                                <input id="closeButton" type="button" value="Cancel" data-type="cancel" />
+                               <input id="downloadButton" type="button" value="Download" data-type="download"/>
+                               <input id="uploadButton" type="button" value="Import" data-type="upload" ondrop="dropHandler(event)" ondragover="dragOverHandler(event);"/>
                                <input id="deleteButton" type="button" value="Delete" data-type="delete" onclick="updateEventFormDimensions(true);$('#CAEvent .saveLoader').show();deleteEvent();" />
                            </td>
                        </tr>

You can see my work at my cgit or gitlab.

Comments