solid-ui 2.4.22-fd0ccabe → 2.4.22-fd705c8d

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 (106) hide show
  1. package/dist/main.js +2059 -1163
  2. package/dist/main.js.map +1 -1
  3. package/lib/acl/access-controller.js +9 -14
  4. package/lib/acl/access-controller.js.map +1 -1
  5. package/lib/acl/access-groups.js +10 -15
  6. package/lib/acl/access-groups.js.map +1 -1
  7. package/lib/acl/acl-control.js +9 -13
  8. package/lib/acl/acl-control.js.map +1 -1
  9. package/lib/acl/acl.js +7 -11
  10. package/lib/acl/acl.js.map +1 -1
  11. package/lib/acl/add-agent-buttons.js +13 -19
  12. package/lib/acl/add-agent-buttons.js.map +1 -1
  13. package/lib/acl/index.js.map +1 -1
  14. package/lib/acl/styles.js.map +1 -1
  15. package/lib/acl/types.js.map +1 -1
  16. package/lib/chat/bookmarks.js +14 -19
  17. package/lib/chat/bookmarks.js.map +1 -1
  18. package/lib/chat/chatLogic.js +9 -15
  19. package/lib/chat/chatLogic.js.map +1 -1
  20. package/lib/chat/dateFolder.js +12 -17
  21. package/lib/chat/dateFolder.js.map +1 -1
  22. package/lib/chat/infinite.js +29 -37
  23. package/lib/chat/infinite.js.map +1 -1
  24. package/lib/chat/message.js +14 -14
  25. package/lib/chat/message.js.map +1 -1
  26. package/lib/chat/messageTools.js +10 -23
  27. package/lib/chat/messageTools.js.map +1 -1
  28. package/lib/chat/thread.js +4 -9
  29. package/lib/chat/thread.js.map +1 -1
  30. package/lib/create/create.js.map +1 -1
  31. package/lib/create/index.js.map +1 -1
  32. package/lib/create/types.js.map +1 -1
  33. package/lib/debug.js.map +1 -1
  34. package/lib/folders.js.map +1 -1
  35. package/lib/footer/index.js +8 -10
  36. package/lib/footer/index.js.map +1 -1
  37. package/lib/footer/styleMap.js.map +1 -1
  38. package/lib/header/empty-profile.js.map +1 -1
  39. package/lib/header/index.js +9 -17
  40. package/lib/header/index.js.map +1 -1
  41. package/lib/header/styleMap.js.map +1 -1
  42. package/lib/iconBase.js.map +1 -1
  43. package/lib/icons/solid_logo.js.map +1 -1
  44. package/lib/index.js.map +1 -1
  45. package/lib/jss/index.js.map +1 -1
  46. package/lib/log.js.map +1 -1
  47. package/lib/login/login.js +21 -63
  48. package/lib/login/login.js.map +1 -1
  49. package/lib/matrix/index.js.map +1 -1
  50. package/lib/matrix/matrix.js.map +1 -1
  51. package/lib/matrix/types.js.map +1 -1
  52. package/lib/media/index.js.map +1 -1
  53. package/lib/media/media-capture.js +4 -20
  54. package/lib/media/media-capture.js.map +1 -1
  55. package/lib/messageArea.js.map +1 -1
  56. package/lib/noun_Camera_1618446_000000.js.map +1 -1
  57. package/lib/ns.js.map +1 -1
  58. package/lib/pad.js.map +1 -1
  59. package/lib/participation.js.map +1 -1
  60. package/lib/preferences.js.map +1 -1
  61. package/lib/signup/config-default.js.map +1 -1
  62. package/lib/signup/signup.js.map +1 -1
  63. package/lib/stories/decorators.js.map +1 -1
  64. package/lib/style.js.map +1 -1
  65. package/lib/style_multiSelect.js +67 -0
  66. package/lib/style_multiSelect.js.map +1 -0
  67. package/lib/table.js.map +1 -1
  68. package/lib/tabs.d.ts +1 -1
  69. package/lib/tabs.d.ts.map +1 -1
  70. package/lib/tabs.js +38 -22
  71. package/lib/tabs.js.map +1 -1
  72. package/lib/typings.d.js.map +1 -1
  73. package/lib/utils/headerFooterHelpers.js +5 -7
  74. package/lib/utils/headerFooterHelpers.js.map +1 -1
  75. package/lib/utils/index.js.map +1 -1
  76. package/lib/utils/label.js +1 -1
  77. package/lib/utils/label.js.map +1 -1
  78. package/lib/versionInfo.js +5 -5
  79. package/lib/versionInfo.js.map +1 -1
  80. package/lib/widgets/buttons/iconLinks.js.map +1 -1
  81. package/lib/widgets/buttons.js.map +1 -1
  82. package/lib/widgets/dragAndDrop.js.map +1 -1
  83. package/lib/widgets/error.js.map +1 -1
  84. package/lib/widgets/forms/autocomplete/autocompleteBar.js +17 -15
  85. package/lib/widgets/forms/autocomplete/autocompleteBar.js.map +1 -1
  86. package/lib/widgets/forms/autocomplete/autocompleteField.js +5 -8
  87. package/lib/widgets/forms/autocomplete/autocompleteField.js.map +1 -1
  88. package/lib/widgets/forms/autocomplete/autocompletePicker.js +21 -19
  89. package/lib/widgets/forms/autocomplete/autocompletePicker.js.map +1 -1
  90. package/lib/widgets/forms/autocomplete/language.js +8 -15
  91. package/lib/widgets/forms/autocomplete/language.js.map +1 -1
  92. package/lib/widgets/forms/autocomplete/publicData.js +22 -27
  93. package/lib/widgets/forms/autocomplete/publicData.js.map +1 -1
  94. package/lib/widgets/forms/basic.js.map +1 -1
  95. package/lib/widgets/forms/comment.js.map +1 -1
  96. package/lib/widgets/forms/fieldFunction.js.map +1 -1
  97. package/lib/widgets/forms/fieldParams.js.map +1 -1
  98. package/lib/widgets/forms/formStyle.js.map +1 -1
  99. package/lib/widgets/forms.js +504 -203
  100. package/lib/widgets/forms.js.map +1 -1
  101. package/lib/widgets/index.js.map +1 -1
  102. package/lib/widgets/multiSelect.js +784 -0
  103. package/lib/widgets/multiSelect.js.map +1 -0
  104. package/lib/widgets/peoplePicker.js.map +1 -1
  105. package/lib/widgets/widgetHelpers.js.map +1 -1
  106. package/package.json +5 -3
@@ -44,6 +44,7 @@ exports.findClosest = findClosest;
44
44
  exports.formsFor = formsFor;
45
45
  exports.makeDescription = makeDescription;
46
46
  exports.makeSelectForCategory = makeSelectForCategory;
47
+ exports.makeSelectForChoice = makeSelectForChoice;
47
48
  exports.makeSelectForNestedCategory = makeSelectForNestedCategory;
48
49
  exports.makeSelectForOptions = makeSelectForOptions;
49
50
  exports.newButton = newButton;
@@ -59,8 +60,6 @@ Object.defineProperty(exports, "renderNameValuePair", {
59
60
  exports.sortByLabel = sortByLabel;
60
61
  exports.sortBySequence = sortBySequence;
61
62
 
62
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
63
-
64
63
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
65
64
 
66
65
  var buttons = _interopRequireWildcard(require("./buttons"));
@@ -93,12 +92,16 @@ var _solidLogic = require("solid-logic");
93
92
 
94
93
  var utils = _interopRequireWildcard(require("../utils"));
95
94
 
95
+ var _multiSelect = require("./multiSelect");
96
+
96
97
  var widgets = _interopRequireWildcard(require("../widgets"));
97
98
 
98
99
  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); }
99
100
 
100
101
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
101
102
 
103
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return generator._invoke = function (innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; }(innerFn, self, context), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; this._invoke = function (method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); }; } function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (undefined === method) { if (context.delegate = null, "throw" === context.method) { if (delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method)) return ContinueSentinel; context.method = "throw", context.arg = new TypeError("The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, define(Gp, "constructor", GeneratorFunctionPrototype), define(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (object) { var keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
104
+
102
105
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
103
106
 
104
107
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -155,6 +158,7 @@ _fieldFunction.field[ns.ui('Form').uri] = _fieldFunction.field[ns.ui('Group').ur
155
158
  var ui = ns.ui;
156
159
  if (container) container.appendChild(box); // Prevent loops
157
160
 
161
+ if (!form) return;
158
162
  var key = subject.toNT() + '|' + form.toNT();
159
163
 
160
164
  if (already[key]) {
@@ -264,47 +268,43 @@ _fieldFunction.field[ns.ui('Options').uri] = function (dom, container, already,
264
268
  values = kb.each(subject, dependingOn);
265
269
  }
266
270
 
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'
271
+ for (var i = 0; i < cases.length; i++) {
272
+ var c = cases[i];
273
+ var tests = kb.each(c, ui('for'), null, formDoc); // There can be multiple 'for'
273
274
 
274
- var match = false;
275
+ var match = false;
275
276
 
276
- for (var j = 0; j < tests.length; j++) {
277
- var _iterator = _createForOfIteratorHelper(values),
278
- _step;
277
+ for (var j = 0; j < tests.length; j++) {
278
+ var _iterator = _createForOfIteratorHelper(values),
279
+ _step;
279
280
 
280
- try {
281
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
282
- var value = _step.value;
283
- var test = tests[j];
281
+ try {
282
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
283
+ var value = _step.value;
284
+ var test = tests[j];
284
285
 
285
- if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
286
- match = true;
287
- }
286
+ if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
287
+ match = true;
288
288
  }
289
- } catch (err) {
290
- _iterator.e(err);
291
- } finally {
292
- _iterator.f();
293
289
  }
290
+ } catch (err) {
291
+ _iterator.e(err);
292
+ } finally {
293
+ _iterator.f();
294
294
  }
295
+ }
295
296
 
296
- if (match) {
297
- var _field3 = kb.the(c, ui('use'));
298
-
299
- if (!_field3) {
300
- box.appendChild((0, _error.errorMessageBlock)(dom, 'No "use" part for case in form ' + form));
301
- return box;
302
- } else {
303
- appendForm(dom, box, already, subject, _field3, dataDoc, callbackFunction);
304
- }
297
+ if (match) {
298
+ var _field3 = kb.the(c, ui('use'));
305
299
 
306
- break;
300
+ if (!_field3) {
301
+ box.appendChild((0, _error.errorMessageBlock)(dom, 'No "use" part for case in form ' + form));
302
+ return box;
303
+ } else {
304
+ appendForm(dom, box, already, subject, _field3, dataDoc, callbackFunction);
307
305
  }
306
+
307
+ break;
308
308
  }
309
309
  } // @@ Add box.refresh() to sync fields with values
310
310
 
@@ -354,9 +354,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
354
354
 
355
355
 
356
356
  function _addItem() {
357
- _addItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
357
+ _addItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
358
358
  var object, toBeInserted, msg;
359
- return _regenerator["default"].wrap(function _callee6$(_context6) {
359
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
360
360
  while (1) {
361
361
  switch (_context6.prev = _context6.next) {
362
362
  case 0:
@@ -419,9 +419,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
419
419
 
420
420
 
421
421
  function _deleteThisItem() {
422
- _deleteThisItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
422
+ _deleteThisItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
423
423
  var i, del;
424
- return _regenerator["default"].wrap(function _callee3$(_context3) {
424
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
425
425
  while (1) {
426
426
  switch (_context3.prev = _context3.next) {
427
427
  case 0:
@@ -494,9 +494,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
494
494
 
495
495
 
496
496
  function _moveThisItem() {
497
- _moveThisItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(event, upwards) {
497
+ _moveThisItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(event, upwards) {
498
498
  var i;
499
- return _regenerator["default"].wrap(function _callee4$(_context4) {
499
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
500
500
  while (1) {
501
501
  switch (_context4.prev = _context4.next) {
502
502
  case 0:
@@ -601,8 +601,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
601
601
  frame.style.gridTemplateColumns = 'auto 3em';
602
602
  frame.style.gridTemplateRows = '50% 50%';
603
603
  var moveUpButton = buttons.button(dom, _iconBase.icons.iconBase + 'noun_1369237.svg', 'Move Up', /*#__PURE__*/function () {
604
- var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event) {
605
- return _regenerator["default"].wrap(function _callee$(_context) {
604
+ var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(event) {
605
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
606
606
  while (1) {
607
607
  switch (_context.prev = _context.next) {
608
608
  case 0:
@@ -621,8 +621,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
621
621
  };
622
622
  }());
623
623
  var moveDownButton = buttons.button(dom, _iconBase.icons.iconBase + 'noun_1369241.svg', 'Move Down', /*#__PURE__*/function () {
624
- var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(event) {
625
- return _regenerator["default"].wrap(function _callee2$(_context2) {
624
+ var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(event) {
625
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
626
626
  while (1) {
627
627
  switch (_context2.prev = _context2.next) {
628
628
  case 0:
@@ -738,8 +738,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
738
738
  var prompt = dom.createElement('span');
739
739
  prompt.textContent = (values.length === 0 ? 'Add another ' : 'Add ') + multipleUIlabel;
740
740
  tail.addEventListener('click', /*#__PURE__*/function () {
741
- var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(_eventNotUsed) {
742
- return _regenerator["default"].wrap(function _callee5$(_context5) {
741
+ var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(_eventNotUsed) {
742
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
743
743
  while (1) {
744
744
  switch (_context5.prev = _context5.next) {
745
745
  case 0:
@@ -778,8 +778,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
778
778
  }
779
779
 
780
780
  function _saveListThenRefresh() {
781
- _saveListThenRefresh = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
782
- return _regenerator["default"].wrap(function _callee7$(_context7) {
781
+ _saveListThenRefresh = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
782
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
783
783
  while (1) {
784
784
  switch (_context7.prev = _context7.next) {
785
785
  case 0:
@@ -836,9 +836,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
836
836
  }
837
837
 
838
838
  function _asyncStuff() {
839
- _asyncStuff = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
839
+ _asyncStuff = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
840
840
  var extra, j;
841
- return _regenerator["default"].wrap(function _callee8$(_context8) {
841
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
842
842
  while (1) {
843
843
  switch (_context8.prev = _context8.next) {
844
844
  case 0:
@@ -1042,9 +1042,6 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1042
1042
  var kb = _solidLogic.store;
1043
1043
  var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
1044
1044
 
1045
- var uiMultipleInUse = false; // this signals to ui:choice that it is part of a ui:multiple
1046
-
1047
- var multiSelect = false;
1048
1045
  var p;
1049
1046
  var box = dom.createElement('div');
1050
1047
  box.setAttribute('class', 'choiceBox'); // Set flexDirection column?
@@ -1073,105 +1070,140 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1073
1070
 
1074
1071
  var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
1075
1072
 
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
- }
1089
-
1090
1073
  var opts = {
1091
1074
  form: form,
1092
1075
  subForm: subForm,
1093
- multiSelect: multiSelect,
1094
- firstSelectOptionText: firstSelectOptionText,
1095
- uiMultipleInUse: uiMultipleInUse,
1096
1076
  disambiguate: false
1097
1077
  };
1098
- possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1099
1078
 
1100
- for (var x in kb.findMembersNT(uiFrom)) {
1101
- possible.push(kb.fromNT(x));
1102
- } // Use rdfs
1079
+ function getSelectorOptions() {
1080
+ var possible = [];
1081
+ var possibleProperties;
1082
+ possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1103
1083
 
1084
+ for (var x in findMembersNT(kb, uiFrom, dataDoc)) {
1085
+ possible.push(kb.fromNT(x));
1086
+ } // Use rdfs
1104
1087
 
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
1088
 
1110
- } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1111
- possibleProperties = buttons.propertyTriage(kb);
1089
+ if (uiFrom.sameTerm(ns.rdfs('Class'))) {
1090
+ for (p in buttons.allClassURIs()) {
1091
+ possible.push(kb.sym(p));
1092
+ } // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
1112
1093
 
1113
- for (p in possibleProperties.op) {
1114
- possible.push(kb.fromNT(p));
1115
- }
1094
+ } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1095
+ possibleProperties = buttons.propertyTriage(kb);
1116
1096
 
1117
- for (p in possibleProperties.dp) {
1118
- possible.push(kb.fromNT(p));
1119
- }
1097
+ for (p in possibleProperties.op) {
1098
+ possible.push(kb.fromNT(p));
1099
+ }
1120
1100
 
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);
1101
+ for (p in possibleProperties.dp) {
1102
+ possible.push(kb.fromNT(p));
1103
+ }
1124
1104
 
1125
- for (p in possibleProperties.op) {
1126
- possible.push(kb.fromNT(p));
1127
- }
1105
+ opts.disambiguate = true; // This is a big class, and the labels won't be enough.
1106
+ } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
1107
+ possibleProperties = buttons.propertyTriage(kb);
1128
1108
 
1129
- opts.disambiguate = true;
1130
- } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1131
- possibleProperties = buttons.propertyTriage(kb);
1109
+ for (p in possibleProperties.op) {
1110
+ possible.push(kb.fromNT(p));
1111
+ }
1112
+
1113
+ opts.disambiguate = true;
1114
+ } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1115
+ possibleProperties = buttons.propertyTriage(kb);
1116
+
1117
+ for (p in possibleProperties.dp) {
1118
+ possible.push(kb.fromNT(p));
1119
+ }
1132
1120
 
1133
- for (p in possibleProperties.dp) {
1134
- possible.push(kb.fromNT(p));
1121
+ opts.disambiguate = true;
1135
1122
  }
1136
1123
 
1137
- opts.disambiguate = true;
1138
- }
1124
+ return possible; // return sortByLabel(possible)
1125
+ } // TODO: this checks for any occurrence, regardless of true or false setting
1139
1126
 
1140
- var sortedPossible = sortByLabel(possible); // TODO: this checks for any occurrence, regardless of true or false setting
1141
1127
 
1142
1128
  if (kb.any(form, ui('canMintNew'))) {
1143
1129
  opts.mint = '* Create new *'; // @@ could be better
1144
1130
  }
1145
1131
 
1146
- var selector = makeSelectForOptions(dom, kb, subject, property, sortedPossible, uiFrom, opts, dataDoc, callbackFunction);
1147
- rhs.appendChild(selector);
1148
- var object;
1132
+ var multiSelect = kb.any(form, ui('multiselect')); // Optional
1149
1133
 
1150
- if (selector.currentURI) {
1151
- object = $rdf.sym(selector.currentURI);
1152
- } else {
1153
- object = kb.any(subject, property);
1154
- }
1134
+ if (multiSelect) opts.multiSelect = true;
1135
+ var selector;
1155
1136
 
1156
- if (object && subForm) {
1157
- removeNextSiblingsAfterElement(selector);
1158
- addSubFormChoice(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
1159
- }
1137
+ rhs.refresh = function () {
1138
+ // from ui:property
1139
+ var selectedOptions = kb.each(subject, property, null, dataDoc).map(function (object) {
1140
+ return object.value;
1141
+ }); // from ui:from + ui:property
1160
1142
 
1161
- return box;
1162
- };
1163
- /**
1164
- * Removes all sibling elements after specified
1165
- * @param {HTMLElement} currentElement
1166
- * @private
1167
- */
1143
+ var possibleOptions = getSelectorOptions();
1144
+ possibleOptions.push(selectedOptions);
1145
+ possibleOptions = sortByLabel(possibleOptions);
1146
+ selector = makeSelectForChoice(dom, rhs, kb, subject, property, possibleOptions, selectedOptions, uiFrom, opts, dataDoc, callbackFunction);
1147
+ rhs.innerHTML = '';
1148
+ rhs.appendChild(selector);
1149
+
1150
+ if (multiSelect) {
1151
+ var multiSelectDiv = new _multiSelect.IconicMultiSelect({
1152
+ placeholder: selector.selected,
1153
+ select: selector,
1154
+ container: rhs,
1155
+ textField: 'textField',
1156
+ valueField: 'valueField'
1157
+ });
1158
+ multiSelectDiv.init();
1159
+ multiSelectDiv.subscribe(function (event) {
1160
+ if (event.action === 'REMOVE_OPTION') {
1161
+ selectedOptions = selectedOptions.filter(function (value) {
1162
+ return value !== event.value;
1163
+ });
1164
+ }
1168
1165
 
1166
+ if (event.action === 'CLEAR_ALL_OPTIONS') {
1167
+ selectedOptions = [];
1168
+ }
1169
1169
 
1170
- function removeNextSiblingsAfterElement(currentElement) {
1171
- while (currentElement.nextElementSibling) {
1172
- currentElement.nextElementSibling.remove();
1173
- }
1174
- }
1170
+ if (event.action === 'ADD_OPTION') {
1171
+ var stringValue = event.value + '';
1172
+
1173
+ if (stringValue.includes('Create new')) {
1174
+ var newObject = newThing(dataDoc);
1175
+ var is = [];
1176
+ is.push($rdf.st(subject, property, kb.sym(newObject), dataDoc));
1177
+ if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc));
1178
+
1179
+ if (subForm) {
1180
+ addSubFormChoice(dom, rhs, {}, $rdf.sym(newObject), subForm, dataDoc, function (ok, body) {
1181
+ if (ok) {
1182
+ kb.updater.update([], is, function (uri, success, errorBody) {
1183
+ if (!success) rhs.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
1184
+ });
1185
+ selectedOptions.push(newObject);
1186
+ if (callbackFunction) callbackFunction(ok, {
1187
+ widget: 'select',
1188
+ event: 'new'
1189
+ });
1190
+ } else {
1191
+ rhs.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
1192
+ }
1193
+ });
1194
+ }
1195
+ } else selectedOptions.push(event.value);
1196
+ }
1197
+
1198
+ selector.update(selectedOptions);
1199
+ });
1200
+ }
1201
+ };
1202
+
1203
+ rhs.refresh();
1204
+ if (selector && selector.refresh) selector.refresh();
1205
+ return box;
1206
+ };
1175
1207
 
1176
1208
  function addSubFormChoice(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction) {
1177
1209
  (0, _fieldFunction.fieldFunction)(dom, subForm)(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction);
@@ -1514,18 +1546,15 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1514
1546
  // @param subject - a term, the subject of the statement(s) being edited.
1515
1547
  // @param predicate - a term, the predicate of the statement(s) being edited
1516
1548
  // @param possible - a list of terms, the possible value the object can take
1517
- // @param options.multiSelect - Boolean - Whether more than one at a time is allowed
1518
- // @param options.firstSelectOptionText - a string to be displayed as the
1519
- // option for none selected (for non multiSelect)
1520
- // @param options.uiMultipleInUse - signals that the ui:choise is used with a ui:multiple
1521
- // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1549
+ // @param options.nullLabel - a string to be displayed as the
1550
+ // option for none selected (for non multiple)
1522
1551
  // @param options.subForm - If mint, then the form to be used for minting the new thing
1523
1552
  // @param dataDoc - The web document being edited
1524
1553
  // @param callbackFunction - takes (boolean ok, string errorBody)
1525
1554
  */
1526
1555
 
1527
1556
 
1528
- function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
1557
+ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
1529
1558
  log.debug('Select list length now ' + possible.length);
1530
1559
  var n = 0;
1531
1560
  var uris = {}; // Count them
@@ -1542,7 +1571,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1542
1571
  } // uris is now the set of possible options
1543
1572
 
1544
1573
 
1545
- if (n === 0 && !options.mint) {
1574
+ if (n === 0) {
1546
1575
  return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1547
1576
  }
1548
1577
 
@@ -1568,6 +1597,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1568
1597
  actual = getActual();
1569
1598
 
1570
1599
  var onChange = function onChange(_e) {
1600
+ select.disabled = true; // until data written back - gives user feedback too
1601
+
1571
1602
  var ds = [];
1572
1603
  var is = [];
1573
1604
 
@@ -1577,43 +1608,18 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1577
1608
  }
1578
1609
  };
1579
1610
 
1580
- var newObject;
1581
-
1582
1611
  for (var _i = 0; _i < select.options.length; _i++) {
1583
1612
  var opt = select.options[_i];
1584
-
1585
- if (opt.selected && opt.AJAR_mint) {
1586
- // not sure if this 'if' is used because I cannot find mintClass
1587
- if (options.mintClass) {
1588
- var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
1589
- if (!ok) {
1590
- callbackFunction(ok, body, {
1591
- change: 'new'
1592
- }); // @@ if ok, need some form of refresh of the select for the new thing
1593
- }
1594
- });
1595
- select.parentNode.appendChild(thisForm);
1596
- newObject = thisForm.AJAR_subject;
1597
- } else {
1598
- newObject = newThing(dataDoc);
1599
- }
1600
-
1601
- is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
1602
- if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc)); // not sure if this 'if' is used because I cannot find mintStatementsFun
1603
-
1604
- if (options.mintStatementsFun) {
1605
- is = is.concat(options.mintStatementsFun(newObject));
1606
- }
1607
-
1608
- select.currentURI = newObject;
1609
- }
1610
-
1611
1613
  if (!opt.AJAR_uri) continue; // a prompt or mint
1612
1614
 
1613
1615
  if (opt.selected && !(opt.AJAR_uri in actual)) {
1614
1616
  // new class
1615
1617
  is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
1616
- select.currentURI = opt.AJAR_uri;
1618
+ }
1619
+
1620
+ if (!opt.selected && opt.AJAR_uri in actual) {
1621
+ // old class
1622
+ removeValue(kb.sym(opt.AJAR_uri));
1617
1623
  }
1618
1624
 
1619
1625
  if (opt.selected) select.currentURI = opt.AJAR_uri;
@@ -1633,29 +1639,25 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1633
1639
  sel = sel.superSelect;
1634
1640
  }
1635
1641
 
1636
- log.info('selectForOptions: data doc = ' + dataDoc); // refresh subForm
1642
+ log.info('selectForOptions: data doc = ' + dataDoc);
1643
+ kb.updater.update(ds, is, function (uri, ok, body) {
1644
+ actual = getActual(); // refresh
1637
1645
 
1638
- removeNextSiblingsAfterElement(select);
1639
- addSubFormChoice(dom, select.parentNode, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
1640
1646
  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
- });
1647
+ select.disabled = false; // data written back
1650
1648
  } else {
1651
- select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
1649
+ return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1652
1650
  }
1651
+
1652
+ if (callbackFunction) callbackFunction(ok, {
1653
+ widget: 'select',
1654
+ event: 'change'
1655
+ });
1653
1656
  });
1654
1657
  };
1655
1658
 
1656
1659
  var select = dom.createElement('select');
1657
1660
  select.setAttribute('style', style.formSelectSTyle);
1658
- if (options.multiSelect) select.setAttribute('multiSelect', 'true');
1659
1661
  select.currentURI = null;
1660
1662
 
1661
1663
  select.refresh = function () {
@@ -1698,22 +1700,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1698
1700
  select.appendChild(option);
1699
1701
  }
1700
1702
 
1701
- if (editable && options.mint) {
1702
- var mint = dom.createElement('option');
1703
- mint.appendChild(dom.createTextNode(options.mint));
1704
- mint.AJAR_mint = true; // Flag it
1705
-
1706
- select.insertBefore(mint, select.firstChild);
1707
- }
1708
-
1709
- if (!select.currentURI && options.uiMultipleInUse) {
1703
+ if (!select.currentURI) {
1710
1704
  var prompt = dom.createElement('option');
1711
- prompt.appendChild(dom.createTextNode(options.firstSelectOptionText));
1712
- prompt.disabled = true;
1713
- prompt.value = true;
1714
- prompt.hidden = true;
1715
- prompt.selected = true;
1705
+ prompt.appendChild(dom.createTextNode(options.nullLabel));
1716
1706
  select.insertBefore(prompt, select.firstChild);
1707
+ prompt.selected = true;
1717
1708
  }
1718
1709
 
1719
1710
  if (editable) {
@@ -1732,27 +1723,16 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1732
1723
  function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1733
1724
  var du = kb.any(category, ns.owl('disjointUnionOf'));
1734
1725
  var subs;
1735
- var multiSelect = false;
1736
1726
 
1737
1727
  if (!du) {
1738
1728
  subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
1739
- multiSelect = true;
1740
1729
  } else {
1741
1730
  subs = du.elements;
1742
1731
  }
1743
1732
 
1744
1733
  log.debug('Select list length ' + subs.length);
1745
-
1746
- if (subs.length === 0) {
1747
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiSelect ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1748
- }
1749
-
1750
- if (subs.length === 1) {
1751
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiSelect ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
1752
- }
1753
-
1754
- return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, null, {
1755
- multiSelect: multiSelect
1734
+ return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, {
1735
+ nullLabel: '* Select type *'
1756
1736
  }, dataDoc, callbackFunction);
1757
1737
  }
1758
1738
  /** Make SELECT element to select subclasses recurively
@@ -1786,8 +1766,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
1786
1766
  function onChange(ok, body) {
1787
1767
  if (ok) update();
1788
1768
  callbackFunction(ok, body);
1789
- } // eslint-disable-next-line prefer-const
1790
-
1769
+ }
1791
1770
 
1792
1771
  var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
1793
1772
  container.appendChild(select);
@@ -1942,4 +1921,326 @@ function newThing(doc) {
1942
1921
  var now = new Date();
1943
1922
  return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
1944
1923
  }
1924
+ /** Make SELECT element to select options
1925
+ //
1926
+ // @param subject - a term, the subject of the statement(s) being edited.
1927
+ // @param predicate - a term, the predicate of the statement(s) being edited
1928
+ // @param possible - a list of terms, the possible value the object can take
1929
+ // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1930
+ // @param options.subForm - If mint, then the form to be used for minting the new thing
1931
+ // @param dataDoc - The web document being edited
1932
+ // @param callbackFunction - takes (boolean ok, string errorBody)
1933
+ */
1934
+
1935
+
1936
+ function makeSelectForChoice(dom, container, kb, subject, predicate, inputPossibleOptions, selectedOptions, uiFrom, options, dataDoc, callbackFunction) {
1937
+ var optionsFromClassUIfrom = {}; // Count them
1938
+
1939
+ var editable = kb.updater.editable(dataDoc.uri);
1940
+
1941
+ for (var i = 0; i < inputPossibleOptions.length; i++) {
1942
+ var sub = inputPossibleOptions[i]; // @@ Maybe; make this so it works with blank nodes too
1943
+ // if (!sub.uri) debug.warn(`makeSelectForChoice: option does not have an uri: ${sub}, with predicate: ${predicate}`)
1944
+
1945
+ if (!sub.uri || sub.uri in optionsFromClassUIfrom) continue;
1946
+ optionsFromClassUIfrom[sub.uri] = true;
1947
+ }
1948
+
1949
+ var isEmpty = Object.keys(optionsFromClassUIfrom).length === 0;
1950
+
1951
+ if (isEmpty && !options.mint) {
1952
+ return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1953
+ }
1954
+
1955
+ log.debug('makeSelectForChoice: dataDoc=' + dataDoc);
1956
+
1957
+ function createDefaultSelectOptionText() {
1958
+ var firstSelectOptionText = '--- choice ---';
1959
+
1960
+ if (predicate && !(predicate.termType === 'BlankNode')) {
1961
+ firstSelectOptionText = '* Select for property: ' + utils.label(predicate) + ' *';
1962
+ }
1963
+
1964
+ if (subject && !(subject.termType === 'BlankNode')) {
1965
+ firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *';
1966
+ }
1967
+
1968
+ return firstSelectOptionText;
1969
+ }
1970
+
1971
+ function createDefaultSelectOption() {
1972
+ var option = dom.createElement('option');
1973
+ option.appendChild(dom.createTextNode(createDefaultSelectOptionText()));
1974
+ option.disabled = true;
1975
+ option.value = true;
1976
+ option.hidden = true;
1977
+ option.selected = true;
1978
+ return option;
1979
+ }
1980
+
1981
+ var onChange = function onChange(_e) {
1982
+ container.removeChild(container.lastChild);
1983
+ select.refresh();
1984
+ };
1985
+
1986
+ var select = dom.createElement('select');
1987
+ select.setAttribute('style', style.formSelectSTyle);
1988
+ select.setAttribute('id', 'formSelect');
1989
+ select.currentURI = null;
1990
+
1991
+ for (var uri in optionsFromClassUIfrom) {
1992
+ select.appendChild(createOption(uri));
1993
+ }
1994
+
1995
+ if (editable && options.mint) {
1996
+ var mint = dom.createElement('option');
1997
+ mint.appendChild(dom.createTextNode(options.mint));
1998
+ mint.AJAR_mint = true; // Flag it
1999
+
2000
+ select.insertBefore(mint, select.firstChild);
2001
+ }
2002
+
2003
+ if (select.children.length === 0) select.insertBefore(createDefaultSelectOption(), select.firstChild);
2004
+
2005
+ select.update = function (newSelectedOptions) {
2006
+ selectedOptions = newSelectedOptions;
2007
+ var ds = [];
2008
+ var is = [];
2009
+
2010
+ var removeValue = function removeValue(t) {
2011
+ if (kb.holds(subject, predicate, t, dataDoc)) {
2012
+ ds.push($rdf.st(subject, predicate, t, dataDoc));
2013
+ }
2014
+ };
2015
+
2016
+ var addValue = function addValue(t) {
2017
+ if (!kb.holds(subject, predicate, t, dataDoc)) {
2018
+ is.push($rdf.st(subject, predicate, t, dataDoc)); // console.log("----value added " + t)
2019
+ }
2020
+
2021
+ if (uiFrom && !kb.holds(t, ns.rdf('type'), kb.sym(uiFrom), dataDoc)) {
2022
+ is.push($rdf.st(t, ns.rdf('type'), kb.sym(uiFrom), dataDoc)); // console.log("----added type to value " + uiFrom)
2023
+ }
2024
+ };
2025
+
2026
+ var existingValues = kb.each(subject, predicate, null, dataDoc).map(function (object) {
2027
+ return object.value;
2028
+ });
2029
+
2030
+ var _iterator2 = _createForOfIteratorHelper(existingValues),
2031
+ _step2;
2032
+
2033
+ try {
2034
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
2035
+ var value = _step2.value;
2036
+ if (!containsObject(value, selectedOptions)) removeValue($rdf.sym(value));
2037
+ }
2038
+ } catch (err) {
2039
+ _iterator2.e(err);
2040
+ } finally {
2041
+ _iterator2.f();
2042
+ }
2043
+
2044
+ var _iterator3 = _createForOfIteratorHelper(selectedOptions),
2045
+ _step3;
2046
+
2047
+ try {
2048
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
2049
+ var _value = _step3.value;
2050
+ if (!(_value in existingValues)) addValue($rdf.sym(_value));
2051
+ }
2052
+ } catch (err) {
2053
+ _iterator3.e(err);
2054
+ } finally {
2055
+ _iterator3.f();
2056
+ }
2057
+
2058
+ kb.updater.update(ds, is, function (uri, ok, body) {
2059
+ if (!ok) return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
2060
+ select.refresh();
2061
+ if (callbackFunction) callbackFunction(ok, {
2062
+ widget: 'select',
2063
+ event: 'change'
2064
+ });
2065
+ });
2066
+ };
2067
+
2068
+ select.refresh = function () {
2069
+ select.disabled = true; // unlocked any conflict we had got into
2070
+
2071
+ var is = [];
2072
+ var newObject;
2073
+
2074
+ for (var _i3 = 0; _i3 < select.options.length; _i3++) {
2075
+ var opt = select.options[_i3];
2076
+
2077
+ if (opt.selected && opt.AJAR_mint) {
2078
+ // not sure if this 'if' is used because I cannot find mintClass
2079
+ if (options.mintClass) {
2080
+ var thisForm = promptForNew(dom, kb, subject, predicate, uiFrom, options.subForm, dataDoc, function (ok, body) {
2081
+ if (!ok) {
2082
+ callbackFunction(ok, body, {
2083
+ change: 'new'
2084
+ }); // @@ if ok, need some form of refresh of the select for the new thing
2085
+ }
2086
+ });
2087
+ select.parentNode.appendChild(thisForm);
2088
+ newObject = thisForm.AJAR_subject;
2089
+ } else {
2090
+ newObject = newThing(dataDoc);
2091
+ }
2092
+
2093
+ is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
2094
+ 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
2095
+
2096
+ if (options.mintStatementsFun) {
2097
+ is = is.concat(options.mintStatementsFun(newObject));
2098
+ }
2099
+
2100
+ select.currentURI = newObject;
2101
+ }
2102
+
2103
+ if (!opt.AJAR_uri) continue; // a prompt or mint
2104
+
2105
+ if (opt.selected && containsObject(opt.AJAR_uri, selectedOptions)) {
2106
+ select.currentURI = opt.AJAR_uri;
2107
+ }
2108
+
2109
+ if (!containsObject(opt.AJAR_uri, selectedOptions)) opt.removeAttribute('selected');
2110
+ if (containsObject(opt.AJAR_uri, selectedOptions)) opt.setAttribute('selected', 'true');
2111
+ }
2112
+
2113
+ log.info('selectForOptions: data doc = ' + dataDoc);
2114
+
2115
+ if (select.currentURI && options.subForm && !options.multiSelect) {
2116
+ addSubFormChoice(dom, container, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
2117
+ if (ok) {
2118
+ kb.updater.update([], is, function (uri, success, errorBody) {
2119
+ if (!success) container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
2120
+ });
2121
+ if (callbackFunction) callbackFunction(ok, {
2122
+ widget: 'select',
2123
+ event: 'new'
2124
+ });
2125
+ } else {
2126
+ container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
2127
+ }
2128
+ });
2129
+ }
2130
+
2131
+ select.disabled = false;
2132
+ };
2133
+
2134
+ function createOption(uri) {
2135
+ var option = dom.createElement('option');
2136
+ var c = kb.sym(uri);
2137
+ var label;
2138
+
2139
+ if (options.disambiguate) {
2140
+ label = utils.labelWithOntology(c, true); // Init. cap
2141
+ } else {
2142
+ label = utils.label(c, true);
2143
+ }
2144
+
2145
+ option.appendChild(dom.createTextNode(label)); // Init.
2146
+
2147
+ option.setAttribute('value', uri);
2148
+ var backgroundColor = kb.any(c, kb.sym('http://www.w3.org/ns/ui#backgroundColor'));
2149
+
2150
+ if (backgroundColor) {
2151
+ option.setAttribute('style', 'background-color: ' + backgroundColor.value + '; ');
2152
+ }
2153
+
2154
+ option.AJAR_uri = uri;
2155
+
2156
+ if (containsObject(c.value, selectedOptions)) {
2157
+ option.setAttribute('selected', 'true');
2158
+ }
2159
+
2160
+ return option;
2161
+ }
2162
+
2163
+ if (editable) {
2164
+ select.addEventListener('change', onChange, false);
2165
+ }
2166
+
2167
+ return select;
2168
+ } // makeSelectForChoice
2169
+
2170
+
2171
+ function containsObject(obj, list) {
2172
+ var i;
2173
+
2174
+ for (i = 0; i < list.length; i++) {
2175
+ if (list[i] === obj) {
2176
+ return true;
2177
+ }
2178
+ }
2179
+
2180
+ return false;
2181
+ } // This functions replaces the findMembersNT (thisClass) from rdflib until we fix: https://github.com/linkeddata/rdflib.js/issues/565
2182
+
2183
+ /**
2184
+ * For anything which has thisClass (or any subclass) as its type,
2185
+ * or is the object of something which has thisClass (or any subclass) as its range,
2186
+ * or subject of something which has thisClass (or any subclass) as its domain
2187
+ * We don't bother doing subproperty (yet?) as it doesn't seem to be used
2188
+ * much.
2189
+ * Get all the Classes of which we can RDFS-infer the subject is a member
2190
+ * @return a hash of URIs
2191
+ */
2192
+
2193
+
2194
+ function findMembersNT(store, thisClass, quad) {
2195
+ var len2;
2196
+ var len4;
2197
+ var m;
2198
+ var pred;
2199
+ var ref1;
2200
+ var ref2;
2201
+ var ref3;
2202
+ var ref4;
2203
+ var ref5;
2204
+ var st;
2205
+ var u;
2206
+ var seeds = {};
2207
+ seeds[thisClass.toNT()] = true;
2208
+ var members = {};
2209
+ var ref = store.transitiveClosure(seeds, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#subClassOf'), true);
2210
+
2211
+ for (var t in ref) {
2212
+ ref1 = store.statementsMatching(null, store.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), store.fromNT(t), quad);
2213
+
2214
+ for (var i = 0, len = ref1.length; i < len; i++) {
2215
+ st = ref1[i];
2216
+ members[st.subject.toNT()] = st;
2217
+ }
2218
+
2219
+ ref2 = store.each(null, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#domain'), store.fromNT(t), quad);
2220
+
2221
+ for (var l = 0, len1 = ref2.length; l < len1; l++) {
2222
+ pred = ref2[l];
2223
+ ref3 = store.statementsMatching(null, pred, null, quad);
2224
+
2225
+ for (m = 0, len2 = ref3.length; m < len2; m++) {
2226
+ st = ref3[m];
2227
+ members[st.subject.toNT()] = st;
2228
+ }
2229
+ }
2230
+
2231
+ ref4 = store.each(null, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#range'), store.fromNT(t), quad);
2232
+
2233
+ for (var q = 0, len3 = ref4.length; q < len3; q++) {
2234
+ pred = ref4[q];
2235
+ ref5 = store.statementsMatching(null, pred, null, quad);
2236
+
2237
+ for (u = 0, len4 = ref5.length; u < len4; u++) {
2238
+ st = ref5[u];
2239
+ members[st.object.toNT()] = st;
2240
+ }
2241
+ }
2242
+ }
2243
+
2244
+ return members;
2245
+ }
1945
2246
  //# sourceMappingURL=forms.js.map