solid-ui 2.4.22-05274f4a → 2.4.22-0b2c6704
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 +327 -179
- package/dist/main.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 +319 -173
- 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() {
|
|
@@ -1030,23 +1031,26 @@ _fieldFunction.field[ns.ui('Classifier').uri] = function (dom, container, alread
|
|
|
1030
1031
|
** -- radio buttons
|
|
1031
1032
|
** -- auto-complete typing
|
|
1032
1033
|
**
|
|
1033
|
-
**
|
|
1034
|
+
** TODO: according to ontology ui:choice can also have ns.ui('default') - this is not implemented yet
|
|
1034
1035
|
*/
|
|
1035
1036
|
|
|
1036
1037
|
|
|
1037
1038
|
_fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
|
|
1038
1039
|
var ui = ns.ui;
|
|
1039
1040
|
var kb = _solidLogic.store;
|
|
1040
|
-
var multiple = false;
|
|
1041
1041
|
var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
|
|
1042
1042
|
|
|
1043
|
+
var multiSelect = false;
|
|
1043
1044
|
var p;
|
|
1044
|
-
var box = dom.createElement('div');
|
|
1045
|
+
var box = dom.createElement('div');
|
|
1046
|
+
box.setAttribute('class', 'choiceBox'); // Set flexDirection column?
|
|
1045
1047
|
|
|
1046
1048
|
if (container) container.appendChild(box);
|
|
1047
1049
|
var lhs = dom.createElement('div');
|
|
1050
|
+
lhs.setAttribute('class', 'formFieldName choiceBox-label');
|
|
1048
1051
|
box.appendChild(lhs);
|
|
1049
1052
|
var rhs = dom.createElement('div');
|
|
1053
|
+
rhs.setAttribute('class', 'formFieldValue choiceBox-selectBox');
|
|
1050
1054
|
box.appendChild(rhs);
|
|
1051
1055
|
var property = kb.any(form, ui('property'));
|
|
1052
1056
|
|
|
@@ -1055,89 +1059,87 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
|
|
|
1055
1059
|
}
|
|
1056
1060
|
|
|
1057
1061
|
lhs.appendChild((0, _basic.fieldLabel)(dom, property, form));
|
|
1062
|
+
var uiFrom = kb.any(form, ui('from'));
|
|
1063
|
+
|
|
1064
|
+
if (!uiFrom) {
|
|
1065
|
+
return (0, _error.errorMessageBlock)(dom, "No 'from' for Choice: " + form);
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1058
1068
|
var subForm = kb.any(form, ui('use')); // Optional
|
|
1059
1069
|
|
|
1060
1070
|
var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
|
|
1061
1071
|
|
|
1062
|
-
var possible = [];
|
|
1063
|
-
var possibleProperties;
|
|
1064
|
-
var firstSelectOptionText = '* Select from ' + utils.label(subject, true) + ' *';
|
|
1065
1072
|
var opts = {
|
|
1066
1073
|
form: form,
|
|
1067
1074
|
subForm: subForm,
|
|
1068
|
-
|
|
1069
|
-
firstSelectOptionText: firstSelectOptionText,
|
|
1075
|
+
multiSelect: multiSelect,
|
|
1070
1076
|
disambiguate: false
|
|
1071
1077
|
};
|
|
1072
|
-
var uiFrom = kb.any(form, ui('from'));
|
|
1073
1078
|
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1079
|
+
function getSelectorOptions() {
|
|
1080
|
+
var possible = [];
|
|
1081
|
+
var possibleProperties;
|
|
1082
|
+
possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
|
|
1077
1083
|
|
|
1078
|
-
|
|
1084
|
+
for (var x in kb.findMembersNT(uiFrom)) {
|
|
1085
|
+
possible.push(kb.fromNT(x));
|
|
1086
|
+
} // Use rdfs
|
|
1079
1087
|
|
|
1080
|
-
for (var x in kb.findMembersNT(uiFrom)) {
|
|
1081
|
-
possible.push(kb.fromNT(x));
|
|
1082
|
-
} // Use rdfs
|
|
1083
1088
|
|
|
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)
|
|
1084
1093
|
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
possible.push(kb.sym(p));
|
|
1088
|
-
} // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
|
|
1094
|
+
} else if (uiFrom.sameTerm(ns.rdf('Property'))) {
|
|
1095
|
+
possibleProperties = buttons.propertyTriage(kb);
|
|
1089
1096
|
|
|
1090
|
-
|
|
1091
|
-
|
|
1097
|
+
for (p in possibleProperties.op) {
|
|
1098
|
+
possible.push(kb.fromNT(p));
|
|
1099
|
+
}
|
|
1092
1100
|
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1101
|
+
for (p in possibleProperties.dp) {
|
|
1102
|
+
possible.push(kb.fromNT(p));
|
|
1103
|
+
}
|
|
1096
1104
|
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
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);
|
|
1100
1108
|
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1109
|
+
for (p in possibleProperties.op) {
|
|
1110
|
+
possible.push(kb.fromNT(p));
|
|
1111
|
+
}
|
|
1104
1112
|
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1113
|
+
opts.disambiguate = true;
|
|
1114
|
+
} else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
|
|
1115
|
+
possibleProperties = buttons.propertyTriage(kb);
|
|
1108
1116
|
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1117
|
+
for (p in possibleProperties.dp) {
|
|
1118
|
+
possible.push(kb.fromNT(p));
|
|
1119
|
+
}
|
|
1112
1120
|
|
|
1113
|
-
|
|
1114
|
-
possible.push(kb.fromNT(p));
|
|
1121
|
+
opts.disambiguate = true;
|
|
1115
1122
|
}
|
|
1116
1123
|
|
|
1117
|
-
|
|
1118
|
-
}
|
|
1124
|
+
return sortByLabel(possible);
|
|
1125
|
+
} // TODO: this checks for any occurrence, regardless of true or false setting
|
|
1119
1126
|
|
|
1120
|
-
var sortedPossible = sortByLabel(possible); // TODO: this checks for any occurance regardles if it is set to true or false
|
|
1121
1127
|
|
|
1122
1128
|
if (kb.any(form, ui('canMintNew'))) {
|
|
1123
1129
|
opts.mint = '* Create new *'; // @@ could be better
|
|
1124
1130
|
}
|
|
1125
1131
|
|
|
1126
|
-
var selector
|
|
1127
|
-
rhs.appendChild(selector);
|
|
1128
|
-
var object;
|
|
1132
|
+
var selector;
|
|
1129
1133
|
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
if (object && subForm) {
|
|
1137
|
-
removeNextSiblingsAfterElement(selector);
|
|
1138
|
-
addSubFormChoice(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
|
|
1139
|
-
}
|
|
1134
|
+
rhs.refresh = function () {
|
|
1135
|
+
var selectorOptions = getSelectorOptions();
|
|
1136
|
+
selector = makeSelectForChoice(dom, rhs, kb, subject, property, selectorOptions, uiFrom, opts, dataDoc, callbackFunction);
|
|
1137
|
+
rhs.innerHTML = '';
|
|
1138
|
+
rhs.appendChild(selector);
|
|
1139
|
+
};
|
|
1140
1140
|
|
|
1141
|
+
rhs.refresh();
|
|
1142
|
+
if (selector && selector.refresh) selector.refresh();
|
|
1141
1143
|
return box;
|
|
1142
1144
|
};
|
|
1143
1145
|
/**
|
|
@@ -1358,7 +1360,8 @@ function promptForNew(dom, kb, subject, predicate, theClass, form, dataDoc, call
|
|
|
1358
1360
|
b.setAttribute('type', 'button');
|
|
1359
1361
|
b.setAttribute('style', 'float: right;');
|
|
1360
1362
|
b.innerHTML = 'Goto ' + utils.label(theClass);
|
|
1361
|
-
b.addEventListener('click',
|
|
1363
|
+
b.addEventListener('click', // TODO fix dependency cycle to solid-panes by calling outlineManager
|
|
1364
|
+
function (_e) {
|
|
1362
1365
|
dom.outlineManager.GotoSubject(theClass, true, undefined, true, undefined);
|
|
1363
1366
|
}, false);
|
|
1364
1367
|
return box;
|
|
@@ -1493,17 +1496,15 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
|
|
|
1493
1496
|
// @param subject - a term, the subject of the statement(s) being edited.
|
|
1494
1497
|
// @param predicate - a term, the predicate of the statement(s) being edited
|
|
1495
1498
|
// @param possible - a list of terms, the possible value the object can take
|
|
1496
|
-
// @param options.
|
|
1497
|
-
// @param options.firstSelectOptionText - a string to be displayed as the
|
|
1499
|
+
// @param options.nullLabel - a string to be displayed as the
|
|
1498
1500
|
// option for none selected (for non multiple)
|
|
1499
|
-
// @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
|
|
1500
1501
|
// @param options.subForm - If mint, then the form to be used for minting the new thing
|
|
1501
1502
|
// @param dataDoc - The web document being edited
|
|
1502
1503
|
// @param callbackFunction - takes (boolean ok, string errorBody)
|
|
1503
1504
|
*/
|
|
1504
1505
|
|
|
1505
1506
|
|
|
1506
|
-
function makeSelectForOptions(dom, kb, subject, predicate, possible,
|
|
1507
|
+
function makeSelectForOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
|
|
1507
1508
|
log.debug('Select list length now ' + possible.length);
|
|
1508
1509
|
var n = 0;
|
|
1509
1510
|
var uris = {}; // Count them
|
|
@@ -1520,7 +1521,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1520
1521
|
} // uris is now the set of possible options
|
|
1521
1522
|
|
|
1522
1523
|
|
|
1523
|
-
if (n === 0
|
|
1524
|
+
if (n === 0) {
|
|
1524
1525
|
return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
|
|
1525
1526
|
}
|
|
1526
1527
|
|
|
@@ -1546,6 +1547,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1546
1547
|
actual = getActual();
|
|
1547
1548
|
|
|
1548
1549
|
var onChange = function onChange(_e) {
|
|
1550
|
+
select.disabled = true; // until data written back - gives user feedback too
|
|
1551
|
+
|
|
1549
1552
|
var ds = [];
|
|
1550
1553
|
var is = [];
|
|
1551
1554
|
|
|
@@ -1555,43 +1558,18 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1555
1558
|
}
|
|
1556
1559
|
};
|
|
1557
1560
|
|
|
1558
|
-
var newObject;
|
|
1559
|
-
|
|
1560
1561
|
for (var _i = 0; _i < select.options.length; _i++) {
|
|
1561
1562
|
var opt = select.options[_i];
|
|
1562
|
-
|
|
1563
|
-
if (opt.selected && opt.AJAR_mint) {
|
|
1564
|
-
// not sure if this if is used because I cannot find mintClass
|
|
1565
|
-
if (options.mintClass) {
|
|
1566
|
-
var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
|
|
1567
|
-
if (!ok) {
|
|
1568
|
-
callbackFunction(ok, body, {
|
|
1569
|
-
change: 'new'
|
|
1570
|
-
}); // @@ if ok, need some form of refresh of the select for the new thing
|
|
1571
|
-
}
|
|
1572
|
-
});
|
|
1573
|
-
select.parentNode.appendChild(thisForm);
|
|
1574
|
-
newObject = thisForm.AJAR_subject;
|
|
1575
|
-
} else {
|
|
1576
|
-
newObject = newThing(dataDoc);
|
|
1577
|
-
}
|
|
1578
|
-
|
|
1579
|
-
is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
|
|
1580
|
-
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
|
|
1581
|
-
|
|
1582
|
-
if (options.mintStatementsFun) {
|
|
1583
|
-
is = is.concat(options.mintStatementsFun(newObject));
|
|
1584
|
-
}
|
|
1585
|
-
|
|
1586
|
-
select.currentURI = newObject;
|
|
1587
|
-
}
|
|
1588
|
-
|
|
1589
1563
|
if (!opt.AJAR_uri) continue; // a prompt or mint
|
|
1590
1564
|
|
|
1591
1565
|
if (opt.selected && !(opt.AJAR_uri in actual)) {
|
|
1592
1566
|
// new class
|
|
1593
1567
|
is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
|
|
1594
|
-
|
|
1568
|
+
}
|
|
1569
|
+
|
|
1570
|
+
if (!opt.selected && opt.AJAR_uri in actual) {
|
|
1571
|
+
// old class
|
|
1572
|
+
removeValue(kb.sym(opt.AJAR_uri));
|
|
1595
1573
|
}
|
|
1596
1574
|
|
|
1597
1575
|
if (opt.selected) select.currentURI = opt.AJAR_uri;
|
|
@@ -1611,27 +1589,25 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1611
1589
|
sel = sel.superSelect;
|
|
1612
1590
|
}
|
|
1613
1591
|
|
|
1614
|
-
log.info('selectForOptions: data doc = ' + dataDoc);
|
|
1592
|
+
log.info('selectForOptions: data doc = ' + dataDoc);
|
|
1593
|
+
kb.updater.update(ds, is, function (uri, ok, body) {
|
|
1594
|
+
actual = getActual(); // refresh
|
|
1615
1595
|
|
|
1616
|
-
removeNextSiblingsAfterElement(select);
|
|
1617
|
-
addSubFormChoice(dom, select.parentNode, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
|
|
1618
1596
|
if (ok) {
|
|
1619
|
-
|
|
1620
|
-
|
|
1597
|
+
select.disabled = false; // data written back
|
|
1598
|
+
} else {
|
|
1599
|
+
return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
|
|
1600
|
+
}
|
|
1621
1601
|
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
});
|
|
1627
|
-
});
|
|
1628
|
-
} else return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
|
|
1602
|
+
if (callbackFunction) callbackFunction(ok, {
|
|
1603
|
+
widget: 'select',
|
|
1604
|
+
event: 'change'
|
|
1605
|
+
});
|
|
1629
1606
|
});
|
|
1630
1607
|
};
|
|
1631
1608
|
|
|
1632
1609
|
var select = dom.createElement('select');
|
|
1633
1610
|
select.setAttribute('style', style.formSelectSTyle);
|
|
1634
|
-
if (options.multiple) select.setAttribute('multiple', 'true');
|
|
1635
1611
|
select.currentURI = null;
|
|
1636
1612
|
|
|
1637
1613
|
select.refresh = function () {
|
|
@@ -1674,22 +1650,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1674
1650
|
select.appendChild(option);
|
|
1675
1651
|
}
|
|
1676
1652
|
|
|
1677
|
-
if (
|
|
1678
|
-
var mint = dom.createElement('option');
|
|
1679
|
-
mint.appendChild(dom.createTextNode(options.mint));
|
|
1680
|
-
mint.AJAR_mint = true; // Flag it
|
|
1681
|
-
|
|
1682
|
-
select.insertBefore(mint, select.firstChild);
|
|
1683
|
-
}
|
|
1684
|
-
|
|
1685
|
-
if (!select.currentURI && !options.multiple) {
|
|
1653
|
+
if (!select.currentURI) {
|
|
1686
1654
|
var prompt = dom.createElement('option');
|
|
1687
|
-
prompt.appendChild(dom.createTextNode(options.
|
|
1688
|
-
prompt.selected = true;
|
|
1689
|
-
prompt.disabled = true;
|
|
1690
|
-
prompt.value = true;
|
|
1691
|
-
prompt.hidden = true;
|
|
1655
|
+
prompt.appendChild(dom.createTextNode(options.nullLabel));
|
|
1692
1656
|
select.insertBefore(prompt, select.firstChild);
|
|
1657
|
+
prompt.selected = true;
|
|
1693
1658
|
}
|
|
1694
1659
|
|
|
1695
1660
|
if (editable) {
|
|
@@ -1708,27 +1673,16 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1708
1673
|
function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
|
|
1709
1674
|
var du = kb.any(category, ns.owl('disjointUnionOf'));
|
|
1710
1675
|
var subs;
|
|
1711
|
-
var multiple = false;
|
|
1712
1676
|
|
|
1713
1677
|
if (!du) {
|
|
1714
1678
|
subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
|
|
1715
|
-
multiple = true;
|
|
1716
1679
|
} else {
|
|
1717
1680
|
subs = du.elements;
|
|
1718
1681
|
}
|
|
1719
1682
|
|
|
1720
1683
|
log.debug('Select list length ' + subs.length);
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
|
|
1724
|
-
}
|
|
1725
|
-
|
|
1726
|
-
if (subs.length === 1) {
|
|
1727
|
-
return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
|
|
1728
|
-
}
|
|
1729
|
-
|
|
1730
|
-
return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, null, {
|
|
1731
|
-
multiple: multiple
|
|
1684
|
+
return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, {
|
|
1685
|
+
nullLabel: '* Select type *'
|
|
1732
1686
|
}, dataDoc, callbackFunction);
|
|
1733
1687
|
}
|
|
1734
1688
|
/** Make SELECT element to select subclasses recurively
|
|
@@ -1762,8 +1716,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
|
|
|
1762
1716
|
function onChange(ok, body) {
|
|
1763
1717
|
if (ok) update();
|
|
1764
1718
|
callbackFunction(ok, body);
|
|
1765
|
-
}
|
|
1766
|
-
|
|
1719
|
+
}
|
|
1767
1720
|
|
|
1768
1721
|
var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
|
|
1769
1722
|
container.appendChild(select);
|
|
@@ -1918,4 +1871,197 @@ function newThing(doc) {
|
|
|
1918
1871
|
var now = new Date();
|
|
1919
1872
|
return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
|
|
1920
1873
|
}
|
|
1874
|
+
/** Make SELECT element to select options
|
|
1875
|
+
//
|
|
1876
|
+
// @param subject - a term, the subject of the statement(s) being edited.
|
|
1877
|
+
// @param predicate - a term, the predicate of the statement(s) being edited
|
|
1878
|
+
// @param possible - a list of terms, the possible value the object can take
|
|
1879
|
+
// @param options.multiSelect - Boolean - Whether more than one at a time is allowed
|
|
1880
|
+
// @param options.uiMultipleInUse - signals that the ui:choise is used with a ui:multiple
|
|
1881
|
+
// @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
|
|
1882
|
+
// @param options.subForm - If mint, then the form to be used for minting the new thing
|
|
1883
|
+
// @param dataDoc - The web document being edited
|
|
1884
|
+
// @param callbackFunction - takes (boolean ok, string errorBody)
|
|
1885
|
+
*/
|
|
1886
|
+
|
|
1887
|
+
|
|
1888
|
+
function makeSelectForChoice(dom, container, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
|
|
1889
|
+
var n = 0;
|
|
1890
|
+
var uris = {}; // Count them
|
|
1891
|
+
|
|
1892
|
+
var editable = kb.updater.editable(dataDoc.uri);
|
|
1893
|
+
|
|
1894
|
+
for (var i = 0; i < possible.length; i++) {
|
|
1895
|
+
var sub = possible[i]; // @@ Maybe; make this so it works with blank nodes too
|
|
1896
|
+
|
|
1897
|
+
if (!sub.uri) debug.warn("makeSelectForOptions: option does not have an uri: ".concat(sub, ", with predicate: ").concat(predicate));
|
|
1898
|
+
if (!sub.uri || sub.uri in uris) continue;
|
|
1899
|
+
uris[sub.uri] = true;
|
|
1900
|
+
n++;
|
|
1901
|
+
} // uris is now the set of possible options
|
|
1902
|
+
|
|
1903
|
+
|
|
1904
|
+
if (n === 0 && !options.mint) {
|
|
1905
|
+
return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
|
|
1906
|
+
}
|
|
1907
|
+
|
|
1908
|
+
log.debug('makeSelectForOptions: dataDoc=' + dataDoc);
|
|
1909
|
+
|
|
1910
|
+
function determinFirstSelectOption() {
|
|
1911
|
+
var firstSelectOptionText = '--- classify ---';
|
|
1912
|
+
var option = dom.createElement('option');
|
|
1913
|
+
|
|
1914
|
+
if (predicate && !(predicate.termType === 'BlankNode')) {
|
|
1915
|
+
firstSelectOptionText = '* Select for property: ' + utils.label(predicate) + ' *';
|
|
1916
|
+
}
|
|
1917
|
+
|
|
1918
|
+
if (subject && !(subject.termType === 'BlankNode')) {
|
|
1919
|
+
firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *';
|
|
1920
|
+
}
|
|
1921
|
+
|
|
1922
|
+
option.appendChild(dom.createTextNode(firstSelectOptionText));
|
|
1923
|
+
option.disabled = true;
|
|
1924
|
+
option.value = true;
|
|
1925
|
+
option.hidden = true;
|
|
1926
|
+
option.selected = true;
|
|
1927
|
+
return option;
|
|
1928
|
+
}
|
|
1929
|
+
|
|
1930
|
+
var onChange = function onChange(_e) {
|
|
1931
|
+
select.refresh();
|
|
1932
|
+
};
|
|
1933
|
+
|
|
1934
|
+
var select = dom.createElement('select');
|
|
1935
|
+
select.setAttribute('style', style.formSelectSTyle);
|
|
1936
|
+
if (options.multiSelect) select.setAttribute('multiSelect', 'true');
|
|
1937
|
+
select.currentURI = null;
|
|
1938
|
+
var object = kb.any(subject, predicate);
|
|
1939
|
+
if (object) select.currentURI = object;
|
|
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
|
+
select.refresh();
|
|
2065
|
+
return select;
|
|
2066
|
+
} // makeSelectForChoice
|
|
1921
2067
|
//# sourceMappingURL=forms.js.map
|