solid-ui 2.4.22-4e7a23dc → 2.4.22-62779f1d
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/README.md +23 -58
- package/dist/main.js +365 -186
- package/dist/main.js.map +1 -1
- package/lib/tabs.d.ts +1 -1
- package/lib/tabs.d.ts.map +1 -1
- package/lib/tabs.js +34 -21
- package/lib/tabs.js.map +1 -1
- package/lib/utils/label.js +1 -1
- package/lib/utils/label.js.map +1 -1
- package/lib/versionInfo.js +5 -5
- package/lib/versionInfo.js.map +1 -1
- package/lib/widgets/buttons.d.ts.map +1 -1
- package/lib/widgets/buttons.js +2 -0
- package/lib/widgets/buttons.js.map +1 -1
- package/lib/widgets/forms.js +323 -159
- package/lib/widgets/forms.js.map +1 -1
- package/package.json +1 -1
package/lib/widgets/forms.js
CHANGED
|
@@ -44,6 +44,7 @@ exports.findClosest = findClosest;
|
|
|
44
44
|
exports.formsFor = formsFor;
|
|
45
45
|
exports.makeDescription = makeDescription;
|
|
46
46
|
exports.makeSelectForCategory = makeSelectForCategory;
|
|
47
|
+
exports.makeSelectForChoice = makeSelectForChoice;
|
|
47
48
|
exports.makeSelectForNestedCategory = makeSelectForNestedCategory;
|
|
48
49
|
exports.makeSelectForOptions = makeSelectForOptions;
|
|
49
50
|
exports.newButton = newButton;
|
|
@@ -155,14 +156,16 @@ _fieldFunction.field[ns.ui('Form').uri] = _fieldFunction.field[ns.ui('Group').ur
|
|
|
155
156
|
var ui = ns.ui;
|
|
156
157
|
if (container) container.appendChild(box); // Prevent loops
|
|
157
158
|
|
|
159
|
+
if (!form) return;
|
|
158
160
|
var key = subject.toNT() + '|' + form.toNT();
|
|
159
161
|
|
|
160
162
|
if (already[key]) {
|
|
161
163
|
// been there done that
|
|
162
|
-
box.appendChild(dom.createTextNode('Group: see above ' + key));
|
|
163
|
-
|
|
164
|
+
box.appendChild(dom.createTextNode('Group: see above ' + key)); // TODO fix dependency cycle to solid-panes by calling outlineManager
|
|
165
|
+
// const plist = [$rdf.st(subject, ns.owl('sameAs'), subject)] // @@ need prev subject
|
|
166
|
+
// dom.outlineManager.appendPropertyTRs(box, plist)
|
|
167
|
+
// dom.appendChild(plist)
|
|
164
168
|
|
|
165
|
-
dom.outlineManager.appendPropertyTRs(box, plist);
|
|
166
169
|
return box;
|
|
167
170
|
}
|
|
168
171
|
|
|
@@ -263,47 +266,43 @@ _fieldFunction.field[ns.ui('Options').uri] = function (dom, container, already,
|
|
|
263
266
|
values = kb.each(subject, dependingOn);
|
|
264
267
|
}
|
|
265
268
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
for (var i = 0; i < cases.length; i++) {
|
|
270
|
-
var c = cases[i];
|
|
271
|
-
var tests = kb.each(c, ui('for'), null, formDoc); // There can be multiple 'for'
|
|
269
|
+
for (var i = 0; i < cases.length; i++) {
|
|
270
|
+
var c = cases[i];
|
|
271
|
+
var tests = kb.each(c, ui('for'), null, formDoc); // There can be multiple 'for'
|
|
272
272
|
|
|
273
|
-
|
|
273
|
+
var match = false;
|
|
274
274
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
275
|
+
for (var j = 0; j < tests.length; j++) {
|
|
276
|
+
var _iterator = _createForOfIteratorHelper(values),
|
|
277
|
+
_step;
|
|
278
278
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
279
|
+
try {
|
|
280
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
281
|
+
var value = _step.value;
|
|
282
|
+
var test = tests[j];
|
|
283
283
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
}
|
|
284
|
+
if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
|
|
285
|
+
match = true;
|
|
287
286
|
}
|
|
288
|
-
} catch (err) {
|
|
289
|
-
_iterator.e(err);
|
|
290
|
-
} finally {
|
|
291
|
-
_iterator.f();
|
|
292
287
|
}
|
|
288
|
+
} catch (err) {
|
|
289
|
+
_iterator.e(err);
|
|
290
|
+
} finally {
|
|
291
|
+
_iterator.f();
|
|
293
292
|
}
|
|
293
|
+
}
|
|
294
294
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (!_field3) {
|
|
299
|
-
box.appendChild((0, _error.errorMessageBlock)(dom, 'No "use" part for case in form ' + form));
|
|
300
|
-
return box;
|
|
301
|
-
} else {
|
|
302
|
-
appendForm(dom, box, already, subject, _field3, dataDoc, callbackFunction);
|
|
303
|
-
}
|
|
295
|
+
if (match) {
|
|
296
|
+
var _field3 = kb.the(c, ui('use'));
|
|
304
297
|
|
|
305
|
-
|
|
298
|
+
if (!_field3) {
|
|
299
|
+
box.appendChild((0, _error.errorMessageBlock)(dom, 'No "use" part for case in form ' + form));
|
|
300
|
+
return box;
|
|
301
|
+
} else {
|
|
302
|
+
appendForm(dom, box, already, subject, _field3, dataDoc, callbackFunction);
|
|
306
303
|
}
|
|
304
|
+
|
|
305
|
+
break;
|
|
307
306
|
}
|
|
308
307
|
} // @@ Add box.refresh() to sync fields with values
|
|
309
308
|
|
|
@@ -591,7 +590,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
|
|
|
591
590
|
// delete button and move buttons
|
|
592
591
|
|
|
593
592
|
if (kb.updater.editable(dataDoc.uri)) {
|
|
594
|
-
buttons.deleteButtonWithCheck(dom, subField,
|
|
593
|
+
buttons.deleteButtonWithCheck(dom, subField, multipleUIlabel, deleteThisItem);
|
|
595
594
|
|
|
596
595
|
if (ordered) {
|
|
597
596
|
// Add controsl in a frame
|
|
@@ -642,7 +641,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
|
|
|
642
641
|
|
|
643
642
|
var _shim = dom.createElement('div');
|
|
644
643
|
|
|
645
|
-
_shim.appendChild(subField); // Subfield has its own
|
|
644
|
+
_shim.appendChild(subField); // Subfield has its own layout
|
|
646
645
|
|
|
647
646
|
|
|
648
647
|
frame.appendChild(_shim);
|
|
@@ -691,6 +690,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
|
|
|
691
690
|
return shim;
|
|
692
691
|
}
|
|
693
692
|
|
|
693
|
+
var multipleUIlabel = kb.any(form, ui('label'));
|
|
694
|
+
if (!multipleUIlabel) multipleUIlabel = utils.label(property);
|
|
694
695
|
var min = kb.any(form, ui('min')); // This is the minimum number -- default 0
|
|
695
696
|
|
|
696
697
|
min = min ? 0 + min.value : 0;
|
|
@@ -731,10 +732,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
|
|
|
731
732
|
img.setAttribute('src', plusIconURI); // plus sign
|
|
732
733
|
|
|
733
734
|
img.setAttribute('style', 'margin: 0.2em; width: 1.5em; height:1.5em');
|
|
734
|
-
img.title = 'Click to add
|
|
735
|
-
var prompt =
|
|
736
|
-
prompt.textContent = (values.length === 0 ? 'Add
|
|
737
|
-
|
|
735
|
+
img.title = 'Click to add another ' + multipleUIlabel;
|
|
736
|
+
var prompt = dom.createElement('span');
|
|
737
|
+
prompt.textContent = (values.length === 0 ? 'Add another ' : 'Add ') + multipleUIlabel;
|
|
738
738
|
tail.addEventListener('click', /*#__PURE__*/function () {
|
|
739
739
|
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(_eventNotUsed) {
|
|
740
740
|
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
@@ -756,6 +756,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
|
|
|
756
756
|
return _ref3.apply(this, arguments);
|
|
757
757
|
};
|
|
758
758
|
}(), true);
|
|
759
|
+
tail.appendChild(prompt);
|
|
759
760
|
}
|
|
760
761
|
|
|
761
762
|
function createListIfNecessary() {
|
|
@@ -1017,28 +1018,39 @@ _fieldFunction.field[ns.ui('Classifier').uri] = function (dom, container, alread
|
|
|
1017
1018
|
**
|
|
1018
1019
|
** Not nested. Generates a link to something from a given class.
|
|
1019
1020
|
** Optional subform for the thing selected.
|
|
1021
|
+
** Generates a subForm based on a ui:use form
|
|
1022
|
+
** Will look like:
|
|
1023
|
+
** <div id=dropDownDiv>
|
|
1024
|
+
** <div id=labelOfDropDown>
|
|
1025
|
+
** <div id=selectDiv>
|
|
1026
|
+
** <select id=dropDownSelect>
|
|
1027
|
+
** <option> ....
|
|
1028
|
+
** <subForm>
|
|
1020
1029
|
** Alternative implementatons caould be:
|
|
1021
1030
|
** -- pop-up menu (as here)
|
|
1022
1031
|
** -- radio buttons
|
|
1023
1032
|
** -- auto-complete typing
|
|
1024
1033
|
**
|
|
1025
|
-
**
|
|
1034
|
+
** TODO: according to ontology ui:choice can also have ns.ui('default') - this is not implemented yet
|
|
1026
1035
|
*/
|
|
1027
1036
|
|
|
1028
1037
|
|
|
1029
1038
|
_fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
|
|
1030
1039
|
var ui = ns.ui;
|
|
1031
1040
|
var kb = _solidLogic.store;
|
|
1032
|
-
var multiple = false;
|
|
1033
1041
|
var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
|
|
1034
1042
|
|
|
1043
|
+
var multiSelect = false;
|
|
1035
1044
|
var p;
|
|
1036
|
-
var box = dom.createElement('div');
|
|
1045
|
+
var box = dom.createElement('div');
|
|
1046
|
+
box.setAttribute('class', 'choiceBox'); // Set flexDirection column?
|
|
1037
1047
|
|
|
1038
1048
|
if (container) container.appendChild(box);
|
|
1039
1049
|
var lhs = dom.createElement('div');
|
|
1050
|
+
lhs.setAttribute('class', 'formFieldName choiceBox-label');
|
|
1040
1051
|
box.appendChild(lhs);
|
|
1041
1052
|
var rhs = dom.createElement('div');
|
|
1053
|
+
rhs.setAttribute('class', 'formFieldValue choiceBox-selectBox');
|
|
1042
1054
|
box.appendChild(rhs);
|
|
1043
1055
|
var property = kb.any(form, ui('property'));
|
|
1044
1056
|
|
|
@@ -1047,9 +1059,9 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
|
|
|
1047
1059
|
}
|
|
1048
1060
|
|
|
1049
1061
|
lhs.appendChild((0, _basic.fieldLabel)(dom, property, form));
|
|
1050
|
-
var
|
|
1062
|
+
var uiFrom = kb.any(form, ui('from'));
|
|
1051
1063
|
|
|
1052
|
-
if (!
|
|
1064
|
+
if (!uiFrom) {
|
|
1053
1065
|
return (0, _error.errorMessageBlock)(dom, "No 'from' for Choice: " + form);
|
|
1054
1066
|
}
|
|
1055
1067
|
|
|
@@ -1057,77 +1069,97 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
|
|
|
1057
1069
|
|
|
1058
1070
|
var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
|
|
1059
1071
|
|
|
1060
|
-
var possible = [];
|
|
1061
|
-
var possibleProperties;
|
|
1062
|
-
var nullLabel = '--' + utils.label(property) + '-?';
|
|
1063
1072
|
var opts = {
|
|
1064
1073
|
form: form,
|
|
1065
|
-
|
|
1066
|
-
|
|
1074
|
+
subForm: subForm,
|
|
1075
|
+
multiSelect: multiSelect,
|
|
1067
1076
|
disambiguate: false
|
|
1068
1077
|
};
|
|
1069
|
-
possible = kb.each(undefined, ns.rdf('type'), from, formDoc);
|
|
1070
1078
|
|
|
1071
|
-
|
|
1072
|
-
possible
|
|
1073
|
-
|
|
1079
|
+
function getSelectorOptions() {
|
|
1080
|
+
var possible = [];
|
|
1081
|
+
var possibleProperties;
|
|
1082
|
+
possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
|
|
1074
1083
|
|
|
1084
|
+
for (var x in kb.findMembersNT(uiFrom)) {
|
|
1085
|
+
possible.push(kb.fromNT(x));
|
|
1086
|
+
} // Use rdfs
|
|
1075
1087
|
|
|
1076
|
-
if (from.sameTerm(ns.rdfs('Class'))) {
|
|
1077
|
-
for (p in buttons.allClassURIs()) {
|
|
1078
|
-
possible.push(kb.sym(p));
|
|
1079
|
-
} // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
|
|
1080
1088
|
|
|
1081
|
-
|
|
1082
|
-
|
|
1089
|
+
if (uiFrom.sameTerm(ns.rdfs('Class'))) {
|
|
1090
|
+
for (p in buttons.allClassURIs()) {
|
|
1091
|
+
possible.push(kb.sym(p));
|
|
1092
|
+
} // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
|
|
1083
1093
|
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
}
|
|
1094
|
+
} else if (uiFrom.sameTerm(ns.rdf('Property'))) {
|
|
1095
|
+
possibleProperties = buttons.propertyTriage(kb);
|
|
1087
1096
|
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1097
|
+
for (p in possibleProperties.op) {
|
|
1098
|
+
possible.push(kb.fromNT(p));
|
|
1099
|
+
}
|
|
1091
1100
|
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1101
|
+
for (p in possibleProperties.dp) {
|
|
1102
|
+
possible.push(kb.fromNT(p));
|
|
1103
|
+
}
|
|
1095
1104
|
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1105
|
+
opts.disambiguate = true; // This is a big class, and the labels won't be enough.
|
|
1106
|
+
} else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
|
|
1107
|
+
possibleProperties = buttons.propertyTriage(kb);
|
|
1108
|
+
|
|
1109
|
+
for (p in possibleProperties.op) {
|
|
1110
|
+
possible.push(kb.fromNT(p));
|
|
1111
|
+
}
|
|
1099
1112
|
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1113
|
+
opts.disambiguate = true;
|
|
1114
|
+
} else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
|
|
1115
|
+
possibleProperties = buttons.propertyTriage(kb);
|
|
1103
1116
|
|
|
1104
|
-
|
|
1105
|
-
|
|
1117
|
+
for (p in possibleProperties.dp) {
|
|
1118
|
+
possible.push(kb.fromNT(p));
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
opts.disambiguate = true;
|
|
1106
1122
|
}
|
|
1107
1123
|
|
|
1108
|
-
|
|
1109
|
-
|
|
1124
|
+
var object = kb.any(subject, property);
|
|
1125
|
+
if (object) possible.push(object);
|
|
1126
|
+
return sortByLabel(possible);
|
|
1127
|
+
} // TODO: this checks for any occurrence, regardless of true or false setting
|
|
1110
1128
|
|
|
1111
|
-
var object = kb.any(subject, property);
|
|
1112
1129
|
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
(0, _fieldFunction.fieldFunction)(dom, subForm)(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
|
|
1130
|
+
if (kb.any(form, ui('canMintNew'))) {
|
|
1131
|
+
opts.mint = '* Create new *'; // @@ could be better
|
|
1116
1132
|
}
|
|
1117
1133
|
|
|
1118
|
-
var
|
|
1134
|
+
var selector;
|
|
1135
|
+
|
|
1136
|
+
rhs.refresh = function () {
|
|
1137
|
+
var selectorOptions = getSelectorOptions();
|
|
1138
|
+
selector = makeSelectForChoice(dom, rhs, kb, subject, property, selectorOptions, uiFrom, opts, dataDoc, callbackFunction);
|
|
1139
|
+
rhs.innerHTML = '';
|
|
1140
|
+
rhs.appendChild(selector);
|
|
1141
|
+
};
|
|
1142
|
+
|
|
1143
|
+
rhs.refresh();
|
|
1144
|
+
if (selector && selector.refresh) selector.refresh();
|
|
1145
|
+
return box;
|
|
1146
|
+
};
|
|
1147
|
+
/**
|
|
1148
|
+
* Removes all sibling elements after specified
|
|
1149
|
+
* @param {HTMLElement} currentElement
|
|
1150
|
+
* @private
|
|
1151
|
+
*/
|
|
1119
1152
|
|
|
1120
|
-
if (kb.any(form, ui('canMintNew'))) {
|
|
1121
|
-
opts.mint = '* New *'; // @@ could be better
|
|
1122
1153
|
|
|
1123
|
-
|
|
1154
|
+
function removeNextSiblingsAfterElement(currentElement) {
|
|
1155
|
+
while (currentElement.nextElementSibling) {
|
|
1156
|
+
currentElement.nextElementSibling.remove();
|
|
1124
1157
|
}
|
|
1158
|
+
}
|
|
1125
1159
|
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
return box;
|
|
1130
|
-
}; // Documentation - non-interactive fields
|
|
1160
|
+
function addSubFormChoice(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction) {
|
|
1161
|
+
(0, _fieldFunction.fieldFunction)(dom, subForm)(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction);
|
|
1162
|
+
} // Documentation - non-interactive fields
|
|
1131
1163
|
//
|
|
1132
1164
|
|
|
1133
1165
|
|
|
@@ -1330,7 +1362,8 @@ function promptForNew(dom, kb, subject, predicate, theClass, form, dataDoc, call
|
|
|
1330
1362
|
b.setAttribute('type', 'button');
|
|
1331
1363
|
b.setAttribute('style', 'float: right;');
|
|
1332
1364
|
b.innerHTML = 'Goto ' + utils.label(theClass);
|
|
1333
|
-
b.addEventListener('click',
|
|
1365
|
+
b.addEventListener('click', // TODO fix dependency cycle to solid-panes by calling outlineManager
|
|
1366
|
+
function (_e) {
|
|
1334
1367
|
dom.outlineManager.GotoSubject(theClass, true, undefined, true, undefined);
|
|
1335
1368
|
}, false);
|
|
1336
1369
|
return box;
|
|
@@ -1465,10 +1498,8 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
|
|
|
1465
1498
|
// @param subject - a term, the subject of the statement(s) being edited.
|
|
1466
1499
|
// @param predicate - a term, the predicate of the statement(s) being edited
|
|
1467
1500
|
// @param possible - a list of terms, the possible value the object can take
|
|
1468
|
-
// @param options.multiple - Boolean - Whether more than one at a time is allowed
|
|
1469
1501
|
// @param options.nullLabel - a string to be displayed as the
|
|
1470
1502
|
// option for none selected (for non multiple)
|
|
1471
|
-
// @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
|
|
1472
1503
|
// @param options.subForm - If mint, then the form to be used for minting the new thing
|
|
1473
1504
|
// @param dataDoc - The web document being edited
|
|
1474
1505
|
// @param callbackFunction - takes (boolean ok, string errorBody)
|
|
@@ -1492,7 +1523,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
|
|
|
1492
1523
|
} // uris is now the set of possible options
|
|
1493
1524
|
|
|
1494
1525
|
|
|
1495
|
-
if (n === 0
|
|
1526
|
+
if (n === 0) {
|
|
1496
1527
|
return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
|
|
1497
1528
|
}
|
|
1498
1529
|
|
|
@@ -1506,7 +1537,9 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
|
|
|
1506
1537
|
actual = kb.findTypeURIs(subject);
|
|
1507
1538
|
} else {
|
|
1508
1539
|
kb.each(subject, predicate, null, dataDoc).forEach(function (x) {
|
|
1509
|
-
|
|
1540
|
+
if (x.uri) {
|
|
1541
|
+
actual[x.uri] = true;
|
|
1542
|
+
}
|
|
1510
1543
|
});
|
|
1511
1544
|
}
|
|
1512
1545
|
|
|
@@ -1527,33 +1560,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
|
|
|
1527
1560
|
}
|
|
1528
1561
|
};
|
|
1529
1562
|
|
|
1530
|
-
var newObject;
|
|
1531
|
-
|
|
1532
1563
|
for (var _i = 0; _i < select.options.length; _i++) {
|
|
1533
1564
|
var opt = select.options[_i];
|
|
1534
|
-
|
|
1535
|
-
if (opt.selected && opt.AJAR_mint) {
|
|
1536
|
-
if (options.mintClass) {
|
|
1537
|
-
var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
|
|
1538
|
-
if (!ok) {
|
|
1539
|
-
callbackFunction(ok, body, {
|
|
1540
|
-
change: 'new'
|
|
1541
|
-
}); // @@ if ok, need some form of refresh of the select for the new thing
|
|
1542
|
-
}
|
|
1543
|
-
});
|
|
1544
|
-
select.parentNode.appendChild(thisForm);
|
|
1545
|
-
newObject = thisForm.AJAR_subject;
|
|
1546
|
-
} else {
|
|
1547
|
-
newObject = newThing(dataDoc);
|
|
1548
|
-
}
|
|
1549
|
-
|
|
1550
|
-
is.push($rdf.st(subject, predicate, newObject, dataDoc));
|
|
1551
|
-
|
|
1552
|
-
if (options.mintStatementsFun) {
|
|
1553
|
-
is = is.concat(options.mintStatementsFun(newObject));
|
|
1554
|
-
}
|
|
1555
|
-
}
|
|
1556
|
-
|
|
1557
1565
|
if (!opt.AJAR_uri) continue; // a prompt or mint
|
|
1558
1566
|
|
|
1559
1567
|
if (opt.selected && !(opt.AJAR_uri in actual)) {
|
|
@@ -1583,24 +1591,12 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
|
|
|
1583
1591
|
sel = sel.superSelect;
|
|
1584
1592
|
}
|
|
1585
1593
|
|
|
1586
|
-
function doneNew(ok, _body) {
|
|
1587
|
-
callbackFunction(ok, {
|
|
1588
|
-
widget: 'select',
|
|
1589
|
-
event: 'new'
|
|
1590
|
-
});
|
|
1591
|
-
}
|
|
1592
|
-
|
|
1593
1594
|
log.info('selectForOptions: data doc = ' + dataDoc);
|
|
1594
1595
|
kb.updater.update(ds, is, function (uri, ok, body) {
|
|
1595
1596
|
actual = getActual(); // refresh
|
|
1596
1597
|
|
|
1597
1598
|
if (ok) {
|
|
1598
1599
|
select.disabled = false; // data written back
|
|
1599
|
-
|
|
1600
|
-
if (newObject) {
|
|
1601
|
-
var fn = (0, _fieldFunction.fieldFunction)(dom, options.subForm);
|
|
1602
|
-
fn(dom, select.parentNode, {}, newObject, options.subForm, dataDoc, doneNew);
|
|
1603
|
-
}
|
|
1604
1600
|
} else {
|
|
1605
1601
|
return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
|
|
1606
1602
|
}
|
|
@@ -1614,7 +1610,6 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
|
|
|
1614
1610
|
|
|
1615
1611
|
var select = dom.createElement('select');
|
|
1616
1612
|
select.setAttribute('style', style.formSelectSTyle);
|
|
1617
|
-
if (options.multiple) select.setAttribute('multiple', 'true');
|
|
1618
1613
|
select.currentURI = null;
|
|
1619
1614
|
|
|
1620
1615
|
select.refresh = function () {
|
|
@@ -1657,15 +1652,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
|
|
|
1657
1652
|
select.appendChild(option);
|
|
1658
1653
|
}
|
|
1659
1654
|
|
|
1660
|
-
if (
|
|
1661
|
-
var mint = dom.createElement('option');
|
|
1662
|
-
mint.appendChild(dom.createTextNode(options.mint));
|
|
1663
|
-
mint.AJAR_mint = true; // Flag it
|
|
1664
|
-
|
|
1665
|
-
select.insertBefore(mint, select.firstChild);
|
|
1666
|
-
}
|
|
1667
|
-
|
|
1668
|
-
if (select.currentURI == null && !options.multiple) {
|
|
1655
|
+
if (!select.currentURI) {
|
|
1669
1656
|
var prompt = dom.createElement('option');
|
|
1670
1657
|
prompt.appendChild(dom.createTextNode(options.nullLabel));
|
|
1671
1658
|
select.insertBefore(prompt, select.firstChild);
|
|
@@ -1688,28 +1675,16 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
|
|
|
1688
1675
|
function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
|
|
1689
1676
|
var du = kb.any(category, ns.owl('disjointUnionOf'));
|
|
1690
1677
|
var subs;
|
|
1691
|
-
var multiple = false;
|
|
1692
1678
|
|
|
1693
1679
|
if (!du) {
|
|
1694
1680
|
subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
|
|
1695
|
-
multiple = true;
|
|
1696
1681
|
} else {
|
|
1697
1682
|
subs = du.elements;
|
|
1698
1683
|
}
|
|
1699
1684
|
|
|
1700
1685
|
log.debug('Select list length ' + subs.length);
|
|
1701
|
-
|
|
1702
|
-
if (subs.length === 0) {
|
|
1703
|
-
return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
|
|
1704
|
-
}
|
|
1705
|
-
|
|
1706
|
-
if (subs.length === 1) {
|
|
1707
|
-
return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
|
|
1708
|
-
}
|
|
1709
|
-
|
|
1710
1686
|
return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, {
|
|
1711
|
-
|
|
1712
|
-
nullPrompt: '--classify--'
|
|
1687
|
+
nullLabel: '* Select type *'
|
|
1713
1688
|
}, dataDoc, callbackFunction);
|
|
1714
1689
|
}
|
|
1715
1690
|
/** Make SELECT element to select subclasses recurively
|
|
@@ -1743,8 +1718,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
|
|
|
1743
1718
|
function onChange(ok, body) {
|
|
1744
1719
|
if (ok) update();
|
|
1745
1720
|
callbackFunction(ok, body);
|
|
1746
|
-
}
|
|
1747
|
-
|
|
1721
|
+
}
|
|
1748
1722
|
|
|
1749
1723
|
var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
|
|
1750
1724
|
container.appendChild(select);
|
|
@@ -1899,4 +1873,194 @@ function newThing(doc) {
|
|
|
1899
1873
|
var now = new Date();
|
|
1900
1874
|
return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
|
|
1901
1875
|
}
|
|
1876
|
+
/** Make SELECT element to select options
|
|
1877
|
+
//
|
|
1878
|
+
// @param subject - a term, the subject of the statement(s) being edited.
|
|
1879
|
+
// @param predicate - a term, the predicate of the statement(s) being edited
|
|
1880
|
+
// @param possible - a list of terms, the possible value the object can take
|
|
1881
|
+
// @param options.multiSelect - Boolean - Whether more than one at a time is allowed
|
|
1882
|
+
// @param options.uiMultipleInUse - signals that the ui:choise is used with a ui:multiple
|
|
1883
|
+
// @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
|
|
1884
|
+
// @param options.subForm - If mint, then the form to be used for minting the new thing
|
|
1885
|
+
// @param dataDoc - The web document being edited
|
|
1886
|
+
// @param callbackFunction - takes (boolean ok, string errorBody)
|
|
1887
|
+
*/
|
|
1888
|
+
|
|
1889
|
+
|
|
1890
|
+
function makeSelectForChoice(dom, container, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
|
|
1891
|
+
var n = 0;
|
|
1892
|
+
var uris = {}; // Count them
|
|
1893
|
+
|
|
1894
|
+
var editable = kb.updater.editable(dataDoc.uri);
|
|
1895
|
+
|
|
1896
|
+
for (var i = 0; i < possible.length; i++) {
|
|
1897
|
+
var sub = possible[i]; // @@ Maybe; make this so it works with blank nodes too
|
|
1898
|
+
|
|
1899
|
+
if (!sub.uri) debug.warn("makeSelectForOptions: option does not have an uri: ".concat(sub, ", with predicate: ").concat(predicate));
|
|
1900
|
+
if (!sub.uri || sub.uri in uris) continue;
|
|
1901
|
+
uris[sub.uri] = true;
|
|
1902
|
+
n++;
|
|
1903
|
+
} // uris is now the set of possible options
|
|
1904
|
+
|
|
1905
|
+
|
|
1906
|
+
if (n === 0 && !options.mint) {
|
|
1907
|
+
return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
|
|
1908
|
+
}
|
|
1909
|
+
|
|
1910
|
+
log.debug('makeSelectForOptions: dataDoc=' + dataDoc);
|
|
1911
|
+
|
|
1912
|
+
function determinFirstSelectOption() {
|
|
1913
|
+
var firstSelectOptionText = '--- classify ---';
|
|
1914
|
+
var option = dom.createElement('option');
|
|
1915
|
+
|
|
1916
|
+
if (predicate && !(predicate.termType === 'BlankNode')) {
|
|
1917
|
+
firstSelectOptionText = '* Select for property: ' + utils.label(predicate) + ' *';
|
|
1918
|
+
}
|
|
1919
|
+
|
|
1920
|
+
if (subject && !(subject.termType === 'BlankNode')) {
|
|
1921
|
+
firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *';
|
|
1922
|
+
}
|
|
1923
|
+
|
|
1924
|
+
option.appendChild(dom.createTextNode(firstSelectOptionText));
|
|
1925
|
+
option.disabled = true;
|
|
1926
|
+
option.value = true;
|
|
1927
|
+
option.hidden = true;
|
|
1928
|
+
option.selected = true;
|
|
1929
|
+
return option;
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
var onChange = function onChange(_e) {
|
|
1933
|
+
select.refresh();
|
|
1934
|
+
};
|
|
1935
|
+
|
|
1936
|
+
var select = dom.createElement('select');
|
|
1937
|
+
select.setAttribute('style', style.formSelectSTyle);
|
|
1938
|
+
if (options.multiSelect) select.setAttribute('multiSelect', 'true');
|
|
1939
|
+
select.currentURI = null;
|
|
1940
|
+
|
|
1941
|
+
for (var uri in uris) {
|
|
1942
|
+
select.appendChild(createOption(uri));
|
|
1943
|
+
}
|
|
1944
|
+
|
|
1945
|
+
if (editable && options.mint) {
|
|
1946
|
+
var mint = dom.createElement('option');
|
|
1947
|
+
mint.appendChild(dom.createTextNode(options.mint));
|
|
1948
|
+
mint.AJAR_mint = true; // Flag it
|
|
1949
|
+
|
|
1950
|
+
select.insertBefore(mint, select.firstChild);
|
|
1951
|
+
}
|
|
1952
|
+
|
|
1953
|
+
if (select.children.length === 0) select.insertBefore(determinFirstSelectOption(), select.firstChild);
|
|
1954
|
+
|
|
1955
|
+
select.refresh = function () {
|
|
1956
|
+
select.disabled = true; // unlocked any conflict we had got into
|
|
1957
|
+
|
|
1958
|
+
var ds = [];
|
|
1959
|
+
var is = [];
|
|
1960
|
+
|
|
1961
|
+
var removeValue = function removeValue(t) {
|
|
1962
|
+
if (kb.holds(subject, predicate, t, dataDoc)) {
|
|
1963
|
+
ds.push($rdf.st(subject, predicate, t, dataDoc));
|
|
1964
|
+
}
|
|
1965
|
+
};
|
|
1966
|
+
|
|
1967
|
+
var newObject;
|
|
1968
|
+
|
|
1969
|
+
for (var _i3 = 0; _i3 < select.options.length; _i3++) {
|
|
1970
|
+
var opt = select.options[_i3];
|
|
1971
|
+
|
|
1972
|
+
if (opt.selected && opt.AJAR_mint) {
|
|
1973
|
+
// not sure if this 'if' is used because I cannot find mintClass
|
|
1974
|
+
if (options.mintClass) {
|
|
1975
|
+
var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
|
|
1976
|
+
if (!ok) {
|
|
1977
|
+
callbackFunction(ok, body, {
|
|
1978
|
+
change: 'new'
|
|
1979
|
+
}); // @@ if ok, need some form of refresh of the select for the new thing
|
|
1980
|
+
}
|
|
1981
|
+
});
|
|
1982
|
+
select.parentNode.appendChild(thisForm);
|
|
1983
|
+
newObject = thisForm.AJAR_subject;
|
|
1984
|
+
} else {
|
|
1985
|
+
newObject = newThing(dataDoc);
|
|
1986
|
+
}
|
|
1987
|
+
|
|
1988
|
+
is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
|
|
1989
|
+
if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc)); // not sure if this 'if' is used because I cannot find mintStatementsFun
|
|
1990
|
+
|
|
1991
|
+
if (options.mintStatementsFun) {
|
|
1992
|
+
is = is.concat(options.mintStatementsFun(newObject));
|
|
1993
|
+
}
|
|
1994
|
+
|
|
1995
|
+
select.currentURI = newObject;
|
|
1996
|
+
}
|
|
1997
|
+
|
|
1998
|
+
if (!opt.AJAR_uri) continue; // a prompt or mint
|
|
1999
|
+
|
|
2000
|
+
if (opt.selected) select.currentURI = opt.AJAR_uri;
|
|
2001
|
+
}
|
|
2002
|
+
|
|
2003
|
+
var sel = select.subSelect; // All subclasses must also go
|
|
2004
|
+
|
|
2005
|
+
while (sel && sel.currentURI) {
|
|
2006
|
+
removeValue(kb.sym(sel.currentURI));
|
|
2007
|
+
sel = sel.subSelect;
|
|
2008
|
+
}
|
|
2009
|
+
|
|
2010
|
+
sel = select.superSelect; // All superclasses are redundant
|
|
2011
|
+
|
|
2012
|
+
while (sel && sel.currentURI) {
|
|
2013
|
+
removeValue(kb.sym(sel.currentURI));
|
|
2014
|
+
sel = sel.superSelect;
|
|
2015
|
+
}
|
|
2016
|
+
|
|
2017
|
+
log.info('selectForOptions: data doc = ' + dataDoc);
|
|
2018
|
+
|
|
2019
|
+
if (select.currentURI) {
|
|
2020
|
+
removeNextSiblingsAfterElement(select);
|
|
2021
|
+
addSubFormChoice(dom, container, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
|
|
2022
|
+
if (ok) {
|
|
2023
|
+
kb.updater.update(ds, is, function (uri, success, errorBody) {
|
|
2024
|
+
if (!success) container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
|
|
2025
|
+
});
|
|
2026
|
+
if (callbackFunction) callbackFunction(ok, {
|
|
2027
|
+
widget: 'select',
|
|
2028
|
+
event: 'new'
|
|
2029
|
+
}); // widgets.refreshTree(container)
|
|
2030
|
+
} else {
|
|
2031
|
+
container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
|
|
2032
|
+
}
|
|
2033
|
+
});
|
|
2034
|
+
}
|
|
2035
|
+
|
|
2036
|
+
select.disabled = false;
|
|
2037
|
+
};
|
|
2038
|
+
|
|
2039
|
+
function createOption(uri) {
|
|
2040
|
+
var option = dom.createElement('option');
|
|
2041
|
+
var c = kb.sym(uri);
|
|
2042
|
+
|
|
2043
|
+
if (options.disambiguate) {
|
|
2044
|
+
option.appendChild(dom.createTextNode(utils.labelWithOntology(c, true))); // Init. cap
|
|
2045
|
+
} else {
|
|
2046
|
+
option.appendChild(dom.createTextNode(utils.label(c, true))); // Init.
|
|
2047
|
+
}
|
|
2048
|
+
|
|
2049
|
+
var backgroundColor = kb.any(c, kb.sym('http://www.w3.org/ns/ui#backgroundColor'));
|
|
2050
|
+
|
|
2051
|
+
if (backgroundColor) {
|
|
2052
|
+
option.setAttribute('style', 'background-color: ' + backgroundColor.value + '; ');
|
|
2053
|
+
}
|
|
2054
|
+
|
|
2055
|
+
option.AJAR_uri = uri;
|
|
2056
|
+
if (c.toString() === '' + select.currentURI) option.selected = true;
|
|
2057
|
+
return option;
|
|
2058
|
+
}
|
|
2059
|
+
|
|
2060
|
+
if (editable) {
|
|
2061
|
+
select.addEventListener('change', onChange, false);
|
|
2062
|
+
}
|
|
2063
|
+
|
|
2064
|
+
return select;
|
|
2065
|
+
} // makeSelectForChoice
|
|
1902
2066
|
//# sourceMappingURL=forms.js.map
|