solid-panes
Version:
Solid-compatible Panes: applets and views for the mashlib and databrowser
174 lines (158 loc) • 6.83 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var UI = _interopRequireWildcard(require("solid-ui"));
var $rdf = _interopRequireWildcard(require("rdflib"));
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
/* Trip Pane
**
** This pane deals with trips themselves and also
** will look at transactions organized by trip.
**
** This outline pane allows a user to interact with a transaction
** downloaded from a bank statement, annotting it with classes and comments,
** trips, etc
*/
const ns = UI.ns;
var _default = exports.default = {
icon: UI.icons.iconBase + 'noun_62007.svg',
name: 'travel expenses',
audience: [ns.solid('PowerUser')],
// Does the subject deserve this pane?
label: function (subject, context) {
const kb = context.session.store;
const t = kb.findTypeURIs(subject);
// if (t['http://www.w3.org/2000/10/swap/pim/qif#Transaction']) return "$$";
// if(kb.any(subject, UI.ns.qu('amount'))) return "$$$"; // In case schema not picked up
if (UI.ns.qu('Transaction') in kb.findSuperClassesNT(subject)) {
return 'by Trip';
}
if (t['http://www.w3.org/ns/pim/trip#Trip']) return 'Trip $';
return null; // No under other circumstances (while testing at least!)
},
render: function (subject, context) {
const myDocument = context.dom;
const kb = context.store;
const ns = UI.ns;
const CAL = $rdf.Namespace('http://www.w3.org/2002/12/cal/ical#');
const TRIP = $rdf.Namespace('http://www.w3.org/ns/pim/trip#');
const div = myDocument.createElement('div');
div.setAttribute('class', 'transactionPane');
div.innerHTML = '<h2>Trip transactions</h2>';
const complain = function complain(message, style) {
if (style === undefined) style = 'color: grey';
const pre = myDocument.createElement('pre');
pre.setAttribute('style', style);
div.appendChild(pre);
pre.appendChild(myDocument.createTextNode(message));
};
// //////////////////////////////////////////////////////////////////////////////
//
// Body of trip pane
const t = kb.findTypeURIs(subject);
// var me = authn.currentUser()
// Function: Render a single trip
const renderTrip = function renderTrip(subject, thisDiv) {
const query = new $rdf.Query(UI.utils.label(subject));
const vars = ['date', 'transaction', 'comment', 'type', 'in_USD'];
const v = {};
vars.forEach(function (x) {
query.vars.push(v[x] = $rdf.variable(x));
}); // Only used by UI
query.pat.add(v.transaction, TRIP('trip'), subject);
const opt = kb.formula();
opt.add(v.transaction, ns.rdf('type'), v.type); // Issue: this will get stored supertypes too
query.pat.optional.push(opt);
query.pat.add(v.transaction, UI.ns.qu('date'), v.date);
opt.add(v.transaction, ns.rdfs('comment'), v.comment);
query.pat.optional.push(opt);
// opt = kb.formula();
query.pat.add(v.transaction, UI.ns.qu('in_USD'), v.in_USD);
// query.pat.optional.push(opt);
const calculations = function () {
const total = {};
const trans = kb.each(undefined, TRIP('trip'), subject);
// complain("@@ Number of transactions in this trip: " + trans.length);
trans.forEach(function (t) {
let ty = kb.the(t, ns.rdf('type'));
// complain(" -- one trans: "+t.uri + ' -> '+kb.any(t, UI.ns.qu('in_USD')));
if (!ty) ty = UI.ns.qu('ErrorNoType');
if (ty && ty.uri) {
const tyuri = ty.uri;
if (!total[tyuri]) total[tyuri] = 0.0;
const lit = kb.any(t, UI.ns.qu('in_USD'));
if (!lit) {
complain(' @@ No amount in USD: ' + lit + ' for ' + t);
}
if (lit) {
total[tyuri] = total[tyuri] + parseFloat(lit.value);
// complain(' Trans type ='+ty+'; in_USD "' + lit
// +'; total[tyuri] = '+total[tyuri]+';')
}
}
});
let str = '';
let types = 0;
let grandTotal = 0.0;
for (const uri in total) {
str += UI.utils.label(kb.sym(uri)) + ': ' + total[uri] + '; ';
types++;
grandTotal += total[uri];
}
complain('Totals of ' + trans.length + ' transactions: ' + str, ''); // @@@@@ yucky -- need 2 col table
if (types > 1) {
complain('Overall net: ' + grandTotal, 'text-treatment: bold;');
}
};
const tableDiv = UI.table(myDocument, {
query,
onDone: calculations
});
thisDiv.appendChild(tableDiv);
};
// Render the set of trips which have transactions in this class
if (UI.ns.qu('Transaction') in kb.findSuperClassesNT(subject)) {
const ts = kb.each(undefined, ns.rdf('type'), subject);
const triples = [];
const index = [];
for (let i = 0; i < ts.length; i++) {
const trans = ts[i];
const trip = kb.any(trans, TRIP('trip'));
if (!trip) {
triples.push(trans);
} else {
if (!(trans in index)) index[trip] = {
total: 0,
transactions: []
};
const usd = kb.any(trans, UI.ns.qu('in_USD'));
if (usd) index[trip].total += usd;
const date = kb.any(trans, UI.ns.qu('date'));
index[trip.toNT()].transactions.push([date, trans]);
}
}
/* var byDate = function(a,b) {
return new Date(kb.any(a, CAL('dtstart'))) -
new Date(kb.any(b, CAL('dtstart')));
}
*/
const list = [];
for (const h1 in index) {
const t1 = kb.fromNT(h1);
list.push([kb.any(t1, CAL('dtstart')), t1]);
}
list.sort();
for (let j = 0; j < list.length; j++) {
const t2 = list[j][1];
renderTrip(t2, div);
}
// Render a single trip
} else if (t['http://www.w3.org/ns/pim/trip#Trip']) {
renderTrip(subject, div);
}
// if (!me) complain("You do not have your Web Id set. Set your Web ID to make changes.");
return div;
}
}; // ends