diff --git a/customize.dist/src/less2/include/notifications.less b/customize.dist/src/less2/include/notifications.less index f3bc8c0b4..0d58f4dc3 100644 --- a/customize.dist/src/less2/include/notifications.less +++ b/customize.dist/src/less2/include/notifications.less @@ -27,14 +27,16 @@ color: @cryptpad_color_red; } } - .cp-avatar { - .avatar_main(30px); - padding: 0 5px; + .cp-reminder, .cp-avatar { cursor: pointer; &:hover { background-color: @cp_dropdown-bg-hover; } } + .cp-avatar { + .avatar_main(30px); + padding: 0 5px; + } .cp-notification-content { flex: 1; align-items: stretch; diff --git a/www/calendar/inner.js b/www/calendar/inner.js index 59c936bd3..5154f3f3a 100644 --- a/www/calendar/inner.js +++ b/www/calendar/inner.js @@ -135,6 +135,66 @@ define([ return weekDays.map(function (day) { return day.replace(/^./, function (str) { return str.toUpperCase(); }); }); }; + // Get week number in our calendar view + var ISO8601_week_no = function (dt) { + var tdt = new Date(dt.valueOf()); + var dayn = (dt.getDay() + 6) % 7; + tdt.setDate(tdt.getDate() - dayn + 3); + var firstThursday = tdt.valueOf(); + tdt.setMonth(0, 1); + if (tdt.getDay() !== 4) { + tdt.setMonth(0, 1 + ((4 - tdt.getDay()) + 7) % 7); + } + return 1 + Math.ceil((firstThursday - tdt) / 604800000); + }; + + var updateDateRange = function () { + var range = APP.calendar._renderRange; + var start = range.start._date.toLocaleDateString(); + var end = range.end._date.toLocaleDateString(); + var week = ISO8601_week_no(range.start._date); + var date = [ + h('b.cp-small', Messages._getKey('calendar_weekNumber', [week])), + h('b', start), + h('span', ' - '), + h('b', end), + ]; + if (APP.calendar._viewName === "day") { + date = h('b', start); + } else if (APP.calendar._viewName === "month") { + var month; + var mid = new Date(Math.floor(((+range.start._date) + (+range.end._date)) / 2)); + try { + month = mid.toLocaleString('default', { + month: 'long', + year:'numeric' + }); + month = month.replace(/^./, function (str) { return str.toUpperCase(); }); + date = h('b', month); + } catch (e) { + // Use same as week range: first day of month to last day of month + } + } + APP.toolbar.$bottomM.empty().append(h('div', date)); + }; + APP.moveToDate = function (time) { + var cal = APP.calendar; + if (!cal) { return; } + + // Move calendar to correct date + var d = new Date(time); + cal.setDate(d); + updateDateRange(); + + // Scroll to correct time + setTimeout(function () { + var h = d.toLocaleTimeString('en-US', { hour12: 0, timeStyle: "short" }).slice(0,2); + h = Number(h) % 24; + var $h = $('.tui-full-calendar-timegrid-timezone .tui-full-calendar-timegrid-hour'); + try { $h.get(h).scrollIntoView(); } catch (e) { console.error(e); } + }); + }; + var getCalendars = function () { var LOOKUP = {}; var TEAMS = {}; @@ -223,6 +283,10 @@ define([ cal.setCalendars(getCalendars()); cal.createSchedules(applyUpdates(getSchedules()), true); cal.render(); + if (APP.initTime && APP.moveToDate) { + APP.moveToDate(APP.initTime); + delete APP.initTime; + } Rec.resetCache(); updateRecurring(); } catch (e) { @@ -785,19 +849,6 @@ define([ }; - // Get week number in our calendar view - var ISO8601_week_no = function (dt) { - var tdt = new Date(dt.valueOf()); - var dayn = (dt.getDay() + 6) % 7; - tdt.setDate(tdt.getDate() - dayn + 3); - var firstThursday = tdt.valueOf(); - tdt.setMonth(0, 1); - if (tdt.getDay() !== 4) { - tdt.setMonth(0, 1 + ((4 - tdt.getDay()) + 7) % 7); - } - return 1 + Math.ceil((firstThursday - tdt) / 604800000); - }; - var _updateRecurring = function () { var cal = APP.calendar; if (!cal) { return; } @@ -868,35 +919,6 @@ ICS ==> create a new event with the same UID and a RECURRENCE-ID field (with a v }; }; - var updateDateRange = function () { - var range = APP.calendar._renderRange; - var start = range.start._date.toLocaleDateString(); - var end = range.end._date.toLocaleDateString(); - var week = ISO8601_week_no(range.start._date); - var date = [ - h('b.cp-small', Messages._getKey('calendar_weekNumber', [week])), - h('b', start), - h('span', ' - '), - h('b', end), - ]; - if (APP.calendar._viewName === "day") { - date = h('b', start); - } else if (APP.calendar._viewName === "month") { - var month; - var mid = new Date(Math.floor(((+range.start._date) + (+range.end._date)) / 2)); - try { - month = mid.toLocaleString('default', { - month: 'long', - year:'numeric' - }); - month = month.replace(/^./, function (str) { return str.toUpperCase(); }); - date = h('b', month); - } catch (e) { - // Use same as week range: first day of month to last day of month - } - } - APP.toolbar.$bottomM.empty().append(h('div', date)); - }; var makeCalendar = function (view) { var store = window.cryptpadStore; @@ -1190,12 +1212,12 @@ ICS ==> create a new event with the same UID and a RECURRENCE-ID field (with a v }); $(goRight).click(function () { cal.next(); - // XXX update recurring updateDateRange(); updateRecurring(); }); $(goToday).click(function () { - cal.today(); + APP.moveToDate(+new Date()); + //cal.today(); updateDateRange(); updateRecurring(); }); @@ -2191,6 +2213,8 @@ APP.recurrenceRule = { }, function (obj) { if (obj && obj.error) { console.error(obj.error); } }); + } else if (privateData.calendarOpts) { + APP.initTime = privateData.calendarOpts.time; } store.get('calendarView', makeCalendar); UI.removeLoadingScreen(); diff --git a/www/calendar/main.js b/www/calendar/main.js index 11b1ba4bf..6f8e362f7 100644 --- a/www/calendar/main.js +++ b/www/calendar/main.js @@ -6,13 +6,21 @@ define([ '/common/sframe-common-outer.js', ], function (nThen, ApiConfig, DomReady, SFCommonO) { - // Loaded in load #2 + var hash, href; nThen(function (waitFor) { DomReady.onReady(waitFor()); }).nThen(function (waitFor) { - SFCommonO.initIframe(waitFor); + var obj = SFCommonO.initIframe(waitFor, true); + href = obj.href; + hash = obj.hash; }).nThen(function (/*waitFor*/) { - var addData = function (meta) { + var addData = function (meta, Cryptpad, user, Utils) { + if (hash) { + var parsed = Utils.Hash.parsePadUrl(href); + if (parsed.hashData && parsed.hashData.newPadOpts) { + meta.calendarOpts = Utils.Hash.decodeDataOptions(parsed.hashData.newPadOpts); + } + } meta.calendarHash = Boolean(window.location.hash); }; SFCommonO.start({ diff --git a/www/calendar/recurrence.js b/www/calendar/recurrence.js index 64563f901..a9b3358ce 100644 --- a/www/calendar/recurrence.js +++ b/www/calendar/recurrence.js @@ -564,6 +564,7 @@ define([ rec.forEach(function (obj) { var _start = new Date(obj.start); var _end = new Date(obj.end); + var _origin = obj; var rule = obj.recurrenceRule; if (!rule) { return; } @@ -624,7 +625,7 @@ define([ _toAdd.some(function (_newS) { // Make event with correct start and end time var _ev = Util.clone(obj); - _ev.id += '|' + (+_newS); + _ev.id = _origin.id + '|' + (+_newS); var _evS = new Date(+_newS); var _evE = new Date(+_newS); setEndData(_evS, _evE, endData); diff --git a/www/common/notifications.js b/www/common/notifications.js index 83052ff68..7875c257f 100644 --- a/www/common/notifications.js +++ b/www/common/notifications.js @@ -481,6 +481,18 @@ define([ var missed = content.msg.missed; var start = msg.start; var title = Util.fixHTML(msg.title); + content.handler = function () { + var priv = common.getMetadataMgr().getPrivateData(); + var time = Util.find(data, ['content', 'msg', 'content', 'start']); + if (priv.app === "calendar" && window.APP && window.APP.moveToDate) { + return void window.APP.moveToDate(time); + } + var url = Hash.hashToHref('', 'calendar'); + var optsUrl = Hash.getNewPadURL(url, { + time: time + }); + common.openURL(optsUrl); + }; content.getFormatText = function () { var now = +new Date(); diff --git a/www/common/sframe-common-mailbox.js b/www/common/sframe-common-mailbox.js index f3b267f50..4b9fd9e85 100644 --- a/www/common/sframe-common-mailbox.js +++ b/www/common/sframe-common-mailbox.js @@ -13,6 +13,7 @@ define([ Mailbox.create = function (Common) { var mailbox = Common.mailbox; var sframeChan = Common.getSframeChannel(); + var priv = Common.getMetadataMgr().getPrivateData(); var execCommand = function (cmd, data, cb) { sframeChan.query('Q_MAILBOX_COMMAND', { @@ -67,6 +68,14 @@ define([ } } else if (data.type === 'reminders') { avatar = h('i.fa.fa-calendar.cp-broadcast.preview'); + if (priv.app !== 'calendar') { avatar.classList.add('cp-reminder'); } + $(avatar).click(function (e) { + e.stopPropagation(); + if (data.content && data.content.handler) { + return void data.content.handler(); + } + Common.openURL(Hash.hashToHref('', 'calendar')); + }); } else if (userData && typeof(userData) === "object" && userData.profile) { avatar = h('span.cp-avatar'); Common.displayAvatar($(avatar), userData.avatar, userData.displayName || userData.name);