Offline calendars

pull/1/head
yflory 4 years ago
parent dd7746a2fd
commit 19ad5d90e8

@ -56,7 +56,7 @@ Messages.calendar_today = "Today";
Messages.calendar_deleteConfirm = "Are you sure you want to delete this calendar from your account?";
Messages.calendar_deleteTeamConfirm = "Are you sure you want to delete this calendar from this team?";
Messages.calendar_deleteOwned = " It will still be visible for the users it has been shared with.";
Messages.calendar_errorNoCalendar = "No calendar selected!";
Messages.calendar_errorNoCalendar = "No editable calendar selected!";
var onCalendarsUpdate = Util.mkEvent();
@ -125,7 +125,7 @@ Messages.calendar_errorNoCalendar = "No calendar selected!";
var getCalendars = function () {
return Object.keys(APP.calendars).map(function (id) {
var c = APP.calendars[id];
if (c.hidden) { return; }
if (c.hidden || c.restricted) { return; }
var md = Util.find(c, ['content', 'metadata']);
if (!md) { return void console.error('Ignore calendar without metadata'); }
return {
@ -142,12 +142,15 @@ Messages.calendar_errorNoCalendar = "No calendar selected!";
var s = [];
Object.keys(APP.calendars).forEach(function (id) {
var c = APP.calendars[id];
if (c.hidden) { return; }
if (c.hidden || c.restricted) { return; }
var data = c.content || {};
Object.keys(data.content || {}).forEach(function (uid) {
var obj = data.content[uid];
obj.title = Util.fixHTML(obj.title || "");
obj.location = Util.fixHTML(obj.location || "");
if (c.readOnly) {
obj.isReadOnly = true;
}
s.push(data.content[uid]);
});
});
@ -347,6 +350,7 @@ Messages.calendar_errorNoCalendar = "No calendar selected!";
return UIElements.createDropdown(dropdownConfig)[0];
};
var makeCalendarEntry = function (id, teamId) {
// XXX handle RESTRICTED calendars (data.restricted)
var data = APP.calendars[id];
var edit;
if (!data.readOnly) {
@ -523,6 +527,15 @@ Messages.calendar_errorNoCalendar = "No calendar selected!";
});
});
cal.on('clickSchedule', function (event) {
var id = event.calendar && event.calendar.id;
if (!id || !APP.calendars[id]) {
APP.lastClicked = false;
return;
}
APP.lastClicked = id;
});
renderCalendar();
};
@ -593,7 +606,20 @@ Messages.calendar_errorNoCalendar = "No calendar selected!";
$el.find('input').attr('autocomplete', 'off');
$el.find('.tui-full-calendar-dropdown-button').addClass('btn btn-secondary');
$el.find('.tui-full-calendar-popup-close').addClass('btn btn-cancel fa fa-times cp-calendar-close').empty();
if ($el.find('.tui-full-calendar-hide.tui-full-calendar-dropdown').length) {
var calendars = APP.calendars || {};
var show = false;
$el.find('.tui-full-calendar-dropdown-menu li').each(function (i, li) {
var $li = $(li);
var id = $li.attr('data-calendar-id');
var c = calendars[id];
if (!c || c.readOnly) {
return void $li.remove();
}
// If at least one calendar is editable, show the popup
show = true;
});
if ($el.find('.tui-full-calendar-hide.tui-full-calendar-dropdown').length || !show) {
$el.hide();
UI.warn(Messages.calendar_errorNoCalendar);
return;
@ -604,14 +630,24 @@ Messages.calendar_errorNoCalendar = "No calendar selected!";
$el.find('.tui-full-calendar-dropdown-menu').addClass('cp-forcehide');
}
};
var onCalendarEditPopup = function (el) {
// TODO
};
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var node;
for (var i = 0; i < mutation.addedNodes.length; i++) {
var node = mutation.addedNodes[i];
if (node.classList && node.classList.contains('tui-full-calendar-popup')) {
onCalendarPopup(node);
}
try {
if (node.classList && node.classList.contains('tui-full-calendar-popup')
&& node.parentNode.classList.contains('tui-view-26')) {
onCalendarPopup(node);
}
if (node.classList && node.classList.contains('tui-full-calendar-popup')
&& node.parentNode.classList.contains('tui-view-29')) {
onCalendarEditPopup(node);
}
} catch (e) {}
}
});
});
@ -637,7 +673,6 @@ Messages.calendar_errorNoCalendar = "No calendar selected!";
});
return;
}
console.error('subscribed');
// XXX build UI
makeCalendar();
UI.removeLoadingScreen();

@ -26,7 +26,8 @@ define([
//addRpc: addRpc,
//addData: addData,
//owned: true,
noRealtime: true
noRealtime: true,
cache: true,
});
});
});

@ -1494,7 +1494,7 @@ define([
}
};
// Teams support offline/cache mode
if (obj.type === "team") { return void todo(); }
if (['team', 'calendar'].indexOf(obj.type) !== -1) { return void todo(); }
// If we're in "noDrive" mode
if (!store.proxy) { return void todo(); }
// Other modules should wait for the ready event
@ -2652,6 +2652,7 @@ define([
}, true);
}).nThen(function (waitFor) {
loadUniversal(Team, 'team', waitFor, clientId);
loadUniversal(Calendar, 'calendar', waitFor);
}).nThen(function () {
cb();
});

@ -3,12 +3,13 @@ define([
'/common/common-hash.js',
'/common/common-constants.js',
'/common/common-realtime.js',
'/common/outer/cache-store.js',
'/customize/messages.js',
'/bower_components/nthen/index.js',
'/bower_components/chainpad-listmap/chainpad-listmap.js',
'/bower_components/chainpad-crypto/crypto.js',
'/bower_components/chainpad/chainpad.dist.js',
], function (Util, Hash, Constants, Realtime, Messages, nThen, Listmap, Crypto, ChainPad) {
], function (Util, Hash, Constants, Realtime, Cache, Messages, nThen, Listmap, Crypto, ChainPad) {
var Calendar = {};
@ -103,8 +104,9 @@ ctx.calendars[channel] = {
ctx.emit('UPDATE', {
teams: c.stores,
id: c.channel,
readOnly: c.readOnly,
readOnly: c.readOnly || (!c.ready && c.cacheready),
deleted: !c.stores.length,
restricted: c.restricted,
owned: false, // XXX XXX destroy
content: Util.clone(c.proxy)
}, ctx.clients);
@ -178,14 +180,16 @@ ctx.calendars[channel] = {
var config = {
data: {},
network: ctx.store.network, // XXX offline
network: ctx.store.network || ctx.store.networkPromise, // XXX offline
channel: secret.channel,
crypto: crypto,
owners: [edPublic],
ChainPad: ChainPad,
validateKey: secret.keys.validateKey || undefined,
userName: 'calendar',
classic: true
Cache: Cache,
classic: true,
onRejected: ctx.Store && ctx.Store.onRejected
};
console.error(channel, config);
@ -213,7 +217,12 @@ ctx.calendars[channel] = {
});
};
lm.proxy.on('ready', function () {
lm.proxy.on('cacheready', function () {
if (!proxy.metadata) { return; }
c.cacheready = true;
setTimeout(update);
if (cb) { cb(null, lm.proxy); }
}).on('ready', function () {
c.ready = true;
if (!proxy.metadata) {
if (!cfg.isNew) {
@ -240,6 +249,9 @@ ctx.calendars[channel] = {
if (info.error === "EDELETED" ) {
return void onDeleted();
}
if (info.error === "ERESTRICTED" ) {
c.restricted = true;
}
cb(info);
});
});
@ -274,7 +286,7 @@ ctx.calendars[channel] = {
Object.keys(ctx.calendars).forEach(function (channel) {
var c = ctx.calendars[channel] || {};
console.log(channel, c);
if (!c.ready) { return; }
if (!c.ready && !c.cacheready) { return; }
sendUpdate(ctx, c);
});
};

@ -186,7 +186,7 @@ define([
ChainPad: ChainPad,
classic: true,
network: network,
Cache: Cache, // ICE shared-folder cache
Cache: Cache, // shared-folder cache
metadata: {
validateKey: secret.keys.validateKey || undefined,
owners: owners

Loading…
Cancel
Save