|
|
|
|
|
// Listview view
|
|
enyo.kind({
|
|
name: "Sugar.Journal",
|
|
published: { journal: null },
|
|
kind: "FittableRows",
|
|
components: [
|
|
{name: "warningbox", kind: "Sugar.GenericDialogBox", showing: false, classes: "journal-dialogbox", onCancel: "dialogSelectedCancel", onOk: "dialogSelectedOk"},
|
|
{name: "content", kind: "Scroller", fit: true, classes: "journal-content", onresize: "draw", onScroll: "onscroll", components: [
|
|
{name: "empty", classes: "journal-empty", showing: true},
|
|
{name: "message", classes: "journal-message", showing: true},
|
|
{name: "nofilter", kind: "Sugar.IconButton", icon: {directory: "icons", icon: "dialog-cancel.svg"}, classes: "listview-button", ontap: "nofilter", showing: false},
|
|
{name: "journalList", classes: "journal-list", kind: "Repeater", onSetupItem: "setupItem", components: [
|
|
{name: "item", classes: "journal-list-item", components: [
|
|
{name: "check", kind: "Input", type: "checkbox", classes: "toggle journal-check", onchange: "switchCheck"},
|
|
{name: "favorite", kind: "Sugar.Icon", x: 40, y: 4, size: constant.iconSizeLargeFavorite, ontap: "switchFavorite"},
|
|
{name: "activity", kind: "Sugar.Icon", x: 100, y: 5, size: constant.iconSizeList, colorized: true, ontap: "runActivity"},
|
|
{name: "title", showing: true, classes: "journal-title", ontap: "titleEditStart"},
|
|
{name: "titleEdit", showing: false, kind: "enyo.Input", classes: "journal-title-edit", onblur:"titleEditEnd"},
|
|
{name: "time", classes: "journal-time"},
|
|
{name: "goright", kind: "Sugar.Icon", classes: "journal-goright", size: constant.iconSizeFavorite, ontap: "runActivity"}
|
|
]}
|
|
]},
|
|
{name: "activityPopup", kind: "Sugar.Popup", showing: false}
|
|
]},
|
|
{name: "footer", classes: "journal-footer toolbar", showing: false, components: [
|
|
{name: "journalbutton", kind: "Button", classes: "toolbutton view-localjournal-button active", title:"Journal", ontap: "showLocalJournal"},
|
|
{name: "cloudonebutton", kind: "Button", classes: "toolbutton view-cloudone-button", title:"Private", ontap: "showPrivateCloud"},
|
|
{name: "cloudallbutton", kind: "Button", classes: "toolbutton view-cloudall-button", title:"Shared", ontap: "showSharedCloud"},
|
|
{name: "syncgear", classes: "sync-button sync-gear sync-gear-journal", showing: false},
|
|
{name: "syncbutton", kind: "Button", classes: "toolbutton sync-button sync-journal", title:"Sync", ontap: "syncJournal"},
|
|
{name: "pageup", kind: "Button", classes: "toolbutton page-up", showing: false, title:"Previous", ontap: "pagePrevious"},
|
|
{name: "pagecount", content: "99/99", classes: "page-count", showing: false},
|
|
{name: "pagedown", kind: "Button", classes: "toolbutton page-down", showing: false, title:"Next", ontap: "pageNext"}
|
|
]}
|
|
],
|
|
|
|
// Constructor: init list
|
|
create: function() {
|
|
this.inherited(arguments);
|
|
this.toolbar = null;
|
|
this.empty = (this.journal.length == 0);
|
|
this.realLength = 0;
|
|
this.loadResult = {};
|
|
this.loadingError = false;
|
|
this.journalType = constant.journalLocal;
|
|
this.smallTime = false;
|
|
this.dialogAction = -1;
|
|
this.journalChanged();
|
|
this.$.footer.setShowing(preferences.getNetworkId() != null && preferences.getPrivateJournal() != null && preferences.getSharedJournal() != null);
|
|
if (l10n.language.direction == "rtl") {
|
|
this.$.message.addClass("rtl-10");
|
|
}
|
|
this.draw();
|
|
},
|
|
|
|
// Render
|
|
rendered: function() {
|
|
this.inherited(arguments);
|
|
|
|
// Colorizer footer icons
|
|
iconLib.colorize(this.$.journalbutton.hasNode(), preferences.getColor(), function() {});
|
|
iconLib.colorize(this.$.cloudonebutton.hasNode(), preferences.getColor(), function() {});
|
|
iconLib.colorize(this.$.cloudallbutton.hasNode(), preferences.getColor(), function() {});
|
|
|
|
this.$.syncbutton.setNodeProperty("title", l10n.get("Synchronize"));
|
|
this.$.pageup.setNodeProperty("title", l10n.get("Back"));
|
|
this.$.pagedown.setNodeProperty("title", l10n.get("Next"));
|
|
this.journalChanged();
|
|
},
|
|
|
|
// Handle scroll to lazy display on local content
|
|
onscroll: function(inSender, inEvent) {
|
|
var scrollBounds = inEvent.scrollBounds;
|
|
var scrollAtBottom = ((scrollBounds.maxTop - scrollBounds.top) < constant.journalScrollLimit);
|
|
var currentCount = this.$.journalList.get("count");
|
|
if (this.journalType == constant.journalLocal && !this.getToolbar().hasFilter() && scrollAtBottom && this.realLength > currentCount) {
|
|
var selection = this.getSelection();
|
|
var length = Math.min(currentCount + constant.journalStepCount, this.journal.length);
|
|
humane.log(l10n.get("Loading"));
|
|
this.$.journalList.set("count", length, true);
|
|
this.setSelection(selection);
|
|
this.updateSelectionCount();
|
|
}
|
|
},
|
|
|
|
// Load next remote page in Journal
|
|
pageNext: function() {
|
|
var result = this.loadResult;
|
|
if ((result.offset+result.limit) < result.total) {
|
|
this.getToolbar().setMultiselectToolbarVisibility(false);
|
|
this.$.warningbox.setShowing(false);
|
|
var journalId = (this.journalType == constant.journalRemotePrivate ) ? preferences.getPrivateJournal() : preferences.getSharedJournal();
|
|
var offset = result.offset + result.limit;
|
|
if (result.total - offset < result.limit) {
|
|
offset = result.total - result.limit;
|
|
}
|
|
humane.log(l10n.get("Loading"));
|
|
if (!this.getToolbar().hasFilter()) {
|
|
this.loadRemoteJournal(journalId, offset);
|
|
} else {
|
|
this.filterEntries(this.request.name, this.request.favorite, this.request.typeactivity, this.request.stime, offset);
|
|
}
|
|
}
|
|
},
|
|
|
|
// Load previous remote page in Journal
|
|
pagePrevious: function() {
|
|
var result = this.loadResult;
|
|
if (result.offset > 0) {
|
|
this.getToolbar().setMultiselectToolbarVisibility(false);
|
|
this.$.warningbox.setShowing(false);
|
|
var journalId = (this.journalType == constant.journalRemotePrivate ) ? preferences.getPrivateJournal() : preferences.getSharedJournal();
|
|
var offset = result.offset - result.limit;
|
|
if (offset < result.limit) {
|
|
offset = 0;
|
|
}
|
|
humane.log(l10n.get("Loading"));
|
|
if (!this.getToolbar().hasFilter()) {
|
|
this.loadRemoteJournal(journalId, offset);
|
|
} else {
|
|
this.filterEntries(this.request.name, this.request.favorite, this.request.typeactivity, this.request.stime, offset);
|
|
}
|
|
}
|
|
},
|
|
|
|
// Show/hide remote page button
|
|
showPageButton: function() {
|
|
var result = this.loadResult;
|
|
if (this.journalType == constant.journalLocal || !result) {
|
|
this.$.pagedown.setShowing(false);
|
|
this.$.pageup.setShowing(false);
|
|
this.$.pagecount.setShowing(false);
|
|
return;
|
|
}
|
|
|
|
var up = (result.offset > 0);
|
|
this.$.pageup.setShowing(up);
|
|
|
|
var down = (result.offset+result.limit) < result.total;
|
|
this.$.pagedown.setShowing(down);
|
|
|
|
var currentPage = (result.total?1:0)+Math.ceil(result.offset/result.limit);
|
|
var lastPage = Math.ceil(result.total/result.limit);
|
|
this.$.pagecount.setContent(currentPage+"/"+lastPage);
|
|
this.$.pagecount.setShowing(down || up);
|
|
},
|
|
|
|
// Get linked toolbar
|
|
getToolbar: function() {
|
|
if (this.toolbar == null) {
|
|
this.toolbar = new Sugar.JournalToolbar();
|
|
}
|
|
return this.toolbar;
|
|
},
|
|
|
|
// Draw screen
|
|
draw: function() {
|
|
// Resize content and set Journal empty in the middle
|
|
var canvas_center = util.getCanvasCenter();
|
|
var footer_size = this.$.footer.getShowing() ? 55 : 0; // HACK: 55 is the footer height
|
|
this.smallTime = (canvas_center.dx < 660);
|
|
var android_gap = (enyo.platform.android ? 3 : 0);
|
|
this.$.content.applyStyle("height", (canvas_center.dy-footer_size-android_gap)+"px");
|
|
this.$.empty.applyStyle("margin-left", (canvas_center.x-constant.sizeEmpty/4)+"px");
|
|
var margintop = (canvas_center.y-constant.sizeEmpty/4-80);
|
|
this.$.empty.applyStyle("margin-top", margintop+"px");
|
|
this.$.message.setContent(l10n.get("JournalEmpty"));
|
|
if (preferences.getNetworkId() != null && preferences.getPrivateJournal() != null && preferences.getSharedJournal() != null) {
|
|
tutorial.setElement("journalbutton", this.$.journalbutton.getAttribute("id"));
|
|
tutorial.setElement("cloudonebutton", this.$.cloudonebutton.getAttribute("id"));
|
|
tutorial.setElement("cloudallbutton", this.$.cloudallbutton.getAttribute("id"));
|
|
}
|
|
},
|
|
|
|
updateNetworkBar: function() {
|
|
this.$.footer.setShowing(preferences.getNetworkId() != null && preferences.getPrivateJournal() != null && preferences.getSharedJournal() != null);
|
|
this.draw();
|
|
},
|
|
|
|
// Property changed
|
|
journalChanged: function() {
|
|
if (!this.$.empty) {
|
|
return;
|
|
}
|
|
this.$.empty.show();
|
|
this.$.message.show();
|
|
this.$.nofilter.show();
|
|
var noFilter = !this.getToolbar().hasFilter();
|
|
var isLocalJournal = (this.journalType == constant.journalLocal);
|
|
this.empty = (noFilter && !this.loadingError && this.journal.length == 0);
|
|
if (this.journal != null && this.journal.length > 0) {
|
|
var length = (isLocalJournal && noFilter && this.journal.length > constant.journalInitCount) ? constant.journalInitCount : this.journal.length;
|
|
this.realLength = this.journal.length;
|
|
this.$.journalList.set("count", length, true);
|
|
this.$.empty.hide();
|
|
this.$.message.hide();
|
|
this.$.nofilter.hide();
|
|
} else {
|
|
this.$.journalList.set("count", 0, true);
|
|
if (this.empty) {
|
|
// Journal empty
|
|
this.$.message.setContent(l10n.get("JournalEmpty"));
|
|
this.$.nofilter.hide();
|
|
} else if (this.loadingError) {
|
|
// Loading error
|
|
this.$.message.setContent(l10n.get("ErrorLoadingRemote"));
|
|
this.$.nofilter.setText(l10n.get("Retry"));
|
|
this.$.nofilter.setIcon({directory: "icons", icon: "system-restart.svg"});
|
|
} else {
|
|
// Filtering return no result
|
|
this.$.message.setContent(l10n.get("NoMatchingEntries"));
|
|
this.$.nofilter.setText(l10n.get("ClearSearch"));
|
|
this.$.nofilter.setIcon({directory: "icons", icon: "dialog-cancel.svg"});
|
|
}
|
|
}
|
|
this.showPageButton();
|
|
},
|
|
|
|
// Init setup for a line
|
|
setupItem: function(inSender, inEvent) {
|
|
// Set item in the template
|
|
var entry = this.journal[inEvent.index];
|
|
if (entry.metadata.buddy_color) {
|
|
inEvent.item.$.activity.setColorizedColor(entry.metadata.buddy_color);
|
|
}
|
|
var activityIcon = preferences.getActivity(entry.metadata.activity);
|
|
if (activityIcon == preferences.genericActivity) {
|
|
if (entry.metadata.mimetype == "text/plain") {
|
|
activityIcon = {directory: "icons", icon: "application-x-txt.svg"};
|
|
} else if (entry.metadata.mimetype == "application/pdf") {
|
|
activityIcon = {directory: "icons", icon: "application-x-pdf.svg"};
|
|
} else if (entry.metadata.mimetype == "application/msword") {
|
|
activityIcon = {directory: "icons", icon: "application-x-doc.svg"};
|
|
} else if (entry.metadata.mimetype == "application/vnd.oasis.opendocument.text") {
|
|
activityIcon = {directory: "icons", icon: "application-x-odt.svg"};
|
|
}
|
|
}
|
|
inEvent.item.$.activity.setIcon(activityIcon);
|
|
inEvent.item.$.favorite.setIcon({directory: "icons", icon: "emblem-favorite-large.svg"});
|
|
var keep = entry.metadata.keep;
|
|
inEvent.item.$.favorite.setColorized(keep !== undefined && keep == 1);
|
|
inEvent.item.$.title.setContent(entry.metadata.title);
|
|
var sortfield = this.getToolbar().getSortType();
|
|
if (sortfield == 1) {
|
|
inEvent.item.$.time.setContent(util.timestampToElapsedString(entry.metadata.creation_time, 2, this.smallTime));
|
|
} else if (sortfield == 2) {
|
|
inEvent.item.$.time.setContent(util.formatSize(entry.metadata.textsize || 0));
|
|
} else {
|
|
inEvent.item.$.time.setContent(util.timestampToElapsedString(entry.metadata.timestamp, 2, this.smallTime));
|
|
}
|
|
inEvent.item.$.goright.setIcon({directory: "icons", icon: "go-right.svg"});
|
|
inEvent.item.$.activity.setPopupShow(enyo.bind(this, "showActivityPopup"));
|
|
inEvent.item.$.activity.setPopupHide(enyo.bind(this, "hideActivityPopup"));
|
|
inEvent.item.$.activity.setData(entry);
|
|
if (l10n.language.direction == "rtl") {
|
|
inEvent.item.$.title.addClass("rtl-14");
|
|
inEvent.item.$.titleEdit.addClass("rtl-14");
|
|
inEvent.item.$.time.addClass("rtl-14");
|
|
}
|
|
if (inEvent.index == 0) {
|
|
tutorial.setElement("checkitem", inEvent.item.$.check.getAttribute("id"));
|
|
tutorial.setElement("activityitem", inEvent.item.$.activity.getAttribute("id"));
|
|
tutorial.setElement("titleitem", inEvent.item.$.title.getAttribute("id"));
|
|
tutorial.setElement("timeitem", inEvent.item.$.time.getAttribute("id"));
|
|
tutorial.setElement("favoriteitem", inEvent.item.$.favorite.getAttribute("id"));
|
|
}
|
|
},
|
|
|
|
// Switch favorite value for clicked line
|
|
switchFavorite: function(inSender, inEvent) {
|
|
var objectId = this.journal[inEvent.index].objectId;
|
|
var keep = this.journal[inEvent.index].metadata.keep;
|
|
if (keep === undefined) {
|
|
this.journal[inEvent.index].metadata.keep = 1;
|
|
} else {
|
|
this.journal[inEvent.index].metadata.keep = (keep + 1) % 2;
|
|
}
|
|
stats.trace(constant.viewNames[app.getView()], 'switch_favorite', objectId, null);
|
|
var ds = new datastore.DatastoreObject(objectId);
|
|
ds.setMetadata(this.journal[inEvent.index].metadata);
|
|
ds.save();
|
|
inEvent.dispatchTarget.container.setColorized(this.journal[inEvent.index].metadata.keep == 1);
|
|
inEvent.dispatchTarget.container.render();
|
|
},
|
|
|
|
// Check/uncheck an item Checkbox
|
|
switchCheck: function(inSender, inEvent) {
|
|
this.$.warningbox.setShowing(false);
|
|
this.getToolbar().setMultiselectToolbarVisibility(this.updateSelectionCount() > 0);
|
|
},
|
|
|
|
updateSelectionCount: function() {
|
|
var selection = this.getSelection();
|
|
this.getToolbar().setSelectedCount(selection.length, this.$.journalList.get("count"));
|
|
return selection.length;
|
|
},
|
|
|
|
getSelection: function() {
|
|
var selection = [];
|
|
var length = this.$.journalList.get("count");
|
|
for (var i = 0 ; i < length ; i++) {
|
|
if (this.$.journalList.children[i].$.check.getNodeProperty("checked")) {
|
|
selection.push(i);
|
|
}
|
|
}
|
|
return selection;
|
|
},
|
|
|
|
setSelection: function(selection) {
|
|
var length = selection.length;
|
|
for (var i = 0 ; i < length ; i++) {
|
|
var index = selection[i];
|
|
this.$.journalList.children[index].$.check.setNodeProperty("checked", true);
|
|
}
|
|
},
|
|
|
|
selectAll: function() {
|
|
var length = this.$.journalList.get("count");
|
|
for (var i = 0 ; i < length ; i++) {
|
|
this.$.journalList.children[i].$.check.setNodeProperty("checked", true);
|
|
}
|
|
this.getToolbar().setSelectedCount(length, length);
|
|
},
|
|
|
|
unselectAll: function() {
|
|
var length = this.$.journalList.get("count");
|
|
for (var i = 0 ; i < length ; i++) {
|
|
this.$.journalList.children[i].$.check.setNodeProperty("checked", false);
|
|
}
|
|
this.getToolbar().setMultiselectToolbarVisibility(false);
|
|
},
|
|
|
|
removeSelected: function() {
|
|
this.dialogAction = constant.journalRemove;
|
|
this.$.warningbox.setTitle(l10n.get("Erase"));
|
|
var length = this.getSelection().length;
|
|
this.$.warningbox.setMessage(length == 1 ? l10n.get("Erase_one",{count:length}) : l10n.get("Erase_other",{count:length}));
|
|
this.$.warningbox.setOkText(l10n.get("Ok"));
|
|
this.$.warningbox.setCancelText(l10n.get("Cancel"));
|
|
this.$.warningbox.setShowing(true);
|
|
},
|
|
|
|
copySelected: function(dest) {
|
|
this.dialogAction = dest;
|
|
var title = ["CopyToLocal", "CopyToPrivate", "CopyToShared", "", "CopyToDevice"];
|
|
this.$.warningbox.setTitle(l10n.get(title[dest]));
|
|
var length = this.getSelection().length;
|
|
this.$.warningbox.setMessage(length == 1 ? l10n.get(title[dest]+"_one",{count:length}) : l10n.get(title[dest]+"_other",{count:length}));
|
|
this.$.warningbox.setOkText(l10n.get("Ok"));
|
|
this.$.warningbox.setCancelText(l10n.get("Cancel"));
|
|
this.$.warningbox.setShowing(true);
|
|
},
|
|
|
|
dialogSelectedOk: function() {
|
|
this.$.warningbox.setShowing(false);
|
|
this.getToolbar().setMultiselectToolbarVisibility(false);
|
|
var selection = this.getSelection();
|
|
var toProcess = [];
|
|
for (var i = 0 ; i < selection.length ; i++) {
|
|
toProcess.push(this.journal[selection[i]]);
|
|
}
|
|
var that = this;
|
|
var isMultiple = (this.dialogAction == constant.journalDevice && util.getClientType() == constant.appType && enyo.platform.electron);
|
|
if (!isMultiple) {
|
|
humane.log(l10n.get(this.dialogAction == constant.journalRemove ? "Erasing" : "Copying"));
|
|
}
|
|
window.setTimeout(function() {
|
|
if (!isMultiple) {
|
|
// Do action on each entry
|
|
for (var i = 0 ; i < toProcess.length ; i++) {
|
|
if (that.dialogAction == constant.journalDevice) {
|
|
that.copyToDevice(toProcess[i]);
|
|
} else if (that.dialogAction == constant.journalRemove) {
|
|
that.removeEntry(toProcess[i], {isLast: (i==toProcess.length-1)});
|
|
} else if (that.dialogAction == constant.journalLocal) {
|
|
that.copyToLocal(toProcess[i]);
|
|
} else {
|
|
that.copyToRemote(toProcess[i], (that.dialogAction == constant.journalRemotePrivate ? preferences.getPrivateJournal() : preferences.getSharedJournal()));
|
|
}
|
|
}
|
|
} else {
|
|
// Do action on all entries
|
|
that.copyMultipleToDevice(toProcess);
|
|
}
|
|
that.unselectAll();
|
|
}, 100);
|
|
},
|
|
|
|
dialogSelectedCancel: function() {
|
|
this.$.warningbox.setShowing(false);
|
|
this.getToolbar().setMultiselectToolbarVisibility(true);
|
|
},
|
|
|
|
// Run activity from icon or from the popup menu
|
|
runActivity: function(inSender, inEvent) {
|
|
this.runCurrentActivity(this.journal[inEvent.index]);
|
|
},
|
|
runCurrentActivity: function(activity) {
|
|
// Generic activity type, try to open as a document
|
|
var activityInstance = preferences.getActivity(activity.metadata.activity);
|
|
if (activityInstance == preferences.genericActivity) {
|
|
if (activity.metadata.mimetype == "application/pdf") {
|
|
var that = this;
|
|
this.loadEntry(activity, function(err, metadata, text) {
|
|
that.$.activityPopup.hidePopup();
|
|
util.openAsDocument(metadata, text);
|
|
return;
|
|
});
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Load text content
|
|
var that = this;
|
|
this.loadEntry(activity, function(err, metadata, text) {
|
|
// Remote entry, copy in the local journal first
|
|
if (that.journalType != constant.journalLocal) {
|
|
// Create the entry with same oid - or update the entry if already there
|
|
var ds = new datastore.DatastoreObject(activity.objectId);
|
|
ds.setMetadata(metadata);
|
|
ds.setDataAsText(text);
|
|
ds.save(function() {
|
|
// Run updated local entry
|
|
preferences.runActivity(
|
|
activityInstance,
|
|
activity.objectId,
|
|
metadata.title);
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Run local entry
|
|
preferences.runActivity(
|
|
activityInstance,
|
|
activity.objectId,
|
|
metadata.title);
|
|
});
|
|
},
|
|
|
|
// Filter entries handling
|
|
filterEntries: function(name, favorite, typeactivity, timeperiod, offset) {
|
|
// Filter remote entries
|
|
var sortfield = this.getToolbar().getSortType();
|
|
if (this.journalType != constant.journalLocal) {
|
|
var journalId = (this.journalType == constant.journalRemotePrivate ) ? preferences.getPrivateJournal() : preferences.getSharedJournal();
|
|
var that = this;
|
|
var sort = '-timestamp';
|
|
if (sortfield == 1) {
|
|
sort = '-creation_time';
|
|
} else if (sortfield == 2) {
|
|
sort = '-textsize';
|
|
}
|
|
var request = {
|
|
typeactivity: typeactivity,
|
|
title: (name !== undefined) ? name : undefined,
|
|
stime: (timeperiod !== undefined ? timeperiod : undefined),
|
|
favorite: favorite,
|
|
field: constant.fieldMetadata,
|
|
limit: constant.pageJournalSize,
|
|
sort: sort,
|
|
offset: (offset !== undefined ? offset : 0)
|
|
}
|
|
myserver.getJournal(journalId, request,
|
|
function(inSender, inResponse) {
|
|
that.loadResult = {offset: inResponse.offset, total: inResponse.total, limit: inResponse.limit};
|
|
that.request = request;
|
|
that.journal = inResponse.entries;
|
|
that.empty = (!that.getToolbar().hasFilter() && !this.loadingError && that.journal.length == 0);
|
|
that.loadingError = false;
|
|
that.journalChanged();
|
|
},
|
|
function() {
|
|
console.log("WARNING: Error filtering journal "+journalId);
|
|
that.loadResult = {};
|
|
that.request = {};
|
|
that.journal = [];
|
|
that.loadingError = true;
|
|
that.journalChanged();
|
|
}
|
|
);
|
|
return;
|
|
}
|
|
|
|
// Filter local entries
|
|
this.journal = datastore.find(typeactivity);
|
|
this.loadingError = false;
|
|
this.journal = this.journal.filter(function(activity) {
|
|
return (favorite !== undefined ? activity.metadata.keep : true)
|
|
&& (name.length != 0 ? activity.metadata.title.toLowerCase().indexOf(name.toLowerCase()) != -1 : true)
|
|
&& (timeperiod !== undefined ? activity.metadata.timestamp >= timeperiod : true);
|
|
});
|
|
var that = this;
|
|
this.journal = this.journal.sort(function(e0, e1) {
|
|
if (sortfield == 1) {
|
|
return parseInt(e1.metadata.creation_time) - parseInt(e0.metadata.creation_time);
|
|
} else if (sortfield == 2) {
|
|
return parseInt(e1.metadata.textsize || 0) - parseInt(e0.metadata.textsize || 0);
|
|
} else {
|
|
return parseInt(e1.metadata.timestamp) - parseInt(e0.metadata.timestamp);
|
|
}
|
|
});
|
|
this.journalChanged();
|
|
},
|
|
|
|
nofilter: function() {
|
|
this.toolbar.removeFilter();
|
|
this.filterEntries("", undefined, undefined, undefined, undefined);
|
|
},
|
|
|
|
// Activity popup
|
|
showActivityPopup: function(icon) {
|
|
// Create popup
|
|
if (!icon.owner) {
|
|
return;
|
|
}
|
|
var activity = icon.icon; // HACK: activity is stored as an icon
|
|
var entry = icon.getData();
|
|
var title = null;
|
|
if (this.journalType != constant.sharedJournal) {
|
|
if (entry.metadata.textsize && entry.metadata.textsize > constant.minimumSizeDisplay) {
|
|
title = util.formatSize(entry.metadata.textsize);
|
|
}
|
|
} else if (entry.metadata.buddy_name) {
|
|
title = l10n.get("ByUser", {user:entry.metadata.buddy_name});
|
|
}
|
|
this.$.activityPopup.setHeader({
|
|
icon: icon.icon,
|
|
colorized: true,
|
|
colorizedColor: (entry.metadata.buddy_color ? entry.metadata.buddy_color : null),
|
|
name: entry.metadata.title,
|
|
title: title,
|
|
action: enyo.bind(this, "runCurrentActivity"),
|
|
data: [entry, null]
|
|
});
|
|
this.$.activityPopup.setItems(null);
|
|
var items = [];
|
|
items.push({
|
|
icon: {directory: "icons", icon: "activity-start.svg"},
|
|
colorized: false,
|
|
name: l10n.get("RestartActivity"),
|
|
action: enyo.bind(this, "runCurrentActivity"),
|
|
disable: (preferences.getActivity(entry.metadata.activity) == preferences.genericActivity && entry.metadata.mimetype != "application/pdf"),
|
|
data: [entry, null]
|
|
});
|
|
items.push({
|
|
icon: {directory: "icons", icon: "copy-journal.svg"},
|
|
colorized: false,
|
|
name: l10n.get("CopyToLocal"),
|
|
action: enyo.bind(this, "copyToLocal"),
|
|
data: [entry, null],
|
|
disable: this.journalType == constant.journalLocal
|
|
});
|
|
items.push({
|
|
icon: {directory: "icons", icon: "copy-cloud-one.svg"},
|
|
colorized: false,
|
|
name: l10n.get("CopyToPrivate"),
|
|
action: enyo.bind(this, "copyToRemote"),
|
|
data: [entry, preferences.getPrivateJournal()],
|
|
disable: !preferences.isConnected() || this.journalType == constant.journalRemotePrivate
|
|
});
|
|
items.push({
|
|
icon: {directory: "icons", icon: "copy-cloud-all.svg"},
|
|
colorized: false,
|
|
name: l10n.get("CopyToShared"),
|
|
action: enyo.bind(this, "copyToRemote"),
|
|
data: [entry, preferences.getSharedJournal()],
|
|
disable: !preferences.isConnected() || this.journalType == constant.journalRemoteShared
|
|
});
|
|
items.push({
|
|
icon: {directory: "icons", icon: "copy-to-device.svg"},
|
|
colorized: false,
|
|
name: l10n.get("CopyToDevice"),
|
|
action: enyo.bind(this, "copyToDevice"),
|
|
data: [entry, null]
|
|
});
|
|
items.push({
|
|
icon: {directory: "icons", icon: "list-remove.svg"},
|
|
colorized: false,
|
|
name: l10n.get("Erase"),
|
|
action: enyo.bind(this, "removeEntry"),
|
|
data: [entry, null]
|
|
});
|
|
this.$.activityPopup.setFooter(items);
|
|
|
|
// Show popup
|
|
this.$.activityPopup.setMargin({left: 0, top: (icon.owner.index*60)+20-mouse.position.y});
|
|
this.$.activityPopup.showPopup();
|
|
},
|
|
hideActivityPopup: function(icon) {
|
|
if (!this.$.activityPopup) {
|
|
return true;
|
|
}
|
|
if (this.$.activityPopup.cursorIsInside() || icon.cursorIsInside()) {
|
|
return false;
|
|
}
|
|
this.$.activityPopup.hidePopup();
|
|
return true;
|
|
},
|
|
|
|
// Copy activity content to the local journal
|
|
copyToLocal: function(entry) {
|
|
var that = this;
|
|
stats.trace(constant.viewNames[app.getView()], 'copy_to_local', entry.objectId, null);
|
|
this.loadEntry(entry, function(err, metadata, text) {
|
|
var ds = new datastore.DatastoreObject(entry.objectId);
|
|
ds.setMetadata(metadata);
|
|
ds.setDataAsText(text);
|
|
ds.save();
|
|
that.$.activityPopup.hidePopup();
|
|
});
|
|
},
|
|
|
|
// Copy activity content into a file on the device
|
|
copyToDevice: function(entry, directory) {
|
|
var that = this;
|
|
that.$.activityPopup.hidePopup();
|
|
this.loadEntry(entry, function(err, metadata, text) {
|
|
util.writeFile(directory, metadata, text, function(err, filename) {
|
|
if (err) {
|
|
humane.log(l10n.get("ErrorWritingFile"));
|
|
} else {
|
|
humane.log(l10n.get("FileWroteTo",{file:filename}));
|
|
}
|
|
});
|
|
});
|
|
},
|
|
|
|
// Copy a set of entries on the device: ask directory, then copy each entry
|
|
copyMultipleToDevice: function(entries) {
|
|
var that = this;
|
|
util.askDirectory(function(directory) {
|
|
for (var i = 0 ; i < entries.length ; i++) {
|
|
that.copyToDevice(entries[i], directory);
|
|
}
|
|
});
|
|
},
|
|
|
|
// Copy activity content to a remote journal
|
|
copyToRemote: function(entry, journalId) {
|
|
stats.trace(constant.viewNames[app.getView()], 'copy_to_remote', entry.objectId, journalId);
|
|
this.loadEntry(entry, function(err, metadata, text) {
|
|
var dataentry = {metadata: metadata, text: text, objectId: entry.objectId};
|
|
myserver.putJournalEntry(journalId, entry.objectId, dataentry,
|
|
function() {},
|
|
function() {
|
|
console.log("WARNING: Error writing journal "+journalId);
|
|
}
|
|
);
|
|
});
|
|
this.$.activityPopup.hidePopup();
|
|
},
|
|
|
|
// Load local journal
|
|
loadLocalJournal: function() {
|
|
this.journal = datastore.find();
|
|
this.journal = this.journal.sort(function(e0, e1) {
|
|
return parseInt(e1.metadata.timestamp) - parseInt(e0.metadata.timestamp);
|
|
});
|
|
this.journalChanged();
|
|
},
|
|
|
|
// Load a remote journal
|
|
loadRemoteJournal: function(journalId, offset) {
|
|
var that = this;
|
|
var request = {
|
|
field: constant.fieldMetadata,
|
|
limit: constant.pageJournalSize,
|
|
offset: (offset !== undefined ? offset : 0),
|
|
sort: '-timestamp'
|
|
}
|
|
var sortfield = this.getToolbar().getSortType();
|
|
if (sortfield == 1) {
|
|
request.sort = '-creation_time';
|
|
} else if (sortfield == 2) {
|
|
request.sort = '-textsize';
|
|
}
|
|
myserver.getJournal(journalId, request,
|
|
function(inSender, inResponse) {
|
|
that.loadResult = {offset: inResponse.offset, total: inResponse.total, limit: inResponse.limit};
|
|
that.journal = inResponse.entries;
|
|
that.empty = (!that.getToolbar().hasFilter() && !this.loadingError && that.journal.length == 0);
|
|
that.loadingError = false;
|
|
that.journalChanged();
|
|
},
|
|
function() {
|
|
console.log("WARNING: Error reading journal "+journalId);
|
|
that.loadResult = {};
|
|
that.journal = [];
|
|
that.loadingError = true;
|
|
that.journalChanged();
|
|
}
|
|
);
|
|
},
|
|
|
|
// Load entry in the journal
|
|
loadEntry: function(entry, callback) {
|
|
if (this.journalType == constant.journalLocal) {
|
|
var dataentry = new datastore.DatastoreObject(entry.objectId);
|
|
dataentry.loadAsText(function(err, metadata, text) {
|
|
callback(err, metadata, text);
|
|
});
|
|
} else {
|
|
var journalId;
|
|
if (this.journalType == constant.journalRemotePrivate) {
|
|
journalId = preferences.getPrivateJournal();
|
|
} else if (this.journalType == constant.journalRemoteShared) {
|
|
journalId = preferences.getSharedJournal();
|
|
}
|
|
myserver.getJournalEntry(journalId, entry.objectId,
|
|
function(inSender, inResponse) {
|
|
callback(null, inResponse.entries[0].metadata, inResponse.entries[0].text);
|
|
},
|
|
function() {
|
|
console.log("WARNING: Error loading entry "+objectId+" in journal "+journalId);
|
|
}
|
|
);
|
|
}
|
|
},
|
|
|
|
// Remove an entry in the journal
|
|
removeEntry: function(entry, multiple) {
|
|
// Remove from local journal
|
|
if (this.journalType == constant.journalLocal) {
|
|
// Delete in datastore
|
|
stats.trace(constant.viewNames[app.getView()], 'remove_entry', entry.objectId, null);
|
|
datastore.remove(entry.objectId);
|
|
|
|
// If connected and in sync, try remove also the matching remote entry
|
|
if (preferences.isConnected() && preferences.getOptions("sync")) {
|
|
var journalId = preferences.getPrivateJournal();
|
|
var objectId = entry.objectId;
|
|
myserver.deleteJournalEntry(journalId, objectId,
|
|
function(inSender, inResponse) {},
|
|
function() {
|
|
console.log("WARNING: Error removing entry "+objectId+" in journal "+journalId);
|
|
}
|
|
);
|
|
}
|
|
|
|
// Test if refresh
|
|
var refresh = (!multiple || multiple.isLast);
|
|
if (refresh) {
|
|
// Refresh screen
|
|
this.toolbar.removeFilter();
|
|
this.loadLocalJournal();
|
|
|
|
// Refresh home screen: activity menu, journal content
|
|
preferences.updateEntries();
|
|
app.journal = this.journal;
|
|
app.redraw();
|
|
}
|
|
} else {
|
|
// Remove from remote journal
|
|
var journalId = (this.journalType == constant.journalRemotePrivate ) ? preferences.getPrivateJournal() : preferences.getSharedJournal();
|
|
var objectId = entry.objectId;
|
|
var that = this;
|
|
this.toolbar.removeFilter();
|
|
stats.trace(constant.viewNames[app.getView()], 'remove_entry', objectId, journalId);
|
|
myserver.deleteJournalEntry(journalId, objectId,
|
|
function(inSender, inResponse) {
|
|
that.loadRemoteJournal(journalId);
|
|
that.$.activityPopup.hidePopup();
|
|
},
|
|
function() {
|
|
console.log("WARNING: Error removing entry "+objectId+" in journal "+journalId);
|
|
that.loadRemoteJournal(journalId);
|
|
that.$.activityPopup.hidePopup();
|
|
}
|
|
);
|
|
return;
|
|
}
|
|
this.$.activityPopup.hidePopup();
|
|
},
|
|
|
|
// Handle entry title update
|
|
titleEditStart: function(inSender, inEvent) {
|
|
var line = inEvent.dispatchTarget.owner.$;
|
|
line.title.setShowing(false);
|
|
line.titleEdit.setValue(line.title.getContent());
|
|
line.titleEdit.setShowing(true);
|
|
line.titleEdit.focus();
|
|
},
|
|
|
|
titleEditEnd: function(inSender, inEvent) {
|
|
var line = inEvent.dispatchTarget.owner.$;
|
|
line.title.setShowing(true);
|
|
line.titleEdit.setShowing(false);
|
|
var newtitle = line.titleEdit.getValue();
|
|
if (newtitle == line.title.getContent()) {
|
|
return;
|
|
}
|
|
var objectId = this.journal[inEvent.index].objectId;
|
|
|
|
// Update local journal
|
|
var that = this;
|
|
this.loadEntry(this.journal[inEvent.index], function(err, metadata, text) {
|
|
if (that.journalType == constant.journalLocal) {
|
|
// Update metadata
|
|
metadata.title = newtitle;
|
|
stats.trace(constant.viewNames[app.getView()], 'rename_entry', objectId, 'local');
|
|
|
|
// Update datastore
|
|
var ds = new datastore.DatastoreObject(objectId);
|
|
ds.setMetadata(metadata);
|
|
ds.setDataAsText(text);
|
|
ds.save();
|
|
|
|
// Refresh screen
|
|
that.loadLocalJournal();
|
|
|
|
// Refresh home screen: activity menu, journal content
|
|
preferences.updateEntries();
|
|
app.journal = that.journal;
|
|
app.redraw();
|
|
}
|
|
|
|
// Update remote journal
|
|
else {
|
|
// Update metadata
|
|
metadata.title = newtitle;
|
|
|
|
// Update remote journal
|
|
var journalId = (that.journalType == constant.journalRemotePrivate ) ? preferences.getPrivateJournal() : preferences.getSharedJournal();
|
|
var dataentry = {metadata: metadata, text: text, objectId: objectId};
|
|
stats.trace(constant.viewNames[app.getView()], 'rename_entry', objectId, journalId);
|
|
myserver.putJournalEntry(journalId, objectId, dataentry,
|
|
function() {
|
|
that.loadRemoteJournal(journalId);
|
|
},
|
|
function() {
|
|
console.log("WARNING: Error updating journal "+journalId);
|
|
that.loadRemoteJournal(journalId);
|
|
}
|
|
);
|
|
}
|
|
});
|
|
},
|
|
|
|
// Switch journal
|
|
showLocalJournal: function() {
|
|
this.changeJournalType(constant.journalLocal);
|
|
stats.trace(constant.viewNames[app.getView()], 'show_journal', 'local', null);
|
|
this.loadLocalJournal();
|
|
},
|
|
|
|
showPrivateCloud: function() {
|
|
stats.trace(constant.viewNames[app.getView()], 'show_journal', 'private', null);
|
|
this.changeJournalType(constant.journalRemotePrivate);
|
|
this.loadRemoteJournal(preferences.getPrivateJournal());
|
|
},
|
|
|
|
showSharedCloud: function() {
|
|
stats.trace(constant.viewNames[app.getView()], 'show_journal', 'shared', null);
|
|
this.changeJournalType(constant.journalRemoteShared);
|
|
this.loadRemoteJournal(preferences.getSharedJournal());
|
|
},
|
|
|
|
// Sync local journal with remote journal
|
|
syncJournal: function() {
|
|
var that = this;
|
|
autosync.synchronizeJournal(
|
|
function(count) {
|
|
if (count) {
|
|
humane.log(l10n.get("RetrievingJournal"));
|
|
that.$.syncbutton.setShowing(false);
|
|
that.$.syncgear.setShowing(true);
|
|
}
|
|
},
|
|
function(locale, remote, error) {
|
|
// Display button
|
|
if (!that.$.syncbutton) {
|
|
return;
|
|
}
|
|
that.$.syncbutton.setShowing(true);
|
|
that.$.syncgear.setShowing(false);
|
|
// Locale has changed, update display
|
|
if (locale && that.journalType == constant.journalLocal) {
|
|
that.loadLocalJournal();
|
|
app.journal = that.journal;
|
|
preferences.updateEntries();
|
|
app.draw();
|
|
}
|
|
// Remote has changed, update display
|
|
if (remote && that.journalType == constant.journalRemotePrivate) {
|
|
that.loadRemoteJournal(preferences.getPrivateJournal());
|
|
}
|
|
}
|
|
);
|
|
},
|
|
|
|
changeJournalType: function(newType) {
|
|
this.journalType = newType;
|
|
this.$.journalbutton.addRemoveClass('active', newType == constant.journalLocal);
|
|
this.$.cloudonebutton.addRemoveClass('active', newType == constant.journalRemotePrivate);
|
|
this.$.cloudallbutton.addRemoveClass('active', newType == constant.journalRemoteShared);
|
|
this.getToolbar().removeFilter();
|
|
this.getToolbar().setMultiselectToolbarVisibility(false);
|
|
this.$.warningbox.setShowing(false);
|
|
},
|
|
|
|
getJournalType: function() {
|
|
return this.journalType;
|
|
}
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Class for journal toolbar
|
|
enyo.kind({
|
|
name: "Sugar.JournalToolbar",
|
|
kind: enyo.Control,
|
|
components: [
|
|
{name: "unselallbutton", showing: false, kind: "Sugar.Icon", classes: "journal-unselectall", x: 0, y: 0, icon: {directory: "icons", icon: "select-none.svg"}, size: constant.iconSizeList, disabledBackground: "#282828", ontap: "unselectAll"},
|
|
{name: "selallbutton", showing: false, kind: "Sugar.Icon", classes: "journal-selectall", x: 0, y: 0, icon: {directory: "icons", icon: "select-all.svg"}, size: constant.iconSizeList, disabledBackground: "#282828", ontap: "selectAll"},
|
|
{name: "split1", showing: false, classes: "splitbar"},
|
|
{name: "copyjournalbutton", showing: false, kind: "Sugar.Icon", classes: "journal-copy", x: 0, y: 0, icon: {directory: "icons", icon: "copy-journal.svg"}, size: constant.iconSizeList, disabledBackground: "#282828", ontap: "copySelected"},
|
|
{name: "copycloudonebutton", showing: false, kind: "Sugar.Icon", classes: "journal-copy", x: 0, y: 0, icon: {directory: "icons", icon: "copy-cloud-one.svg"}, size: constant.iconSizeList, disabledBackground: "#282828", ontap: "copySelected"},
|
|
{name: "copycloudallbutton", showing: false, kind: "Sugar.Icon", classes: "journal-copy", x: 0, y: 0, icon: {directory: "icons", icon: "copy-cloud-all.svg"}, size: constant.iconSizeList, disabledBackground: "#282828", ontap: "copySelected"},
|
|
{name: "copydevicebutton", showing: false, kind: "Sugar.Icon", classes: "journal-copy", x: 0, y: 0, icon: {directory: "icons", icon: "copy-to-device.svg"}, size: constant.iconSizeList, disabledBackground: "#282828", ontap: "copySelected"},
|
|
{name: "removebutton", showing: false, kind: "Sugar.Icon", classes: "journal-remove", x: 0, y: 0, icon: {directory: "icons", icon: "list-remove.svg"}, size: constant.iconSizeList, disabledBackground: "#282828", ontap: "removeSelected"},
|
|
{name: "split2", showing: false, classes: "splitbar"},
|
|
{name: "selectcount", showing: false, classes: "journal-selectcount"},
|
|
{name: "favoritebutton", kind: "Sugar.Icon", classes: "journal-filter-favorite", x: 0, y: 4, icon: {directory: "icons", icon: "emblem-favorite.svg"}, size: constant.iconSizeList, ontap: "filterFavorite"},
|
|
{name: "journalsearch", kind: "Sugar.SearchField", onTextChanged: "filterEntries", classes: "journal-filter-text"},
|
|
{name: "radialbutton", kind: "Button", classes: "toolbutton view-desktop-button", title:"Home", ontap: "gotoDesktop"},
|
|
{name: "typepalette", kind: "Sugar.Palette", ontap: "showTypePalette", icon: {directory: "icons", icon: "view-type.svg"}, size: constant.iconSizeList, classes: "journal-filtertype-palette", contentsClasses: "journal-filtertype-content", contents: []},
|
|
{name: "datepalette", kind: "Sugar.Palette", ontap: "showDatePalette", icon: {directory: "icons", icon: "view-created.svg"}, size: constant.iconSizeList, classes: "journal-filterdate-palette", contentsClasses: "journal-filterdate-content", contents: []},
|
|
{name: "sortpalette", kind: "Sugar.Palette", ontap: "showSortPalette", icon: {directory: "icons", icon: "view-lastedit.svg"}, size: constant.iconSizeList, classes: "journal-sort-palette", contentsClasses: "journal-sort-content", contents: []},
|
|
{name: "split3", classes: "splitbar journal-split split3"},
|
|
{name: "fromdevicebutton", kind: "Sugar.Icon", x: 0, y: 0, icon: {directory: "icons", icon: "copy-from-device.svg"}, classes: "journal-fromdevice", size: constant.iconSizeList, ontap: "fromDeviceSelected"},
|
|
{name: "split4", classes: "splitbar journal-split split4"},
|
|
{name: "helpbutton", kind: "Button", classes: "toolbutton help-button-journal", title:"Help", ontap: "startTutorial"}
|
|
],
|
|
|
|
// Constructor
|
|
create: function() {
|
|
this.inherited(arguments);
|
|
this.localize();
|
|
this.typeselected = 0;
|
|
this.dateselected = 0;
|
|
this.sortfield = 0;
|
|
if (util.getClientType() == constant.webAppType || (util.getClientType() == constant.appType && !enyo.platform.android && !enyo.platform.androidChrome && !enyo.platform.ios && !enyo.platform.electron)) {
|
|
this.createComponent({name: "file", kind: "Input", type: "file", showing: false, onchange: "fileSelected"}, {owner: this});
|
|
}
|
|
},
|
|
|
|
rendered: function() {
|
|
this.inherited(arguments);
|
|
this.localize();
|
|
},
|
|
|
|
localize: function() {
|
|
// Localize items
|
|
this.$.favoritebutton.setNodeProperty("title", l10n.get("FilterFavorites"));
|
|
this.$.radialbutton.setNodeProperty("title", l10n.get("Home"));
|
|
this.$.helpbutton.setNodeProperty("title", l10n.get("Tutorial"));
|
|
this.$.unselallbutton.setNodeProperty("title", l10n.get("UnselectAll"));
|
|
this.$.selallbutton.setNodeProperty("title", l10n.get("SelectAll"));
|
|
this.$.removebutton.setNodeProperty("title", l10n.get("Erase"));
|
|
this.$.copyjournalbutton.setNodeProperty("title", l10n.get("CopyToLocal"));
|
|
this.$.copycloudonebutton.setNodeProperty("title", l10n.get("CopyToPrivate"));
|
|
this.$.copycloudallbutton.setNodeProperty("title", l10n.get("CopyToShared"));
|
|
this.$.copydevicebutton.setNodeProperty("title", l10n.get("CopyToDevice"));
|
|
this.$.journalsearch.setPlaceholder(l10n.get("SearchJournal"));
|
|
this.$.typepalette.setText(l10n.get("AllType"));
|
|
this.$.datepalette.setText(l10n.get("Anytime"));
|
|
|
|
// Set time selectbox content
|
|
this.dates = [l10n.get("Anytime"), l10n.get("Today"), l10n.get("SinceYesterday"), l10n.get("PastWeek"), l10n.get("PastMonth")];
|
|
var items = [];
|
|
this.$.datepalette.setHeader(l10n.get("SelectFilter"));
|
|
for(var i = 0 ; i < this.dates.length ; i++) {
|
|
items.push({id: ""+(i+1), classes: "journal-filterdate-line", components:[
|
|
{classes: "journal-filterdate-item", content: this.dates[i]}
|
|
], ontap: "tapDate"});
|
|
}
|
|
this.$.datepalette.setItems(items);
|
|
|
|
// Set type selectbox content
|
|
items = [];
|
|
this.$.typepalette.setHeader(l10n.get("SelectFilter"));
|
|
items.push({id: "0", classes: "journal-filtertype-line", components:[
|
|
{kind: "Sugar.Icon", icon: {directory: "icons", icon: "application-x-generic.svg"}, x: 5, y: 3, size: constant.iconSizeFavorite},
|
|
{classes: "item-name", content: l10n.get("AllType")}
|
|
], ontap: "tapLine"});
|
|
var activities = preferences.getActivities();
|
|
var unsortedItems = [];
|
|
for(var i = 0 ; i < activities.length ; i++) {
|
|
unsortedItems.push({id: ""+(i+1), classes: "journal-filtertype-line", components:[
|
|
{kind: "Sugar.Icon", icon: activities[i], x: 5, y: 3, size: constant.iconSizeFavorite},
|
|
{classes: "item-name", content: activities[i].name}
|
|
], ontap: "tapLine"});
|
|
}
|
|
unsortedItems.sort(function(a,b) {
|
|
var ca = a.components[1].content, cb = b.components[1].content;
|
|
if (ca > cb) { return 1; }
|
|
else if (ca < cb) { return -1; }
|
|
else return 0;
|
|
});
|
|
for (var i = 0 ; i < unsortedItems.length ; i++) {
|
|
items.push(unsortedItems[i]);
|
|
}
|
|
this.$.typepalette.setItems(items);
|
|
|
|
// Set sort selectbox content
|
|
this.sorts = [{text: l10n.get("SortByUpdated"), icon:"view-lastedit.svg"}, {text: l10n.get("SortByCreated"), icon:"view-created.svg"}, {text: l10n.get("SortBySize"), icon:"view-size.svg"}];
|
|
var items = [];
|
|
this.$.sortpalette.setHeader(l10n.get("SortDisplay"));
|
|
for(var i = 0 ; i < this.sorts.length ; i++) {
|
|
items.push({id: ""+(i+1), classes: "journal-sort-line", components:[
|
|
{kind: "Sugar.Icon", icon: {directory: "icons", icon: this.sorts[i].icon}, x: 5, y: 3, size: constant.iconSizeFavorite},
|
|
{classes: "journal-sort-item", content: this.sorts[i].text}
|
|
], ontap: "tapSort"});
|
|
}
|
|
this.$.sortpalette.setItems(items);
|
|
},
|
|
|
|
// Event handling
|
|
gotoDesktop: function() {
|
|
util.vibrate();
|
|
app.showView(constant.radialView);
|
|
},
|
|
|
|
filterFavorite: function() {
|
|
this.$.favoritebutton.setColorized(!this.$.favoritebutton.getColorized());
|
|
this.$.favoritebutton.render();
|
|
this.filterEntries();
|
|
},
|
|
|
|
showTypePalette: function() {
|
|
this.$.typepalette.switchPalette(app.otherview);
|
|
},
|
|
|
|
tapLine: function(e, s) {
|
|
var activities = preferences.getActivities();
|
|
var generic = {directory: "icons", icon: "application-x-generic.svg"};
|
|
this.typeselected = e.getId();
|
|
this.$.typepalette.setIcon((this.typeselected == 0 ? generic : activities[this.typeselected-1]));
|
|
this.$.typepalette.setText((this.typeselected == 0 ? l10n.get("AllType") : activities[this.typeselected-1].name));
|
|
this.filterEntries();
|
|
this.$.typepalette.switchPalette(app.otherview);
|
|
},
|
|
|
|
showDatePalette: function() {
|
|
this.$.datepalette.switchPalette(app.otherview);
|
|
},
|
|
|
|
tapDate: function(e, s) {
|
|
this.dateselected = e.getId()-1;
|
|
this.$.datepalette.setText(this.dates[this.dateselected]);
|
|
this.filterEntries();
|
|
this.$.datepalette.switchPalette(app.otherview);
|
|
},
|
|
|
|
showSortPalette: function() {
|
|
this.$.sortpalette.switchPalette(app.otherview);
|
|
},
|
|
|
|
tapSort: function(e, s) {
|
|
this.sortfield = e.getId()-1;
|
|
this.$.sortpalette.setIcon({directory: "icons", icon: this.sorts[this.sortfield].icon});
|
|
this.filterEntries();
|
|
this.$.sortpalette.switchPalette(app.otherview);
|
|
},
|
|
|
|
selectAll: function() {
|
|
if (this.$.selallbutton.getDisabled()) {
|
|
return;
|
|
}
|
|
app.otherview.selectAll();
|
|
},
|
|
|
|
unselectAll: function() {
|
|
if (this.$.unselallbutton.getDisabled()) {
|
|
return;
|
|
}
|
|
app.otherview.unselectAll();
|
|
},
|
|
|
|
setSelectedCount: function(count, total) {
|
|
if (count <= 1) {
|
|
this.$.selectcount.setContent(l10n.get("Selected_one", {count: count, total: total}));
|
|
} else {
|
|
this.$.selectcount.setContent(l10n.get("Selected_other", {count: count, total: total}));
|
|
}
|
|
},
|
|
|
|
removeSelected: function() {
|
|
if (this.$.removebutton.getDisabled()) {
|
|
return;
|
|
}
|
|
this.disableMultiselectToolbarVisibility();
|
|
app.otherview.removeSelected();
|
|
},
|
|
|
|
copySelected: function(e, s) {
|
|
if (e.getDisabled()) {
|
|
return;
|
|
}
|
|
this.disableMultiselectToolbarVisibility();
|
|
var dest;
|
|
if (e.name == "copydevicebutton") {
|
|
dest = constant.journalDevice;
|
|
} else if (e.name == "copycloudonebutton") {
|
|
dest = constant.journalRemotePrivate;
|
|
} else if (e.name == "copycloudallbutton") {
|
|
dest = constant.journalRemoteShared;
|
|
} else {
|
|
dest = constant.journalLocal;
|
|
}
|
|
app.otherview.copySelected(dest);
|
|
},
|
|
|
|
fromDeviceSelected: function() {
|
|
if (util.getClientType() == constant.webAppType || (util.getClientType() == constant.appType && !enyo.platform.android && !enyo.platform.androidChrome && !enyo.platform.ios && !enyo.platform.electron)) {
|
|
this.$.file.setNodeProperty("accept", ".png,.jpg,.wav,.webm,.json,.mp3,.mp4,.pdf,.txt,.doc,.odt");
|
|
this.$.file.setNodeProperty("multiple", "true");
|
|
this.$.file.hasNode().click();
|
|
} else {
|
|
util.askFiles(function(file, err, metadata, text) {
|
|
if (err) {
|
|
humane.log(l10n.get("ErrorLoadingFile",{file:file}));
|
|
return;
|
|
}
|
|
metadata.timestamp = new Date().getTime();
|
|
metadata.creation_time = new Date().getTime();
|
|
datastore.create(metadata, function(err) {
|
|
if (err) {
|
|
humane.log(l10n.get("ErrorLoadingFile",{file:file}));
|
|
return;
|
|
}
|
|
app.otherview.loadLocalJournal();
|
|
if (preferences.isConnected()) {
|
|
app.otherview.syncJournal();
|
|
}
|
|
}, text);
|
|
});
|
|
}
|
|
},
|
|
|
|
fileSelected: function() {
|
|
var files = this.$.file.getNodeProperty("files");
|
|
for (var i = 0 ; i < files.length ; i++) {
|
|
util.loadFile(files[i], function(file, err, metadata, text) {
|
|
if (err) {
|
|
humane.log(l10n.get("ErrorLoadingFile",{file:file}));
|
|
return;
|
|
}
|
|
metadata.timestamp = new Date().getTime();
|
|
metadata.creation_time = new Date().getTime();
|
|
datastore.create(metadata, function() {
|
|
app.otherview.loadLocalJournal();
|
|
if (preferences.isConnected()) {
|
|
app.otherview.syncJournal();
|
|
}
|
|
}, text);
|
|
});
|
|
}
|
|
},
|
|
|
|
// Compute filter
|
|
hasFilter: function() {
|
|
return this.$.journalsearch.getText() != ""
|
|
|| this.$.favoritebutton.getColorized()
|
|
|| this.typeselected > 0
|
|
|| this.dateselected > 0;
|
|
},
|
|
|
|
getSortType: function() {
|
|
return this.sortfield;
|
|
},
|
|
|
|
filterEntries: function() {
|
|
var text = this.$.journalsearch.getText();
|
|
var favorite = this.$.favoritebutton.getColorized() ? true : undefined;
|
|
var selected = this.typeselected;
|
|
var typeselected = (selected <= 0 ? undefined : preferences.getActivities()[selected-1].id);
|
|
selected = this.dateselected;
|
|
var timeselected = (selected <= 0 ? undefined : util.getDateRange(selected).min);
|
|
var filtertext = 'q=' + text;
|
|
if (favorite) filtertext += '&favorite=true';
|
|
if (typeselected) filtertext += '&type=' + typeselected;
|
|
if (timeselected) filtertext += '&time=' + timeselected;
|
|
stats.trace(constant.viewNames[app.getView()], 'search', filtertext, null);
|
|
app.otherview.filterEntries(text, favorite, typeselected, timeselected, undefined, this.sortfield);
|
|
},
|
|
|
|
removeFilter: function() {
|
|
this.typeselected = 0;
|
|
this.$.typepalette.setIcon({directory: "icons", icon: "application-x-generic.svg"});
|
|
this.dateselected = 0;
|
|
this.sortfield = 0;
|
|
this.$.sortpalette.setIcon({directory: "icons", icon: "view-lastedit.svg"})
|
|
this.$.favoritebutton.setColorized(false);
|
|
this.$.journalsearch.setText("");
|
|
this.render();
|
|
},
|
|
|
|
setMultiselectToolbarVisibility: function(shown) {
|
|
if (this.$.typepalette.isOpen()) {
|
|
this.$.typepalette.switchPalette(app.otherview);
|
|
}
|
|
if (this.$.datepalette.isOpen()) {
|
|
this.$.datepalette.switchPalette(app.otherview);
|
|
}
|
|
if (this.$.sortpalette.isOpen()) {
|
|
this.$.sortpalette.switchPalette(app.otherview);
|
|
}
|
|
var journalType = app.otherview.getJournalType();
|
|
this.$.favoritebutton.setShowing(!shown);
|
|
this.$.journalsearch.setShowing(!shown);
|
|
this.$.radialbutton.setShowing(!shown);
|
|
this.$.typepalette.setShowing(!shown);
|
|
this.$.datepalette.setShowing(!shown);
|
|
this.$.sortpalette.setShowing(!shown);
|
|
this.$.split3.setShowing(!shown && journalType == constant.journalLocal);
|
|
this.$.fromdevicebutton.setShowing(!shown && journalType == constant.journalLocal);
|
|
this.$.split4.setShowing(!shown);
|
|
this.$.helpbutton.setShowing(!shown);
|
|
|
|
this.$.unselallbutton.setShowing(shown);
|
|
this.$.selallbutton.setShowing(shown);
|
|
this.$.split1.setShowing(shown);
|
|
this.$.removebutton.setShowing(shown);
|
|
this.$.copyjournalbutton.setShowing(shown && journalType != constant.journalLocal);
|
|
this.$.copycloudonebutton.setShowing(shown && journalType != constant.journalRemotePrivate && preferences.isConnected());
|
|
this.$.copycloudallbutton.setShowing(shown && journalType != constant.journalRemoteShared && preferences.isConnected());
|
|
this.$.copydevicebutton.setShowing(shown);
|
|
this.$.split2.setShowing(shown);
|
|
this.$.selectcount.setShowing(shown);
|
|
|
|
this.$.unselallbutton.setDisabled(!shown);
|
|
this.$.selallbutton.setDisabled(!shown);
|
|
this.$.removebutton.setDisabled(!shown);
|
|
this.$.copyjournalbutton.setDisabled(!shown);
|
|
this.$.copycloudonebutton.setDisabled(!shown);
|
|
this.$.copycloudallbutton.setDisabled(!shown);
|
|
this.$.copydevicebutton.setDisabled(!shown);
|
|
this.$.selectcount.addRemoveClass("journal-selectcount-disabled", !shown);
|
|
},
|
|
|
|
disableMultiselectToolbarVisibility: function() {
|
|
this.$.unselallbutton.setDisabled(true);
|
|
this.$.selallbutton.setDisabled(true);
|
|
this.$.removebutton.setDisabled(true);
|
|
this.$.copyjournalbutton.setDisabled(true);
|
|
this.$.copycloudonebutton.setDisabled(true);
|
|
this.$.copycloudallbutton.setDisabled(true);
|
|
this.$.copydevicebutton.setDisabled(true);
|
|
this.$.selectcount.addRemoveClass("journal-selectcount-disabled", true);
|
|
},
|
|
|
|
startTutorial: function() {
|
|
tutorial.setElement("favoritebutton", this.$.favoritebutton.getAttribute("id"));
|
|
tutorial.setElement("searchtext", this.$.journalsearch.getAttribute("id"));
|
|
tutorial.setElement("typeselect", this.$.typepalette.getAttribute("id"));
|
|
tutorial.setElement("timeselect", this.$.datepalette.getAttribute("id"));
|
|
tutorial.setElement("sortselect", this.$.sortpalette.getAttribute("id"));
|
|
tutorial.setElement("fromdevicebutton", this.$.fromdevicebutton.getAttribute("id"));
|
|
tutorial.setElement("radialbutton", this.$.radialbutton.getAttribute("id"));
|
|
stats.trace(constant.viewNames[app.getView()], 'tutorial', 'start', null);
|
|
tutorial.start();
|
|
}
|
|
});
|