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.
Files changed (97) hide show
  1. package/README.md +23 -58
  2. package/dist/main.js +8123 -7172
  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 +298 -344
  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 +711 -143
  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 +34 -30
@@ -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
- var plist = [$rdf.st(subject, ns.owl('sameAs'), subject)]; // @@ need prev subject
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
- 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'
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
- var match = false;
288
+ var match = false;
274
289
 
275
- for (var j = 0; j < tests.length; j++) {
276
- var _iterator = _createForOfIteratorHelper(values),
277
- _step;
290
+ for (var j = 0; j < tests.length; j++) {
291
+ var _iterator = _createForOfIteratorHelper(values),
292
+ _step;
278
293
 
279
- try {
280
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
281
- var value = _step.value;
282
- var test = tests[j];
294
+ try {
295
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
296
+ var value = _step.value;
297
+ var test = tests[j];
283
298
 
284
- if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
285
- match = true;
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
- if (match) {
296
- var _field3 = kb.the(c, ui('use'));
310
+ if (match) {
311
+ var _field3 = kb.the(c, ui('use'));
297
312
 
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
- }
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, utils.label(property), deleteThisItem);
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 laytout
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 one or more ' + utils.predicateLabel(property, reverse);
735
- var prompt = tail.appendChild(dom.createElement('span'));
736
- prompt.textContent = (values.length === 0 ? 'Add one or more ' : 'Add more ') + utils.predicateLabel(property, reverse); // utils.label(property)
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
- ** Todo: Deal with multiple. Maybe merge with multiple code.
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'); // Set flexDirection column?
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 subForm = kb.any(form, ui('use')); // Optional
1076
+ var uiFrom = kb.any(form, ui('from'));
1059
1077
 
1060
- var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
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
- if (!uiFrom) {
1075
- return (0, _error.errorMessageBlock)(dom, "No 'from' for Choice: " + form);
1076
- }
1091
+ function getSelectorOptions() {
1092
+ var possible = [];
1093
+ var possibleProperties;
1094
+ possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1077
1095
 
1078
- possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
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
- if (uiFrom.sameTerm(ns.rdfs('Class'))) {
1086
- for (p in buttons.allClassURIs()) {
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
- } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1091
- possibleProperties = buttons.propertyTriage(kb);
1109
+ for (p in possibleProperties.op) {
1110
+ possible.push(kb.fromNT(p));
1111
+ }
1092
1112
 
1093
- for (p in possibleProperties.op) {
1094
- possible.push(kb.fromNT(p));
1095
- }
1113
+ for (p in possibleProperties.dp) {
1114
+ possible.push(kb.fromNT(p));
1115
+ }
1096
1116
 
1097
- for (p in possibleProperties.dp) {
1098
- possible.push(kb.fromNT(p));
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
- opts.disambiguate = true; // This is a big class, and the labels won't be enough.
1102
- } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
1103
- possibleProperties = buttons.propertyTriage(kb);
1121
+ for (p in possibleProperties.op) {
1122
+ possible.push(kb.fromNT(p));
1123
+ }
1104
1124
 
1105
- for (p in possibleProperties.op) {
1106
- possible.push(kb.fromNT(p));
1107
- }
1125
+ opts.disambiguate = true;
1126
+ } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1127
+ possibleProperties = buttons.propertyTriage(kb);
1108
1128
 
1109
- opts.disambiguate = true;
1110
- } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1111
- possibleProperties = buttons.propertyTriage(kb);
1129
+ for (p in possibleProperties.dp) {
1130
+ possible.push(kb.fromNT(p));
1131
+ }
1112
1132
 
1113
- for (p in possibleProperties.dp) {
1114
- possible.push(kb.fromNT(p));
1133
+ opts.disambiguate = true;
1115
1134
  }
1116
1135
 
1117
- opts.disambiguate = true;
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 selector = makeSelectForOptions(dom, kb, subject, property, sortedPossible, uiFrom, opts, dataDoc, callbackFunction);
1127
- rhs.appendChild(selector);
1128
- var object;
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
- if (selector.currentURI) {
1131
- object = $rdf.sym(selector.currentURI);
1132
- } else {
1133
- object = kb.any(subject, property);
1134
- }
1178
+ if (event.action === 'CLEAR_ALL_OPTIONS') {
1179
+ selectedOptions = [];
1180
+ }
1135
1181
 
1136
- if (object && subForm) {
1137
- removeNextSiblingsAfterElement(selector);
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
- return box;
1142
- };
1143
- /**
1144
- * Removes all sibling elements after specified
1145
- * @param {HTMLElement} currentElement
1146
- * @private
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
- function removeNextSiblingsAfterElement(currentElement) {
1151
- while (currentElement.nextElementSibling) {
1152
- currentElement.nextElementSibling.remove();
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', function (_e) {
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.firstSelectOptionText - a string to be displayed as the
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 makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
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("makeSelectForOptions: option does not have an uri: ".concat(sub, ", with predicate: ").concat(predicate));
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('makeSelectForOptions: dataDoc=' + dataDoc);
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
- if (x.uri) {
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, kb.sym(newObject), dataDoc));
1580
- if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc)); // not sure if this if is used because I cannot find mintStatementsFun
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
- select.currentURI = opt.AJAR_uri;
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
- log.info('selectForOptions: data doc = ' + dataDoc); // refresh subForm
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
- kb.updater.update(ds, is, function (uri, success, errorBody) {
1620
- actual = getActual(); // refresh
1691
+ select.disabled = false; // data written back
1621
1692
 
1622
- if (!success) return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + errorBody));
1623
- if (callbackFunction) callbackFunction(success, {
1624
- widget: 'select',
1625
- event: 'new'
1626
- });
1627
- });
1628
- } else return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
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 (!select.currentURI && !options.multiple) {
1761
+ if (select.currentURI == null && !options.multiple) {
1686
1762
  var prompt = dom.createElement('option');
1687
- prompt.appendChild(dom.createTextNode(options.firstSelectOptionText));
1763
+ prompt.appendChild(dom.createTextNode(options.nullLabel));
1764
+ select.insertBefore(prompt, select.firstChild);
1688
1765
  prompt.selected = true;
1689
- prompt.disabled = true;
1690
- prompt.value = true;
1691
- prompt.hidden = true;
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 makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, null, {
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
- } // eslint-disable-next-line prefer-const
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