solid-ui 2.4.22-0511f5d1 → 2.4.22-0686f42e

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 (109) hide show
  1. package/README.md +23 -58
  2. package/dist/main.js +2011 -1137
  3. package/dist/main.js.map +1 -1
  4. package/lib/acl/access-controller.js +9 -14
  5. package/lib/acl/access-controller.js.map +1 -1
  6. package/lib/acl/access-groups.js +10 -15
  7. package/lib/acl/access-groups.js.map +1 -1
  8. package/lib/acl/acl-control.js +9 -13
  9. package/lib/acl/acl-control.js.map +1 -1
  10. package/lib/acl/acl.js +7 -11
  11. package/lib/acl/acl.js.map +1 -1
  12. package/lib/acl/add-agent-buttons.js +13 -19
  13. package/lib/acl/add-agent-buttons.js.map +1 -1
  14. package/lib/acl/index.js.map +1 -1
  15. package/lib/acl/styles.js.map +1 -1
  16. package/lib/acl/types.js.map +1 -1
  17. package/lib/chat/bookmarks.js +14 -19
  18. package/lib/chat/bookmarks.js.map +1 -1
  19. package/lib/chat/chatLogic.js +9 -15
  20. package/lib/chat/chatLogic.js.map +1 -1
  21. package/lib/chat/dateFolder.js +12 -17
  22. package/lib/chat/dateFolder.js.map +1 -1
  23. package/lib/chat/infinite.js +29 -37
  24. package/lib/chat/infinite.js.map +1 -1
  25. package/lib/chat/message.js +14 -14
  26. package/lib/chat/message.js.map +1 -1
  27. package/lib/chat/messageTools.js +10 -23
  28. package/lib/chat/messageTools.js.map +1 -1
  29. package/lib/chat/thread.js +4 -9
  30. package/lib/chat/thread.js.map +1 -1
  31. package/lib/create/create.js.map +1 -1
  32. package/lib/create/index.js.map +1 -1
  33. package/lib/create/types.js.map +1 -1
  34. package/lib/debug.js.map +1 -1
  35. package/lib/folders.js.map +1 -1
  36. package/lib/footer/index.js +8 -10
  37. package/lib/footer/index.js.map +1 -1
  38. package/lib/footer/styleMap.js.map +1 -1
  39. package/lib/header/empty-profile.js.map +1 -1
  40. package/lib/header/index.js +9 -17
  41. package/lib/header/index.js.map +1 -1
  42. package/lib/header/styleMap.js.map +1 -1
  43. package/lib/iconBase.js.map +1 -1
  44. package/lib/icons/solid_logo.js.map +1 -1
  45. package/lib/index.js.map +1 -1
  46. package/lib/jss/index.js.map +1 -1
  47. package/lib/log.js.map +1 -1
  48. package/lib/login/login.js +21 -63
  49. package/lib/login/login.js.map +1 -1
  50. package/lib/matrix/index.js.map +1 -1
  51. package/lib/matrix/matrix.js.map +1 -1
  52. package/lib/matrix/types.js.map +1 -1
  53. package/lib/media/index.js.map +1 -1
  54. package/lib/media/media-capture.js +4 -20
  55. package/lib/media/media-capture.js.map +1 -1
  56. package/lib/messageArea.js.map +1 -1
  57. package/lib/noun_Camera_1618446_000000.js.map +1 -1
  58. package/lib/ns.js.map +1 -1
  59. package/lib/pad.js.map +1 -1
  60. package/lib/participation.js.map +1 -1
  61. package/lib/preferences.js.map +1 -1
  62. package/lib/signup/config-default.js.map +1 -1
  63. package/lib/signup/signup.js.map +1 -1
  64. package/lib/stories/decorators.js.map +1 -1
  65. package/lib/style.js.map +1 -1
  66. package/lib/style_multiSelect.js +67 -0
  67. package/lib/style_multiSelect.js.map +1 -0
  68. package/lib/table.js.map +1 -1
  69. package/lib/tabs.d.ts +1 -1
  70. package/lib/tabs.d.ts.map +1 -1
  71. package/lib/tabs.js +34 -21
  72. package/lib/tabs.js.map +1 -1
  73. package/lib/typings.d.js.map +1 -1
  74. package/lib/utils/headerFooterHelpers.js +5 -7
  75. package/lib/utils/headerFooterHelpers.js.map +1 -1
  76. package/lib/utils/index.js.map +1 -1
  77. package/lib/utils/label.js +1 -1
  78. package/lib/utils/label.js.map +1 -1
  79. package/lib/versionInfo.js +6 -6
  80. package/lib/versionInfo.js.map +1 -1
  81. package/lib/widgets/buttons/iconLinks.js.map +1 -1
  82. package/lib/widgets/buttons.d.ts.map +1 -1
  83. package/lib/widgets/buttons.js +2 -0
  84. package/lib/widgets/buttons.js.map +1 -1
  85. package/lib/widgets/dragAndDrop.js.map +1 -1
  86. package/lib/widgets/error.js.map +1 -1
  87. package/lib/widgets/forms/autocomplete/autocompleteBar.js +17 -15
  88. package/lib/widgets/forms/autocomplete/autocompleteBar.js.map +1 -1
  89. package/lib/widgets/forms/autocomplete/autocompleteField.js +5 -8
  90. package/lib/widgets/forms/autocomplete/autocompleteField.js.map +1 -1
  91. package/lib/widgets/forms/autocomplete/autocompletePicker.js +21 -19
  92. package/lib/widgets/forms/autocomplete/autocompletePicker.js.map +1 -1
  93. package/lib/widgets/forms/autocomplete/language.js +8 -15
  94. package/lib/widgets/forms/autocomplete/language.js.map +1 -1
  95. package/lib/widgets/forms/autocomplete/publicData.js +22 -27
  96. package/lib/widgets/forms/autocomplete/publicData.js.map +1 -1
  97. package/lib/widgets/forms/basic.js.map +1 -1
  98. package/lib/widgets/forms/comment.js.map +1 -1
  99. package/lib/widgets/forms/fieldFunction.js.map +1 -1
  100. package/lib/widgets/forms/fieldParams.js.map +1 -1
  101. package/lib/widgets/forms/formStyle.js.map +1 -1
  102. package/lib/widgets/forms.js +457 -177
  103. package/lib/widgets/forms.js.map +1 -1
  104. package/lib/widgets/index.js.map +1 -1
  105. package/lib/widgets/multiSelect.js +784 -0
  106. package/lib/widgets/multiSelect.js.map +1 -0
  107. package/lib/widgets/peoplePicker.js.map +1 -1
  108. package/lib/widgets/widgetHelpers.js.map +1 -1
  109. package/package.json +7 -4
@@ -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,14 +158,16 @@ _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]) {
161
165
  // been there done that
162
- box.appendChild(dom.createTextNode('Group: see above ' + key));
163
- var plist = [$rdf.st(subject, ns.owl('sameAs'), subject)]; // @@ need prev subject
166
+ box.appendChild(dom.createTextNode('Group: see above ' + key)); // TODO fix dependency cycle to solid-panes by calling outlineManager
167
+ // const plist = [$rdf.st(subject, ns.owl('sameAs'), subject)] // @@ need prev subject
168
+ // dom.outlineManager.appendPropertyTRs(box, plist)
169
+ // dom.appendChild(plist)
164
170
 
165
- dom.outlineManager.appendPropertyTRs(box, plist);
166
171
  return box;
167
172
  }
168
173
 
@@ -263,47 +268,43 @@ _fieldFunction.field[ns.ui('Options').uri] = function (dom, container, already,
263
268
  values = kb.each(subject, dependingOn);
264
269
  }
265
270
 
266
- if (values.length === 0) {
267
- box.appendChild((0, _error.errorMessageBlock)(dom, "Can't select subform as no value of: " + dependingOn));
268
- } else {
269
- for (var i = 0; i < cases.length; i++) {
270
- var c = cases[i];
271
- var tests = kb.each(c, ui('for'), null, formDoc); // There can be multiple 'for'
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'
272
274
 
273
- var match = false;
275
+ var match = false;
274
276
 
275
- for (var j = 0; j < tests.length; j++) {
276
- var _iterator = _createForOfIteratorHelper(values),
277
- _step;
277
+ for (var j = 0; j < tests.length; j++) {
278
+ var _iterator = _createForOfIteratorHelper(values),
279
+ _step;
278
280
 
279
- try {
280
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
281
- var value = _step.value;
282
- var test = tests[j];
281
+ try {
282
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
283
+ var value = _step.value;
284
+ var test = tests[j];
283
285
 
284
- if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
285
- match = true;
286
- }
286
+ if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
287
+ match = true;
287
288
  }
288
- } catch (err) {
289
- _iterator.e(err);
290
- } finally {
291
- _iterator.f();
292
289
  }
290
+ } catch (err) {
291
+ _iterator.e(err);
292
+ } finally {
293
+ _iterator.f();
293
294
  }
295
+ }
294
296
 
295
- if (match) {
296
- var _field3 = kb.the(c, ui('use'));
297
-
298
- if (!_field3) {
299
- box.appendChild((0, _error.errorMessageBlock)(dom, 'No "use" part for case in form ' + form));
300
- return box;
301
- } else {
302
- appendForm(dom, box, already, subject, _field3, dataDoc, callbackFunction);
303
- }
297
+ if (match) {
298
+ var _field3 = kb.the(c, ui('use'));
304
299
 
305
- 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);
306
305
  }
306
+
307
+ break;
307
308
  }
308
309
  } // @@ Add box.refresh() to sync fields with values
309
310
 
@@ -353,9 +354,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
353
354
 
354
355
 
355
356
  function _addItem() {
356
- _addItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
357
+ _addItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
357
358
  var object, toBeInserted, msg;
358
- return _regenerator["default"].wrap(function _callee6$(_context6) {
359
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
359
360
  while (1) {
360
361
  switch (_context6.prev = _context6.next) {
361
362
  case 0:
@@ -418,9 +419,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
418
419
 
419
420
 
420
421
  function _deleteThisItem() {
421
- _deleteThisItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
422
+ _deleteThisItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
422
423
  var i, del;
423
- return _regenerator["default"].wrap(function _callee3$(_context3) {
424
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
424
425
  while (1) {
425
426
  switch (_context3.prev = _context3.next) {
426
427
  case 0:
@@ -493,9 +494,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
493
494
 
494
495
 
495
496
  function _moveThisItem() {
496
- _moveThisItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(event, upwards) {
497
+ _moveThisItem = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(event, upwards) {
497
498
  var i;
498
- return _regenerator["default"].wrap(function _callee4$(_context4) {
499
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
499
500
  while (1) {
500
501
  switch (_context4.prev = _context4.next) {
501
502
  case 0:
@@ -591,7 +592,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
591
592
  // delete button and move buttons
592
593
 
593
594
  if (kb.updater.editable(dataDoc.uri)) {
594
- buttons.deleteButtonWithCheck(dom, subField, utils.label(property), deleteThisItem);
595
+ buttons.deleteButtonWithCheck(dom, subField, multipleUIlabel, deleteThisItem);
595
596
 
596
597
  if (ordered) {
597
598
  // Add controsl in a frame
@@ -600,8 +601,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
600
601
  frame.style.gridTemplateColumns = 'auto 3em';
601
602
  frame.style.gridTemplateRows = '50% 50%';
602
603
  var moveUpButton = buttons.button(dom, _iconBase.icons.iconBase + 'noun_1369237.svg', 'Move Up', /*#__PURE__*/function () {
603
- var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event) {
604
- 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) {
605
606
  while (1) {
606
607
  switch (_context.prev = _context.next) {
607
608
  case 0:
@@ -620,8 +621,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
620
621
  };
621
622
  }());
622
623
  var moveDownButton = buttons.button(dom, _iconBase.icons.iconBase + 'noun_1369241.svg', 'Move Down', /*#__PURE__*/function () {
623
- var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(event) {
624
- 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) {
625
626
  while (1) {
626
627
  switch (_context2.prev = _context2.next) {
627
628
  case 0:
@@ -642,7 +643,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
642
643
 
643
644
  var _shim = dom.createElement('div');
644
645
 
645
- _shim.appendChild(subField); // Subfield has its own laytout
646
+ _shim.appendChild(subField); // Subfield has its own layout
646
647
 
647
648
 
648
649
  frame.appendChild(_shim);
@@ -691,6 +692,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
691
692
  return shim;
692
693
  }
693
694
 
695
+ var multipleUIlabel = kb.any(form, ui('label'));
696
+ if (!multipleUIlabel) multipleUIlabel = utils.label(property);
694
697
  var min = kb.any(form, ui('min')); // This is the minimum number -- default 0
695
698
 
696
699
  min = min ? 0 + min.value : 0;
@@ -731,13 +734,12 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
731
734
  img.setAttribute('src', plusIconURI); // plus sign
732
735
 
733
736
  img.setAttribute('style', 'margin: 0.2em; width: 1.5em; height:1.5em');
734
- img.title = 'Click to add one or more ' + utils.predicateLabel(property, reverse);
735
- var prompt = tail.appendChild(dom.createElement('span'));
736
- prompt.textContent = (values.length === 0 ? 'Add one or more ' : 'Add more ') + utils.predicateLabel(property, reverse); // utils.label(property)
737
-
737
+ img.title = 'Click to add another ' + multipleUIlabel;
738
+ var prompt = dom.createElement('span');
739
+ prompt.textContent = (values.length === 0 ? 'Add another ' : 'Add ') + multipleUIlabel;
738
740
  tail.addEventListener('click', /*#__PURE__*/function () {
739
- var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(_eventNotUsed) {
740
- 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) {
741
743
  while (1) {
742
744
  switch (_context5.prev = _context5.next) {
743
745
  case 0:
@@ -756,6 +758,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
756
758
  return _ref3.apply(this, arguments);
757
759
  };
758
760
  }(), true);
761
+ tail.appendChild(prompt);
759
762
  }
760
763
 
761
764
  function createListIfNecessary() {
@@ -775,8 +778,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
775
778
  }
776
779
 
777
780
  function _saveListThenRefresh() {
778
- _saveListThenRefresh = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
779
- return _regenerator["default"].wrap(function _callee7$(_context7) {
781
+ _saveListThenRefresh = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
782
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
780
783
  while (1) {
781
784
  switch (_context7.prev = _context7.next) {
782
785
  case 0:
@@ -833,9 +836,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
833
836
  }
834
837
 
835
838
  function _asyncStuff() {
836
- _asyncStuff = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
839
+ _asyncStuff = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
837
840
  var extra, j;
838
- return _regenerator["default"].wrap(function _callee8$(_context8) {
841
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
839
842
  while (1) {
840
843
  switch (_context8.prev = _context8.next) {
841
844
  case 0:
@@ -1017,28 +1020,38 @@ _fieldFunction.field[ns.ui('Classifier').uri] = function (dom, container, alread
1017
1020
  **
1018
1021
  ** Not nested. Generates a link to something from a given class.
1019
1022
  ** Optional subform for the thing selected.
1023
+ ** Generates a subForm based on a ui:use form
1024
+ ** Will look like:
1025
+ ** <div id=dropDownDiv>
1026
+ ** <div id=labelOfDropDown>
1027
+ ** <div id=selectDiv>
1028
+ ** <select id=dropDownSelect>
1029
+ ** <option> ....
1030
+ ** <subForm>
1020
1031
  ** Alternative implementatons caould be:
1021
1032
  ** -- pop-up menu (as here)
1022
1033
  ** -- radio buttons
1023
1034
  ** -- auto-complete typing
1024
1035
  **
1025
- ** Todo: Deal with multiple. Maybe merge with multiple code.
1036
+ ** TODO: according to ontology ui:choice can also have ns.ui('default') - this is not implemented yet
1026
1037
  */
1027
1038
 
1028
1039
 
1029
1040
  _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
1030
1041
  var ui = ns.ui;
1031
1042
  var kb = _solidLogic.store;
1032
- var multiple = false;
1033
1043
  var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
1034
1044
 
1035
1045
  var p;
1036
- var box = dom.createElement('div'); // Set flexDirection column?
1046
+ var box = dom.createElement('div');
1047
+ box.setAttribute('class', 'choiceBox'); // Set flexDirection column?
1037
1048
 
1038
1049
  if (container) container.appendChild(box);
1039
1050
  var lhs = dom.createElement('div');
1051
+ lhs.setAttribute('class', 'formFieldName choiceBox-label');
1040
1052
  box.appendChild(lhs);
1041
1053
  var rhs = dom.createElement('div');
1054
+ rhs.setAttribute('class', 'formFieldValue choiceBox-selectBox');
1042
1055
  box.appendChild(rhs);
1043
1056
  var property = kb.any(form, ui('property'));
1044
1057
 
@@ -1047,9 +1060,9 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1047
1060
  }
1048
1061
 
1049
1062
  lhs.appendChild((0, _basic.fieldLabel)(dom, property, form));
1050
- var from = kb.any(form, ui('from'));
1063
+ var uiFrom = kb.any(form, ui('from'));
1051
1064
 
1052
- if (!from) {
1065
+ if (!uiFrom) {
1053
1066
  return (0, _error.errorMessageBlock)(dom, "No 'from' for Choice: " + form);
1054
1067
  }
1055
1068
 
@@ -1057,77 +1070,144 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1057
1070
 
1058
1071
  var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
1059
1072
 
1060
- var possible = [];
1061
- var possibleProperties;
1062
- var nullLabel = '--' + utils.label(property) + '-?';
1063
1073
  var opts = {
1064
1074
  form: form,
1065
- multiple: multiple,
1066
- nullLabel: nullLabel,
1075
+ subForm: subForm,
1067
1076
  disambiguate: false
1068
1077
  };
1069
- possible = kb.each(undefined, ns.rdf('type'), from, formDoc);
1070
1078
 
1071
- for (var x in kb.findMembersNT(from)) {
1072
- possible.push(kb.fromNT(x));
1073
- } // Use rdfs
1079
+ function getSelectorOptions() {
1080
+ var possible = [];
1081
+ var possibleProperties;
1082
+ possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1074
1083
 
1084
+ for (var x in kb.findMembersNT(uiFrom)) {
1085
+ possible.push(kb.fromNT(x));
1086
+ } // Use rdfs
1075
1087
 
1076
- if (from.sameTerm(ns.rdfs('Class'))) {
1077
- for (p in buttons.allClassURIs()) {
1078
- possible.push(kb.sym(p));
1079
- } // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
1080
1088
 
1081
- } else if (from.sameTerm(ns.rdf('Property'))) {
1082
- 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)
1083
1093
 
1084
- for (p in possibleProperties.op) {
1085
- possible.push(kb.fromNT(p));
1086
- }
1094
+ } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1095
+ possibleProperties = buttons.propertyTriage(kb);
1087
1096
 
1088
- for (p in possibleProperties.dp) {
1089
- possible.push(kb.fromNT(p));
1090
- }
1097
+ for (p in possibleProperties.op) {
1098
+ possible.push(kb.fromNT(p));
1099
+ }
1100
+
1101
+ for (p in possibleProperties.dp) {
1102
+ possible.push(kb.fromNT(p));
1103
+ }
1091
1104
 
1092
- opts.disambiguate = true; // This is a big class, and the labels won't be enough.
1093
- } else if (from.sameTerm(ns.owl('ObjectProperty'))) {
1094
- possibleProperties = buttons.propertyTriage(kb);
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);
1095
1108
 
1096
- for (p in possibleProperties.op) {
1097
- possible.push(kb.fromNT(p));
1098
- }
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);
1099
1116
 
1100
- opts.disambiguate = true;
1101
- } else if (from.sameTerm(ns.owl('DatatypeProperty'))) {
1102
- possibleProperties = buttons.propertyTriage(kb);
1117
+ for (p in possibleProperties.dp) {
1118
+ possible.push(kb.fromNT(p));
1119
+ }
1103
1120
 
1104
- for (p in possibleProperties.dp) {
1105
- possible.push(kb.fromNT(p));
1121
+ opts.disambiguate = true;
1106
1122
  }
1107
1123
 
1108
- opts.disambiguate = true;
1109
- }
1124
+ return possible; // return sortByLabel(possible)
1125
+ } // TODO: this checks for any occurrence, regardless of true or false setting
1110
1126
 
1111
- var object = kb.any(subject, property);
1112
1127
 
1113
- function addSubForm() {
1114
- object = kb.any(subject, property);
1115
- (0, _fieldFunction.fieldFunction)(dom, subForm)(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
1128
+ if (kb.any(form, ui('canMintNew'))) {
1129
+ opts.mint = '* Create new *'; // @@ could be better
1116
1130
  }
1117
1131
 
1118
- var possible2 = sortByLabel(possible);
1132
+ var multiSelect = kb.any(form, ui('multiselect')); // Optional
1133
+
1134
+ if (multiSelect) opts.multiSelect = true;
1135
+ var selector;
1136
+
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
1142
+
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
+ }
1165
+
1166
+ if (event.action === 'CLEAR_ALL_OPTIONS') {
1167
+ selectedOptions = [];
1168
+ }
1119
1169
 
1120
- if (kb.any(form, ui('canMintNew'))) {
1121
- opts.mint = '* New *'; // @@ could be better
1170
+ if (event.action === 'ADD_OPTION') {
1171
+ var stringValue = event.value + '';
1122
1172
 
1123
- opts.subForm = subForm;
1124
- }
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));
1125
1178
 
1126
- var selector = makeSelectForOptions(dom, kb, subject, property, possible2, opts, dataDoc, callbackFunction);
1127
- rhs.appendChild(selector);
1128
- if (object && subForm) addSubForm();
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();
1129
1205
  return box;
1130
- }; // Documentation - non-interactive fields
1206
+ };
1207
+
1208
+ function addSubFormChoice(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction) {
1209
+ (0, _fieldFunction.fieldFunction)(dom, subForm)(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction);
1210
+ } // Documentation - non-interactive fields
1131
1211
  //
1132
1212
 
1133
1213
 
@@ -1330,7 +1410,8 @@ function promptForNew(dom, kb, subject, predicate, theClass, form, dataDoc, call
1330
1410
  b.setAttribute('type', 'button');
1331
1411
  b.setAttribute('style', 'float: right;');
1332
1412
  b.innerHTML = 'Goto ' + utils.label(theClass);
1333
- b.addEventListener('click', function (_e) {
1413
+ b.addEventListener('click', // TODO fix dependency cycle to solid-panes by calling outlineManager
1414
+ function (_e) {
1334
1415
  dom.outlineManager.GotoSubject(theClass, true, undefined, true, undefined);
1335
1416
  }, false);
1336
1417
  return box;
@@ -1465,10 +1546,8 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1465
1546
  // @param subject - a term, the subject of the statement(s) being edited.
1466
1547
  // @param predicate - a term, the predicate of the statement(s) being edited
1467
1548
  // @param possible - a list of terms, the possible value the object can take
1468
- // @param options.multiple - Boolean - Whether more than one at a time is allowed
1469
1549
  // @param options.nullLabel - a string to be displayed as the
1470
1550
  // option for none selected (for non multiple)
1471
- // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1472
1551
  // @param options.subForm - If mint, then the form to be used for minting the new thing
1473
1552
  // @param dataDoc - The web document being edited
1474
1553
  // @param callbackFunction - takes (boolean ok, string errorBody)
@@ -1492,7 +1571,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1492
1571
  } // uris is now the set of possible options
1493
1572
 
1494
1573
 
1495
- if (n === 0 && !options.mint) {
1574
+ if (n === 0) {
1496
1575
  return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1497
1576
  }
1498
1577
 
@@ -1506,7 +1585,9 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1506
1585
  actual = kb.findTypeURIs(subject);
1507
1586
  } else {
1508
1587
  kb.each(subject, predicate, null, dataDoc).forEach(function (x) {
1509
- actual[x.uri] = true;
1588
+ if (x.uri) {
1589
+ actual[x.uri] = true;
1590
+ }
1510
1591
  });
1511
1592
  }
1512
1593
 
@@ -1527,33 +1608,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1527
1608
  }
1528
1609
  };
1529
1610
 
1530
- var newObject;
1531
-
1532
1611
  for (var _i = 0; _i < select.options.length; _i++) {
1533
1612
  var opt = select.options[_i];
1534
-
1535
- if (opt.selected && opt.AJAR_mint) {
1536
- if (options.mintClass) {
1537
- var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
1538
- if (!ok) {
1539
- callbackFunction(ok, body, {
1540
- change: 'new'
1541
- }); // @@ if ok, need some form of refresh of the select for the new thing
1542
- }
1543
- });
1544
- select.parentNode.appendChild(thisForm);
1545
- newObject = thisForm.AJAR_subject;
1546
- } else {
1547
- newObject = newThing(dataDoc);
1548
- }
1549
-
1550
- is.push($rdf.st(subject, predicate, newObject, dataDoc));
1551
-
1552
- if (options.mintStatementsFun) {
1553
- is = is.concat(options.mintStatementsFun(newObject));
1554
- }
1555
- }
1556
-
1557
1613
  if (!opt.AJAR_uri) continue; // a prompt or mint
1558
1614
 
1559
1615
  if (opt.selected && !(opt.AJAR_uri in actual)) {
@@ -1583,24 +1639,12 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1583
1639
  sel = sel.superSelect;
1584
1640
  }
1585
1641
 
1586
- function doneNew(ok, _body) {
1587
- callbackFunction(ok, {
1588
- widget: 'select',
1589
- event: 'new'
1590
- });
1591
- }
1592
-
1593
1642
  log.info('selectForOptions: data doc = ' + dataDoc);
1594
1643
  kb.updater.update(ds, is, function (uri, ok, body) {
1595
1644
  actual = getActual(); // refresh
1596
1645
 
1597
1646
  if (ok) {
1598
1647
  select.disabled = false; // data written back
1599
-
1600
- if (newObject) {
1601
- var fn = (0, _fieldFunction.fieldFunction)(dom, options.subForm);
1602
- fn(dom, select.parentNode, {}, newObject, options.subForm, dataDoc, doneNew);
1603
- }
1604
1648
  } else {
1605
1649
  return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1606
1650
  }
@@ -1614,7 +1658,6 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1614
1658
 
1615
1659
  var select = dom.createElement('select');
1616
1660
  select.setAttribute('style', style.formSelectSTyle);
1617
- if (options.multiple) select.setAttribute('multiple', 'true');
1618
1661
  select.currentURI = null;
1619
1662
 
1620
1663
  select.refresh = function () {
@@ -1657,15 +1700,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1657
1700
  select.appendChild(option);
1658
1701
  }
1659
1702
 
1660
- if (editable && options.mint) {
1661
- var mint = dom.createElement('option');
1662
- mint.appendChild(dom.createTextNode(options.mint));
1663
- mint.AJAR_mint = true; // Flag it
1664
-
1665
- select.insertBefore(mint, select.firstChild);
1666
- }
1667
-
1668
- if (select.currentURI == null && !options.multiple) {
1703
+ if (!select.currentURI) {
1669
1704
  var prompt = dom.createElement('option');
1670
1705
  prompt.appendChild(dom.createTextNode(options.nullLabel));
1671
1706
  select.insertBefore(prompt, select.firstChild);
@@ -1688,28 +1723,16 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1688
1723
  function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1689
1724
  var du = kb.any(category, ns.owl('disjointUnionOf'));
1690
1725
  var subs;
1691
- var multiple = false;
1692
1726
 
1693
1727
  if (!du) {
1694
1728
  subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
1695
- multiple = true;
1696
1729
  } else {
1697
1730
  subs = du.elements;
1698
1731
  }
1699
1732
 
1700
1733
  log.debug('Select list length ' + subs.length);
1701
-
1702
- if (subs.length === 0) {
1703
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1704
- }
1705
-
1706
- if (subs.length === 1) {
1707
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
1708
- }
1709
-
1710
1734
  return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, {
1711
- multiple: multiple,
1712
- nullPrompt: '--classify--'
1735
+ nullLabel: '* Select type *'
1713
1736
  }, dataDoc, callbackFunction);
1714
1737
  }
1715
1738
  /** Make SELECT element to select subclasses recurively
@@ -1743,8 +1766,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
1743
1766
  function onChange(ok, body) {
1744
1767
  if (ok) update();
1745
1768
  callbackFunction(ok, body);
1746
- } // eslint-disable-next-line prefer-const
1747
-
1769
+ }
1748
1770
 
1749
1771
  var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
1750
1772
  container.appendChild(select);
@@ -1899,4 +1921,262 @@ function newThing(doc) {
1899
1921
  var now = new Date();
1900
1922
  return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
1901
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
+ }
1902
2182
  //# sourceMappingURL=forms.js.map