solid-ui 2.4.22-c76aca59 → 2.4.22-d4ac720b
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 +8123 -7172
- package/dist/main.js.map +1 -1
- package/lib/acl/access-controller.js.map +1 -1
- package/lib/acl/access-groups.js.map +1 -1
- package/lib/acl/acl-control.js.map +1 -1
- package/lib/acl/acl.js.map +1 -1
- package/lib/acl/add-agent-buttons.js +0 -1
- package/lib/acl/add-agent-buttons.js.map +1 -1
- package/lib/acl/index.js.map +1 -1
- package/lib/acl/styles.js.map +1 -1
- package/lib/acl/types.js.map +1 -1
- package/lib/chat/bookmarks.js +2 -4
- package/lib/chat/bookmarks.js.map +1 -1
- package/lib/chat/chatLogic.js.map +1 -1
- package/lib/chat/dateFolder.js.map +1 -1
- package/lib/chat/infinite.js.map +1 -1
- package/lib/chat/message.js.map +1 -1
- package/lib/chat/messageTools.js.map +1 -1
- package/lib/chat/thread.js.map +1 -1
- package/lib/create/create.js.map +1 -1
- package/lib/create/index.js.map +1 -1
- package/lib/create/types.js.map +1 -1
- package/lib/debug.js.map +1 -1
- package/lib/folders.js.map +1 -1
- package/lib/footer/index.js.map +1 -1
- package/lib/footer/styleMap.js.map +1 -1
- package/lib/header/empty-profile.js.map +1 -1
- package/lib/header/index.js.map +1 -1
- package/lib/header/styleMap.js.map +1 -1
- package/lib/iconBase.js +3 -2
- package/lib/iconBase.js.map +1 -1
- package/lib/icons/solid_logo.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/jss/index.js.map +1 -1
- package/lib/log.js.map +1 -1
- package/lib/login/login.d.ts +9 -8
- package/lib/login/login.d.ts.map +1 -1
- package/lib/login/login.js +298 -344
- package/lib/login/login.js.map +1 -1
- package/lib/matrix/index.js.map +1 -1
- package/lib/matrix/matrix.js.map +1 -1
- package/lib/matrix/types.js.map +1 -1
- package/lib/media/index.js.map +1 -1
- package/lib/media/media-capture.js.map +1 -1
- package/lib/messageArea.js.map +1 -1
- package/lib/noun_Camera_1618446_000000.js.map +1 -1
- package/lib/ns.js.map +1 -1
- package/lib/pad.js.map +1 -1
- package/lib/participation.js.map +1 -1
- package/lib/preferences.js.map +1 -1
- package/lib/signup/config-default.js.map +1 -1
- package/lib/signup/signup.js.map +1 -1
- package/lib/stories/decorators.js.map +1 -1
- package/lib/style.js.map +1 -1
- package/lib/style_multiSelect.js +67 -0
- package/lib/style_multiSelect.js.map +1 -0
- package/lib/table.js.map +1 -1
- package/lib/tabs.d.ts +1 -1
- package/lib/tabs.d.ts.map +1 -1
- package/lib/tabs.js +38 -22
- package/lib/tabs.js.map +1 -1
- package/lib/typings.d.js.map +1 -1
- package/lib/utils/headerFooterHelpers.js.map +1 -1
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/label.js +1 -1
- package/lib/utils/label.js.map +1 -1
- package/lib/versionInfo.d.ts +9 -9
- package/lib/versionInfo.js +14 -14
- package/lib/versionInfo.js.map +1 -1
- package/lib/widgets/buttons/iconLinks.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/dragAndDrop.js.map +1 -1
- package/lib/widgets/error.d.ts +0 -12
- package/lib/widgets/error.d.ts.map +1 -1
- package/lib/widgets/error.js +5 -0
- package/lib/widgets/error.js.map +1 -1
- package/lib/widgets/forms/autocomplete/autocompleteBar.js.map +1 -1
- package/lib/widgets/forms/autocomplete/autocompleteField.js.map +1 -1
- package/lib/widgets/forms/autocomplete/autocompletePicker.js.map +1 -1
- package/lib/widgets/forms/autocomplete/language.js.map +1 -1
- package/lib/widgets/forms/autocomplete/publicData.js.map +1 -1
- package/lib/widgets/forms/basic.js.map +1 -1
- package/lib/widgets/forms/comment.js.map +1 -1
- package/lib/widgets/forms/fieldFunction.js.map +1 -1
- package/lib/widgets/forms/fieldParams.js.map +1 -1
- package/lib/widgets/forms/formStyle.js.map +1 -1
- package/lib/widgets/forms.js +711 -143
- package/lib/widgets/forms.js.map +1 -1
- package/lib/widgets/index.js.map +1 -1
- package/lib/widgets/multiSelect.js +784 -0
- package/lib/widgets/multiSelect.js.map +1 -0
- package/lib/widgets/peoplePicker.js.map +1 -1
- package/lib/widgets/widgetHelpers.js.map +1 -1
- package/package.json +34 -30
package/lib/widgets/forms.js
CHANGED
|
@@ -22,6 +22,12 @@ Object.defineProperty(exports, "field", {
|
|
|
22
22
|
return _fieldFunction.field;
|
|
23
23
|
}
|
|
24
24
|
});
|
|
25
|
+
Object.defineProperty(exports, "fieldFunction", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
get: function get() {
|
|
28
|
+
return _fieldFunction.fieldFunction;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
25
31
|
Object.defineProperty(exports, "fieldLabel", {
|
|
26
32
|
enumerable: true,
|
|
27
33
|
get: function get() {
|
|
@@ -44,8 +50,16 @@ exports.findClosest = findClosest;
|
|
|
44
50
|
exports.formsFor = formsFor;
|
|
45
51
|
exports.makeDescription = makeDescription;
|
|
46
52
|
exports.makeSelectForCategory = makeSelectForCategory;
|
|
53
|
+
exports.makeSelectForChoice = makeSelectForChoice;
|
|
54
|
+
exports.makeSelectForClassifierOptions = makeSelectForClassifierOptions;
|
|
47
55
|
exports.makeSelectForNestedCategory = makeSelectForNestedCategory;
|
|
48
56
|
exports.makeSelectForOptions = makeSelectForOptions;
|
|
57
|
+
Object.defineProperty(exports, "mostSpecificClassURI", {
|
|
58
|
+
enumerable: true,
|
|
59
|
+
get: function get() {
|
|
60
|
+
return _fieldFunction.mostSpecificClassURI;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
49
63
|
exports.newButton = newButton;
|
|
50
64
|
exports.newThing = newThing;
|
|
51
65
|
exports.promptForNew = promptForNew;
|
|
@@ -93,6 +107,8 @@ var _solidLogic = require("solid-logic");
|
|
|
93
107
|
|
|
94
108
|
var utils = _interopRequireWildcard(require("../utils"));
|
|
95
109
|
|
|
110
|
+
var _multiSelect = require("./multiSelect");
|
|
111
|
+
|
|
96
112
|
var widgets = _interopRequireWildcard(require("../widgets"));
|
|
97
113
|
|
|
98
114
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
@@ -155,14 +171,16 @@ _fieldFunction.field[ns.ui('Form').uri] = _fieldFunction.field[ns.ui('Group').ur
|
|
|
155
171
|
var ui = ns.ui;
|
|
156
172
|
if (container) container.appendChild(box); // Prevent loops
|
|
157
173
|
|
|
174
|
+
if (!form) return;
|
|
158
175
|
var key = subject.toNT() + '|' + form.toNT();
|
|
159
176
|
|
|
160
177
|
if (already[key]) {
|
|
161
178
|
// been there done that
|
|
162
|
-
box.appendChild(dom.createTextNode('Group: see above ' + key));
|
|
163
|
-
|
|
179
|
+
box.appendChild(dom.createTextNode('Group: see above ' + key)); // TODO fix dependency cycle to solid-panes by calling outlineManager
|
|
180
|
+
// const plist = [$rdf.st(subject, ns.owl('sameAs'), subject)] // @@ need prev subject
|
|
181
|
+
// dom.outlineManager.appendPropertyTRs(box, plist)
|
|
182
|
+
// dom.appendChild(plist)
|
|
164
183
|
|
|
165
|
-
dom.outlineManager.appendPropertyTRs(box, plist);
|
|
166
184
|
return box;
|
|
167
185
|
}
|
|
168
186
|
|
|
@@ -263,47 +281,43 @@ _fieldFunction.field[ns.ui('Options').uri] = function (dom, container, already,
|
|
|
263
281
|
values = kb.each(subject, dependingOn);
|
|
264
282
|
}
|
|
265
283
|
|
|
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'
|
|
284
|
+
for (var i = 0; i < cases.length; i++) {
|
|
285
|
+
var c = cases[i];
|
|
286
|
+
var tests = kb.each(c, ui('for'), null, formDoc); // There can be multiple 'for'
|
|
272
287
|
|
|
273
|
-
|
|
288
|
+
var match = false;
|
|
274
289
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
290
|
+
for (var j = 0; j < tests.length; j++) {
|
|
291
|
+
var _iterator = _createForOfIteratorHelper(values),
|
|
292
|
+
_step;
|
|
278
293
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
294
|
+
try {
|
|
295
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
296
|
+
var value = _step.value;
|
|
297
|
+
var test = tests[j];
|
|
283
298
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
}
|
|
299
|
+
if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
|
|
300
|
+
match = true;
|
|
287
301
|
}
|
|
288
|
-
} catch (err) {
|
|
289
|
-
_iterator.e(err);
|
|
290
|
-
} finally {
|
|
291
|
-
_iterator.f();
|
|
292
302
|
}
|
|
303
|
+
} catch (err) {
|
|
304
|
+
_iterator.e(err);
|
|
305
|
+
} finally {
|
|
306
|
+
_iterator.f();
|
|
293
307
|
}
|
|
308
|
+
}
|
|
294
309
|
|
|
295
|
-
|
|
296
|
-
|
|
310
|
+
if (match) {
|
|
311
|
+
var _field3 = kb.the(c, ui('use'));
|
|
297
312
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
break;
|
|
313
|
+
if (!_field3) {
|
|
314
|
+
box.appendChild((0, _error.errorMessageBlock)(dom, 'No "use" part for case in form ' + form));
|
|
315
|
+
return box;
|
|
316
|
+
} else {
|
|
317
|
+
appendForm(dom, box, already, subject, _field3, dataDoc, callbackFunction);
|
|
306
318
|
}
|
|
319
|
+
|
|
320
|
+
break;
|
|
307
321
|
}
|
|
308
322
|
} // @@ Add box.refresh() to sync fields with values
|
|
309
323
|
|
|
@@ -591,7 +605,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
|
|
|
591
605
|
// delete button and move buttons
|
|
592
606
|
|
|
593
607
|
if (kb.updater.editable(dataDoc.uri)) {
|
|
594
|
-
buttons.deleteButtonWithCheck(dom, subField,
|
|
608
|
+
buttons.deleteButtonWithCheck(dom, subField, multipleUIlabel, deleteThisItem);
|
|
595
609
|
|
|
596
610
|
if (ordered) {
|
|
597
611
|
// Add controsl in a frame
|
|
@@ -642,7 +656,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
|
|
|
642
656
|
|
|
643
657
|
var _shim = dom.createElement('div');
|
|
644
658
|
|
|
645
|
-
_shim.appendChild(subField); // Subfield has its own
|
|
659
|
+
_shim.appendChild(subField); // Subfield has its own layout
|
|
646
660
|
|
|
647
661
|
|
|
648
662
|
frame.appendChild(_shim);
|
|
@@ -691,6 +705,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
|
|
|
691
705
|
return shim;
|
|
692
706
|
}
|
|
693
707
|
|
|
708
|
+
var multipleUIlabel = kb.any(form, ui('label'));
|
|
709
|
+
if (!multipleUIlabel) multipleUIlabel = utils.label(property);
|
|
694
710
|
var min = kb.any(form, ui('min')); // This is the minimum number -- default 0
|
|
695
711
|
|
|
696
712
|
min = min ? 0 + min.value : 0;
|
|
@@ -731,10 +747,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
|
|
|
731
747
|
img.setAttribute('src', plusIconURI); // plus sign
|
|
732
748
|
|
|
733
749
|
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
|
-
|
|
750
|
+
img.title = 'Click to add another ' + multipleUIlabel;
|
|
751
|
+
var prompt = dom.createElement('span');
|
|
752
|
+
prompt.textContent = (values.length === 0 ? 'Add another ' : 'Add ') + multipleUIlabel;
|
|
738
753
|
tail.addEventListener('click', /*#__PURE__*/function () {
|
|
739
754
|
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(_eventNotUsed) {
|
|
740
755
|
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
@@ -756,6 +771,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
|
|
|
756
771
|
return _ref3.apply(this, arguments);
|
|
757
772
|
};
|
|
758
773
|
}(), true);
|
|
774
|
+
tail.appendChild(prompt);
|
|
759
775
|
}
|
|
760
776
|
|
|
761
777
|
function createListIfNecessary() {
|
|
@@ -1030,23 +1046,25 @@ _fieldFunction.field[ns.ui('Classifier').uri] = function (dom, container, alread
|
|
|
1030
1046
|
** -- radio buttons
|
|
1031
1047
|
** -- auto-complete typing
|
|
1032
1048
|
**
|
|
1033
|
-
**
|
|
1049
|
+
** TODO: according to ontology ui:choice can also have ns.ui('default') - this is not implemented yet
|
|
1034
1050
|
*/
|
|
1035
1051
|
|
|
1036
1052
|
|
|
1037
1053
|
_fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
|
|
1038
1054
|
var ui = ns.ui;
|
|
1039
1055
|
var kb = _solidLogic.store;
|
|
1040
|
-
var multiple = false;
|
|
1041
1056
|
var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
|
|
1042
1057
|
|
|
1043
1058
|
var p;
|
|
1044
|
-
var box = dom.createElement('div');
|
|
1059
|
+
var box = dom.createElement('div');
|
|
1060
|
+
box.setAttribute('class', 'choiceBox'); // Set flexDirection column?
|
|
1045
1061
|
|
|
1046
1062
|
if (container) container.appendChild(box);
|
|
1047
1063
|
var lhs = dom.createElement('div');
|
|
1064
|
+
lhs.setAttribute('class', 'formFieldName choiceBox-label');
|
|
1048
1065
|
box.appendChild(lhs);
|
|
1049
1066
|
var rhs = dom.createElement('div');
|
|
1067
|
+
rhs.setAttribute('class', 'formFieldValue choiceBox-selectBox');
|
|
1050
1068
|
box.appendChild(rhs);
|
|
1051
1069
|
var property = kb.any(form, ui('property'));
|
|
1052
1070
|
|
|
@@ -1055,103 +1073,149 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
|
|
|
1055
1073
|
}
|
|
1056
1074
|
|
|
1057
1075
|
lhs.appendChild((0, _basic.fieldLabel)(dom, property, form));
|
|
1058
|
-
var
|
|
1076
|
+
var uiFrom = kb.any(form, ui('from'));
|
|
1059
1077
|
|
|
1060
|
-
|
|
1078
|
+
if (!uiFrom) {
|
|
1079
|
+
return (0, _error.errorMessageBlock)(dom, "No 'from' for Choice: " + form);
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
var subForm = kb.any(form, ui('use')); // Optional
|
|
1083
|
+
// const follow = kb.anyJS(form, ui('follow'), null, formDoc) // data doc moves to new subject?
|
|
1061
1084
|
|
|
1062
|
-
var possible = [];
|
|
1063
|
-
var possibleProperties;
|
|
1064
|
-
var firstSelectOptionText = '* Select from ' + utils.label(subject, true) + ' *';
|
|
1065
1085
|
var opts = {
|
|
1066
1086
|
form: form,
|
|
1067
1087
|
subForm: subForm,
|
|
1068
|
-
multiple: multiple,
|
|
1069
|
-
firstSelectOptionText: firstSelectOptionText,
|
|
1070
1088
|
disambiguate: false
|
|
1071
1089
|
};
|
|
1072
|
-
var uiFrom = kb.any(form, ui('from'));
|
|
1073
1090
|
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1091
|
+
function getSelectorOptions() {
|
|
1092
|
+
var possible = [];
|
|
1093
|
+
var possibleProperties;
|
|
1094
|
+
possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
|
|
1077
1095
|
|
|
1078
|
-
|
|
1096
|
+
for (var x in findMembersNT(kb, uiFrom, dataDoc)) {
|
|
1097
|
+
possible.push(kb.fromNT(x));
|
|
1098
|
+
} // Use rdfs
|
|
1079
1099
|
|
|
1080
|
-
for (var x in kb.findMembersNT(uiFrom)) {
|
|
1081
|
-
possible.push(kb.fromNT(x));
|
|
1082
|
-
} // Use rdfs
|
|
1083
1100
|
|
|
1101
|
+
if (uiFrom.sameTerm(ns.rdfs('Class'))) {
|
|
1102
|
+
for (p in buttons.allClassURIs()) {
|
|
1103
|
+
possible.push(kb.sym(p));
|
|
1104
|
+
} // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
|
|
1084
1105
|
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
possible.push(kb.sym(p));
|
|
1088
|
-
} // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
|
|
1106
|
+
} else if (uiFrom.sameTerm(ns.rdf('Property'))) {
|
|
1107
|
+
possibleProperties = buttons.propertyTriage(kb);
|
|
1089
1108
|
|
|
1090
|
-
|
|
1091
|
-
|
|
1109
|
+
for (p in possibleProperties.op) {
|
|
1110
|
+
possible.push(kb.fromNT(p));
|
|
1111
|
+
}
|
|
1092
1112
|
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1113
|
+
for (p in possibleProperties.dp) {
|
|
1114
|
+
possible.push(kb.fromNT(p));
|
|
1115
|
+
}
|
|
1096
1116
|
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1117
|
+
opts.disambiguate = true; // This is a big class, and the labels won't be enough.
|
|
1118
|
+
} else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
|
|
1119
|
+
possibleProperties = buttons.propertyTriage(kb);
|
|
1100
1120
|
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1121
|
+
for (p in possibleProperties.op) {
|
|
1122
|
+
possible.push(kb.fromNT(p));
|
|
1123
|
+
}
|
|
1104
1124
|
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1125
|
+
opts.disambiguate = true;
|
|
1126
|
+
} else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
|
|
1127
|
+
possibleProperties = buttons.propertyTriage(kb);
|
|
1108
1128
|
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1129
|
+
for (p in possibleProperties.dp) {
|
|
1130
|
+
possible.push(kb.fromNT(p));
|
|
1131
|
+
}
|
|
1112
1132
|
|
|
1113
|
-
|
|
1114
|
-
possible.push(kb.fromNT(p));
|
|
1133
|
+
opts.disambiguate = true;
|
|
1115
1134
|
}
|
|
1116
1135
|
|
|
1117
|
-
|
|
1118
|
-
}
|
|
1136
|
+
return possible; // return sortByLabel(possible)
|
|
1137
|
+
} // TODO: this checks for any occurrence, regardless of true or false setting
|
|
1119
1138
|
|
|
1120
|
-
var sortedPossible = sortByLabel(possible); // TODO: this checks for any occurance regardles if it is set to true or false
|
|
1121
1139
|
|
|
1122
1140
|
if (kb.any(form, ui('canMintNew'))) {
|
|
1123
1141
|
opts.mint = '* Create new *'; // @@ could be better
|
|
1124
1142
|
}
|
|
1125
1143
|
|
|
1126
|
-
var
|
|
1127
|
-
|
|
1128
|
-
|
|
1144
|
+
var multiSelect = kb.any(form, ui('multiselect')); // Optional
|
|
1145
|
+
|
|
1146
|
+
if (multiSelect) opts.multiSelect = true;
|
|
1147
|
+
var selector;
|
|
1148
|
+
|
|
1149
|
+
rhs.refresh = function () {
|
|
1150
|
+
// from ui:property
|
|
1151
|
+
var selectedOptions = kb.each(subject, property, null, dataDoc).map(function (object) {
|
|
1152
|
+
return object.value;
|
|
1153
|
+
}); // from ui:from + ui:property
|
|
1154
|
+
|
|
1155
|
+
var possibleOptions = getSelectorOptions();
|
|
1156
|
+
possibleOptions.push(selectedOptions);
|
|
1157
|
+
possibleOptions = sortByLabel(possibleOptions);
|
|
1158
|
+
selector = makeSelectForChoice(dom, rhs, kb, subject, property, possibleOptions, selectedOptions, uiFrom, opts, dataDoc, callbackFunction);
|
|
1159
|
+
rhs.innerHTML = '';
|
|
1160
|
+
rhs.appendChild(selector);
|
|
1161
|
+
|
|
1162
|
+
if (multiSelect) {
|
|
1163
|
+
var multiSelectDiv = new _multiSelect.IconicMultiSelect({
|
|
1164
|
+
placeholder: selector.selected,
|
|
1165
|
+
select: selector,
|
|
1166
|
+
container: rhs,
|
|
1167
|
+
textField: 'textField',
|
|
1168
|
+
valueField: 'valueField'
|
|
1169
|
+
});
|
|
1170
|
+
multiSelectDiv.init();
|
|
1171
|
+
multiSelectDiv.subscribe(function (event) {
|
|
1172
|
+
if (event.action === 'REMOVE_OPTION') {
|
|
1173
|
+
selectedOptions = selectedOptions.filter(function (value) {
|
|
1174
|
+
return value !== event.value;
|
|
1175
|
+
});
|
|
1176
|
+
}
|
|
1129
1177
|
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
object = kb.any(subject, property);
|
|
1134
|
-
}
|
|
1178
|
+
if (event.action === 'CLEAR_ALL_OPTIONS') {
|
|
1179
|
+
selectedOptions = [];
|
|
1180
|
+
}
|
|
1135
1181
|
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
addSubFormChoice(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
|
|
1139
|
-
}
|
|
1182
|
+
if (event.action === 'ADD_OPTION') {
|
|
1183
|
+
var stringValue = event.value + '';
|
|
1140
1184
|
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1185
|
+
if (stringValue.includes('Create new')) {
|
|
1186
|
+
var newObject = newThing(dataDoc);
|
|
1187
|
+
var is = [];
|
|
1188
|
+
is.push($rdf.st(subject, property, kb.sym(newObject), dataDoc));
|
|
1189
|
+
if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc));
|
|
1190
|
+
|
|
1191
|
+
if (subForm) {
|
|
1192
|
+
addSubFormChoice(dom, rhs, {}, $rdf.sym(newObject), subForm, dataDoc, function (ok, body) {
|
|
1193
|
+
if (ok) {
|
|
1194
|
+
kb.updater.update([], is, function (uri, success, errorBody) {
|
|
1195
|
+
if (!success) rhs.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
|
|
1196
|
+
});
|
|
1197
|
+
selectedOptions.push(newObject);
|
|
1198
|
+
if (callbackFunction) callbackFunction(ok, {
|
|
1199
|
+
widget: 'select',
|
|
1200
|
+
event: 'new'
|
|
1201
|
+
});
|
|
1202
|
+
} else {
|
|
1203
|
+
rhs.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
|
|
1204
|
+
}
|
|
1205
|
+
});
|
|
1206
|
+
}
|
|
1207
|
+
} else selectedOptions.push(event.value);
|
|
1208
|
+
}
|
|
1148
1209
|
|
|
1210
|
+
selector.update(selectedOptions);
|
|
1211
|
+
});
|
|
1212
|
+
}
|
|
1213
|
+
};
|
|
1149
1214
|
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
}
|
|
1215
|
+
rhs.refresh();
|
|
1216
|
+
if (selector && selector.refresh) selector.refresh();
|
|
1217
|
+
return box;
|
|
1218
|
+
};
|
|
1155
1219
|
|
|
1156
1220
|
function addSubFormChoice(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction) {
|
|
1157
1221
|
(0, _fieldFunction.fieldFunction)(dom, subForm)(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction);
|
|
@@ -1358,7 +1422,8 @@ function promptForNew(dom, kb, subject, predicate, theClass, form, dataDoc, call
|
|
|
1358
1422
|
b.setAttribute('type', 'button');
|
|
1359
1423
|
b.setAttribute('style', 'float: right;');
|
|
1360
1424
|
b.innerHTML = 'Goto ' + utils.label(theClass);
|
|
1361
|
-
b.addEventListener('click',
|
|
1425
|
+
b.addEventListener('click', // TODO fix dependency cycle to solid-panes by calling outlineManager
|
|
1426
|
+
function (_e) {
|
|
1362
1427
|
dom.outlineManager.GotoSubject(theClass, true, undefined, true, undefined);
|
|
1363
1428
|
}, false);
|
|
1364
1429
|
return box;
|
|
@@ -1494,7 +1559,7 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
|
|
|
1494
1559
|
// @param predicate - a term, the predicate of the statement(s) being edited
|
|
1495
1560
|
// @param possible - a list of terms, the possible value the object can take
|
|
1496
1561
|
// @param options.multiple - Boolean - Whether more than one at a time is allowed
|
|
1497
|
-
// @param options.
|
|
1562
|
+
// @param options.nullLabel - a string to be displayed as the
|
|
1498
1563
|
// option for none selected (for non multiple)
|
|
1499
1564
|
// @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
|
|
1500
1565
|
// @param options.subForm - If mint, then the form to be used for minting the new thing
|
|
@@ -1503,7 +1568,7 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
|
|
|
1503
1568
|
*/
|
|
1504
1569
|
|
|
1505
1570
|
|
|
1506
|
-
function
|
|
1571
|
+
function makeSelectForClassifierOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
|
|
1507
1572
|
log.debug('Select list length now ' + possible.length);
|
|
1508
1573
|
var n = 0;
|
|
1509
1574
|
var uris = {}; // Count them
|
|
@@ -1513,7 +1578,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1513
1578
|
for (var i = 0; i < possible.length; i++) {
|
|
1514
1579
|
var sub = possible[i]; // @@ Maybe; make this so it works with blank nodes too
|
|
1515
1580
|
|
|
1516
|
-
if (!sub.uri) debug.warn("
|
|
1581
|
+
if (!sub.uri) debug.warn("makeSelectForClassifierOptions: option does not have an uri: ".concat(sub, ", with predicate: ").concat(predicate));
|
|
1517
1582
|
if (!sub.uri || sub.uri in uris) continue;
|
|
1518
1583
|
uris[sub.uri] = true;
|
|
1519
1584
|
n++;
|
|
@@ -1524,7 +1589,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1524
1589
|
return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
|
|
1525
1590
|
}
|
|
1526
1591
|
|
|
1527
|
-
log.debug('
|
|
1592
|
+
log.debug('makeSelectForClassifierOptions: dataDoc=' + dataDoc);
|
|
1528
1593
|
var actual;
|
|
1529
1594
|
|
|
1530
1595
|
var getActual = function getActual() {
|
|
@@ -1534,9 +1599,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1534
1599
|
actual = kb.findTypeURIs(subject);
|
|
1535
1600
|
} else {
|
|
1536
1601
|
kb.each(subject, predicate, null, dataDoc).forEach(function (x) {
|
|
1537
|
-
|
|
1538
|
-
actual[x.uri] = true;
|
|
1539
|
-
}
|
|
1602
|
+
actual[x.uri] = true;
|
|
1540
1603
|
});
|
|
1541
1604
|
}
|
|
1542
1605
|
|
|
@@ -1546,6 +1609,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1546
1609
|
actual = getActual();
|
|
1547
1610
|
|
|
1548
1611
|
var onChange = function onChange(_e) {
|
|
1612
|
+
select.disabled = true; // until data written back - gives user feedback too
|
|
1613
|
+
|
|
1549
1614
|
var ds = [];
|
|
1550
1615
|
var is = [];
|
|
1551
1616
|
|
|
@@ -1561,7 +1626,6 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1561
1626
|
var opt = select.options[_i];
|
|
1562
1627
|
|
|
1563
1628
|
if (opt.selected && opt.AJAR_mint) {
|
|
1564
|
-
// not sure if this if is used because I cannot find mintClass
|
|
1565
1629
|
if (options.mintClass) {
|
|
1566
1630
|
var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
|
|
1567
1631
|
if (!ok) {
|
|
@@ -1576,14 +1640,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1576
1640
|
newObject = newThing(dataDoc);
|
|
1577
1641
|
}
|
|
1578
1642
|
|
|
1579
|
-
is.push($rdf.st(subject, predicate,
|
|
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
|
|
1643
|
+
is.push($rdf.st(subject, predicate, newObject, dataDoc));
|
|
1581
1644
|
|
|
1582
1645
|
if (options.mintStatementsFun) {
|
|
1583
1646
|
is = is.concat(options.mintStatementsFun(newObject));
|
|
1584
1647
|
}
|
|
1585
|
-
|
|
1586
|
-
select.currentURI = newObject;
|
|
1587
1648
|
}
|
|
1588
1649
|
|
|
1589
1650
|
if (!opt.AJAR_uri) continue; // a prompt or mint
|
|
@@ -1591,7 +1652,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1591
1652
|
if (opt.selected && !(opt.AJAR_uri in actual)) {
|
|
1592
1653
|
// new class
|
|
1593
1654
|
is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
|
|
1594
|
-
|
|
1655
|
+
}
|
|
1656
|
+
|
|
1657
|
+
if (!opt.selected && opt.AJAR_uri in actual) {
|
|
1658
|
+
// old class
|
|
1659
|
+
removeValue(kb.sym(opt.AJAR_uri));
|
|
1595
1660
|
}
|
|
1596
1661
|
|
|
1597
1662
|
if (opt.selected) select.currentURI = opt.AJAR_uri;
|
|
@@ -1611,21 +1676,32 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1611
1676
|
sel = sel.superSelect;
|
|
1612
1677
|
}
|
|
1613
1678
|
|
|
1614
|
-
|
|
1679
|
+
function doneNew(ok, _body) {
|
|
1680
|
+
callbackFunction(ok, {
|
|
1681
|
+
widget: 'select',
|
|
1682
|
+
event: 'new'
|
|
1683
|
+
});
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
log.info('makeSelectForClassifierOptions: data doc = ' + dataDoc);
|
|
1687
|
+
kb.updater.update(ds, is, function (uri, ok, body) {
|
|
1688
|
+
actual = getActual(); // refresh
|
|
1615
1689
|
|
|
1616
|
-
removeNextSiblingsAfterElement(select);
|
|
1617
|
-
addSubFormChoice(dom, select.parentNode, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
|
|
1618
1690
|
if (ok) {
|
|
1619
|
-
|
|
1620
|
-
actual = getActual(); // refresh
|
|
1691
|
+
select.disabled = false; // data written back
|
|
1621
1692
|
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
}
|
|
1693
|
+
if (newObject) {
|
|
1694
|
+
var fn = (0, _fieldFunction.fieldFunction)(dom, options.subForm);
|
|
1695
|
+
fn(dom, select.parentNode, {}, newObject, options.subForm, dataDoc, doneNew);
|
|
1696
|
+
}
|
|
1697
|
+
} else {
|
|
1698
|
+
return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
|
|
1699
|
+
}
|
|
1700
|
+
|
|
1701
|
+
if (callbackFunction) callbackFunction(ok, {
|
|
1702
|
+
widget: 'select',
|
|
1703
|
+
event: 'change'
|
|
1704
|
+
});
|
|
1629
1705
|
});
|
|
1630
1706
|
};
|
|
1631
1707
|
|
|
@@ -1682,14 +1758,184 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
|
|
|
1682
1758
|
select.insertBefore(mint, select.firstChild);
|
|
1683
1759
|
}
|
|
1684
1760
|
|
|
1685
|
-
if (
|
|
1761
|
+
if (select.currentURI == null && !options.multiple) {
|
|
1686
1762
|
var prompt = dom.createElement('option');
|
|
1687
|
-
prompt.appendChild(dom.createTextNode(options.
|
|
1763
|
+
prompt.appendChild(dom.createTextNode(options.nullLabel));
|
|
1764
|
+
select.insertBefore(prompt, select.firstChild);
|
|
1688
1765
|
prompt.selected = true;
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1766
|
+
}
|
|
1767
|
+
|
|
1768
|
+
if (editable) {
|
|
1769
|
+
select.addEventListener('change', onChange, false);
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
return select;
|
|
1773
|
+
} // makeSelectForClassifierOptions
|
|
1774
|
+
|
|
1775
|
+
/** Make SELECT element to select options
|
|
1776
|
+
//
|
|
1777
|
+
// @param subject - a term, the subject of the statement(s) being edited.
|
|
1778
|
+
// @param predicate - a term, the predicate of the statement(s) being edited
|
|
1779
|
+
// @param possible - a list of terms, the possible value the object can take
|
|
1780
|
+
// @param options.nullLabel - a string to be displayed as the
|
|
1781
|
+
// option for none selected (for non multiple)
|
|
1782
|
+
// @param options.subForm - If mint, then the form to be used for minting the new thing
|
|
1783
|
+
// @param dataDoc - The web document being edited
|
|
1784
|
+
// @param callbackFunction - takes (boolean ok, string errorBody)
|
|
1785
|
+
*/
|
|
1786
|
+
|
|
1787
|
+
|
|
1788
|
+
function makeSelectForOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
|
|
1789
|
+
log.debug('Select list length now ' + possible.length);
|
|
1790
|
+
var n = 0;
|
|
1791
|
+
var uris = {}; // Count them
|
|
1792
|
+
|
|
1793
|
+
var editable = kb.updater.editable(dataDoc.uri);
|
|
1794
|
+
|
|
1795
|
+
for (var i = 0; i < possible.length; i++) {
|
|
1796
|
+
var sub = possible[i]; // @@ Maybe; make this so it works with blank nodes too
|
|
1797
|
+
|
|
1798
|
+
if (!sub.uri) debug.warn("makeSelectForOptions: option does not have an uri: ".concat(sub, ", with predicate: ").concat(predicate));
|
|
1799
|
+
if (!sub.uri || sub.uri in uris) continue;
|
|
1800
|
+
uris[sub.uri] = true;
|
|
1801
|
+
n++;
|
|
1802
|
+
} // uris is now the set of possible options
|
|
1803
|
+
|
|
1804
|
+
|
|
1805
|
+
if (n === 0) {
|
|
1806
|
+
return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
log.debug('makeSelectForOptions: dataDoc=' + dataDoc);
|
|
1810
|
+
var actual;
|
|
1811
|
+
|
|
1812
|
+
var getActual = function getActual() {
|
|
1813
|
+
actual = {};
|
|
1814
|
+
|
|
1815
|
+
if (predicate.sameTerm(ns.rdf('type'))) {
|
|
1816
|
+
actual = kb.findTypeURIs(subject);
|
|
1817
|
+
} else {
|
|
1818
|
+
kb.each(subject, predicate, null, dataDoc).forEach(function (x) {
|
|
1819
|
+
if (x.uri) {
|
|
1820
|
+
actual[x.uri] = true;
|
|
1821
|
+
}
|
|
1822
|
+
});
|
|
1823
|
+
}
|
|
1824
|
+
|
|
1825
|
+
return actual;
|
|
1826
|
+
};
|
|
1827
|
+
|
|
1828
|
+
actual = getActual();
|
|
1829
|
+
|
|
1830
|
+
var onChange = function onChange(_e) {
|
|
1831
|
+
select.disabled = true; // until data written back - gives user feedback too
|
|
1832
|
+
|
|
1833
|
+
var ds = [];
|
|
1834
|
+
var is = [];
|
|
1835
|
+
|
|
1836
|
+
var removeValue = function removeValue(t) {
|
|
1837
|
+
if (kb.holds(subject, predicate, t, dataDoc)) {
|
|
1838
|
+
ds.push($rdf.st(subject, predicate, t, dataDoc));
|
|
1839
|
+
}
|
|
1840
|
+
};
|
|
1841
|
+
|
|
1842
|
+
for (var _i3 = 0; _i3 < select.options.length; _i3++) {
|
|
1843
|
+
var opt = select.options[_i3];
|
|
1844
|
+
if (!opt.AJAR_uri) continue; // a prompt or mint
|
|
1845
|
+
|
|
1846
|
+
if (opt.selected && !(opt.AJAR_uri in actual)) {
|
|
1847
|
+
// new class
|
|
1848
|
+
is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
|
|
1849
|
+
}
|
|
1850
|
+
|
|
1851
|
+
if (!opt.selected && opt.AJAR_uri in actual) {
|
|
1852
|
+
// old class
|
|
1853
|
+
removeValue(kb.sym(opt.AJAR_uri));
|
|
1854
|
+
}
|
|
1855
|
+
|
|
1856
|
+
if (opt.selected) select.currentURI = opt.AJAR_uri;
|
|
1857
|
+
}
|
|
1858
|
+
|
|
1859
|
+
var sel = select.subSelect; // All subclasses must also go
|
|
1860
|
+
|
|
1861
|
+
while (sel && sel.currentURI) {
|
|
1862
|
+
removeValue(kb.sym(sel.currentURI));
|
|
1863
|
+
sel = sel.subSelect;
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1866
|
+
sel = select.superSelect; // All superclasses are redundant
|
|
1867
|
+
|
|
1868
|
+
while (sel && sel.currentURI) {
|
|
1869
|
+
removeValue(kb.sym(sel.currentURI));
|
|
1870
|
+
sel = sel.superSelect;
|
|
1871
|
+
}
|
|
1872
|
+
|
|
1873
|
+
log.info('selectForOptions: data doc = ' + dataDoc);
|
|
1874
|
+
kb.updater.update(ds, is, function (uri, ok, body) {
|
|
1875
|
+
actual = getActual(); // refresh
|
|
1876
|
+
|
|
1877
|
+
if (ok) {
|
|
1878
|
+
select.disabled = false; // data written back
|
|
1879
|
+
} else {
|
|
1880
|
+
return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
|
|
1881
|
+
}
|
|
1882
|
+
|
|
1883
|
+
if (callbackFunction) callbackFunction(ok, {
|
|
1884
|
+
widget: 'select',
|
|
1885
|
+
event: 'change'
|
|
1886
|
+
});
|
|
1887
|
+
});
|
|
1888
|
+
};
|
|
1889
|
+
|
|
1890
|
+
var select = dom.createElement('select');
|
|
1891
|
+
select.setAttribute('style', style.formSelectSTyle);
|
|
1892
|
+
select.currentURI = null;
|
|
1893
|
+
|
|
1894
|
+
select.refresh = function () {
|
|
1895
|
+
actual = getActual(); // refresh
|
|
1896
|
+
|
|
1897
|
+
for (var _i4 = 0; _i4 < select.children.length; _i4++) {
|
|
1898
|
+
var option = select.children[_i4];
|
|
1899
|
+
|
|
1900
|
+
if (option.AJAR_uri) {
|
|
1901
|
+
option.selected = option.AJAR_uri in actual;
|
|
1902
|
+
}
|
|
1903
|
+
}
|
|
1904
|
+
|
|
1905
|
+
select.disabled = false; // unlocked any conflict we had got into
|
|
1906
|
+
};
|
|
1907
|
+
|
|
1908
|
+
for (var uri in uris) {
|
|
1909
|
+
var c = kb.sym(uri);
|
|
1910
|
+
var option = dom.createElement('option');
|
|
1911
|
+
|
|
1912
|
+
if (options.disambiguate) {
|
|
1913
|
+
option.appendChild(dom.createTextNode(utils.labelWithOntology(c, true))); // Init. cap
|
|
1914
|
+
} else {
|
|
1915
|
+
option.appendChild(dom.createTextNode(utils.label(c, true))); // Init.
|
|
1916
|
+
}
|
|
1917
|
+
|
|
1918
|
+
var backgroundColor = kb.any(c, kb.sym('http://www.w3.org/ns/ui#backgroundColor'));
|
|
1919
|
+
|
|
1920
|
+
if (backgroundColor) {
|
|
1921
|
+
option.setAttribute('style', 'background-color: ' + backgroundColor.value + '; ');
|
|
1922
|
+
}
|
|
1923
|
+
|
|
1924
|
+
option.AJAR_uri = uri;
|
|
1925
|
+
|
|
1926
|
+
if (uri in actual) {
|
|
1927
|
+
option.setAttribute('selected', 'true');
|
|
1928
|
+
select.currentURI = uri; // dump("Already in class: "+ uri+"\n")
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
select.appendChild(option);
|
|
1932
|
+
}
|
|
1933
|
+
|
|
1934
|
+
if (!select.currentURI) {
|
|
1935
|
+
var prompt = dom.createElement('option');
|
|
1936
|
+
prompt.appendChild(dom.createTextNode(options.nullLabel));
|
|
1692
1937
|
select.insertBefore(prompt, select.firstChild);
|
|
1938
|
+
prompt.selected = true;
|
|
1693
1939
|
}
|
|
1694
1940
|
|
|
1695
1941
|
if (editable) {
|
|
@@ -1727,8 +1973,9 @@ function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunc
|
|
|
1727
1973
|
return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
|
|
1728
1974
|
}
|
|
1729
1975
|
|
|
1730
|
-
return
|
|
1731
|
-
multiple: multiple
|
|
1976
|
+
return makeSelectForClassifierOptions(dom, kb, subject, ns.rdf('type'), subs, {
|
|
1977
|
+
multiple: multiple,
|
|
1978
|
+
nullLabel: '* Select type *'
|
|
1732
1979
|
}, dataDoc, callbackFunction);
|
|
1733
1980
|
}
|
|
1734
1981
|
/** Make SELECT element to select subclasses recurively
|
|
@@ -1762,8 +2009,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
|
|
|
1762
2009
|
function onChange(ok, body) {
|
|
1763
2010
|
if (ok) update();
|
|
1764
2011
|
callbackFunction(ok, body);
|
|
1765
|
-
}
|
|
1766
|
-
|
|
2012
|
+
}
|
|
1767
2013
|
|
|
1768
2014
|
var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
|
|
1769
2015
|
container.appendChild(select);
|
|
@@ -1918,4 +2164,326 @@ function newThing(doc) {
|
|
|
1918
2164
|
var now = new Date();
|
|
1919
2165
|
return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
|
|
1920
2166
|
}
|
|
2167
|
+
/** Make SELECT element to select options
|
|
2168
|
+
//
|
|
2169
|
+
// @param subject - a term, the subject of the statement(s) being edited.
|
|
2170
|
+
// @param predicate - a term, the predicate of the statement(s) being edited
|
|
2171
|
+
// @param possible - a list of terms, the possible value the object can take
|
|
2172
|
+
// @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
|
|
2173
|
+
// @param options.subForm - If mint, then the form to be used for minting the new thing
|
|
2174
|
+
// @param dataDoc - The web document being edited
|
|
2175
|
+
// @param callbackFunction - takes (boolean ok, string errorBody)
|
|
2176
|
+
*/
|
|
2177
|
+
|
|
2178
|
+
|
|
2179
|
+
function makeSelectForChoice(dom, container, kb, subject, predicate, inputPossibleOptions, selectedOptions, uiFrom, options, dataDoc, callbackFunction) {
|
|
2180
|
+
var optionsFromClassUIfrom = {}; // Count them
|
|
2181
|
+
|
|
2182
|
+
var editable = kb.updater.editable(dataDoc.uri);
|
|
2183
|
+
|
|
2184
|
+
for (var i = 0; i < inputPossibleOptions.length; i++) {
|
|
2185
|
+
var sub = inputPossibleOptions[i]; // @@ Maybe; make this so it works with blank nodes too
|
|
2186
|
+
// if (!sub.uri) debug.warn(`makeSelectForChoice: option does not have an uri: ${sub}, with predicate: ${predicate}`)
|
|
2187
|
+
|
|
2188
|
+
if (!sub.uri || sub.uri in optionsFromClassUIfrom) continue;
|
|
2189
|
+
optionsFromClassUIfrom[sub.uri] = true;
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2192
|
+
var isEmpty = Object.keys(optionsFromClassUIfrom).length === 0;
|
|
2193
|
+
|
|
2194
|
+
if (isEmpty && !options.mint) {
|
|
2195
|
+
return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
|
|
2196
|
+
}
|
|
2197
|
+
|
|
2198
|
+
log.debug('makeSelectForChoice: dataDoc=' + dataDoc);
|
|
2199
|
+
|
|
2200
|
+
function createDefaultSelectOptionText() {
|
|
2201
|
+
var firstSelectOptionText = '--- choice ---';
|
|
2202
|
+
|
|
2203
|
+
if (predicate && !(predicate.termType === 'BlankNode')) {
|
|
2204
|
+
firstSelectOptionText = '* Select for property: ' + utils.label(predicate) + ' *';
|
|
2205
|
+
}
|
|
2206
|
+
|
|
2207
|
+
if (subject && !(subject.termType === 'BlankNode')) {
|
|
2208
|
+
firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *';
|
|
2209
|
+
}
|
|
2210
|
+
|
|
2211
|
+
return firstSelectOptionText;
|
|
2212
|
+
}
|
|
2213
|
+
|
|
2214
|
+
function createDefaultSelectOption() {
|
|
2215
|
+
var option = dom.createElement('option');
|
|
2216
|
+
option.appendChild(dom.createTextNode(createDefaultSelectOptionText()));
|
|
2217
|
+
option.disabled = true;
|
|
2218
|
+
option.value = true;
|
|
2219
|
+
option.hidden = true;
|
|
2220
|
+
option.selected = true;
|
|
2221
|
+
return option;
|
|
2222
|
+
}
|
|
2223
|
+
|
|
2224
|
+
var onChange = function onChange(_e) {
|
|
2225
|
+
container.removeChild(container.lastChild);
|
|
2226
|
+
select.refresh();
|
|
2227
|
+
};
|
|
2228
|
+
|
|
2229
|
+
var select = dom.createElement('select');
|
|
2230
|
+
select.setAttribute('style', style.formSelectSTyle);
|
|
2231
|
+
select.setAttribute('id', 'formSelect');
|
|
2232
|
+
select.currentURI = null;
|
|
2233
|
+
|
|
2234
|
+
for (var uri in optionsFromClassUIfrom) {
|
|
2235
|
+
select.appendChild(createOption(uri));
|
|
2236
|
+
}
|
|
2237
|
+
|
|
2238
|
+
if (editable && options.mint) {
|
|
2239
|
+
var mint = dom.createElement('option');
|
|
2240
|
+
mint.appendChild(dom.createTextNode(options.mint));
|
|
2241
|
+
mint.AJAR_mint = true; // Flag it
|
|
2242
|
+
|
|
2243
|
+
select.insertBefore(mint, select.firstChild);
|
|
2244
|
+
}
|
|
2245
|
+
|
|
2246
|
+
if (select.children.length === 0) select.insertBefore(createDefaultSelectOption(), select.firstChild);
|
|
2247
|
+
|
|
2248
|
+
select.update = function (newSelectedOptions) {
|
|
2249
|
+
selectedOptions = newSelectedOptions;
|
|
2250
|
+
var ds = [];
|
|
2251
|
+
var is = [];
|
|
2252
|
+
|
|
2253
|
+
var removeValue = function removeValue(t) {
|
|
2254
|
+
if (kb.holds(subject, predicate, t, dataDoc)) {
|
|
2255
|
+
ds.push($rdf.st(subject, predicate, t, dataDoc));
|
|
2256
|
+
}
|
|
2257
|
+
};
|
|
2258
|
+
|
|
2259
|
+
var addValue = function addValue(t) {
|
|
2260
|
+
if (!kb.holds(subject, predicate, t, dataDoc)) {
|
|
2261
|
+
is.push($rdf.st(subject, predicate, t, dataDoc)); // console.log("----value added " + t)
|
|
2262
|
+
}
|
|
2263
|
+
|
|
2264
|
+
if (uiFrom && !kb.holds(t, ns.rdf('type'), kb.sym(uiFrom), dataDoc)) {
|
|
2265
|
+
is.push($rdf.st(t, ns.rdf('type'), kb.sym(uiFrom), dataDoc)); // console.log("----added type to value " + uiFrom)
|
|
2266
|
+
}
|
|
2267
|
+
};
|
|
2268
|
+
|
|
2269
|
+
var existingValues = kb.each(subject, predicate, null, dataDoc).map(function (object) {
|
|
2270
|
+
return object.value;
|
|
2271
|
+
});
|
|
2272
|
+
|
|
2273
|
+
var _iterator2 = _createForOfIteratorHelper(existingValues),
|
|
2274
|
+
_step2;
|
|
2275
|
+
|
|
2276
|
+
try {
|
|
2277
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
2278
|
+
var value = _step2.value;
|
|
2279
|
+
if (!containsObject(value, selectedOptions)) removeValue($rdf.sym(value));
|
|
2280
|
+
}
|
|
2281
|
+
} catch (err) {
|
|
2282
|
+
_iterator2.e(err);
|
|
2283
|
+
} finally {
|
|
2284
|
+
_iterator2.f();
|
|
2285
|
+
}
|
|
2286
|
+
|
|
2287
|
+
var _iterator3 = _createForOfIteratorHelper(selectedOptions),
|
|
2288
|
+
_step3;
|
|
2289
|
+
|
|
2290
|
+
try {
|
|
2291
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
2292
|
+
var _value = _step3.value;
|
|
2293
|
+
if (!(_value in existingValues)) addValue($rdf.sym(_value));
|
|
2294
|
+
}
|
|
2295
|
+
} catch (err) {
|
|
2296
|
+
_iterator3.e(err);
|
|
2297
|
+
} finally {
|
|
2298
|
+
_iterator3.f();
|
|
2299
|
+
}
|
|
2300
|
+
|
|
2301
|
+
kb.updater.update(ds, is, function (uri, ok, body) {
|
|
2302
|
+
if (!ok) return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
|
|
2303
|
+
select.refresh();
|
|
2304
|
+
if (callbackFunction) callbackFunction(ok, {
|
|
2305
|
+
widget: 'select',
|
|
2306
|
+
event: 'change'
|
|
2307
|
+
});
|
|
2308
|
+
});
|
|
2309
|
+
};
|
|
2310
|
+
|
|
2311
|
+
select.refresh = function () {
|
|
2312
|
+
select.disabled = true; // unlocked any conflict we had got into
|
|
2313
|
+
|
|
2314
|
+
var is = [];
|
|
2315
|
+
var newObject;
|
|
2316
|
+
|
|
2317
|
+
for (var _i5 = 0; _i5 < select.options.length; _i5++) {
|
|
2318
|
+
var opt = select.options[_i5];
|
|
2319
|
+
|
|
2320
|
+
if (opt.selected && opt.AJAR_mint) {
|
|
2321
|
+
// not sure if this 'if' is used because I cannot find mintClass
|
|
2322
|
+
if (options.mintClass) {
|
|
2323
|
+
var thisForm = promptForNew(dom, kb, subject, predicate, uiFrom, options.subForm, dataDoc, function (ok, body) {
|
|
2324
|
+
if (!ok) {
|
|
2325
|
+
callbackFunction(ok, body, {
|
|
2326
|
+
change: 'new'
|
|
2327
|
+
}); // @@ if ok, need some form of refresh of the select for the new thing
|
|
2328
|
+
}
|
|
2329
|
+
});
|
|
2330
|
+
select.parentNode.appendChild(thisForm);
|
|
2331
|
+
newObject = thisForm.AJAR_subject;
|
|
2332
|
+
} else {
|
|
2333
|
+
newObject = newThing(dataDoc);
|
|
2334
|
+
}
|
|
2335
|
+
|
|
2336
|
+
is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
|
|
2337
|
+
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
|
|
2338
|
+
|
|
2339
|
+
if (options.mintStatementsFun) {
|
|
2340
|
+
is = is.concat(options.mintStatementsFun(newObject));
|
|
2341
|
+
}
|
|
2342
|
+
|
|
2343
|
+
select.currentURI = newObject;
|
|
2344
|
+
}
|
|
2345
|
+
|
|
2346
|
+
if (!opt.AJAR_uri) continue; // a prompt or mint
|
|
2347
|
+
|
|
2348
|
+
if (opt.selected && containsObject(opt.AJAR_uri, selectedOptions)) {
|
|
2349
|
+
select.currentURI = opt.AJAR_uri;
|
|
2350
|
+
}
|
|
2351
|
+
|
|
2352
|
+
if (!containsObject(opt.AJAR_uri, selectedOptions)) opt.removeAttribute('selected');
|
|
2353
|
+
if (containsObject(opt.AJAR_uri, selectedOptions)) opt.setAttribute('selected', 'true');
|
|
2354
|
+
}
|
|
2355
|
+
|
|
2356
|
+
log.info('selectForOptions: data doc = ' + dataDoc);
|
|
2357
|
+
|
|
2358
|
+
if (select.currentURI && options.subForm && !options.multiSelect) {
|
|
2359
|
+
addSubFormChoice(dom, container, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
|
|
2360
|
+
if (ok) {
|
|
2361
|
+
kb.updater.update([], is, function (uri, success, errorBody) {
|
|
2362
|
+
if (!success) container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
|
|
2363
|
+
});
|
|
2364
|
+
if (callbackFunction) callbackFunction(ok, {
|
|
2365
|
+
widget: 'select',
|
|
2366
|
+
event: 'new'
|
|
2367
|
+
});
|
|
2368
|
+
} else {
|
|
2369
|
+
container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
|
|
2370
|
+
}
|
|
2371
|
+
});
|
|
2372
|
+
}
|
|
2373
|
+
|
|
2374
|
+
select.disabled = false;
|
|
2375
|
+
};
|
|
2376
|
+
|
|
2377
|
+
function createOption(uri) {
|
|
2378
|
+
var option = dom.createElement('option');
|
|
2379
|
+
var c = kb.sym(uri);
|
|
2380
|
+
var label;
|
|
2381
|
+
|
|
2382
|
+
if (options.disambiguate) {
|
|
2383
|
+
label = utils.labelWithOntology(c, true); // Init. cap
|
|
2384
|
+
} else {
|
|
2385
|
+
label = utils.label(c, true);
|
|
2386
|
+
}
|
|
2387
|
+
|
|
2388
|
+
option.appendChild(dom.createTextNode(label)); // Init.
|
|
2389
|
+
|
|
2390
|
+
option.setAttribute('value', uri);
|
|
2391
|
+
var backgroundColor = kb.any(c, kb.sym('http://www.w3.org/ns/ui#backgroundColor'));
|
|
2392
|
+
|
|
2393
|
+
if (backgroundColor) {
|
|
2394
|
+
option.setAttribute('style', 'background-color: ' + backgroundColor.value + '; ');
|
|
2395
|
+
}
|
|
2396
|
+
|
|
2397
|
+
option.AJAR_uri = uri;
|
|
2398
|
+
|
|
2399
|
+
if (containsObject(c.value, selectedOptions)) {
|
|
2400
|
+
option.setAttribute('selected', 'true');
|
|
2401
|
+
}
|
|
2402
|
+
|
|
2403
|
+
return option;
|
|
2404
|
+
}
|
|
2405
|
+
|
|
2406
|
+
if (editable) {
|
|
2407
|
+
select.addEventListener('change', onChange, false);
|
|
2408
|
+
}
|
|
2409
|
+
|
|
2410
|
+
return select;
|
|
2411
|
+
} // makeSelectForChoice
|
|
2412
|
+
|
|
2413
|
+
|
|
2414
|
+
function containsObject(obj, list) {
|
|
2415
|
+
var i;
|
|
2416
|
+
|
|
2417
|
+
for (i = 0; i < list.length; i++) {
|
|
2418
|
+
if (list[i] === obj) {
|
|
2419
|
+
return true;
|
|
2420
|
+
}
|
|
2421
|
+
}
|
|
2422
|
+
|
|
2423
|
+
return false;
|
|
2424
|
+
} // This functions replaces the findMembersNT (thisClass) from rdflib until we fix: https://github.com/linkeddata/rdflib.js/issues/565
|
|
2425
|
+
|
|
2426
|
+
/**
|
|
2427
|
+
* For anything which has thisClass (or any subclass) as its type,
|
|
2428
|
+
* or is the object of something which has thisClass (or any subclass) as its range,
|
|
2429
|
+
* or subject of something which has thisClass (or any subclass) as its domain
|
|
2430
|
+
* We don't bother doing subproperty (yet?) as it doesn't seem to be used
|
|
2431
|
+
* much.
|
|
2432
|
+
* Get all the Classes of which we can RDFS-infer the subject is a member
|
|
2433
|
+
* @return a hash of URIs
|
|
2434
|
+
*/
|
|
2435
|
+
|
|
2436
|
+
|
|
2437
|
+
function findMembersNT(store, thisClass, quad) {
|
|
2438
|
+
var len2;
|
|
2439
|
+
var len4;
|
|
2440
|
+
var m;
|
|
2441
|
+
var pred;
|
|
2442
|
+
var ref1;
|
|
2443
|
+
var ref2;
|
|
2444
|
+
var ref3;
|
|
2445
|
+
var ref4;
|
|
2446
|
+
var ref5;
|
|
2447
|
+
var st;
|
|
2448
|
+
var u;
|
|
2449
|
+
var seeds = {};
|
|
2450
|
+
seeds[thisClass.toNT()] = true;
|
|
2451
|
+
var members = {};
|
|
2452
|
+
var ref = store.transitiveClosure(seeds, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#subClassOf'), true);
|
|
2453
|
+
|
|
2454
|
+
for (var t in ref) {
|
|
2455
|
+
ref1 = store.statementsMatching(null, store.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), store.fromNT(t), quad);
|
|
2456
|
+
|
|
2457
|
+
for (var i = 0, len = ref1.length; i < len; i++) {
|
|
2458
|
+
st = ref1[i];
|
|
2459
|
+
members[st.subject.toNT()] = st;
|
|
2460
|
+
}
|
|
2461
|
+
|
|
2462
|
+
ref2 = store.each(null, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#domain'), store.fromNT(t), quad);
|
|
2463
|
+
|
|
2464
|
+
for (var l = 0, len1 = ref2.length; l < len1; l++) {
|
|
2465
|
+
pred = ref2[l];
|
|
2466
|
+
ref3 = store.statementsMatching(null, pred, null, quad);
|
|
2467
|
+
|
|
2468
|
+
for (m = 0, len2 = ref3.length; m < len2; m++) {
|
|
2469
|
+
st = ref3[m];
|
|
2470
|
+
members[st.subject.toNT()] = st;
|
|
2471
|
+
}
|
|
2472
|
+
}
|
|
2473
|
+
|
|
2474
|
+
ref4 = store.each(null, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#range'), store.fromNT(t), quad);
|
|
2475
|
+
|
|
2476
|
+
for (var q = 0, len3 = ref4.length; q < len3; q++) {
|
|
2477
|
+
pred = ref4[q];
|
|
2478
|
+
ref5 = store.statementsMatching(null, pred, null, quad);
|
|
2479
|
+
|
|
2480
|
+
for (u = 0, len4 = ref5.length; u < len4; u++) {
|
|
2481
|
+
st = ref5[u];
|
|
2482
|
+
members[st.object.toNT()] = st;
|
|
2483
|
+
}
|
|
2484
|
+
}
|
|
2485
|
+
}
|
|
2486
|
+
|
|
2487
|
+
return members;
|
|
2488
|
+
}
|
|
1921
2489
|
//# sourceMappingURL=forms.js.map
|