solid-ui 2.4.22-6ae4df24 → 2.4.22-6c33eba6

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.
Files changed (97) hide show
  1. package/README.md +23 -58
  2. package/dist/main.js +7302 -6605
  3. package/dist/main.js.map +1 -1
  4. package/lib/acl/access-controller.js.map +1 -1
  5. package/lib/acl/access-groups.js.map +1 -1
  6. package/lib/acl/acl-control.js.map +1 -1
  7. package/lib/acl/acl.js.map +1 -1
  8. package/lib/acl/add-agent-buttons.js +0 -1
  9. package/lib/acl/add-agent-buttons.js.map +1 -1
  10. package/lib/acl/index.js.map +1 -1
  11. package/lib/acl/styles.js.map +1 -1
  12. package/lib/acl/types.js.map +1 -1
  13. package/lib/chat/bookmarks.js +2 -4
  14. package/lib/chat/bookmarks.js.map +1 -1
  15. package/lib/chat/chatLogic.js.map +1 -1
  16. package/lib/chat/dateFolder.js.map +1 -1
  17. package/lib/chat/infinite.js.map +1 -1
  18. package/lib/chat/message.js.map +1 -1
  19. package/lib/chat/messageTools.js.map +1 -1
  20. package/lib/chat/thread.js.map +1 -1
  21. package/lib/create/create.js.map +1 -1
  22. package/lib/create/index.js.map +1 -1
  23. package/lib/create/types.js.map +1 -1
  24. package/lib/debug.js.map +1 -1
  25. package/lib/folders.js.map +1 -1
  26. package/lib/footer/index.js.map +1 -1
  27. package/lib/footer/styleMap.js.map +1 -1
  28. package/lib/header/empty-profile.js.map +1 -1
  29. package/lib/header/index.js.map +1 -1
  30. package/lib/header/styleMap.js.map +1 -1
  31. package/lib/iconBase.js +3 -2
  32. package/lib/iconBase.js.map +1 -1
  33. package/lib/icons/solid_logo.js.map +1 -1
  34. package/lib/index.js.map +1 -1
  35. package/lib/jss/index.js.map +1 -1
  36. package/lib/log.js.map +1 -1
  37. package/lib/login/login.d.ts +9 -8
  38. package/lib/login/login.d.ts.map +1 -1
  39. package/lib/login/login.js +290 -342
  40. package/lib/login/login.js.map +1 -1
  41. package/lib/matrix/index.js.map +1 -1
  42. package/lib/matrix/matrix.js.map +1 -1
  43. package/lib/matrix/types.js.map +1 -1
  44. package/lib/media/index.js.map +1 -1
  45. package/lib/media/media-capture.js.map +1 -1
  46. package/lib/messageArea.js.map +1 -1
  47. package/lib/noun_Camera_1618446_000000.js.map +1 -1
  48. package/lib/ns.js.map +1 -1
  49. package/lib/pad.js.map +1 -1
  50. package/lib/participation.js.map +1 -1
  51. package/lib/preferences.js.map +1 -1
  52. package/lib/signup/config-default.js.map +1 -1
  53. package/lib/signup/signup.js.map +1 -1
  54. package/lib/stories/decorators.js.map +1 -1
  55. package/lib/style.js.map +1 -1
  56. package/lib/style_multiSelect.js +67 -0
  57. package/lib/style_multiSelect.js.map +1 -0
  58. package/lib/table.js.map +1 -1
  59. package/lib/tabs.d.ts +1 -1
  60. package/lib/tabs.d.ts.map +1 -1
  61. package/lib/tabs.js +38 -22
  62. package/lib/tabs.js.map +1 -1
  63. package/lib/typings.d.js.map +1 -1
  64. package/lib/utils/headerFooterHelpers.js.map +1 -1
  65. package/lib/utils/index.js.map +1 -1
  66. package/lib/utils/label.js +1 -1
  67. package/lib/utils/label.js.map +1 -1
  68. package/lib/versionInfo.d.ts +9 -9
  69. package/lib/versionInfo.js +14 -14
  70. package/lib/versionInfo.js.map +1 -1
  71. package/lib/widgets/buttons/iconLinks.js.map +1 -1
  72. package/lib/widgets/buttons.d.ts.map +1 -1
  73. package/lib/widgets/buttons.js +2 -0
  74. package/lib/widgets/buttons.js.map +1 -1
  75. package/lib/widgets/dragAndDrop.js.map +1 -1
  76. package/lib/widgets/error.d.ts +0 -12
  77. package/lib/widgets/error.d.ts.map +1 -1
  78. package/lib/widgets/error.js +5 -0
  79. package/lib/widgets/error.js.map +1 -1
  80. package/lib/widgets/forms/autocomplete/autocompleteBar.js.map +1 -1
  81. package/lib/widgets/forms/autocomplete/autocompleteField.js.map +1 -1
  82. package/lib/widgets/forms/autocomplete/autocompletePicker.js.map +1 -1
  83. package/lib/widgets/forms/autocomplete/language.js.map +1 -1
  84. package/lib/widgets/forms/autocomplete/publicData.js.map +1 -1
  85. package/lib/widgets/forms/basic.js.map +1 -1
  86. package/lib/widgets/forms/comment.js.map +1 -1
  87. package/lib/widgets/forms/fieldFunction.js.map +1 -1
  88. package/lib/widgets/forms/fieldParams.js.map +1 -1
  89. package/lib/widgets/forms/formStyle.js.map +1 -1
  90. package/lib/widgets/forms.js +511 -190
  91. package/lib/widgets/forms.js.map +1 -1
  92. package/lib/widgets/index.js.map +1 -1
  93. package/lib/widgets/multiSelect.js +784 -0
  94. package/lib/widgets/multiSelect.js.map +1 -0
  95. package/lib/widgets/peoplePicker.js.map +1 -1
  96. package/lib/widgets/widgetHelpers.js.map +1 -1
  97. package/package.json +11 -7
@@ -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,15 @@ exports.findClosest = findClosest;
44
50
  exports.formsFor = formsFor;
45
51
  exports.makeDescription = makeDescription;
46
52
  exports.makeSelectForCategory = makeSelectForCategory;
53
+ exports.makeSelectForChoice = makeSelectForChoice;
47
54
  exports.makeSelectForNestedCategory = makeSelectForNestedCategory;
48
55
  exports.makeSelectForOptions = makeSelectForOptions;
56
+ Object.defineProperty(exports, "mostSpecificClassURI", {
57
+ enumerable: true,
58
+ get: function get() {
59
+ return _fieldFunction.mostSpecificClassURI;
60
+ }
61
+ });
49
62
  exports.newButton = newButton;
50
63
  exports.newThing = newThing;
51
64
  exports.promptForNew = promptForNew;
@@ -93,6 +106,8 @@ var _solidLogic = require("solid-logic");
93
106
 
94
107
  var utils = _interopRequireWildcard(require("../utils"));
95
108
 
109
+ var _multiSelect = require("./multiSelect");
110
+
96
111
  var widgets = _interopRequireWildcard(require("../widgets"));
97
112
 
98
113
  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 +170,16 @@ _fieldFunction.field[ns.ui('Form').uri] = _fieldFunction.field[ns.ui('Group').ur
155
170
  var ui = ns.ui;
156
171
  if (container) container.appendChild(box); // Prevent loops
157
172
 
173
+ if (!form) return;
158
174
  var key = subject.toNT() + '|' + form.toNT();
159
175
 
160
176
  if (already[key]) {
161
177
  // been there done that
162
- box.appendChild(dom.createTextNode('Group: see above ' + key));
163
- var plist = [$rdf.st(subject, ns.owl('sameAs'), subject)]; // @@ need prev subject
178
+ box.appendChild(dom.createTextNode('Group: see above ' + key)); // TODO fix dependency cycle to solid-panes by calling outlineManager
179
+ // const plist = [$rdf.st(subject, ns.owl('sameAs'), subject)] // @@ need prev subject
180
+ // dom.outlineManager.appendPropertyTRs(box, plist)
181
+ // dom.appendChild(plist)
164
182
 
165
- dom.outlineManager.appendPropertyTRs(box, plist);
166
183
  return box;
167
184
  }
168
185
 
@@ -263,47 +280,43 @@ _fieldFunction.field[ns.ui('Options').uri] = function (dom, container, already,
263
280
  values = kb.each(subject, dependingOn);
264
281
  }
265
282
 
266
- if (values.length === 0) {
267
- box.appendChild((0, _error.errorMessageBlock)(dom, "Can't select subform as no value of: " + dependingOn));
268
- } else {
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'
283
+ for (var i = 0; i < cases.length; i++) {
284
+ var c = cases[i];
285
+ var tests = kb.each(c, ui('for'), null, formDoc); // There can be multiple 'for'
272
286
 
273
- var match = false;
287
+ var match = false;
274
288
 
275
- for (var j = 0; j < tests.length; j++) {
276
- var _iterator = _createForOfIteratorHelper(values),
277
- _step;
289
+ for (var j = 0; j < tests.length; j++) {
290
+ var _iterator = _createForOfIteratorHelper(values),
291
+ _step;
278
292
 
279
- try {
280
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
281
- var value = _step.value;
282
- var test = tests[j];
293
+ try {
294
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
295
+ var value = _step.value;
296
+ var test = tests[j];
283
297
 
284
- if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
285
- match = true;
286
- }
298
+ if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
299
+ match = true;
287
300
  }
288
- } catch (err) {
289
- _iterator.e(err);
290
- } finally {
291
- _iterator.f();
292
301
  }
302
+ } catch (err) {
303
+ _iterator.e(err);
304
+ } finally {
305
+ _iterator.f();
293
306
  }
307
+ }
294
308
 
295
- if (match) {
296
- var _field3 = kb.the(c, ui('use'));
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
- }
309
+ if (match) {
310
+ var _field3 = kb.the(c, ui('use'));
304
311
 
305
- break;
312
+ if (!_field3) {
313
+ box.appendChild((0, _error.errorMessageBlock)(dom, 'No "use" part for case in form ' + form));
314
+ return box;
315
+ } else {
316
+ appendForm(dom, box, already, subject, _field3, dataDoc, callbackFunction);
306
317
  }
318
+
319
+ break;
307
320
  }
308
321
  } // @@ Add box.refresh() to sync fields with values
309
322
 
@@ -591,7 +604,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
591
604
  // delete button and move buttons
592
605
 
593
606
  if (kb.updater.editable(dataDoc.uri)) {
594
- buttons.deleteButtonWithCheck(dom, subField, utils.label(property), deleteThisItem);
607
+ buttons.deleteButtonWithCheck(dom, subField, multipleUIlabel, deleteThisItem);
595
608
 
596
609
  if (ordered) {
597
610
  // Add controsl in a frame
@@ -691,6 +704,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
691
704
  return shim;
692
705
  }
693
706
 
707
+ var multipleUIlabel = kb.any(form, ui('label'));
708
+ if (!multipleUIlabel) multipleUIlabel = utils.label(property);
694
709
  var min = kb.any(form, ui('min')); // This is the minimum number -- default 0
695
710
 
696
711
  min = min ? 0 + min.value : 0;
@@ -727,16 +742,13 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
727
742
  if (kb.updater.editable(dataDoc.uri)) {
728
743
  var tail = box.appendChild(dom.createElement('div'));
729
744
  tail.style.padding = '0.5em';
730
- var label = kb.any(form, ui('label'));
731
- if (!label) label = utils.label(property, true); // Init capital
732
-
733
745
  var img = tail.appendChild(dom.createElement('img'));
734
746
  img.setAttribute('src', plusIconURI); // plus sign
735
747
 
736
748
  img.setAttribute('style', 'margin: 0.2em; width: 1.5em; height:1.5em');
737
- img.title = 'Click to add one or more ' + label;
749
+ img.title = 'Click to add another ' + multipleUIlabel;
738
750
  var prompt = dom.createElement('span');
739
- prompt.textContent = (values.length === 0 ? 'Add one or more ' : 'Add more ') + utils.predicateLabel(property, reverse);
751
+ prompt.textContent = (values.length === 0 ? 'Add another ' : 'Add ') + multipleUIlabel;
740
752
  tail.addEventListener('click', /*#__PURE__*/function () {
741
753
  var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(_eventNotUsed) {
742
754
  return _regenerator["default"].wrap(function _callee5$(_context5) {
@@ -1033,7 +1045,7 @@ _fieldFunction.field[ns.ui('Classifier').uri] = function (dom, container, alread
1033
1045
  ** -- radio buttons
1034
1046
  ** -- auto-complete typing
1035
1047
  **
1036
- ** Todo: Deal with multiple. Maybe merge with multiple code.
1048
+ ** TODO: according to ontology ui:choice can also have ns.ui('default') - this is not implemented yet
1037
1049
  */
1038
1050
 
1039
1051
 
@@ -1067,104 +1079,142 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1067
1079
  }
1068
1080
 
1069
1081
  var subForm = kb.any(form, ui('use')); // Optional
1070
-
1071
- var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
1072
-
1073
- var possible = [];
1074
- var possibleProperties;
1075
- var multiple = false;
1076
- var firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *'; // if we do NOT have a container it means it is a ui:Multiple
1077
- // only important for the first option text in select
1078
-
1079
- if (!container) {
1080
- multiple = true;
1081
- firstSelectOptionText = utils.label(subject, true);
1082
- }
1082
+ // const follow = kb.anyJS(form, ui('follow'), null, formDoc) // data doc moves to new subject?
1083
1083
 
1084
1084
  var opts = {
1085
1085
  form: form,
1086
1086
  subForm: subForm,
1087
- multiple: multiple,
1088
- firstSelectOptionText: firstSelectOptionText,
1089
1087
  disambiguate: false
1090
1088
  };
1091
- possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1092
1089
 
1093
- for (var x in kb.findMembersNT(uiFrom)) {
1094
- possible.push(kb.fromNT(x));
1095
- } // Use rdfs
1090
+ function getSelectorOptions() {
1091
+ var possible = [];
1092
+ var possibleProperties;
1093
+ possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1096
1094
 
1095
+ for (var x in findMembersNT(kb, uiFrom, dataDoc)) {
1096
+ possible.push(kb.fromNT(x));
1097
+ } // Use rdfs
1097
1098
 
1098
- if (uiFrom.sameTerm(ns.rdfs('Class'))) {
1099
- for (p in buttons.allClassURIs()) {
1100
- possible.push(kb.sym(p));
1101
- } // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
1102
1099
 
1103
- } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1104
- possibleProperties = buttons.propertyTriage(kb);
1100
+ if (uiFrom.sameTerm(ns.rdfs('Class'))) {
1101
+ for (p in buttons.allClassURIs()) {
1102
+ possible.push(kb.sym(p));
1103
+ } // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
1105
1104
 
1106
- for (p in possibleProperties.op) {
1107
- possible.push(kb.fromNT(p));
1108
- }
1105
+ } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1106
+ possibleProperties = buttons.propertyTriage(kb);
1109
1107
 
1110
- for (p in possibleProperties.dp) {
1111
- possible.push(kb.fromNT(p));
1112
- }
1108
+ for (p in possibleProperties.op) {
1109
+ possible.push(kb.fromNT(p));
1110
+ }
1113
1111
 
1114
- opts.disambiguate = true; // This is a big class, and the labels won't be enough.
1115
- } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
1116
- possibleProperties = buttons.propertyTriage(kb);
1112
+ for (p in possibleProperties.dp) {
1113
+ possible.push(kb.fromNT(p));
1114
+ }
1117
1115
 
1118
- for (p in possibleProperties.op) {
1119
- possible.push(kb.fromNT(p));
1120
- }
1116
+ opts.disambiguate = true; // This is a big class, and the labels won't be enough.
1117
+ } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
1118
+ possibleProperties = buttons.propertyTriage(kb);
1121
1119
 
1122
- opts.disambiguate = true;
1123
- } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1124
- possibleProperties = buttons.propertyTriage(kb);
1120
+ for (p in possibleProperties.op) {
1121
+ possible.push(kb.fromNT(p));
1122
+ }
1123
+
1124
+ opts.disambiguate = true;
1125
+ } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1126
+ possibleProperties = buttons.propertyTriage(kb);
1125
1127
 
1126
- for (p in possibleProperties.dp) {
1127
- possible.push(kb.fromNT(p));
1128
+ for (p in possibleProperties.dp) {
1129
+ possible.push(kb.fromNT(p));
1130
+ }
1131
+
1132
+ opts.disambiguate = true;
1128
1133
  }
1129
1134
 
1130
- opts.disambiguate = true;
1131
- }
1135
+ return possible; // return sortByLabel(possible)
1136
+ } // TODO: this checks for any occurrence, regardless of true or false setting
1132
1137
 
1133
- var sortedPossible = sortByLabel(possible); // TODO: this checks for any occurrence, regardless of true or false setting
1134
1138
 
1135
1139
  if (kb.any(form, ui('canMintNew'))) {
1136
1140
  opts.mint = '* Create new *'; // @@ could be better
1137
1141
  }
1138
1142
 
1139
- var selector = makeSelectForOptions(dom, kb, subject, property, sortedPossible, uiFrom, opts, dataDoc, callbackFunction);
1140
- rhs.appendChild(selector);
1141
- var object;
1143
+ var multiSelect = kb.any(form, ui('multiselect')); // Optional
1144
+
1145
+ if (multiSelect) opts.multiSelect = true;
1146
+ var selector;
1147
+
1148
+ rhs.refresh = function () {
1149
+ // from ui:property
1150
+ var selectedOptions = kb.each(subject, property, null, dataDoc).map(function (object) {
1151
+ return object.value;
1152
+ }); // from ui:from + ui:property
1153
+
1154
+ var possibleOptions = getSelectorOptions();
1155
+ possibleOptions.push(selectedOptions);
1156
+ possibleOptions = sortByLabel(possibleOptions);
1157
+ selector = makeSelectForChoice(dom, rhs, kb, subject, property, possibleOptions, selectedOptions, uiFrom, opts, dataDoc, callbackFunction);
1158
+ rhs.innerHTML = '';
1159
+ rhs.appendChild(selector);
1160
+
1161
+ if (multiSelect) {
1162
+ var multiSelectDiv = new _multiSelect.IconicMultiSelect({
1163
+ placeholder: selector.selected,
1164
+ select: selector,
1165
+ container: rhs,
1166
+ textField: 'textField',
1167
+ valueField: 'valueField'
1168
+ });
1169
+ multiSelectDiv.init();
1170
+ multiSelectDiv.subscribe(function (event) {
1171
+ if (event.action === 'REMOVE_OPTION') {
1172
+ selectedOptions = selectedOptions.filter(function (value) {
1173
+ return value !== event.value;
1174
+ });
1175
+ }
1142
1176
 
1143
- if (selector.currentURI) {
1144
- object = $rdf.sym(selector.currentURI);
1145
- } else {
1146
- object = kb.any(subject, property);
1147
- }
1177
+ if (event.action === 'CLEAR_ALL_OPTIONS') {
1178
+ selectedOptions = [];
1179
+ }
1148
1180
 
1149
- if (object && subForm) {
1150
- removeNextSiblingsAfterElement(selector);
1151
- addSubFormChoice(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
1152
- }
1181
+ if (event.action === 'ADD_OPTION') {
1182
+ var stringValue = event.value + '';
1153
1183
 
1154
- return box;
1155
- };
1156
- /**
1157
- * Removes all sibling elements after specified
1158
- * @param {HTMLElement} currentElement
1159
- * @private
1160
- */
1184
+ if (stringValue.includes('Create new')) {
1185
+ var newObject = newThing(dataDoc);
1186
+ var is = [];
1187
+ is.push($rdf.st(subject, property, kb.sym(newObject), dataDoc));
1188
+ if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc));
1189
+
1190
+ if (subForm) {
1191
+ addSubFormChoice(dom, rhs, {}, $rdf.sym(newObject), subForm, dataDoc, function (ok, body) {
1192
+ if (ok) {
1193
+ kb.updater.update([], is, function (uri, success, errorBody) {
1194
+ if (!success) rhs.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
1195
+ });
1196
+ selectedOptions.push(newObject);
1197
+ if (callbackFunction) callbackFunction(ok, {
1198
+ widget: 'select',
1199
+ event: 'new'
1200
+ });
1201
+ } else {
1202
+ rhs.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
1203
+ }
1204
+ });
1205
+ }
1206
+ } else selectedOptions.push(event.value);
1207
+ }
1161
1208
 
1209
+ selector.update(selectedOptions);
1210
+ });
1211
+ }
1212
+ };
1162
1213
 
1163
- function removeNextSiblingsAfterElement(currentElement) {
1164
- while (currentElement.nextElementSibling) {
1165
- currentElement.nextElementSibling.remove();
1166
- }
1167
- }
1214
+ rhs.refresh();
1215
+ if (selector && selector.refresh) selector.refresh();
1216
+ return box;
1217
+ };
1168
1218
 
1169
1219
  function addSubFormChoice(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction) {
1170
1220
  (0, _fieldFunction.fieldFunction)(dom, subForm)(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction);
@@ -1371,7 +1421,8 @@ function promptForNew(dom, kb, subject, predicate, theClass, form, dataDoc, call
1371
1421
  b.setAttribute('type', 'button');
1372
1422
  b.setAttribute('style', 'float: right;');
1373
1423
  b.innerHTML = 'Goto ' + utils.label(theClass);
1374
- b.addEventListener('click', function (_e) {
1424
+ b.addEventListener('click', // TODO fix dependency cycle to solid-panes by calling outlineManager
1425
+ function (_e) {
1375
1426
  dom.outlineManager.GotoSubject(theClass, true, undefined, true, undefined);
1376
1427
  }, false);
1377
1428
  return box;
@@ -1506,17 +1557,15 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1506
1557
  // @param subject - a term, the subject of the statement(s) being edited.
1507
1558
  // @param predicate - a term, the predicate of the statement(s) being edited
1508
1559
  // @param possible - a list of terms, the possible value the object can take
1509
- // @param options.multiple - Boolean - Whether more than one at a time is allowed
1510
- // @param options.firstSelectOptionText - a string to be displayed as the
1560
+ // @param options.nullLabel - a string to be displayed as the
1511
1561
  // option for none selected (for non multiple)
1512
- // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1513
1562
  // @param options.subForm - If mint, then the form to be used for minting the new thing
1514
1563
  // @param dataDoc - The web document being edited
1515
1564
  // @param callbackFunction - takes (boolean ok, string errorBody)
1516
1565
  */
1517
1566
 
1518
1567
 
1519
- function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
1568
+ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
1520
1569
  log.debug('Select list length now ' + possible.length);
1521
1570
  var n = 0;
1522
1571
  var uris = {}; // Count them
@@ -1533,7 +1582,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1533
1582
  } // uris is now the set of possible options
1534
1583
 
1535
1584
 
1536
- if (n === 0 && !options.mint) {
1585
+ if (n === 0) {
1537
1586
  return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1538
1587
  }
1539
1588
 
@@ -1559,6 +1608,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1559
1608
  actual = getActual();
1560
1609
 
1561
1610
  var onChange = function onChange(_e) {
1611
+ select.disabled = true; // until data written back - gives user feedback too
1612
+
1562
1613
  var ds = [];
1563
1614
  var is = [];
1564
1615
 
@@ -1568,43 +1619,18 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1568
1619
  }
1569
1620
  };
1570
1621
 
1571
- var newObject;
1572
-
1573
1622
  for (var _i = 0; _i < select.options.length; _i++) {
1574
1623
  var opt = select.options[_i];
1575
-
1576
- if (opt.selected && opt.AJAR_mint) {
1577
- // not sure if this 'if' is used because I cannot find mintClass
1578
- if (options.mintClass) {
1579
- var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
1580
- if (!ok) {
1581
- callbackFunction(ok, body, {
1582
- change: 'new'
1583
- }); // @@ if ok, need some form of refresh of the select for the new thing
1584
- }
1585
- });
1586
- select.parentNode.appendChild(thisForm);
1587
- newObject = thisForm.AJAR_subject;
1588
- } else {
1589
- newObject = newThing(dataDoc);
1590
- }
1591
-
1592
- is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
1593
- 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
1594
-
1595
- if (options.mintStatementsFun) {
1596
- is = is.concat(options.mintStatementsFun(newObject));
1597
- }
1598
-
1599
- select.currentURI = newObject;
1600
- }
1601
-
1602
1624
  if (!opt.AJAR_uri) continue; // a prompt or mint
1603
1625
 
1604
1626
  if (opt.selected && !(opt.AJAR_uri in actual)) {
1605
1627
  // new class
1606
1628
  is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
1607
- select.currentURI = opt.AJAR_uri;
1629
+ }
1630
+
1631
+ if (!opt.selected && opt.AJAR_uri in actual) {
1632
+ // old class
1633
+ removeValue(kb.sym(opt.AJAR_uri));
1608
1634
  }
1609
1635
 
1610
1636
  if (opt.selected) select.currentURI = opt.AJAR_uri;
@@ -1624,29 +1650,25 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1624
1650
  sel = sel.superSelect;
1625
1651
  }
1626
1652
 
1627
- log.info('selectForOptions: data doc = ' + dataDoc); // refresh subForm
1653
+ log.info('selectForOptions: data doc = ' + dataDoc);
1654
+ kb.updater.update(ds, is, function (uri, ok, body) {
1655
+ actual = getActual(); // refresh
1628
1656
 
1629
- removeNextSiblingsAfterElement(select);
1630
- addSubFormChoice(dom, select.parentNode, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
1631
1657
  if (ok) {
1632
- kb.updater.update(ds, is, function (uri, success, errorBody) {
1633
- actual = getActual(); // refresh
1634
-
1635
- if (!success) select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
1636
- });
1637
- if (callbackFunction) callbackFunction(ok, {
1638
- widget: 'select',
1639
- event: 'new'
1640
- });
1658
+ select.disabled = false; // data written back
1641
1659
  } else {
1642
- select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
1660
+ return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1643
1661
  }
1662
+
1663
+ if (callbackFunction) callbackFunction(ok, {
1664
+ widget: 'select',
1665
+ event: 'change'
1666
+ });
1644
1667
  });
1645
1668
  };
1646
1669
 
1647
1670
  var select = dom.createElement('select');
1648
- select.setAttribute('style', style.formSelectSTyle); // if (options.multiple) select.setAttribute('multiple', 'true') // use case merged with ui:Multiple
1649
-
1671
+ select.setAttribute('style', style.formSelectSTyle);
1650
1672
  select.currentURI = null;
1651
1673
 
1652
1674
  select.refresh = function () {
@@ -1689,22 +1711,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1689
1711
  select.appendChild(option);
1690
1712
  }
1691
1713
 
1692
- if (editable && options.mint) {
1693
- var mint = dom.createElement('option');
1694
- mint.appendChild(dom.createTextNode(options.mint));
1695
- mint.AJAR_mint = true; // Flag it
1696
-
1697
- select.insertBefore(mint, select.firstChild);
1698
- }
1699
-
1700
- if (!select.currentURI && options.multiple) {
1714
+ if (!select.currentURI) {
1701
1715
  var prompt = dom.createElement('option');
1702
- prompt.appendChild(dom.createTextNode(options.firstSelectOptionText));
1703
- prompt.disabled = true;
1704
- prompt.value = true;
1705
- prompt.hidden = true;
1706
- prompt.selected = true;
1716
+ prompt.appendChild(dom.createTextNode(options.nullLabel));
1707
1717
  select.insertBefore(prompt, select.firstChild);
1718
+ prompt.selected = true;
1708
1719
  }
1709
1720
 
1710
1721
  if (editable) {
@@ -1723,27 +1734,16 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1723
1734
  function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1724
1735
  var du = kb.any(category, ns.owl('disjointUnionOf'));
1725
1736
  var subs;
1726
- var multiple = false;
1727
1737
 
1728
1738
  if (!du) {
1729
1739
  subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
1730
- multiple = true;
1731
1740
  } else {
1732
1741
  subs = du.elements;
1733
1742
  }
1734
1743
 
1735
1744
  log.debug('Select list length ' + subs.length);
1736
-
1737
- if (subs.length === 0) {
1738
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1739
- }
1740
-
1741
- if (subs.length === 1) {
1742
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
1743
- }
1744
-
1745
- return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, null, {
1746
- multiple: multiple
1745
+ return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, {
1746
+ nullLabel: '* Select type *'
1747
1747
  }, dataDoc, callbackFunction);
1748
1748
  }
1749
1749
  /** Make SELECT element to select subclasses recurively
@@ -1777,8 +1777,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
1777
1777
  function onChange(ok, body) {
1778
1778
  if (ok) update();
1779
1779
  callbackFunction(ok, body);
1780
- } // eslint-disable-next-line prefer-const
1781
-
1780
+ }
1782
1781
 
1783
1782
  var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
1784
1783
  container.appendChild(select);
@@ -1933,4 +1932,326 @@ function newThing(doc) {
1933
1932
  var now = new Date();
1934
1933
  return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
1935
1934
  }
1935
+ /** Make SELECT element to select options
1936
+ //
1937
+ // @param subject - a term, the subject of the statement(s) being edited.
1938
+ // @param predicate - a term, the predicate of the statement(s) being edited
1939
+ // @param possible - a list of terms, the possible value the object can take
1940
+ // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1941
+ // @param options.subForm - If mint, then the form to be used for minting the new thing
1942
+ // @param dataDoc - The web document being edited
1943
+ // @param callbackFunction - takes (boolean ok, string errorBody)
1944
+ */
1945
+
1946
+
1947
+ function makeSelectForChoice(dom, container, kb, subject, predicate, inputPossibleOptions, selectedOptions, uiFrom, options, dataDoc, callbackFunction) {
1948
+ var optionsFromClassUIfrom = {}; // Count them
1949
+
1950
+ var editable = kb.updater.editable(dataDoc.uri);
1951
+
1952
+ for (var i = 0; i < inputPossibleOptions.length; i++) {
1953
+ var sub = inputPossibleOptions[i]; // @@ Maybe; make this so it works with blank nodes too
1954
+ // if (!sub.uri) debug.warn(`makeSelectForChoice: option does not have an uri: ${sub}, with predicate: ${predicate}`)
1955
+
1956
+ if (!sub.uri || sub.uri in optionsFromClassUIfrom) continue;
1957
+ optionsFromClassUIfrom[sub.uri] = true;
1958
+ }
1959
+
1960
+ var isEmpty = Object.keys(optionsFromClassUIfrom).length === 0;
1961
+
1962
+ if (isEmpty && !options.mint) {
1963
+ return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1964
+ }
1965
+
1966
+ log.debug('makeSelectForChoice: dataDoc=' + dataDoc);
1967
+
1968
+ function createDefaultSelectOptionText() {
1969
+ var firstSelectOptionText = '--- choice ---';
1970
+
1971
+ if (predicate && !(predicate.termType === 'BlankNode')) {
1972
+ firstSelectOptionText = '* Select for property: ' + utils.label(predicate) + ' *';
1973
+ }
1974
+
1975
+ if (subject && !(subject.termType === 'BlankNode')) {
1976
+ firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *';
1977
+ }
1978
+
1979
+ return firstSelectOptionText;
1980
+ }
1981
+
1982
+ function createDefaultSelectOption() {
1983
+ var option = dom.createElement('option');
1984
+ option.appendChild(dom.createTextNode(createDefaultSelectOptionText()));
1985
+ option.disabled = true;
1986
+ option.value = true;
1987
+ option.hidden = true;
1988
+ option.selected = true;
1989
+ return option;
1990
+ }
1991
+
1992
+ var onChange = function onChange(_e) {
1993
+ container.removeChild(container.lastChild);
1994
+ select.refresh();
1995
+ };
1996
+
1997
+ var select = dom.createElement('select');
1998
+ select.setAttribute('style', style.formSelectSTyle);
1999
+ select.setAttribute('id', 'formSelect');
2000
+ select.currentURI = null;
2001
+
2002
+ for (var uri in optionsFromClassUIfrom) {
2003
+ select.appendChild(createOption(uri));
2004
+ }
2005
+
2006
+ if (editable && options.mint) {
2007
+ var mint = dom.createElement('option');
2008
+ mint.appendChild(dom.createTextNode(options.mint));
2009
+ mint.AJAR_mint = true; // Flag it
2010
+
2011
+ select.insertBefore(mint, select.firstChild);
2012
+ }
2013
+
2014
+ if (select.children.length === 0) select.insertBefore(createDefaultSelectOption(), select.firstChild);
2015
+
2016
+ select.update = function (newSelectedOptions) {
2017
+ selectedOptions = newSelectedOptions;
2018
+ var ds = [];
2019
+ var is = [];
2020
+
2021
+ var removeValue = function removeValue(t) {
2022
+ if (kb.holds(subject, predicate, t, dataDoc)) {
2023
+ ds.push($rdf.st(subject, predicate, t, dataDoc));
2024
+ }
2025
+ };
2026
+
2027
+ var addValue = function addValue(t) {
2028
+ if (!kb.holds(subject, predicate, t, dataDoc)) {
2029
+ is.push($rdf.st(subject, predicate, t, dataDoc)); // console.log("----value added " + t)
2030
+ }
2031
+
2032
+ if (uiFrom && !kb.holds(t, ns.rdf('type'), kb.sym(uiFrom), dataDoc)) {
2033
+ is.push($rdf.st(t, ns.rdf('type'), kb.sym(uiFrom), dataDoc)); // console.log("----added type to value " + uiFrom)
2034
+ }
2035
+ };
2036
+
2037
+ var existingValues = kb.each(subject, predicate, null, dataDoc).map(function (object) {
2038
+ return object.value;
2039
+ });
2040
+
2041
+ var _iterator2 = _createForOfIteratorHelper(existingValues),
2042
+ _step2;
2043
+
2044
+ try {
2045
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
2046
+ var value = _step2.value;
2047
+ if (!containsObject(value, selectedOptions)) removeValue($rdf.sym(value));
2048
+ }
2049
+ } catch (err) {
2050
+ _iterator2.e(err);
2051
+ } finally {
2052
+ _iterator2.f();
2053
+ }
2054
+
2055
+ var _iterator3 = _createForOfIteratorHelper(selectedOptions),
2056
+ _step3;
2057
+
2058
+ try {
2059
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
2060
+ var _value = _step3.value;
2061
+ if (!(_value in existingValues)) addValue($rdf.sym(_value));
2062
+ }
2063
+ } catch (err) {
2064
+ _iterator3.e(err);
2065
+ } finally {
2066
+ _iterator3.f();
2067
+ }
2068
+
2069
+ kb.updater.update(ds, is, function (uri, ok, body) {
2070
+ if (!ok) return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
2071
+ select.refresh();
2072
+ if (callbackFunction) callbackFunction(ok, {
2073
+ widget: 'select',
2074
+ event: 'change'
2075
+ });
2076
+ });
2077
+ };
2078
+
2079
+ select.refresh = function () {
2080
+ select.disabled = true; // unlocked any conflict we had got into
2081
+
2082
+ var is = [];
2083
+ var newObject;
2084
+
2085
+ for (var _i3 = 0; _i3 < select.options.length; _i3++) {
2086
+ var opt = select.options[_i3];
2087
+
2088
+ if (opt.selected && opt.AJAR_mint) {
2089
+ // not sure if this 'if' is used because I cannot find mintClass
2090
+ if (options.mintClass) {
2091
+ var thisForm = promptForNew(dom, kb, subject, predicate, uiFrom, options.subForm, dataDoc, function (ok, body) {
2092
+ if (!ok) {
2093
+ callbackFunction(ok, body, {
2094
+ change: 'new'
2095
+ }); // @@ if ok, need some form of refresh of the select for the new thing
2096
+ }
2097
+ });
2098
+ select.parentNode.appendChild(thisForm);
2099
+ newObject = thisForm.AJAR_subject;
2100
+ } else {
2101
+ newObject = newThing(dataDoc);
2102
+ }
2103
+
2104
+ is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
2105
+ 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
2106
+
2107
+ if (options.mintStatementsFun) {
2108
+ is = is.concat(options.mintStatementsFun(newObject));
2109
+ }
2110
+
2111
+ select.currentURI = newObject;
2112
+ }
2113
+
2114
+ if (!opt.AJAR_uri) continue; // a prompt or mint
2115
+
2116
+ if (opt.selected && containsObject(opt.AJAR_uri, selectedOptions)) {
2117
+ select.currentURI = opt.AJAR_uri;
2118
+ }
2119
+
2120
+ if (!containsObject(opt.AJAR_uri, selectedOptions)) opt.removeAttribute('selected');
2121
+ if (containsObject(opt.AJAR_uri, selectedOptions)) opt.setAttribute('selected', 'true');
2122
+ }
2123
+
2124
+ log.info('selectForOptions: data doc = ' + dataDoc);
2125
+
2126
+ if (select.currentURI && options.subForm && !options.multiSelect) {
2127
+ addSubFormChoice(dom, container, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
2128
+ if (ok) {
2129
+ kb.updater.update([], is, function (uri, success, errorBody) {
2130
+ if (!success) container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
2131
+ });
2132
+ if (callbackFunction) callbackFunction(ok, {
2133
+ widget: 'select',
2134
+ event: 'new'
2135
+ });
2136
+ } else {
2137
+ container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
2138
+ }
2139
+ });
2140
+ }
2141
+
2142
+ select.disabled = false;
2143
+ };
2144
+
2145
+ function createOption(uri) {
2146
+ var option = dom.createElement('option');
2147
+ var c = kb.sym(uri);
2148
+ var label;
2149
+
2150
+ if (options.disambiguate) {
2151
+ label = utils.labelWithOntology(c, true); // Init. cap
2152
+ } else {
2153
+ label = utils.label(c, true);
2154
+ }
2155
+
2156
+ option.appendChild(dom.createTextNode(label)); // Init.
2157
+
2158
+ option.setAttribute('value', uri);
2159
+ var backgroundColor = kb.any(c, kb.sym('http://www.w3.org/ns/ui#backgroundColor'));
2160
+
2161
+ if (backgroundColor) {
2162
+ option.setAttribute('style', 'background-color: ' + backgroundColor.value + '; ');
2163
+ }
2164
+
2165
+ option.AJAR_uri = uri;
2166
+
2167
+ if (containsObject(c.value, selectedOptions)) {
2168
+ option.setAttribute('selected', 'true');
2169
+ }
2170
+
2171
+ return option;
2172
+ }
2173
+
2174
+ if (editable) {
2175
+ select.addEventListener('change', onChange, false);
2176
+ }
2177
+
2178
+ return select;
2179
+ } // makeSelectForChoice
2180
+
2181
+
2182
+ function containsObject(obj, list) {
2183
+ var i;
2184
+
2185
+ for (i = 0; i < list.length; i++) {
2186
+ if (list[i] === obj) {
2187
+ return true;
2188
+ }
2189
+ }
2190
+
2191
+ return false;
2192
+ } // This functions replaces the findMembersNT (thisClass) from rdflib until we fix: https://github.com/linkeddata/rdflib.js/issues/565
2193
+
2194
+ /**
2195
+ * For anything which has thisClass (or any subclass) as its type,
2196
+ * or is the object of something which has thisClass (or any subclass) as its range,
2197
+ * or subject of something which has thisClass (or any subclass) as its domain
2198
+ * We don't bother doing subproperty (yet?) as it doesn't seem to be used
2199
+ * much.
2200
+ * Get all the Classes of which we can RDFS-infer the subject is a member
2201
+ * @return a hash of URIs
2202
+ */
2203
+
2204
+
2205
+ function findMembersNT(store, thisClass, quad) {
2206
+ var len2;
2207
+ var len4;
2208
+ var m;
2209
+ var pred;
2210
+ var ref1;
2211
+ var ref2;
2212
+ var ref3;
2213
+ var ref4;
2214
+ var ref5;
2215
+ var st;
2216
+ var u;
2217
+ var seeds = {};
2218
+ seeds[thisClass.toNT()] = true;
2219
+ var members = {};
2220
+ var ref = store.transitiveClosure(seeds, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#subClassOf'), true);
2221
+
2222
+ for (var t in ref) {
2223
+ ref1 = store.statementsMatching(null, store.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), store.fromNT(t), quad);
2224
+
2225
+ for (var i = 0, len = ref1.length; i < len; i++) {
2226
+ st = ref1[i];
2227
+ members[st.subject.toNT()] = st;
2228
+ }
2229
+
2230
+ ref2 = store.each(null, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#domain'), store.fromNT(t), quad);
2231
+
2232
+ for (var l = 0, len1 = ref2.length; l < len1; l++) {
2233
+ pred = ref2[l];
2234
+ ref3 = store.statementsMatching(null, pred, null, quad);
2235
+
2236
+ for (m = 0, len2 = ref3.length; m < len2; m++) {
2237
+ st = ref3[m];
2238
+ members[st.subject.toNT()] = st;
2239
+ }
2240
+ }
2241
+
2242
+ ref4 = store.each(null, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#range'), store.fromNT(t), quad);
2243
+
2244
+ for (var q = 0, len3 = ref4.length; q < len3; q++) {
2245
+ pred = ref4[q];
2246
+ ref5 = store.statementsMatching(null, pred, null, quad);
2247
+
2248
+ for (u = 0, len4 = ref5.length; u < len4; u++) {
2249
+ st = ref5[u];
2250
+ members[st.object.toNT()] = st;
2251
+ }
2252
+ }
2253
+ }
2254
+
2255
+ return members;
2256
+ }
1936
2257
  //# sourceMappingURL=forms.js.map