vue-add-to-calendar
Version:
A Vue.js component providing 'Add to Calendar' functionality
188 lines (164 loc) • 3.9 kB
JavaScript
/*!
* vue-add-to-calendar v1.0.7
* (c) 2021 nicolasbeauvais
* Released under the MIT License.
*/
;
var AddToCalendarMixin = {
template: "<a :href=\"$parent.calendarUrl(calendar)\" :class=\"calendarClass\" target=\"_blank\"><slot></slot></a>",
computed: {
calendarClass: function calendarClass () {
return ['vue-add-to-calendar', ((this.calendar) + "-calendar")];
}
}
};
var calendars = {
google: {
url: 'http://www.google.com/calendar/render?action=TEMPLATE&trp=false',
parameters: function parameters (title, location, details, start, end) {
var parameters = {
text: title,
location: location,
details: details
};
if (start && end) {
parameters.dates = start + "/" + end;
}
return parameters;
}
},
microsoft: {
url: 'https://outlook.live.com/owa/?rru=addevent',
parameters: function parameters$1 (title, location, details, start, end) {
return {
subject: title,
location: location,
body: details,
startdt: start,
enddt: end
};
}
},
office365: {
url: 'https://outlook.office.com/owa/?path=/calendar/action/compose&rru=addevent',
parameters: function parameters$2 (title, location, details, start, end) {
return {
subject: title,
location: location,
body: details,
startdt: start,
enddt: end
};
}
}
};
var AddToCalendar = {
props: {
/**
* Event title.
* @var string
*/
title: {
type: String,
default: ''
},
/**
* Event location.
* @var string
*/
location: {
type: String,
default: ''
},
/**
* Event details.
* @var string
*/
details: {
type: String,
default: ''
},
/**
* Event start.
* @var date
*/
start: {
type: Date,
default: null
},
/**
* Event end.
* @var date
*/
end: {
type: Date,
default: null
}
},
data: function data () {
return {
/**
* Available calendars.
* @param object
*/
calendars: calendars
};
},
methods: {
/**
* Returns generated calendar url.
*
* @param calendar.
*/
calendarUrl: function calendarUrl (calendar) {
var url = this.calendars[calendar].url;
var parameters = this.calendars[calendar].parameters(
this.formatString(this.title),
this.formatString(this.location),
this.formatString(this.details),
this.formatDate(this.start),
this.formatDate(this.end)
);
for (var key in parameters) {
if (parameters.hasOwnProperty(key) && parameters[key]) {
url += "&" + key + "=" + (parameters[key]);
}
}
return url;
},
formatString: function formatString (string) {
return encodeURIComponent(string).replace(/%20/g, '+');
},
formatDate: function formatDate (date) {
return date ? date.toISOString().replace(/-|:|\.\d+/g, '') : null;
}
},
mounted: function mounted () {
//
},
/**
* Set component aliases for buttons and links.
*/
components: {
'google-calendar': {
mixins: [AddToCalendarMixin],
data: function () { return { calendar: 'google' }; }
},
'microsoft-calendar': {
mixins: [AddToCalendarMixin],
data: function () { return { calendar: 'microsoft' }; }
},
'office365-calendar': {
mixins: [AddToCalendarMixin],
data: function () { return { calendar: 'office365' }; }
}
}
};
AddToCalendar.version = '1.0.7';
AddToCalendar.install = function (Vue) {
Vue.component('add-to-calendar', AddToCalendar);
};
if (typeof window !== 'undefined') {
window.AddToCalendar = AddToCalendar;
}
module.exports = AddToCalendar;