solid-ui 2.4.22-d939d9d0 → 2.4.22-e3f38b00

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 (94) hide show
  1. package/dist/main.js +7288 -6602
  2. package/dist/main.js.map +1 -1
  3. package/lib/acl/access-controller.js.map +1 -1
  4. package/lib/acl/access-groups.js.map +1 -1
  5. package/lib/acl/acl-control.js.map +1 -1
  6. package/lib/acl/acl.js.map +1 -1
  7. package/lib/acl/add-agent-buttons.js +0 -1
  8. package/lib/acl/add-agent-buttons.js.map +1 -1
  9. package/lib/acl/index.js.map +1 -1
  10. package/lib/acl/styles.js.map +1 -1
  11. package/lib/acl/types.js.map +1 -1
  12. package/lib/chat/bookmarks.js +2 -4
  13. package/lib/chat/bookmarks.js.map +1 -1
  14. package/lib/chat/chatLogic.js.map +1 -1
  15. package/lib/chat/dateFolder.js.map +1 -1
  16. package/lib/chat/infinite.js.map +1 -1
  17. package/lib/chat/message.js.map +1 -1
  18. package/lib/chat/messageTools.js.map +1 -1
  19. package/lib/chat/thread.js.map +1 -1
  20. package/lib/create/create.js.map +1 -1
  21. package/lib/create/index.js.map +1 -1
  22. package/lib/create/types.js.map +1 -1
  23. package/lib/debug.js.map +1 -1
  24. package/lib/folders.js.map +1 -1
  25. package/lib/footer/index.js.map +1 -1
  26. package/lib/footer/styleMap.js.map +1 -1
  27. package/lib/header/empty-profile.js.map +1 -1
  28. package/lib/header/index.js.map +1 -1
  29. package/lib/header/styleMap.js.map +1 -1
  30. package/lib/iconBase.js +3 -2
  31. package/lib/iconBase.js.map +1 -1
  32. package/lib/icons/solid_logo.js.map +1 -1
  33. package/lib/index.js.map +1 -1
  34. package/lib/jss/index.js.map +1 -1
  35. package/lib/log.js.map +1 -1
  36. package/lib/login/login.d.ts +9 -8
  37. package/lib/login/login.d.ts.map +1 -1
  38. package/lib/login/login.js +290 -342
  39. package/lib/login/login.js.map +1 -1
  40. package/lib/matrix/index.js.map +1 -1
  41. package/lib/matrix/matrix.js.map +1 -1
  42. package/lib/matrix/types.js.map +1 -1
  43. package/lib/media/index.js.map +1 -1
  44. package/lib/media/media-capture.js.map +1 -1
  45. package/lib/messageArea.js.map +1 -1
  46. package/lib/noun_Camera_1618446_000000.js.map +1 -1
  47. package/lib/ns.js.map +1 -1
  48. package/lib/pad.js.map +1 -1
  49. package/lib/participation.js.map +1 -1
  50. package/lib/preferences.js.map +1 -1
  51. package/lib/signup/config-default.js.map +1 -1
  52. package/lib/signup/signup.js.map +1 -1
  53. package/lib/stories/decorators.js.map +1 -1
  54. package/lib/style.js.map +1 -1
  55. package/lib/style_multiSelect.js +67 -0
  56. package/lib/style_multiSelect.js.map +1 -0
  57. package/lib/table.js.map +1 -1
  58. package/lib/tabs.d.ts +1 -1
  59. package/lib/tabs.d.ts.map +1 -1
  60. package/lib/tabs.js +38 -22
  61. package/lib/tabs.js.map +1 -1
  62. package/lib/typings.d.js.map +1 -1
  63. package/lib/utils/headerFooterHelpers.js.map +1 -1
  64. package/lib/utils/index.js.map +1 -1
  65. package/lib/utils/label.js +1 -1
  66. package/lib/utils/label.js.map +1 -1
  67. package/lib/versionInfo.d.ts +9 -9
  68. package/lib/versionInfo.js +14 -14
  69. package/lib/versionInfo.js.map +1 -1
  70. package/lib/widgets/buttons/iconLinks.js.map +1 -1
  71. package/lib/widgets/buttons.js.map +1 -1
  72. package/lib/widgets/dragAndDrop.js.map +1 -1
  73. package/lib/widgets/error.d.ts +0 -12
  74. package/lib/widgets/error.d.ts.map +1 -1
  75. package/lib/widgets/error.js +5 -0
  76. package/lib/widgets/error.js.map +1 -1
  77. package/lib/widgets/forms/autocomplete/autocompleteBar.js.map +1 -1
  78. package/lib/widgets/forms/autocomplete/autocompleteField.js.map +1 -1
  79. package/lib/widgets/forms/autocomplete/autocompletePicker.js.map +1 -1
  80. package/lib/widgets/forms/autocomplete/language.js.map +1 -1
  81. package/lib/widgets/forms/autocomplete/publicData.js.map +1 -1
  82. package/lib/widgets/forms/basic.js.map +1 -1
  83. package/lib/widgets/forms/comment.js.map +1 -1
  84. package/lib/widgets/forms/fieldFunction.js.map +1 -1
  85. package/lib/widgets/forms/fieldParams.js.map +1 -1
  86. package/lib/widgets/forms/formStyle.js.map +1 -1
  87. package/lib/widgets/forms.js +499 -187
  88. package/lib/widgets/forms.js.map +1 -1
  89. package/lib/widgets/index.js.map +1 -1
  90. package/lib/widgets/multiSelect.js +784 -0
  91. package/lib/widgets/multiSelect.js.map +1 -0
  92. package/lib/widgets/peoplePicker.js.map +1 -1
  93. package/lib/widgets/widgetHelpers.js.map +1 -1
  94. 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,6 +170,7 @@ _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]) {
@@ -264,47 +280,43 @@ _fieldFunction.field[ns.ui('Options').uri] = function (dom, container, already,
264
280
  values = kb.each(subject, dependingOn);
265
281
  }
266
282
 
267
- if (values.length === 0) {
268
- box.appendChild((0, _error.errorMessageBlock)(dom, "Can't select subform as no value of: " + dependingOn));
269
- } else {
270
- for (var i = 0; i < cases.length; i++) {
271
- var c = cases[i];
272
- 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'
273
286
 
274
- var match = false;
287
+ var match = false;
275
288
 
276
- for (var j = 0; j < tests.length; j++) {
277
- var _iterator = _createForOfIteratorHelper(values),
278
- _step;
289
+ for (var j = 0; j < tests.length; j++) {
290
+ var _iterator = _createForOfIteratorHelper(values),
291
+ _step;
279
292
 
280
- try {
281
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
282
- var value = _step.value;
283
- var test = tests[j];
293
+ try {
294
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
295
+ var value = _step.value;
296
+ var test = tests[j];
284
297
 
285
- if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
286
- match = true;
287
- }
298
+ if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
299
+ match = true;
288
300
  }
289
- } catch (err) {
290
- _iterator.e(err);
291
- } finally {
292
- _iterator.f();
293
301
  }
302
+ } catch (err) {
303
+ _iterator.e(err);
304
+ } finally {
305
+ _iterator.f();
294
306
  }
307
+ }
295
308
 
296
- if (match) {
297
- var _field3 = kb.the(c, ui('use'));
298
-
299
- if (!_field3) {
300
- box.appendChild((0, _error.errorMessageBlock)(dom, 'No "use" part for case in form ' + form));
301
- return box;
302
- } else {
303
- appendForm(dom, box, already, subject, _field3, dataDoc, callbackFunction);
304
- }
309
+ if (match) {
310
+ var _field3 = kb.the(c, ui('use'));
305
311
 
306
- 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);
307
317
  }
318
+
319
+ break;
308
320
  }
309
321
  } // @@ Add box.refresh() to sync fields with values
310
322
 
@@ -1042,9 +1054,6 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1042
1054
  var kb = _solidLogic.store;
1043
1055
  var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
1044
1056
 
1045
- var uiMultipleInUse = false; // this signals to ui:choice that it is part of a ui:multiple
1046
-
1047
- var multiSelect = false;
1048
1057
  var p;
1049
1058
  var box = dom.createElement('div');
1050
1059
  box.setAttribute('class', 'choiceBox'); // Set flexDirection column?
@@ -1070,108 +1079,142 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1070
1079
  }
1071
1080
 
1072
1081
  var subForm = kb.any(form, ui('use')); // Optional
1073
-
1074
- var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
1075
-
1076
- var possible = [];
1077
- var possibleProperties;
1078
- var firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *'; // if we do NOT have a container it means it is a ui:Multiple
1079
- // only important for the first option text in select
1080
-
1081
- if (!container) {
1082
- uiMultipleInUse = true;
1083
- firstSelectOptionText = utils.label(subject, true);
1084
- }
1085
-
1086
- if (subject.termType === 'BlankNode') {
1087
- firstSelectOptionText = '* Select for ' + utils.label(property) + ' *';
1088
- }
1082
+ // const follow = kb.anyJS(form, ui('follow'), null, formDoc) // data doc moves to new subject?
1089
1083
 
1090
1084
  var opts = {
1091
1085
  form: form,
1092
1086
  subForm: subForm,
1093
- multiSelect: multiSelect,
1094
- firstSelectOptionText: firstSelectOptionText,
1095
- uiMultipleInUse: uiMultipleInUse,
1096
1087
  disambiguate: false
1097
1088
  };
1098
- possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1099
1089
 
1100
- for (var x in kb.findMembersNT(uiFrom)) {
1101
- possible.push(kb.fromNT(x));
1102
- } // Use rdfs
1090
+ function getSelectorOptions() {
1091
+ var possible = [];
1092
+ var possibleProperties;
1093
+ possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1103
1094
 
1095
+ for (var x in findMembersNT(kb, uiFrom, dataDoc)) {
1096
+ possible.push(kb.fromNT(x));
1097
+ } // Use rdfs
1104
1098
 
1105
- if (uiFrom.sameTerm(ns.rdfs('Class'))) {
1106
- for (p in buttons.allClassURIs()) {
1107
- possible.push(kb.sym(p));
1108
- } // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
1109
1099
 
1110
- } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1111
- 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)
1112
1104
 
1113
- for (p in possibleProperties.op) {
1114
- possible.push(kb.fromNT(p));
1115
- }
1105
+ } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1106
+ possibleProperties = buttons.propertyTriage(kb);
1116
1107
 
1117
- for (p in possibleProperties.dp) {
1118
- possible.push(kb.fromNT(p));
1119
- }
1108
+ for (p in possibleProperties.op) {
1109
+ possible.push(kb.fromNT(p));
1110
+ }
1120
1111
 
1121
- opts.disambiguate = true; // This is a big class, and the labels won't be enough.
1122
- } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
1123
- possibleProperties = buttons.propertyTriage(kb);
1112
+ for (p in possibleProperties.dp) {
1113
+ possible.push(kb.fromNT(p));
1114
+ }
1124
1115
 
1125
- for (p in possibleProperties.op) {
1126
- possible.push(kb.fromNT(p));
1127
- }
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);
1128
1119
 
1129
- opts.disambiguate = true;
1130
- } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1131
- possibleProperties = buttons.propertyTriage(kb);
1120
+ for (p in possibleProperties.op) {
1121
+ possible.push(kb.fromNT(p));
1122
+ }
1132
1123
 
1133
- for (p in possibleProperties.dp) {
1134
- possible.push(kb.fromNT(p));
1124
+ opts.disambiguate = true;
1125
+ } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1126
+ possibleProperties = buttons.propertyTriage(kb);
1127
+
1128
+ for (p in possibleProperties.dp) {
1129
+ possible.push(kb.fromNT(p));
1130
+ }
1131
+
1132
+ opts.disambiguate = true;
1135
1133
  }
1136
1134
 
1137
- opts.disambiguate = true;
1138
- }
1135
+ return possible; // return sortByLabel(possible)
1136
+ } // TODO: this checks for any occurrence, regardless of true or false setting
1139
1137
 
1140
- var sortedPossible = sortByLabel(possible); // TODO: this checks for any occurrence, regardless of true or false setting
1141
1138
 
1142
1139
  if (kb.any(form, ui('canMintNew'))) {
1143
1140
  opts.mint = '* Create new *'; // @@ could be better
1144
1141
  }
1145
1142
 
1146
- var selector = makeSelectForOptions(dom, kb, subject, property, sortedPossible, uiFrom, opts, dataDoc, callbackFunction);
1147
- rhs.appendChild(selector);
1148
- var object;
1143
+ var multiSelect = kb.any(form, ui('multiselect')); // Optional
1149
1144
 
1150
- if (selector.currentURI) {
1151
- object = $rdf.sym(selector.currentURI);
1152
- } else {
1153
- object = kb.any(subject, property);
1154
- }
1145
+ if (multiSelect) opts.multiSelect = true;
1146
+ var selector;
1155
1147
 
1156
- if (object && subForm) {
1157
- removeNextSiblingsAfterElement(selector);
1158
- addSubFormChoice(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
1159
- }
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
1160
1153
 
1161
- return box;
1162
- };
1163
- /**
1164
- * Removes all sibling elements after specified
1165
- * @param {HTMLElement} currentElement
1166
- * @private
1167
- */
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);
1168
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
+ }
1169
1176
 
1170
- function removeNextSiblingsAfterElement(currentElement) {
1171
- while (currentElement.nextElementSibling) {
1172
- currentElement.nextElementSibling.remove();
1173
- }
1174
- }
1177
+ if (event.action === 'CLEAR_ALL_OPTIONS') {
1178
+ selectedOptions = [];
1179
+ }
1180
+
1181
+ if (event.action === 'ADD_OPTION') {
1182
+ var stringValue = event.value + '';
1183
+
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
+ }
1208
+
1209
+ selector.update(selectedOptions);
1210
+ });
1211
+ }
1212
+ };
1213
+
1214
+ rhs.refresh();
1215
+ if (selector && selector.refresh) selector.refresh();
1216
+ return box;
1217
+ };
1175
1218
 
1176
1219
  function addSubFormChoice(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction) {
1177
1220
  (0, _fieldFunction.fieldFunction)(dom, subForm)(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction);
@@ -1514,18 +1557,15 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1514
1557
  // @param subject - a term, the subject of the statement(s) being edited.
1515
1558
  // @param predicate - a term, the predicate of the statement(s) being edited
1516
1559
  // @param possible - a list of terms, the possible value the object can take
1517
- // @param options.multiSelect - Boolean - Whether more than one at a time is allowed
1518
- // @param options.firstSelectOptionText - a string to be displayed as the
1519
- // option for none selected (for non multiSelect)
1520
- // @param options.uiMultipleInUse - signals that the ui:choise is used with a ui:multiple
1521
- // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1560
+ // @param options.nullLabel - a string to be displayed as the
1561
+ // option for none selected (for non multiple)
1522
1562
  // @param options.subForm - If mint, then the form to be used for minting the new thing
1523
1563
  // @param dataDoc - The web document being edited
1524
1564
  // @param callbackFunction - takes (boolean ok, string errorBody)
1525
1565
  */
1526
1566
 
1527
1567
 
1528
- function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
1568
+ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
1529
1569
  log.debug('Select list length now ' + possible.length);
1530
1570
  var n = 0;
1531
1571
  var uris = {}; // Count them
@@ -1542,7 +1582,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1542
1582
  } // uris is now the set of possible options
1543
1583
 
1544
1584
 
1545
- if (n === 0 && !options.mint) {
1585
+ if (n === 0) {
1546
1586
  return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1547
1587
  }
1548
1588
 
@@ -1568,6 +1608,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1568
1608
  actual = getActual();
1569
1609
 
1570
1610
  var onChange = function onChange(_e) {
1611
+ select.disabled = true; // until data written back - gives user feedback too
1612
+
1571
1613
  var ds = [];
1572
1614
  var is = [];
1573
1615
 
@@ -1577,43 +1619,18 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1577
1619
  }
1578
1620
  };
1579
1621
 
1580
- var newObject;
1581
-
1582
1622
  for (var _i = 0; _i < select.options.length; _i++) {
1583
1623
  var opt = select.options[_i];
1584
-
1585
- if (opt.selected && opt.AJAR_mint) {
1586
- // not sure if this 'if' is used because I cannot find mintClass
1587
- if (options.mintClass) {
1588
- var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
1589
- if (!ok) {
1590
- callbackFunction(ok, body, {
1591
- change: 'new'
1592
- }); // @@ if ok, need some form of refresh of the select for the new thing
1593
- }
1594
- });
1595
- select.parentNode.appendChild(thisForm);
1596
- newObject = thisForm.AJAR_subject;
1597
- } else {
1598
- newObject = newThing(dataDoc);
1599
- }
1600
-
1601
- is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
1602
- 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
1603
-
1604
- if (options.mintStatementsFun) {
1605
- is = is.concat(options.mintStatementsFun(newObject));
1606
- }
1607
-
1608
- select.currentURI = newObject;
1609
- }
1610
-
1611
1624
  if (!opt.AJAR_uri) continue; // a prompt or mint
1612
1625
 
1613
1626
  if (opt.selected && !(opt.AJAR_uri in actual)) {
1614
1627
  // new class
1615
1628
  is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
1616
- 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));
1617
1634
  }
1618
1635
 
1619
1636
  if (opt.selected) select.currentURI = opt.AJAR_uri;
@@ -1633,29 +1650,25 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1633
1650
  sel = sel.superSelect;
1634
1651
  }
1635
1652
 
1636
- 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
1637
1656
 
1638
- removeNextSiblingsAfterElement(select);
1639
- addSubFormChoice(dom, select.parentNode, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
1640
1657
  if (ok) {
1641
- kb.updater.update(ds, is, function (uri, success, errorBody) {
1642
- actual = getActual(); // refresh
1643
-
1644
- if (!success) select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
1645
- });
1646
- if (callbackFunction) callbackFunction(ok, {
1647
- widget: 'select',
1648
- event: 'new'
1649
- });
1658
+ select.disabled = false; // data written back
1650
1659
  } else {
1651
- 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));
1652
1661
  }
1662
+
1663
+ if (callbackFunction) callbackFunction(ok, {
1664
+ widget: 'select',
1665
+ event: 'change'
1666
+ });
1653
1667
  });
1654
1668
  };
1655
1669
 
1656
1670
  var select = dom.createElement('select');
1657
1671
  select.setAttribute('style', style.formSelectSTyle);
1658
- if (options.multiSelect) select.setAttribute('multiSelect', 'true');
1659
1672
  select.currentURI = null;
1660
1673
 
1661
1674
  select.refresh = function () {
@@ -1698,22 +1711,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1698
1711
  select.appendChild(option);
1699
1712
  }
1700
1713
 
1701
- if (editable && options.mint) {
1702
- var mint = dom.createElement('option');
1703
- mint.appendChild(dom.createTextNode(options.mint));
1704
- mint.AJAR_mint = true; // Flag it
1705
-
1706
- select.insertBefore(mint, select.firstChild);
1707
- }
1708
-
1709
- if (!select.currentURI && options.uiMultipleInUse) {
1714
+ if (!select.currentURI) {
1710
1715
  var prompt = dom.createElement('option');
1711
- prompt.appendChild(dom.createTextNode(options.firstSelectOptionText));
1712
- prompt.disabled = true;
1713
- prompt.value = true;
1714
- prompt.hidden = true;
1715
- prompt.selected = true;
1716
+ prompt.appendChild(dom.createTextNode(options.nullLabel));
1716
1717
  select.insertBefore(prompt, select.firstChild);
1718
+ prompt.selected = true;
1717
1719
  }
1718
1720
 
1719
1721
  if (editable) {
@@ -1732,27 +1734,16 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1732
1734
  function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1733
1735
  var du = kb.any(category, ns.owl('disjointUnionOf'));
1734
1736
  var subs;
1735
- var multiSelect = false;
1736
1737
 
1737
1738
  if (!du) {
1738
1739
  subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
1739
- multiSelect = true;
1740
1740
  } else {
1741
1741
  subs = du.elements;
1742
1742
  }
1743
1743
 
1744
1744
  log.debug('Select list length ' + subs.length);
1745
-
1746
- if (subs.length === 0) {
1747
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiSelect ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1748
- }
1749
-
1750
- if (subs.length === 1) {
1751
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiSelect ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
1752
- }
1753
-
1754
- return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, null, {
1755
- multiSelect: multiSelect
1745
+ return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, {
1746
+ nullLabel: '* Select type *'
1756
1747
  }, dataDoc, callbackFunction);
1757
1748
  }
1758
1749
  /** Make SELECT element to select subclasses recurively
@@ -1786,8 +1777,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
1786
1777
  function onChange(ok, body) {
1787
1778
  if (ok) update();
1788
1779
  callbackFunction(ok, body);
1789
- } // eslint-disable-next-line prefer-const
1790
-
1780
+ }
1791
1781
 
1792
1782
  var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
1793
1783
  container.appendChild(select);
@@ -1942,4 +1932,326 @@ function newThing(doc) {
1942
1932
  var now = new Date();
1943
1933
  return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
1944
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
+ }
1945
2257
  //# sourceMappingURL=forms.js.map