solid-ui 2.4.22-fd0ccabe → 2.4.23

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 (248) hide show
  1. package/LICENSE.md +0 -0
  2. package/README.md +0 -0
  3. package/dist/index.html +0 -0
  4. package/dist/main.js +8141 -7208
  5. package/dist/main.js.map +1 -1
  6. package/lib/acl/access-controller.d.ts +0 -0
  7. package/lib/acl/access-controller.d.ts.map +0 -0
  8. package/lib/acl/access-controller.js +0 -0
  9. package/lib/acl/access-controller.js.map +1 -1
  10. package/lib/acl/access-groups.d.ts +0 -0
  11. package/lib/acl/access-groups.d.ts.map +0 -0
  12. package/lib/acl/access-groups.js +0 -0
  13. package/lib/acl/access-groups.js.map +1 -1
  14. package/lib/acl/acl-control.d.ts +0 -0
  15. package/lib/acl/acl-control.d.ts.map +0 -0
  16. package/lib/acl/acl-control.js +0 -0
  17. package/lib/acl/acl-control.js.map +1 -1
  18. package/lib/acl/acl.d.ts +0 -0
  19. package/lib/acl/acl.d.ts.map +0 -0
  20. package/lib/acl/acl.js +0 -0
  21. package/lib/acl/acl.js.map +1 -1
  22. package/lib/acl/add-agent-buttons.d.ts +0 -0
  23. package/lib/acl/add-agent-buttons.d.ts.map +0 -0
  24. package/lib/acl/add-agent-buttons.js +0 -1
  25. package/lib/acl/add-agent-buttons.js.map +1 -1
  26. package/lib/acl/index.d.ts +0 -0
  27. package/lib/acl/index.d.ts.map +0 -0
  28. package/lib/acl/index.js +0 -0
  29. package/lib/acl/index.js.map +1 -1
  30. package/lib/acl/styles.d.ts +0 -0
  31. package/lib/acl/styles.d.ts.map +0 -0
  32. package/lib/acl/styles.js +0 -0
  33. package/lib/acl/styles.js.map +1 -1
  34. package/lib/acl/types.d.ts +0 -0
  35. package/lib/acl/types.d.ts.map +0 -0
  36. package/lib/acl/types.js +0 -0
  37. package/lib/acl/types.js.map +1 -1
  38. package/lib/chat/bookmarks.js +2 -4
  39. package/lib/chat/bookmarks.js.map +1 -1
  40. package/lib/chat/chatLogic.js +0 -0
  41. package/lib/chat/chatLogic.js.map +1 -1
  42. package/lib/chat/dateFolder.js +0 -0
  43. package/lib/chat/dateFolder.js.map +1 -1
  44. package/lib/chat/infinite.js +0 -0
  45. package/lib/chat/infinite.js.map +1 -1
  46. package/lib/chat/message.js +0 -0
  47. package/lib/chat/message.js.map +1 -1
  48. package/lib/chat/messageTools.js +0 -0
  49. package/lib/chat/messageTools.js.map +1 -1
  50. package/lib/chat/thread.js +0 -0
  51. package/lib/chat/thread.js.map +1 -1
  52. package/lib/create/create.d.ts +0 -0
  53. package/lib/create/create.d.ts.map +0 -0
  54. package/lib/create/create.js +0 -0
  55. package/lib/create/create.js.map +1 -1
  56. package/lib/create/index.d.ts +0 -0
  57. package/lib/create/index.d.ts.map +0 -0
  58. package/lib/create/index.js +0 -0
  59. package/lib/create/index.js.map +1 -1
  60. package/lib/create/types.d.ts +0 -0
  61. package/lib/create/types.d.ts.map +0 -0
  62. package/lib/create/types.js +0 -0
  63. package/lib/create/types.js.map +1 -1
  64. package/lib/debug.d.ts +0 -0
  65. package/lib/debug.d.ts.map +0 -0
  66. package/lib/debug.js +0 -0
  67. package/lib/debug.js.map +1 -1
  68. package/lib/folders.js +0 -0
  69. package/lib/folders.js.map +1 -1
  70. package/lib/footer/index.d.ts +0 -0
  71. package/lib/footer/index.d.ts.map +0 -0
  72. package/lib/footer/index.js +0 -0
  73. package/lib/footer/index.js.map +1 -1
  74. package/lib/footer/styleMap.d.ts +0 -0
  75. package/lib/footer/styleMap.d.ts.map +0 -0
  76. package/lib/footer/styleMap.js +0 -0
  77. package/lib/footer/styleMap.js.map +1 -1
  78. package/lib/header/empty-profile.d.ts +0 -0
  79. package/lib/header/empty-profile.d.ts.map +0 -0
  80. package/lib/header/empty-profile.js +0 -0
  81. package/lib/header/empty-profile.js.map +1 -1
  82. package/lib/header/index.d.ts +0 -0
  83. package/lib/header/index.d.ts.map +0 -0
  84. package/lib/header/index.js +0 -0
  85. package/lib/header/index.js.map +1 -1
  86. package/lib/header/styleMap.d.ts +0 -0
  87. package/lib/header/styleMap.d.ts.map +0 -0
  88. package/lib/header/styleMap.js +0 -0
  89. package/lib/header/styleMap.js.map +1 -1
  90. package/lib/iconBase.d.ts +0 -0
  91. package/lib/iconBase.d.ts.map +0 -0
  92. package/lib/iconBase.js +3 -2
  93. package/lib/iconBase.js.map +1 -1
  94. package/lib/icons/solid_logo.d.ts +0 -0
  95. package/lib/icons/solid_logo.d.ts.map +0 -0
  96. package/lib/icons/solid_logo.js +0 -0
  97. package/lib/icons/solid_logo.js.map +1 -1
  98. package/lib/index.d.ts +0 -0
  99. package/lib/index.d.ts.map +0 -0
  100. package/lib/index.js +0 -0
  101. package/lib/index.js.map +1 -1
  102. package/lib/jss/index.d.ts +0 -0
  103. package/lib/jss/index.d.ts.map +0 -0
  104. package/lib/jss/index.js +0 -0
  105. package/lib/jss/index.js.map +1 -1
  106. package/lib/log.d.ts +0 -0
  107. package/lib/log.d.ts.map +0 -0
  108. package/lib/log.js +0 -0
  109. package/lib/log.js.map +1 -1
  110. package/lib/login/login.d.ts +9 -8
  111. package/lib/login/login.d.ts.map +1 -1
  112. package/lib/login/login.js +298 -344
  113. package/lib/login/login.js.map +1 -1
  114. package/lib/matrix/index.d.ts +0 -0
  115. package/lib/matrix/index.d.ts.map +0 -0
  116. package/lib/matrix/index.js +0 -0
  117. package/lib/matrix/index.js.map +1 -1
  118. package/lib/matrix/matrix.d.ts +0 -0
  119. package/lib/matrix/matrix.d.ts.map +0 -0
  120. package/lib/matrix/matrix.js +0 -0
  121. package/lib/matrix/matrix.js.map +1 -1
  122. package/lib/matrix/types.d.ts +0 -0
  123. package/lib/matrix/types.d.ts.map +0 -0
  124. package/lib/matrix/types.js +0 -0
  125. package/lib/matrix/types.js.map +1 -1
  126. package/lib/media/index.d.ts +0 -0
  127. package/lib/media/index.d.ts.map +0 -0
  128. package/lib/media/index.js +0 -0
  129. package/lib/media/index.js.map +1 -1
  130. package/lib/media/media-capture.d.ts +0 -0
  131. package/lib/media/media-capture.d.ts.map +0 -0
  132. package/lib/media/media-capture.js +0 -0
  133. package/lib/media/media-capture.js.map +1 -1
  134. package/lib/messageArea.js +0 -0
  135. package/lib/messageArea.js.map +1 -1
  136. package/lib/noun_Camera_1618446_000000.js +0 -0
  137. package/lib/noun_Camera_1618446_000000.js.map +1 -1
  138. package/lib/ns.js +0 -0
  139. package/lib/ns.js.map +1 -1
  140. package/lib/pad.d.ts +0 -0
  141. package/lib/pad.d.ts.map +0 -0
  142. package/lib/pad.js +0 -0
  143. package/lib/pad.js.map +1 -1
  144. package/lib/participation.d.ts +0 -0
  145. package/lib/participation.d.ts.map +0 -0
  146. package/lib/participation.js +0 -0
  147. package/lib/participation.js.map +1 -1
  148. package/lib/preferences.js +0 -0
  149. package/lib/preferences.js.map +1 -1
  150. package/lib/signup/config-default.js +0 -0
  151. package/lib/signup/config-default.js.map +1 -1
  152. package/lib/signup/signup.js +0 -0
  153. package/lib/signup/signup.js.map +1 -1
  154. package/lib/stories/decorators.js +0 -0
  155. package/lib/stories/decorators.js.map +1 -1
  156. package/lib/style.js +0 -0
  157. package/lib/style.js.map +1 -1
  158. package/lib/style_multiSelect.js +67 -0
  159. package/lib/style_multiSelect.js.map +1 -0
  160. package/lib/table.js +0 -0
  161. package/lib/table.js.map +1 -1
  162. package/lib/tabs.d.ts +1 -1
  163. package/lib/tabs.d.ts.map +1 -1
  164. package/lib/tabs.js +38 -22
  165. package/lib/tabs.js.map +1 -1
  166. package/lib/typings.d.js +0 -0
  167. package/lib/typings.d.js.map +1 -1
  168. package/lib/utils/headerFooterHelpers.d.ts +0 -0
  169. package/lib/utils/headerFooterHelpers.d.ts.map +0 -0
  170. package/lib/utils/headerFooterHelpers.js +0 -0
  171. package/lib/utils/headerFooterHelpers.js.map +1 -1
  172. package/lib/utils/index.js +0 -0
  173. package/lib/utils/index.js.map +1 -1
  174. package/lib/utils/label.d.ts +0 -0
  175. package/lib/utils/label.d.ts.map +0 -0
  176. package/lib/utils/label.js +1 -1
  177. package/lib/utils/label.js.map +1 -1
  178. package/lib/versionInfo.d.ts +9 -9
  179. package/lib/versionInfo.d.ts.map +0 -0
  180. package/lib/versionInfo.js +15 -15
  181. package/lib/versionInfo.js.map +1 -1
  182. package/lib/widgets/buttons/iconLinks.d.ts +0 -0
  183. package/lib/widgets/buttons/iconLinks.d.ts.map +0 -0
  184. package/lib/widgets/buttons/iconLinks.js +0 -0
  185. package/lib/widgets/buttons/iconLinks.js.map +1 -1
  186. package/lib/widgets/buttons.d.ts +0 -0
  187. package/lib/widgets/buttons.d.ts.map +0 -0
  188. package/lib/widgets/buttons.js +0 -0
  189. package/lib/widgets/buttons.js.map +1 -1
  190. package/lib/widgets/dragAndDrop.js +0 -0
  191. package/lib/widgets/dragAndDrop.js.map +1 -1
  192. package/lib/widgets/error.d.ts +0 -12
  193. package/lib/widgets/error.d.ts.map +1 -1
  194. package/lib/widgets/error.js +5 -0
  195. package/lib/widgets/error.js.map +1 -1
  196. package/lib/widgets/forms/autocomplete/autocompleteBar.d.ts +0 -0
  197. package/lib/widgets/forms/autocomplete/autocompleteBar.d.ts.map +0 -0
  198. package/lib/widgets/forms/autocomplete/autocompleteBar.js +0 -0
  199. package/lib/widgets/forms/autocomplete/autocompleteBar.js.map +1 -1
  200. package/lib/widgets/forms/autocomplete/autocompleteField.d.ts +0 -0
  201. package/lib/widgets/forms/autocomplete/autocompleteField.d.ts.map +0 -0
  202. package/lib/widgets/forms/autocomplete/autocompleteField.js +0 -0
  203. package/lib/widgets/forms/autocomplete/autocompleteField.js.map +1 -1
  204. package/lib/widgets/forms/autocomplete/autocompletePicker.d.ts +0 -0
  205. package/lib/widgets/forms/autocomplete/autocompletePicker.d.ts.map +0 -0
  206. package/lib/widgets/forms/autocomplete/autocompletePicker.js +0 -0
  207. package/lib/widgets/forms/autocomplete/autocompletePicker.js.map +1 -1
  208. package/lib/widgets/forms/autocomplete/language.d.ts +0 -0
  209. package/lib/widgets/forms/autocomplete/language.d.ts.map +0 -0
  210. package/lib/widgets/forms/autocomplete/language.js +0 -0
  211. package/lib/widgets/forms/autocomplete/language.js.map +1 -1
  212. package/lib/widgets/forms/autocomplete/publicData.d.ts +0 -0
  213. package/lib/widgets/forms/autocomplete/publicData.d.ts.map +0 -0
  214. package/lib/widgets/forms/autocomplete/publicData.js +0 -0
  215. package/lib/widgets/forms/autocomplete/publicData.js.map +1 -1
  216. package/lib/widgets/forms/basic.d.ts +0 -0
  217. package/lib/widgets/forms/basic.d.ts.map +0 -0
  218. package/lib/widgets/forms/basic.js +0 -0
  219. package/lib/widgets/forms/basic.js.map +1 -1
  220. package/lib/widgets/forms/comment.d.ts +0 -0
  221. package/lib/widgets/forms/comment.d.ts.map +0 -0
  222. package/lib/widgets/forms/comment.js +0 -0
  223. package/lib/widgets/forms/comment.js.map +1 -1
  224. package/lib/widgets/forms/fieldFunction.d.ts +0 -0
  225. package/lib/widgets/forms/fieldFunction.d.ts.map +0 -0
  226. package/lib/widgets/forms/fieldFunction.js +0 -0
  227. package/lib/widgets/forms/fieldFunction.js.map +1 -1
  228. package/lib/widgets/forms/fieldParams.d.ts +0 -0
  229. package/lib/widgets/forms/fieldParams.d.ts.map +0 -0
  230. package/lib/widgets/forms/fieldParams.js +0 -0
  231. package/lib/widgets/forms/fieldParams.js.map +1 -1
  232. package/lib/widgets/forms/formStyle.d.ts +0 -0
  233. package/lib/widgets/forms/formStyle.d.ts.map +0 -0
  234. package/lib/widgets/forms/formStyle.js +0 -0
  235. package/lib/widgets/forms/formStyle.js.map +1 -1
  236. package/lib/widgets/forms.js +694 -150
  237. package/lib/widgets/forms.js.map +1 -1
  238. package/lib/widgets/index.js +0 -0
  239. package/lib/widgets/index.js.map +1 -1
  240. package/lib/widgets/multiSelect.js +784 -0
  241. package/lib/widgets/multiSelect.js.map +1 -0
  242. package/lib/widgets/peoplePicker.js +0 -0
  243. package/lib/widgets/peoplePicker.js.map +1 -1
  244. package/lib/widgets/widgetHelpers.d.ts +0 -0
  245. package/lib/widgets/widgetHelpers.d.ts.map +0 -0
  246. package/lib/widgets/widgetHelpers.js +0 -0
  247. package/lib/widgets/widgetHelpers.js.map +1 -1
  248. package/package.json +51 -47
@@ -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,6 +171,7 @@ _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]) {
@@ -264,47 +281,43 @@ _fieldFunction.field[ns.ui('Options').uri] = function (dom, container, already,
264
281
  values = kb.each(subject, dependingOn);
265
282
  }
266
283
 
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'
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'
273
287
 
274
- var match = false;
288
+ var match = false;
275
289
 
276
- for (var j = 0; j < tests.length; j++) {
277
- var _iterator = _createForOfIteratorHelper(values),
278
- _step;
290
+ for (var j = 0; j < tests.length; j++) {
291
+ var _iterator = _createForOfIteratorHelper(values),
292
+ _step;
279
293
 
280
- try {
281
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
282
- var value = _step.value;
283
- var test = tests[j];
294
+ try {
295
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
296
+ var value = _step.value;
297
+ var test = tests[j];
284
298
 
285
- if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
286
- match = true;
287
- }
299
+ if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
300
+ match = true;
288
301
  }
289
- } catch (err) {
290
- _iterator.e(err);
291
- } finally {
292
- _iterator.f();
293
302
  }
303
+ } catch (err) {
304
+ _iterator.e(err);
305
+ } finally {
306
+ _iterator.f();
294
307
  }
308
+ }
295
309
 
296
- if (match) {
297
- var _field3 = kb.the(c, ui('use'));
310
+ if (match) {
311
+ var _field3 = kb.the(c, ui('use'));
298
312
 
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
- }
305
-
306
- 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);
307
318
  }
319
+
320
+ break;
308
321
  }
309
322
  } // @@ Add box.refresh() to sync fields with values
310
323
 
@@ -1042,9 +1055,6 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1042
1055
  var kb = _solidLogic.store;
1043
1056
  var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
1044
1057
 
1045
- var uiMultipleInUse = false; // this signals to ui:choice that it is part of a ui:multiple
1046
-
1047
- var multiSelect = false;
1048
1058
  var p;
1049
1059
  var box = dom.createElement('div');
1050
1060
  box.setAttribute('class', 'choiceBox'); // Set flexDirection column?
@@ -1070,108 +1080,142 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1070
1080
  }
1071
1081
 
1072
1082
  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
- }
1083
+ // const follow = kb.anyJS(form, ui('follow'), null, formDoc) // data doc moves to new subject?
1089
1084
 
1090
1085
  var opts = {
1091
1086
  form: form,
1092
1087
  subForm: subForm,
1093
- multiSelect: multiSelect,
1094
- firstSelectOptionText: firstSelectOptionText,
1095
- uiMultipleInUse: uiMultipleInUse,
1096
1088
  disambiguate: false
1097
1089
  };
1098
- possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1099
1090
 
1100
- for (var x in kb.findMembersNT(uiFrom)) {
1101
- possible.push(kb.fromNT(x));
1102
- } // Use rdfs
1091
+ function getSelectorOptions() {
1092
+ var possible = [];
1093
+ var possibleProperties;
1094
+ possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1103
1095
 
1096
+ for (var x in findMembersNT(kb, uiFrom, dataDoc)) {
1097
+ possible.push(kb.fromNT(x));
1098
+ } // Use rdfs
1104
1099
 
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
1100
 
1110
- } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1111
- possibleProperties = buttons.propertyTriage(kb);
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)
1112
1105
 
1113
- for (p in possibleProperties.op) {
1114
- possible.push(kb.fromNT(p));
1115
- }
1106
+ } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1107
+ possibleProperties = buttons.propertyTriage(kb);
1116
1108
 
1117
- for (p in possibleProperties.dp) {
1118
- possible.push(kb.fromNT(p));
1119
- }
1109
+ for (p in possibleProperties.op) {
1110
+ possible.push(kb.fromNT(p));
1111
+ }
1120
1112
 
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);
1113
+ for (p in possibleProperties.dp) {
1114
+ possible.push(kb.fromNT(p));
1115
+ }
1124
1116
 
1125
- for (p in possibleProperties.op) {
1126
- possible.push(kb.fromNT(p));
1127
- }
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);
1128
1120
 
1129
- opts.disambiguate = true;
1130
- } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1131
- possibleProperties = buttons.propertyTriage(kb);
1121
+ for (p in possibleProperties.op) {
1122
+ possible.push(kb.fromNT(p));
1123
+ }
1124
+
1125
+ opts.disambiguate = true;
1126
+ } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1127
+ possibleProperties = buttons.propertyTriage(kb);
1128
+
1129
+ for (p in possibleProperties.dp) {
1130
+ possible.push(kb.fromNT(p));
1131
+ }
1132
1132
 
1133
- for (p in possibleProperties.dp) {
1134
- possible.push(kb.fromNT(p));
1133
+ opts.disambiguate = true;
1135
1134
  }
1136
1135
 
1137
- opts.disambiguate = true;
1138
- }
1136
+ return possible; // return sortByLabel(possible)
1137
+ } // TODO: this checks for any occurrence, regardless of true or false setting
1139
1138
 
1140
- var sortedPossible = sortByLabel(possible); // TODO: this checks for any occurrence, regardless of true or false setting
1141
1139
 
1142
1140
  if (kb.any(form, ui('canMintNew'))) {
1143
1141
  opts.mint = '* Create new *'; // @@ could be better
1144
1142
  }
1145
1143
 
1146
- var selector = makeSelectForOptions(dom, kb, subject, property, sortedPossible, uiFrom, opts, dataDoc, callbackFunction);
1147
- rhs.appendChild(selector);
1148
- var object;
1144
+ var multiSelect = kb.any(form, ui('multiselect')); // Optional
1149
1145
 
1150
- if (selector.currentURI) {
1151
- object = $rdf.sym(selector.currentURI);
1152
- } else {
1153
- object = kb.any(subject, property);
1154
- }
1146
+ if (multiSelect) opts.multiSelect = true;
1147
+ var selector;
1155
1148
 
1156
- if (object && subForm) {
1157
- removeNextSiblingsAfterElement(selector);
1158
- addSubFormChoice(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
1159
- }
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
1160
1154
 
1161
- return box;
1162
- };
1163
- /**
1164
- * Removes all sibling elements after specified
1165
- * @param {HTMLElement} currentElement
1166
- * @private
1167
- */
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);
1168
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
+ }
1169
1177
 
1170
- function removeNextSiblingsAfterElement(currentElement) {
1171
- while (currentElement.nextElementSibling) {
1172
- currentElement.nextElementSibling.remove();
1173
- }
1174
- }
1178
+ if (event.action === 'CLEAR_ALL_OPTIONS') {
1179
+ selectedOptions = [];
1180
+ }
1181
+
1182
+ if (event.action === 'ADD_OPTION') {
1183
+ var stringValue = event.value + '';
1184
+
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
+ }
1209
+
1210
+ selector.update(selectedOptions);
1211
+ });
1212
+ }
1213
+ };
1214
+
1215
+ rhs.refresh();
1216
+ if (selector && selector.refresh) selector.refresh();
1217
+ return box;
1218
+ };
1175
1219
 
1176
1220
  function addSubFormChoice(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction) {
1177
1221
  (0, _fieldFunction.fieldFunction)(dom, subForm)(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction);
@@ -1514,10 +1558,9 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1514
1558
  // @param subject - a term, the subject of the statement(s) being edited.
1515
1559
  // @param predicate - a term, the predicate of the statement(s) being edited
1516
1560
  // @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
1561
+ // @param options.multiple - Boolean - Whether more than one at a time is allowed
1562
+ // @param options.nullLabel - a string to be displayed as the
1563
+ // option for none selected (for non multiple)
1521
1564
  // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1522
1565
  // @param options.subForm - If mint, then the form to be used for minting the new thing
1523
1566
  // @param dataDoc - The web document being edited
@@ -1525,7 +1568,7 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1525
1568
  */
1526
1569
 
1527
1570
 
1528
- function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
1571
+ function makeSelectForClassifierOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
1529
1572
  log.debug('Select list length now ' + possible.length);
1530
1573
  var n = 0;
1531
1574
  var uris = {}; // Count them
@@ -1535,7 +1578,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1535
1578
  for (var i = 0; i < possible.length; i++) {
1536
1579
  var sub = possible[i]; // @@ Maybe; make this so it works with blank nodes too
1537
1580
 
1538
- 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));
1539
1582
  if (!sub.uri || sub.uri in uris) continue;
1540
1583
  uris[sub.uri] = true;
1541
1584
  n++;
@@ -1546,7 +1589,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1546
1589
  return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1547
1590
  }
1548
1591
 
1549
- log.debug('makeSelectForOptions: dataDoc=' + dataDoc);
1592
+ log.debug('makeSelectForClassifierOptions: dataDoc=' + dataDoc);
1550
1593
  var actual;
1551
1594
 
1552
1595
  var getActual = function getActual() {
@@ -1556,9 +1599,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1556
1599
  actual = kb.findTypeURIs(subject);
1557
1600
  } else {
1558
1601
  kb.each(subject, predicate, null, dataDoc).forEach(function (x) {
1559
- if (x.uri) {
1560
- actual[x.uri] = true;
1561
- }
1602
+ actual[x.uri] = true;
1562
1603
  });
1563
1604
  }
1564
1605
 
@@ -1568,6 +1609,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1568
1609
  actual = getActual();
1569
1610
 
1570
1611
  var onChange = function onChange(_e) {
1612
+ select.disabled = true; // until data written back - gives user feedback too
1613
+
1571
1614
  var ds = [];
1572
1615
  var is = [];
1573
1616
 
@@ -1583,7 +1626,6 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1583
1626
  var opt = select.options[_i];
1584
1627
 
1585
1628
  if (opt.selected && opt.AJAR_mint) {
1586
- // not sure if this 'if' is used because I cannot find mintClass
1587
1629
  if (options.mintClass) {
1588
1630
  var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
1589
1631
  if (!ok) {
@@ -1598,14 +1640,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1598
1640
  newObject = newThing(dataDoc);
1599
1641
  }
1600
1642
 
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
1643
+ is.push($rdf.st(subject, predicate, newObject, dataDoc));
1603
1644
 
1604
1645
  if (options.mintStatementsFun) {
1605
1646
  is = is.concat(options.mintStatementsFun(newObject));
1606
1647
  }
1607
-
1608
- select.currentURI = newObject;
1609
1648
  }
1610
1649
 
1611
1650
  if (!opt.AJAR_uri) continue; // a prompt or mint
@@ -1613,7 +1652,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1613
1652
  if (opt.selected && !(opt.AJAR_uri in actual)) {
1614
1653
  // new class
1615
1654
  is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
1616
- 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));
1617
1660
  }
1618
1661
 
1619
1662
  if (opt.selected) select.currentURI = opt.AJAR_uri;
@@ -1633,29 +1676,38 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1633
1676
  sel = sel.superSelect;
1634
1677
  }
1635
1678
 
1636
- 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
1637
1689
 
1638
- removeNextSiblingsAfterElement(select);
1639
- addSubFormChoice(dom, select.parentNode, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
1640
1690
  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
- });
1691
+ select.disabled = false; // data written back
1692
+
1693
+ if (newObject) {
1694
+ var fn = (0, _fieldFunction.fieldFunction)(dom, options.subForm);
1695
+ fn(dom, select.parentNode, {}, newObject, options.subForm, dataDoc, doneNew);
1696
+ }
1650
1697
  } else {
1651
- select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
1698
+ return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1652
1699
  }
1700
+
1701
+ if (callbackFunction) callbackFunction(ok, {
1702
+ widget: 'select',
1703
+ event: 'change'
1704
+ });
1653
1705
  });
1654
1706
  };
1655
1707
 
1656
1708
  var select = dom.createElement('select');
1657
1709
  select.setAttribute('style', style.formSelectSTyle);
1658
- if (options.multiSelect) select.setAttribute('multiSelect', 'true');
1710
+ if (options.multiple) select.setAttribute('multiple', 'true');
1659
1711
  select.currentURI = null;
1660
1712
 
1661
1713
  select.refresh = function () {
@@ -1706,14 +1758,184 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1706
1758
  select.insertBefore(mint, select.firstChild);
1707
1759
  }
1708
1760
 
1709
- if (!select.currentURI && options.uiMultipleInUse) {
1761
+ if (select.currentURI == null && !options.multiple) {
1710
1762
  var prompt = dom.createElement('option');
1711
- prompt.appendChild(dom.createTextNode(options.firstSelectOptionText));
1712
- prompt.disabled = true;
1713
- prompt.value = true;
1714
- prompt.hidden = true;
1763
+ prompt.appendChild(dom.createTextNode(options.nullLabel));
1764
+ select.insertBefore(prompt, select.firstChild);
1715
1765
  prompt.selected = 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));
1716
1937
  select.insertBefore(prompt, select.firstChild);
1938
+ prompt.selected = true;
1717
1939
  }
1718
1940
 
1719
1941
  if (editable) {
@@ -1732,11 +1954,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1732
1954
  function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1733
1955
  var du = kb.any(category, ns.owl('disjointUnionOf'));
1734
1956
  var subs;
1735
- var multiSelect = false;
1957
+ var multiple = false;
1736
1958
 
1737
1959
  if (!du) {
1738
1960
  subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
1739
- multiSelect = true;
1961
+ multiple = true;
1740
1962
  } else {
1741
1963
  subs = du.elements;
1742
1964
  }
@@ -1744,15 +1966,16 @@ function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunc
1744
1966
  log.debug('Select list length ' + subs.length);
1745
1967
 
1746
1968
  if (subs.length === 0) {
1747
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiSelect ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1969
+ return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1748
1970
  }
1749
1971
 
1750
1972
  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]);
1973
+ return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
1752
1974
  }
1753
1975
 
1754
- return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, null, {
1755
- multiSelect: multiSelect
1976
+ return makeSelectForClassifierOptions(dom, kb, subject, ns.rdf('type'), subs, {
1977
+ multiple: multiple,
1978
+ nullLabel: '* Select type *'
1756
1979
  }, dataDoc, callbackFunction);
1757
1980
  }
1758
1981
  /** Make SELECT element to select subclasses recurively
@@ -1786,8 +2009,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
1786
2009
  function onChange(ok, body) {
1787
2010
  if (ok) update();
1788
2011
  callbackFunction(ok, body);
1789
- } // eslint-disable-next-line prefer-const
1790
-
2012
+ }
1791
2013
 
1792
2014
  var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
1793
2015
  container.appendChild(select);
@@ -1942,4 +2164,326 @@ function newThing(doc) {
1942
2164
  var now = new Date();
1943
2165
  return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
1944
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
+ }
1945
2489
  //# sourceMappingURL=forms.js.map