solid-panes 3.5.19 → 3.5.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dev/loader.ts +11 -11
- package/lib/argument/argumentPane.js +15 -7
- package/lib/argument/argumentPane.js.map +1 -1
- package/lib/dashboard/basicPreferences.d.ts.map +1 -1
- package/lib/dashboard/basicPreferences.js +6 -6
- package/lib/dashboard/basicPreferences.js.map +1 -1
- package/lib/dashboard/dashboardPane.d.ts.map +1 -1
- package/lib/dashboard/dashboardPane.js +6 -4
- package/lib/dashboard/dashboardPane.js.map +1 -1
- package/lib/dataContentPane.js +1 -1
- package/lib/dataContentPane.js.map +1 -1
- package/lib/form/pane.js +15 -6
- package/lib/form/pane.js.map +1 -1
- package/lib/home/homePane.d.ts.map +1 -1
- package/lib/home/homePane.js +7 -5
- package/lib/home/homePane.js.map +1 -1
- package/lib/index.d.ts +7 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +15 -4
- package/lib/index.js.map +1 -1
- package/lib/mainPage/header.d.ts.map +1 -1
- package/lib/mainPage/header.js +4 -2
- package/lib/mainPage/header.js.map +1 -1
- package/lib/microblogPane/microblogPane.js +16 -14
- package/lib/microblogPane/microblogPane.js.map +1 -1
- package/lib/outline/dragDrop.js +16 -6
- package/lib/outline/dragDrop.js.map +1 -1
- package/lib/outline/licenseOptions.js +12 -5
- package/lib/outline/licenseOptions.js.map +1 -1
- package/lib/outline/manager.js +29 -21
- package/lib/outline/manager.js.map +1 -1
- package/lib/outline/queryByExample.js +14 -6
- package/lib/outline/queryByExample.js.map +1 -1
- package/lib/outline/userInput.js +90 -80
- package/lib/outline/userInput.js.map +1 -1
- package/lib/pad/padPane.d.ts.map +1 -1
- package/lib/pad/padPane.js +6 -4
- package/lib/pad/padPane.js.map +1 -1
- package/lib/profile/editProfile.view.d.ts.map +1 -1
- package/lib/profile/editProfile.view.js +3 -3
- package/lib/profile/editProfile.view.js.map +1 -1
- package/lib/schedule/schedulePane.js +26 -14
- package/lib/schedule/schedulePane.js.map +1 -1
- package/lib/socialPane.js +16 -6
- package/lib/socialPane.js.map +1 -1
- package/lib/transaction/pane.js +1 -1
- package/lib/transaction/pane.js.map +1 -1
- package/lib/transaction/period.js +1 -1
- package/lib/transaction/period.js.map +1 -1
- package/lib/trip/tripPane.js +1 -1
- package/lib/trip/tripPane.js.map +1 -1
- package/lib/trustedApplications/trustedApplications.dom.d.ts.map +1 -1
- package/lib/trustedApplications/trustedApplications.dom.js +11 -9
- package/lib/trustedApplications/trustedApplications.dom.js.map +1 -1
- package/lib/trustedApplications/trustedApplications.view.d.ts.map +1 -1
- package/lib/trustedApplications/trustedApplications.view.js +5 -3
- package/lib/trustedApplications/trustedApplications.view.js.map +1 -1
- package/lib/versionInfo.js +3 -3
- package/lib/versionInfo.js.map +1 -1
- package/package.json +14 -14
- package/src/argument/argumentPane.js +5 -5
- package/src/dashboard/basicPreferences.ts +4 -5
- package/src/dashboard/dashboardPane.ts +4 -3
- package/src/dataContentPane.js +1 -1
- package/src/form/pane.js +5 -4
- package/src/home/homePane.ts +7 -6
- package/src/index.ts +24 -18
- package/src/mainPage/header.ts +3 -2
- package/src/microblogPane/microblogPane.js +9 -8
- package/src/outline/dragDrop.js +5 -4
- package/src/outline/licenseOptions.js +4 -5
- package/src/outline/manager.js +22 -21
- package/src/outline/queryByExample.js +4 -4
- package/src/outline/userInput.js +72 -72
- package/src/pad/padPane.ts +3 -3
- package/src/profile/editProfile.view.ts +5 -8
- package/src/schedule/schedulePane.js +14 -13
- package/src/socialPane.js +5 -4
- package/src/transaction/pane.js +1 -1
- package/src/transaction/period.js +1 -1
- package/src/trip/tripPane.js +1 -1
- package/src/trustedApplications/trustedApplications.dom.ts +2 -1
- package/src/trustedApplications/trustedApplications.view.ts +4 -4
- package/src/versionInfo.ts +3 -3
package/src/mainPage/header.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { authSession, authn } from 'solid-logic'
|
|
2
|
+
import { icons, initHeader } from 'solid-ui'
|
|
2
3
|
/**
|
|
3
4
|
* menu icons
|
|
4
5
|
*/
|
|
@@ -41,7 +42,7 @@ async function setUserMenu (outliner: any) {
|
|
|
41
42
|
const logOut = {
|
|
42
43
|
label: LOG_OUT_MENU_ITEM,
|
|
43
44
|
onclick: () => {
|
|
44
|
-
|
|
45
|
+
authSession.logout()
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
48
|
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
Charles McKenzie <charles2@mit.edu>
|
|
4
4
|
*/
|
|
5
5
|
/* global alert */
|
|
6
|
-
|
|
6
|
+
import { authn, store } from 'solid-logic'
|
|
7
|
+
import * as UI from 'solid-ui'
|
|
7
8
|
|
|
8
9
|
module.exports = {
|
|
9
10
|
icon: UI.icons.originalIconBase + 'microblog/microblog.png',
|
|
10
11
|
name: 'microblogPane',
|
|
11
12
|
label: function (subject) {
|
|
12
|
-
if (
|
|
13
|
+
if (store.whether(subject, UI.ns.rdf('type'), UI.ns.foaf('Person'))) {
|
|
13
14
|
return 'Microblog'
|
|
14
15
|
} else {
|
|
15
16
|
return null
|
|
@@ -25,9 +26,9 @@ module.exports = {
|
|
|
25
26
|
const terms = UI.rdf.Namespace('http://purl.org/dc/terms/')
|
|
26
27
|
const RDF = UI.ns.rdf
|
|
27
28
|
|
|
28
|
-
const kb =
|
|
29
|
+
const kb = store
|
|
29
30
|
const charCount = 140
|
|
30
|
-
const sf =
|
|
31
|
+
const sf = store.fetcher
|
|
31
32
|
//* **********************************************
|
|
32
33
|
// BACK END
|
|
33
34
|
//* **********************************************
|
|
@@ -134,7 +135,7 @@ module.exports = {
|
|
|
134
135
|
// attempt to fetch user account from local preferences if just
|
|
135
136
|
// in case the user's foaf was not writable. add it to the store
|
|
136
137
|
// this will probably need to change.
|
|
137
|
-
const theUser =
|
|
138
|
+
const theUser = authn.currentUser()
|
|
138
139
|
|
|
139
140
|
if (theUser) {
|
|
140
141
|
let theAccount = UI.preferences.get('acct')
|
|
@@ -304,7 +305,7 @@ module.exports = {
|
|
|
304
305
|
})
|
|
305
306
|
}
|
|
306
307
|
Microblog.prototype.getMyURI = function () {
|
|
307
|
-
const me =
|
|
308
|
+
const me = authn.currentUser()
|
|
308
309
|
console.log(me)
|
|
309
310
|
const myMicroblog = kb.any(kb.sym(me), FOAF('holdsAccount'))
|
|
310
311
|
console.log('\n\n' + myMicroblog)
|
|
@@ -533,7 +534,7 @@ module.exports = {
|
|
|
533
534
|
} else if (resourceType.uri === SIOC('User').uri) {
|
|
534
535
|
this.thisIsMe = s.uri === mb.getMyURI()
|
|
535
536
|
} else if (resourceType.uri === FOAF('Person').uri) {
|
|
536
|
-
const me =
|
|
537
|
+
const me = authn.currentUser()
|
|
537
538
|
const meUri = me && me.uri
|
|
538
539
|
this.thisIsMe = s.uri === meUri
|
|
539
540
|
} else {
|
|
@@ -900,7 +901,7 @@ module.exports = {
|
|
|
900
901
|
) {
|
|
901
902
|
creator = creators[c]
|
|
902
903
|
// var mb = kb.sym(creator.uri.split("#")[0]);
|
|
903
|
-
//
|
|
904
|
+
// store.fetcher.refresh(mb);
|
|
904
905
|
break
|
|
905
906
|
// TODO add support for more than one microblog in same foaf
|
|
906
907
|
}
|
package/src/outline/dragDrop.js
CHANGED
|
@@ -20,9 +20,10 @@ if (!tabulator_gBrowser) {
|
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
22
|
/* 2007: adapted from dragAndDrop UI Library */
|
|
23
|
+
import { store } from 'solid-logic'
|
|
24
|
+
import * as UI from 'solid-ui'
|
|
25
|
+
import * as $rdf from 'rdflib'
|
|
23
26
|
|
|
24
|
-
const UI = require('solid-ui')
|
|
25
|
-
const $rdf = require('rdflib')
|
|
26
27
|
const dragAndDrop = (module.exports = {})
|
|
27
28
|
|
|
28
29
|
dragAndDrop.util = {}
|
|
@@ -270,7 +271,7 @@ const TabulatorOutlinerObserver = {
|
|
|
270
271
|
const templateDoc = $rdf.sym(
|
|
271
272
|
'chrome://tabulator/content/internalKnowledge.n3#defaultNew'
|
|
272
273
|
)
|
|
273
|
-
|
|
274
|
+
store.copyTo(templateDoc, $rdf.sym(url))
|
|
274
275
|
/*
|
|
275
276
|
function WriteToFileRepresentedBy (subject){
|
|
276
277
|
var outputFormulaTerm=kb.any(subject,OWL('unionOf'))
|
|
@@ -333,7 +334,7 @@ const TabulatorOutlinerObserver = {
|
|
|
333
334
|
const thisOutline = table.outline
|
|
334
335
|
thisOutline.UserInput.insertTermTo(
|
|
335
336
|
targetTd,
|
|
336
|
-
UI.utils.getAbout(
|
|
337
|
+
UI.utils.getAbout(store, this.dragTarget)
|
|
337
338
|
)
|
|
338
339
|
},
|
|
339
340
|
onDragStart: function (x, y, td) {
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
// tabulator.options becaome UI.licenseOptions
|
|
5
5
|
// Possible future alternative directoons: Store licence preferences in a solid preferences file
|
|
6
|
+
import * as UI from 'solid-ui'
|
|
7
|
+
import { store } from 'solid-logic'
|
|
6
8
|
|
|
7
9
|
const licenseURI = [
|
|
8
10
|
'http://creativecommons.org/licenses/by-nc-nd/3.0/',
|
|
@@ -15,9 +17,6 @@ const licenseURI = [
|
|
|
15
17
|
|
|
16
18
|
const names = ['BY-NC-ND', 'BY-NC-SA', 'BY-NC', 'BY-ND', 'BY-SA', 'BY']
|
|
17
19
|
|
|
18
|
-
const UI = require('solid-ui')
|
|
19
|
-
const kb = UI.store
|
|
20
|
-
|
|
21
20
|
module.exports = function licenseOptions () {
|
|
22
21
|
this.options = {}
|
|
23
22
|
this.references = []
|
|
@@ -83,9 +82,9 @@ module.exports = function licenseOptions () {
|
|
|
83
82
|
}
|
|
84
83
|
|
|
85
84
|
this.checkLicence = function checkLicense (statement) {
|
|
86
|
-
const licenses =
|
|
85
|
+
const licenses = store.each(
|
|
87
86
|
statement.why,
|
|
88
|
-
|
|
87
|
+
store.sym('http://creativecommons.org/ns#license')
|
|
89
88
|
)
|
|
90
89
|
UI.log.info('licenses:' + statement.why + ': ' + licenses)
|
|
91
90
|
for (let i = 0; i < licenses.length; i++) {
|
package/src/outline/manager.js
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import * as UI from 'solid-ui'
|
|
7
|
-
import
|
|
7
|
+
import { authn, authSession, store } from 'solid-logic'
|
|
8
|
+
import * as paneRegistry from 'pane-registry'
|
|
8
9
|
import * as $rdf from 'rdflib'
|
|
9
10
|
import YAHOO from './dragDrop'
|
|
10
11
|
import outlineIcons from './outlineIcons'
|
|
@@ -30,9 +31,9 @@ export default function (context) {
|
|
|
30
31
|
this.selection = selection
|
|
31
32
|
this.ancestor = UI.utils.ancestor // make available as outline.ancestor in callbacks
|
|
32
33
|
this.sparql = UI.rdf.UpdateManager
|
|
33
|
-
this.kb =
|
|
34
|
-
const kb =
|
|
35
|
-
const sf =
|
|
34
|
+
this.kb = store
|
|
35
|
+
const kb = store
|
|
36
|
+
const sf = store.fetcher
|
|
36
37
|
dom.outline = this
|
|
37
38
|
this.qs = new queryByExample.QuerySource() // Track queries in queryByExample
|
|
38
39
|
|
|
@@ -344,7 +345,7 @@ export default function (context) {
|
|
|
344
345
|
async function globalAppTabs (options = {}) {
|
|
345
346
|
console.log('globalAppTabs @@')
|
|
346
347
|
const div = dom.createElement('div')
|
|
347
|
-
const me =
|
|
348
|
+
const me = authn.currentUser()
|
|
348
349
|
if (!me) {
|
|
349
350
|
alert('Must be logged in for this')
|
|
350
351
|
throw new Error('Not logged in')
|
|
@@ -358,10 +359,10 @@ export default function (context) {
|
|
|
358
359
|
|
|
359
360
|
function renderMain (containerDiv, item) {
|
|
360
361
|
// Items are pane names
|
|
361
|
-
const pane =
|
|
362
|
+
const pane = paneRegistry.byName(item.paneName) // 20190701
|
|
362
363
|
containerDiv.innerHTML = ''
|
|
363
364
|
const table = containerDiv.appendChild(dom.createElement('table'))
|
|
364
|
-
const me =
|
|
365
|
+
const me = authn.currentUser()
|
|
365
366
|
thisOutline.GotoSubject(
|
|
366
367
|
item.subject || me,
|
|
367
368
|
true,
|
|
@@ -391,7 +392,7 @@ export default function (context) {
|
|
|
391
392
|
this.getDashboard = globalAppTabs
|
|
392
393
|
|
|
393
394
|
async function getDashboardItems () {
|
|
394
|
-
const me =
|
|
395
|
+
const me = authn.currentUser()
|
|
395
396
|
if (!me) return []
|
|
396
397
|
const div = dom.createElement('div')
|
|
397
398
|
const [books, pods] = await Promise.all([getAddressBooks(), getPods()])
|
|
@@ -482,7 +483,7 @@ export default function (context) {
|
|
|
482
483
|
|
|
483
484
|
async function getAddressBooks () {
|
|
484
485
|
try {
|
|
485
|
-
const context = await UI.
|
|
486
|
+
const context = await UI.login.findAppInstances(
|
|
486
487
|
{ me, div, dom },
|
|
487
488
|
ns.vcard('AddressBook')
|
|
488
489
|
)
|
|
@@ -534,7 +535,7 @@ export default function (context) {
|
|
|
534
535
|
})
|
|
535
536
|
|
|
536
537
|
// close the dashboard if user log out
|
|
537
|
-
|
|
538
|
+
authSession.onLogout(closeDashboard)
|
|
538
539
|
|
|
539
540
|
// finally - switch to showing dashboard
|
|
540
541
|
outlineContainer.style.display = 'none'
|
|
@@ -600,7 +601,7 @@ export default function (context) {
|
|
|
600
601
|
// there are no relevant panes, simply return default pane (which ironically is internalPane)
|
|
601
602
|
return [panes.byName('internal')]
|
|
602
603
|
}
|
|
603
|
-
const filteredPanes = await UI.
|
|
604
|
+
const filteredPanes = await UI.login.filterAvailablePanes(relevantPanes)
|
|
604
605
|
if (filteredPanes.length === 0) {
|
|
605
606
|
// if no relevant panes are available panes because of user role, we still allow for the most relevant pane to be viewed
|
|
606
607
|
return [relevantPanes[0]]
|
|
@@ -1367,7 +1368,7 @@ export default function (context) {
|
|
|
1367
1368
|
if (target.label) {
|
|
1368
1369
|
window.content.location = target.label
|
|
1369
1370
|
// The following alternative does not work in the extension.
|
|
1370
|
-
// var s =
|
|
1371
|
+
// var s = store.sym(target.label);
|
|
1371
1372
|
// outline.GotoSubject(s, true);
|
|
1372
1373
|
}
|
|
1373
1374
|
}
|
|
@@ -1438,7 +1439,7 @@ export default function (context) {
|
|
|
1438
1439
|
// don't do these for headers or base nodes
|
|
1439
1440
|
const source = st.why
|
|
1440
1441
|
// var target = st.why
|
|
1441
|
-
const editable =
|
|
1442
|
+
const editable = store.updater.editable(source.uri, kb)
|
|
1442
1443
|
if (!editable) {
|
|
1443
1444
|
// let target = node.parentNode.AJAR_inverse ? st.object : st.subject
|
|
1444
1445
|
} // left hand side
|
|
@@ -1609,7 +1610,7 @@ export default function (context) {
|
|
|
1609
1610
|
// I don't know why 'HTML'
|
|
1610
1611
|
const object = UI.utils.getAbout(kb, selectedTd)
|
|
1611
1612
|
target = selectedTd.parentNode.AJAR_statement.why
|
|
1612
|
-
editable =
|
|
1613
|
+
editable = store.updater.editable(target.uri, kb)
|
|
1613
1614
|
if (object) {
|
|
1614
1615
|
// <Feature about='enterToExpand'>
|
|
1615
1616
|
outline.GotoSubject(object, true)
|
|
@@ -1660,7 +1661,7 @@ export default function (context) {
|
|
|
1660
1661
|
case 46: // delete
|
|
1661
1662
|
case 8: // backspace
|
|
1662
1663
|
target = selectedTd.parentNode.AJAR_statement.why
|
|
1663
|
-
editable =
|
|
1664
|
+
editable = store.updater.editable(target.uri, kb)
|
|
1664
1665
|
if (editable) {
|
|
1665
1666
|
e.preventDefault() // prevent from going back
|
|
1666
1667
|
this.UserInput.Delete(selectedTd)
|
|
@@ -1688,7 +1689,7 @@ export default function (context) {
|
|
|
1688
1689
|
sf.addCallback('done', setSelectedAfterward)
|
|
1689
1690
|
sf.addCallback('fail', setSelectedAfterward)
|
|
1690
1691
|
outlineExpand(selectedTd, obj, {
|
|
1691
|
-
pane:
|
|
1692
|
+
pane: paneRegistry.byName('defaultPane')
|
|
1692
1693
|
})
|
|
1693
1694
|
}
|
|
1694
1695
|
setSelectedAfterward()
|
|
@@ -1791,7 +1792,7 @@ export default function (context) {
|
|
|
1791
1792
|
const target = thisOutline.targetOf(e)
|
|
1792
1793
|
const p = target.parentNode
|
|
1793
1794
|
const subject = UI.utils.getAbout(kb, target)
|
|
1794
|
-
const pane = e.altKey ?
|
|
1795
|
+
const pane = e.altKey ? paneRegistry.byName('internal') : undefined // set later: was panes.defaultPane
|
|
1795
1796
|
|
|
1796
1797
|
if (e.shiftKey) {
|
|
1797
1798
|
// Shift forces a refocus - bring this to the top
|
|
@@ -1800,7 +1801,7 @@ export default function (context) {
|
|
|
1800
1801
|
if (e.altKey) {
|
|
1801
1802
|
// To investigate screw ups, dont wait show internals
|
|
1802
1803
|
outlineExpand(p, subject, {
|
|
1803
|
-
pane:
|
|
1804
|
+
pane: paneRegistry.byName('internal'),
|
|
1804
1805
|
immediate: true
|
|
1805
1806
|
})
|
|
1806
1807
|
} else {
|
|
@@ -1813,7 +1814,7 @@ export default function (context) {
|
|
|
1813
1814
|
// for icon UI.icons.originalIconBase + 'tbl-collapse.png'
|
|
1814
1815
|
const target = thisOutline.targetOf(e)
|
|
1815
1816
|
const subject = UI.utils.getAbout(kb, target)
|
|
1816
|
-
const pane = e.altKey ?
|
|
1817
|
+
const pane = e.altKey ? paneRegistry.byName('internal') : undefined
|
|
1817
1818
|
const p = target.parentNode.parentNode
|
|
1818
1819
|
outlineCollapse(p, subject, pane)
|
|
1819
1820
|
}
|
|
@@ -1902,7 +1903,7 @@ export default function (context) {
|
|
|
1902
1903
|
const st = node.parentNode.AJAR_statement
|
|
1903
1904
|
if (!st) return // For example in the title TD of an expanded pane
|
|
1904
1905
|
const target = st.why
|
|
1905
|
-
const editable =
|
|
1906
|
+
const editable = store.updater.editable(target.uri, kb)
|
|
1906
1907
|
if (sel && editable) thisOutline.UserInput.Click(e, selection[0]) // was next 2 lines
|
|
1907
1908
|
// var text='TabulatorMouseDown@Outline()';
|
|
1908
1909
|
// HCIoptions['able to edit in Discovery Mode by mouse'].setupHere([sel,e,thisOutline,selection[0]],text);
|
|
@@ -2414,7 +2415,7 @@ export default function (context) {
|
|
|
2414
2415
|
row.appendChild(thisOutline.outlineObjectTD(elt))
|
|
2415
2416
|
}
|
|
2416
2417
|
} else if (obj.termType === 'Graph') {
|
|
2417
|
-
rep =
|
|
2418
|
+
rep = paneRegistry
|
|
2418
2419
|
.byName('dataContentPane')
|
|
2419
2420
|
.statementsAsTables(obj.statements, context)
|
|
2420
2421
|
rep.setAttribute('class', 'nestedFormula')
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
// to find all other places which had the same pattern.
|
|
7
7
|
// Fields could be optional by pressing th ewhite optoional button
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
import { store } from 'solid-logic'
|
|
10
|
+
import * as UI from 'solid-ui'
|
|
10
11
|
|
|
11
12
|
module.exports = {
|
|
12
13
|
makeQueryRow,
|
|
@@ -31,7 +32,6 @@ function predParentOf (node) {
|
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
function makeQueryRow (q, tr, constraint) {
|
|
34
|
-
const kb = UI.store
|
|
35
35
|
// predtr = predParentOf(tr)
|
|
36
36
|
// var nodes = tr.childNodes
|
|
37
37
|
// var n = tr.childNodes.length
|
|
@@ -87,7 +87,7 @@ function makeQueryRow (q, tr, constraint) {
|
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
if (opt) {
|
|
90
|
-
const optForm =
|
|
90
|
+
const optForm = store.formula()
|
|
91
91
|
optionalSubqueriesIndex.push(optForm)
|
|
92
92
|
predtr.setAttribute(
|
|
93
93
|
'optionalSubqueriesIndex',
|
|
@@ -115,7 +115,7 @@ function makeQueryRow (q, tr, constraint) {
|
|
|
115
115
|
// UI.log.debug('Initial variable: '+tr.AJAR_variable)
|
|
116
116
|
const v = tr.AJAR_variable
|
|
117
117
|
? tr.AJAR_variable
|
|
118
|
-
:
|
|
118
|
+
: store.variable(UI.utils.newVariableName())
|
|
119
119
|
q.vars.push(v)
|
|
120
120
|
v.label = hasParent ? parentVar.label : UI.utils.label(parentVar)
|
|
121
121
|
v.label += ' ' + UI.utils.predicateLabelForXML(st.predicate, inverse)
|