diff --git a/Meeting-dial-in/Meeting-dial-in.js b/Meeting-dial-in/Meeting-dial-in.js index da736b8..15bc96f 100644 --- a/Meeting-dial-in/Meeting-dial-in.js +++ b/Meeting-dial-in/Meeting-dial-in.js @@ -12,49 +12,64 @@ If the dial-in data of a meeting should not be recognized, the invitation can be *****************************/ -let timeformat = 'de-DE' -let countryCode = '+49' +let timeformat, countryCode -const listLimit = (config.widgetFamily == 'medium')? 1:5; +let widgetInputRAW = args.widgetParameter; +let widgetInput = null; + +if (widgetInputRAW) { + widgetInput = widgetInputRAW.toString().split(';') + countryCode = widgetInput[0] + timeformat = widgetInput[1] || 'de-DE' + if (/^\+[\d]{1,3}$/.test(countryCode) === false) { + throw new Error('Invalid format of country code: ' + countryCode); + } +} else { + countryCode = '+49' + timeformat = 'de-DE' +} + +const listLimit = (config.widgetFamily == 'medium') ? 1 : 5; let iconColor; if (Device.isUsingDarkAppearance()) { iconColor = 'EDEDED' } else { - iconColor = '222222' + iconColor = '222222' } let now = new Date() let end = new Date() -end.setHours(23,59,59,999); +end.setHours(23, 59, 59, 999); + const matchPatterns = { skype: { online: [ /Skype-Besprechung teilnehmen <(https?:\/\/[a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF./\-_]*)>/ ], phone: [ - {number: /Per Telefon teilnehmen[\r\n\s]+.*/, pin: /Konferenzkennung:[\s]([0-9]+)/} - ] + { number: /Per Telefon teilnehmen[\r\n\s]+.*/, pin: /Konferenzkennung:[\s]([0-9]+)/ } + ] }, circuit: { online: [ /(https:\/\/eu\.yourcircuit\.com\/guest\?token=[\a-z0-9-]+)/ ], phone: [ - {number: /Einwahlnummern[\r\n]*Deutschland[\r\n]*Deutsch[\r\n]*(\+49[0-9\s]+)/, pin: /PIN[\r\n]*([0-9\s]+)#/} + { number: /Einwahlnummern[\r\n]*Deutschland[\r\n]*Deutsch[\r\n]*(\+49[0-9\s]+)/, pin: /PIN[\r\n]*([0-9\s]+)#/ } ] }, msteams: { online: [ /<(https:\/\/teams\.microsoft\.com\/l\/meetup-join\/.+)>/ - ] + ] } } let upcomingRemoteMeeting = (await CalendarEvent.between(now, end)).map((event) => { if (event.notes) { for (const [key, value] of Object.entries(matchPatterns)) { - for (pattern of value.online || []) { + for (pattern of value.online || []) { let m = event.notes.match(new RegExp(pattern, 'im')) if (m && m[1]) { event.dialInUrl = m[1] @@ -63,12 +78,12 @@ let upcomingRemoteMeeting = (await CalendarEvent.between(now, end)).map((event) } // Some Invitations contains multiple phone numbers with different Country Codes, why first all numbers will be collected and late the needed number with the given country code will be filtered out let dialInNumbers = [] - for (pattern of value.phone || []) { + for (pattern of value.phone || []) { let numberMatch = event.notes.match(new RegExp(pattern.number, 'im')) if (numberMatch && numberMatch[1]) { let dialInNumber = numberMatch[1] let pinMatch = event.notes.match(new RegExp(pattern.pin, 'im')) - if (pinMatch && pinMatch[1]) { + if (pinMatch && pinMatch[1]) { dialInNumber += ',,' + pinMatch[1] + '#' } dialInNumbers.push(dialInNumber.replace(/%20|[\s\r\n]/g, '')) @@ -108,92 +123,92 @@ else if (nextUpcomingMeeting) { widget.addSpacer(5) let headlineText = widget.addText("Next Remote Meeting") headlineText.font = Font.boldSystemFont(12) - + widget.addSpacer(10) - + let stack = widget.addStack() stack.layoutHorizontally() - + let leftStack = stack.addStack() leftStack.layoutVertically() leftStack.size = new Size(260, 70) - + let nextMeetingTime = leftStack.addText(`${(new Date(nextUpcomingMeeting.startDate)).toLocaleString(timeformat)} - ${(new Date(nextUpcomingMeeting.endDate)).toLocaleString(timeformat)}`) nextMeetingTime.font = Font.thinSystemFont(10) - + let nextMeetingTitle = leftStack.addText(nextUpcomingMeeting.title) nextMeetingTitle.font = Font.boldSystemFont(20) nextMeetingTime.minimumScaleFactor = 1 nextMeetingTime.lineLimit = 2 - + leftStack.addSpacer() - + stack.addSpacer() - + let rightStack = stack.addStack() rightStack.layoutVertically() rightStack.size = new Size(25, 70) - + if (nextUpcomingMeeting.dialInNumber) { let phoneImage = rightStack.addImage(SFSymbol.named('phone').image) - phoneImage.imageSize = new Size(25,25) + phoneImage.imageSize = new Size(25, 25) phoneImage.url = 'tel:' + nextUpcomingMeeting.dialInNumber - if (iconColor) {phoneImage.tintColor = new Color(iconColor)} + if (iconColor) { phoneImage.tintColor = new Color(iconColor) } } - + if (nextUpcomingMeeting.dialInUrl) { rightStack.addSpacer(10) let videoImage = rightStack.addImage(SFSymbol.named('video').image) - videoImage.imageSize = new Size(25,25) + videoImage.imageSize = new Size(25, 25) videoImage.url = nextUpcomingMeeting.dialInUrl videoImage.centerAlignImage() - if (iconColor) {videoImage.tintColor = new Color(iconColor)} + if (iconColor) { videoImage.tintColor = new Color(iconColor) } } rightStack.addSpacer() widget.addSpacer() - + let upcomingMeetingStack = widget.addStack() upcomingMeetingStack.layoutVertically() - + if (upComingMeetings && upComingMeetings.length > 0) { - let upComingText = upcomingMeetingStack.addText((upComingMeetings.length == 1)? 'Upcoming Remote Meeting':'Upcoming Remote Meetings') + let upComingText = upcomingMeetingStack.addText((upComingMeetings.length == 1) ? 'Upcoming Remote Meeting' : 'Upcoming Remote Meetings') upComingText.font = Font.boldSystemFont(10) upcomingMeetingStack.addSpacer(2) } - + for (let i = 0; i < listLimit && i < upComingMeetings.length; i++) { let row = upcomingMeetingStack.addStack() row.layoutHorizontally() - + let leftColumn = row.addStack() leftColumn.layoutVertically() - + row.addSpacer() - + let rightColumn = row.addStack() rightColumn.layoutHorizontally() rightColumn.setPadding(5, 5, 5, 5) rightColumn.spacing = 5 - + let meetingTime = leftColumn.addText(`${(new Date(upComingMeetings[i].startDate)).toLocaleString(timeformat)} - ${(new Date(upComingMeetings[i].endDate)).toLocaleString(timeformat)}`) meetingTime.font = Font.thinSystemFont(8) - + let meetingTitle = leftColumn.addText(upComingMeetings[i].title) meetingTitle.font = Font.systemFont(10) meetingTitle.lineLimit = 1 - + if (upComingMeetings[i].dialInNumber) { let phoneImage = rightColumn.addImage(SFSymbol.named('phone').image) - phoneImage.imageSize = new Size(15,15) + phoneImage.imageSize = new Size(15, 15) phoneImage.url = 'tel:' + upComingMeetings[i].dialInNumber - if (iconColor) {phoneImage.tintColor = new Color(iconColor)} + if (iconColor) { phoneImage.tintColor = new Color(iconColor) } } - + if (upComingMeetings[i].dialInUrl) { let videoImage = rightColumn.addImage(SFSymbol.named('video').image) - videoImage.imageSize = new Size(15,15) + videoImage.imageSize = new Size(15, 15) videoImage.url = upComingMeetings[i].dialInUrl - if (iconColor) {videoImage.tintColor = new Color(iconColor)} + if (iconColor) { videoImage.tintColor = new Color(iconColor) } } } widget.addSpacer(5) @@ -206,7 +221,7 @@ else if (nextUpcomingMeeting) { widget.addSpacer() } -if(!config.runsInWidget) { +if (!config.runsInWidget) { await widget.presentLarge() } else { // Tell the system to show the widget.