solid-ui 2.4.22-4e7a23dc → 2.4.22-62779f1d

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.
@@ -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;
@@ -155,14 +156,16 @@ _fieldFunction.field[ns.ui('Form').uri] = _fieldFunction.field[ns.ui('Group').ur
155
156
  var ui = ns.ui;
156
157
  if (container) container.appendChild(box); // Prevent loops
157
158
 
159
+ if (!form) return;
158
160
  var key = subject.toNT() + '|' + form.toNT();
159
161
 
160
162
  if (already[key]) {
161
163
  // 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
164
+ box.appendChild(dom.createTextNode('Group: see above ' + key)); // TODO fix dependency cycle to solid-panes by calling outlineManager
165
+ // const plist = [$rdf.st(subject, ns.owl('sameAs'), subject)] // @@ need prev subject
166
+ // dom.outlineManager.appendPropertyTRs(box, plist)
167
+ // dom.appendChild(plist)
164
168
 
165
- dom.outlineManager.appendPropertyTRs(box, plist);
166
169
  return box;
167
170
  }
168
171
 
@@ -263,47 +266,43 @@ _fieldFunction.field[ns.ui('Options').uri] = function (dom, container, already,
263
266
  values = kb.each(subject, dependingOn);
264
267
  }
265
268
 
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'
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'
272
272
 
273
- var match = false;
273
+ var match = false;
274
274
 
275
- for (var j = 0; j < tests.length; j++) {
276
- var _iterator = _createForOfIteratorHelper(values),
277
- _step;
275
+ for (var j = 0; j < tests.length; j++) {
276
+ var _iterator = _createForOfIteratorHelper(values),
277
+ _step;
278
278
 
279
- try {
280
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
281
- var value = _step.value;
282
- var test = tests[j];
279
+ try {
280
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
281
+ var value = _step.value;
282
+ var test = tests[j];
283
283
 
284
- if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
285
- match = true;
286
- }
284
+ if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
285
+ match = true;
287
286
  }
288
- } catch (err) {
289
- _iterator.e(err);
290
- } finally {
291
- _iterator.f();
292
287
  }
288
+ } catch (err) {
289
+ _iterator.e(err);
290
+ } finally {
291
+ _iterator.f();
293
292
  }
293
+ }
294
294
 
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
- }
295
+ if (match) {
296
+ var _field3 = kb.the(c, ui('use'));
304
297
 
305
- break;
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);
306
303
  }
304
+
305
+ break;
307
306
  }
308
307
  } // @@ Add box.refresh() to sync fields with values
309
308
 
@@ -591,7 +590,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
591
590
  // delete button and move buttons
592
591
 
593
592
  if (kb.updater.editable(dataDoc.uri)) {
594
- buttons.deleteButtonWithCheck(dom, subField, utils.label(property), deleteThisItem);
593
+ buttons.deleteButtonWithCheck(dom, subField, multipleUIlabel, deleteThisItem);
595
594
 
596
595
  if (ordered) {
597
596
  // Add controsl in a frame
@@ -642,7 +641,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
642
641
 
643
642
  var _shim = dom.createElement('div');
644
643
 
645
- _shim.appendChild(subField); // Subfield has its own laytout
644
+ _shim.appendChild(subField); // Subfield has its own layout
646
645
 
647
646
 
648
647
  frame.appendChild(_shim);
@@ -691,6 +690,8 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
691
690
  return shim;
692
691
  }
693
692
 
693
+ var multipleUIlabel = kb.any(form, ui('label'));
694
+ if (!multipleUIlabel) multipleUIlabel = utils.label(property);
694
695
  var min = kb.any(form, ui('min')); // This is the minimum number -- default 0
695
696
 
696
697
  min = min ? 0 + min.value : 0;
@@ -731,10 +732,9 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
731
732
  img.setAttribute('src', plusIconURI); // plus sign
732
733
 
733
734
  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
-
735
+ img.title = 'Click to add another ' + multipleUIlabel;
736
+ var prompt = dom.createElement('span');
737
+ prompt.textContent = (values.length === 0 ? 'Add another ' : 'Add ') + multipleUIlabel;
738
738
  tail.addEventListener('click', /*#__PURE__*/function () {
739
739
  var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(_eventNotUsed) {
740
740
  return _regenerator["default"].wrap(function _callee5$(_context5) {
@@ -756,6 +756,7 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
756
756
  return _ref3.apply(this, arguments);
757
757
  };
758
758
  }(), true);
759
+ tail.appendChild(prompt);
759
760
  }
760
761
 
761
762
  function createListIfNecessary() {
@@ -1017,28 +1018,39 @@ _fieldFunction.field[ns.ui('Classifier').uri] = function (dom, container, alread
1017
1018
  **
1018
1019
  ** Not nested. Generates a link to something from a given class.
1019
1020
  ** Optional subform for the thing selected.
1021
+ ** Generates a subForm based on a ui:use form
1022
+ ** Will look like:
1023
+ ** <div id=dropDownDiv>
1024
+ ** <div id=labelOfDropDown>
1025
+ ** <div id=selectDiv>
1026
+ ** <select id=dropDownSelect>
1027
+ ** <option> ....
1028
+ ** <subForm>
1020
1029
  ** Alternative implementatons caould be:
1021
1030
  ** -- pop-up menu (as here)
1022
1031
  ** -- radio buttons
1023
1032
  ** -- auto-complete typing
1024
1033
  **
1025
- ** Todo: Deal with multiple. Maybe merge with multiple code.
1034
+ ** TODO: according to ontology ui:choice can also have ns.ui('default') - this is not implemented yet
1026
1035
  */
1027
1036
 
1028
1037
 
1029
1038
  _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
1030
1039
  var ui = ns.ui;
1031
1040
  var kb = _solidLogic.store;
1032
- var multiple = false;
1033
1041
  var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
1034
1042
 
1043
+ var multiSelect = false;
1035
1044
  var p;
1036
- var box = dom.createElement('div'); // Set flexDirection column?
1045
+ var box = dom.createElement('div');
1046
+ box.setAttribute('class', 'choiceBox'); // Set flexDirection column?
1037
1047
 
1038
1048
  if (container) container.appendChild(box);
1039
1049
  var lhs = dom.createElement('div');
1050
+ lhs.setAttribute('class', 'formFieldName choiceBox-label');
1040
1051
  box.appendChild(lhs);
1041
1052
  var rhs = dom.createElement('div');
1053
+ rhs.setAttribute('class', 'formFieldValue choiceBox-selectBox');
1042
1054
  box.appendChild(rhs);
1043
1055
  var property = kb.any(form, ui('property'));
1044
1056
 
@@ -1047,9 +1059,9 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1047
1059
  }
1048
1060
 
1049
1061
  lhs.appendChild((0, _basic.fieldLabel)(dom, property, form));
1050
- var from = kb.any(form, ui('from'));
1062
+ var uiFrom = kb.any(form, ui('from'));
1051
1063
 
1052
- if (!from) {
1064
+ if (!uiFrom) {
1053
1065
  return (0, _error.errorMessageBlock)(dom, "No 'from' for Choice: " + form);
1054
1066
  }
1055
1067
 
@@ -1057,77 +1069,97 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1057
1069
 
1058
1070
  var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
1059
1071
 
1060
- var possible = [];
1061
- var possibleProperties;
1062
- var nullLabel = '--' + utils.label(property) + '-?';
1063
1072
  var opts = {
1064
1073
  form: form,
1065
- multiple: multiple,
1066
- nullLabel: nullLabel,
1074
+ subForm: subForm,
1075
+ multiSelect: multiSelect,
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
+ }
1091
1100
 
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);
1101
+ for (p in possibleProperties.dp) {
1102
+ possible.push(kb.fromNT(p));
1103
+ }
1095
1104
 
1096
- for (p in possibleProperties.op) {
1097
- possible.push(kb.fromNT(p));
1098
- }
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);
1108
+
1109
+ for (p in possibleProperties.op) {
1110
+ possible.push(kb.fromNT(p));
1111
+ }
1099
1112
 
1100
- opts.disambiguate = true;
1101
- } else if (from.sameTerm(ns.owl('DatatypeProperty'))) {
1102
- possibleProperties = buttons.propertyTriage(kb);
1113
+ opts.disambiguate = true;
1114
+ } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1115
+ possibleProperties = buttons.propertyTriage(kb);
1103
1116
 
1104
- for (p in possibleProperties.dp) {
1105
- possible.push(kb.fromNT(p));
1117
+ for (p in possibleProperties.dp) {
1118
+ possible.push(kb.fromNT(p));
1119
+ }
1120
+
1121
+ opts.disambiguate = true;
1106
1122
  }
1107
1123
 
1108
- opts.disambiguate = true;
1109
- }
1124
+ var object = kb.any(subject, property);
1125
+ if (object) possible.push(object);
1126
+ return sortByLabel(possible);
1127
+ } // TODO: this checks for any occurrence, regardless of true or false setting
1110
1128
 
1111
- var object = kb.any(subject, property);
1112
1129
 
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);
1130
+ if (kb.any(form, ui('canMintNew'))) {
1131
+ opts.mint = '* Create new *'; // @@ could be better
1116
1132
  }
1117
1133
 
1118
- var possible2 = sortByLabel(possible);
1134
+ var selector;
1135
+
1136
+ rhs.refresh = function () {
1137
+ var selectorOptions = getSelectorOptions();
1138
+ selector = makeSelectForChoice(dom, rhs, kb, subject, property, selectorOptions, uiFrom, opts, dataDoc, callbackFunction);
1139
+ rhs.innerHTML = '';
1140
+ rhs.appendChild(selector);
1141
+ };
1142
+
1143
+ rhs.refresh();
1144
+ if (selector && selector.refresh) selector.refresh();
1145
+ return box;
1146
+ };
1147
+ /**
1148
+ * Removes all sibling elements after specified
1149
+ * @param {HTMLElement} currentElement
1150
+ * @private
1151
+ */
1119
1152
 
1120
- if (kb.any(form, ui('canMintNew'))) {
1121
- opts.mint = '* New *'; // @@ could be better
1122
1153
 
1123
- opts.subForm = subForm;
1154
+ function removeNextSiblingsAfterElement(currentElement) {
1155
+ while (currentElement.nextElementSibling) {
1156
+ currentElement.nextElementSibling.remove();
1124
1157
  }
1158
+ }
1125
1159
 
1126
- var selector = makeSelectForOptions(dom, kb, subject, property, possible2, opts, dataDoc, callbackFunction);
1127
- rhs.appendChild(selector);
1128
- if (object && subForm) addSubForm();
1129
- return box;
1130
- }; // Documentation - non-interactive fields
1160
+ function addSubFormChoice(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction) {
1161
+ (0, _fieldFunction.fieldFunction)(dom, subForm)(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction);
1162
+ } // Documentation - non-interactive fields
1131
1163
  //
1132
1164
 
1133
1165
 
@@ -1330,7 +1362,8 @@ function promptForNew(dom, kb, subject, predicate, theClass, form, dataDoc, call
1330
1362
  b.setAttribute('type', 'button');
1331
1363
  b.setAttribute('style', 'float: right;');
1332
1364
  b.innerHTML = 'Goto ' + utils.label(theClass);
1333
- b.addEventListener('click', function (_e) {
1365
+ b.addEventListener('click', // TODO fix dependency cycle to solid-panes by calling outlineManager
1366
+ function (_e) {
1334
1367
  dom.outlineManager.GotoSubject(theClass, true, undefined, true, undefined);
1335
1368
  }, false);
1336
1369
  return box;
@@ -1465,10 +1498,8 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1465
1498
  // @param subject - a term, the subject of the statement(s) being edited.
1466
1499
  // @param predicate - a term, the predicate of the statement(s) being edited
1467
1500
  // @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
1501
  // @param options.nullLabel - a string to be displayed as the
1470
1502
  // 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
1503
  // @param options.subForm - If mint, then the form to be used for minting the new thing
1473
1504
  // @param dataDoc - The web document being edited
1474
1505
  // @param callbackFunction - takes (boolean ok, string errorBody)
@@ -1492,7 +1523,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1492
1523
  } // uris is now the set of possible options
1493
1524
 
1494
1525
 
1495
- if (n === 0 && !options.mint) {
1526
+ if (n === 0) {
1496
1527
  return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1497
1528
  }
1498
1529
 
@@ -1506,7 +1537,9 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1506
1537
  actual = kb.findTypeURIs(subject);
1507
1538
  } else {
1508
1539
  kb.each(subject, predicate, null, dataDoc).forEach(function (x) {
1509
- actual[x.uri] = true;
1540
+ if (x.uri) {
1541
+ actual[x.uri] = true;
1542
+ }
1510
1543
  });
1511
1544
  }
1512
1545
 
@@ -1527,33 +1560,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1527
1560
  }
1528
1561
  };
1529
1562
 
1530
- var newObject;
1531
-
1532
1563
  for (var _i = 0; _i < select.options.length; _i++) {
1533
1564
  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
1565
  if (!opt.AJAR_uri) continue; // a prompt or mint
1558
1566
 
1559
1567
  if (opt.selected && !(opt.AJAR_uri in actual)) {
@@ -1583,24 +1591,12 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1583
1591
  sel = sel.superSelect;
1584
1592
  }
1585
1593
 
1586
- function doneNew(ok, _body) {
1587
- callbackFunction(ok, {
1588
- widget: 'select',
1589
- event: 'new'
1590
- });
1591
- }
1592
-
1593
1594
  log.info('selectForOptions: data doc = ' + dataDoc);
1594
1595
  kb.updater.update(ds, is, function (uri, ok, body) {
1595
1596
  actual = getActual(); // refresh
1596
1597
 
1597
1598
  if (ok) {
1598
1599
  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
1600
  } else {
1605
1601
  return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1606
1602
  }
@@ -1614,7 +1610,6 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1614
1610
 
1615
1611
  var select = dom.createElement('select');
1616
1612
  select.setAttribute('style', style.formSelectSTyle);
1617
- if (options.multiple) select.setAttribute('multiple', 'true');
1618
1613
  select.currentURI = null;
1619
1614
 
1620
1615
  select.refresh = function () {
@@ -1657,15 +1652,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1657
1652
  select.appendChild(option);
1658
1653
  }
1659
1654
 
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) {
1655
+ if (!select.currentURI) {
1669
1656
  var prompt = dom.createElement('option');
1670
1657
  prompt.appendChild(dom.createTextNode(options.nullLabel));
1671
1658
  select.insertBefore(prompt, select.firstChild);
@@ -1688,28 +1675,16 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, da
1688
1675
  function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1689
1676
  var du = kb.any(category, ns.owl('disjointUnionOf'));
1690
1677
  var subs;
1691
- var multiple = false;
1692
1678
 
1693
1679
  if (!du) {
1694
1680
  subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
1695
- multiple = true;
1696
1681
  } else {
1697
1682
  subs = du.elements;
1698
1683
  }
1699
1684
 
1700
1685
  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
1686
  return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, {
1711
- multiple: multiple,
1712
- nullPrompt: '--classify--'
1687
+ nullLabel: '* Select type *'
1713
1688
  }, dataDoc, callbackFunction);
1714
1689
  }
1715
1690
  /** Make SELECT element to select subclasses recurively
@@ -1743,8 +1718,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
1743
1718
  function onChange(ok, body) {
1744
1719
  if (ok) update();
1745
1720
  callbackFunction(ok, body);
1746
- } // eslint-disable-next-line prefer-const
1747
-
1721
+ }
1748
1722
 
1749
1723
  var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
1750
1724
  container.appendChild(select);
@@ -1899,4 +1873,194 @@ function newThing(doc) {
1899
1873
  var now = new Date();
1900
1874
  return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
1901
1875
  }
1876
+ /** Make SELECT element to select options
1877
+ //
1878
+ // @param subject - a term, the subject of the statement(s) being edited.
1879
+ // @param predicate - a term, the predicate of the statement(s) being edited
1880
+ // @param possible - a list of terms, the possible value the object can take
1881
+ // @param options.multiSelect - Boolean - Whether more than one at a time is allowed
1882
+ // @param options.uiMultipleInUse - signals that the ui:choise is used with a ui:multiple
1883
+ // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1884
+ // @param options.subForm - If mint, then the form to be used for minting the new thing
1885
+ // @param dataDoc - The web document being edited
1886
+ // @param callbackFunction - takes (boolean ok, string errorBody)
1887
+ */
1888
+
1889
+
1890
+ function makeSelectForChoice(dom, container, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
1891
+ var n = 0;
1892
+ var uris = {}; // Count them
1893
+
1894
+ var editable = kb.updater.editable(dataDoc.uri);
1895
+
1896
+ for (var i = 0; i < possible.length; i++) {
1897
+ var sub = possible[i]; // @@ Maybe; make this so it works with blank nodes too
1898
+
1899
+ if (!sub.uri) debug.warn("makeSelectForOptions: option does not have an uri: ".concat(sub, ", with predicate: ").concat(predicate));
1900
+ if (!sub.uri || sub.uri in uris) continue;
1901
+ uris[sub.uri] = true;
1902
+ n++;
1903
+ } // uris is now the set of possible options
1904
+
1905
+
1906
+ if (n === 0 && !options.mint) {
1907
+ return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1908
+ }
1909
+
1910
+ log.debug('makeSelectForOptions: dataDoc=' + dataDoc);
1911
+
1912
+ function determinFirstSelectOption() {
1913
+ var firstSelectOptionText = '--- classify ---';
1914
+ var option = dom.createElement('option');
1915
+
1916
+ if (predicate && !(predicate.termType === 'BlankNode')) {
1917
+ firstSelectOptionText = '* Select for property: ' + utils.label(predicate) + ' *';
1918
+ }
1919
+
1920
+ if (subject && !(subject.termType === 'BlankNode')) {
1921
+ firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *';
1922
+ }
1923
+
1924
+ option.appendChild(dom.createTextNode(firstSelectOptionText));
1925
+ option.disabled = true;
1926
+ option.value = true;
1927
+ option.hidden = true;
1928
+ option.selected = true;
1929
+ return option;
1930
+ }
1931
+
1932
+ var onChange = function onChange(_e) {
1933
+ select.refresh();
1934
+ };
1935
+
1936
+ var select = dom.createElement('select');
1937
+ select.setAttribute('style', style.formSelectSTyle);
1938
+ if (options.multiSelect) select.setAttribute('multiSelect', 'true');
1939
+ select.currentURI = null;
1940
+
1941
+ for (var uri in uris) {
1942
+ select.appendChild(createOption(uri));
1943
+ }
1944
+
1945
+ if (editable && options.mint) {
1946
+ var mint = dom.createElement('option');
1947
+ mint.appendChild(dom.createTextNode(options.mint));
1948
+ mint.AJAR_mint = true; // Flag it
1949
+
1950
+ select.insertBefore(mint, select.firstChild);
1951
+ }
1952
+
1953
+ if (select.children.length === 0) select.insertBefore(determinFirstSelectOption(), select.firstChild);
1954
+
1955
+ select.refresh = function () {
1956
+ select.disabled = true; // unlocked any conflict we had got into
1957
+
1958
+ var ds = [];
1959
+ var is = [];
1960
+
1961
+ var removeValue = function removeValue(t) {
1962
+ if (kb.holds(subject, predicate, t, dataDoc)) {
1963
+ ds.push($rdf.st(subject, predicate, t, dataDoc));
1964
+ }
1965
+ };
1966
+
1967
+ var newObject;
1968
+
1969
+ for (var _i3 = 0; _i3 < select.options.length; _i3++) {
1970
+ var opt = select.options[_i3];
1971
+
1972
+ if (opt.selected && opt.AJAR_mint) {
1973
+ // not sure if this 'if' is used because I cannot find mintClass
1974
+ if (options.mintClass) {
1975
+ var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
1976
+ if (!ok) {
1977
+ callbackFunction(ok, body, {
1978
+ change: 'new'
1979
+ }); // @@ if ok, need some form of refresh of the select for the new thing
1980
+ }
1981
+ });
1982
+ select.parentNode.appendChild(thisForm);
1983
+ newObject = thisForm.AJAR_subject;
1984
+ } else {
1985
+ newObject = newThing(dataDoc);
1986
+ }
1987
+
1988
+ is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
1989
+ 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
1990
+
1991
+ if (options.mintStatementsFun) {
1992
+ is = is.concat(options.mintStatementsFun(newObject));
1993
+ }
1994
+
1995
+ select.currentURI = newObject;
1996
+ }
1997
+
1998
+ if (!opt.AJAR_uri) continue; // a prompt or mint
1999
+
2000
+ if (opt.selected) select.currentURI = opt.AJAR_uri;
2001
+ }
2002
+
2003
+ var sel = select.subSelect; // All subclasses must also go
2004
+
2005
+ while (sel && sel.currentURI) {
2006
+ removeValue(kb.sym(sel.currentURI));
2007
+ sel = sel.subSelect;
2008
+ }
2009
+
2010
+ sel = select.superSelect; // All superclasses are redundant
2011
+
2012
+ while (sel && sel.currentURI) {
2013
+ removeValue(kb.sym(sel.currentURI));
2014
+ sel = sel.superSelect;
2015
+ }
2016
+
2017
+ log.info('selectForOptions: data doc = ' + dataDoc);
2018
+
2019
+ if (select.currentURI) {
2020
+ removeNextSiblingsAfterElement(select);
2021
+ addSubFormChoice(dom, container, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
2022
+ if (ok) {
2023
+ kb.updater.update(ds, is, function (uri, success, errorBody) {
2024
+ if (!success) container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
2025
+ });
2026
+ if (callbackFunction) callbackFunction(ok, {
2027
+ widget: 'select',
2028
+ event: 'new'
2029
+ }); // widgets.refreshTree(container)
2030
+ } else {
2031
+ container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
2032
+ }
2033
+ });
2034
+ }
2035
+
2036
+ select.disabled = false;
2037
+ };
2038
+
2039
+ function createOption(uri) {
2040
+ var option = dom.createElement('option');
2041
+ var c = kb.sym(uri);
2042
+
2043
+ if (options.disambiguate) {
2044
+ option.appendChild(dom.createTextNode(utils.labelWithOntology(c, true))); // Init. cap
2045
+ } else {
2046
+ option.appendChild(dom.createTextNode(utils.label(c, true))); // Init.
2047
+ }
2048
+
2049
+ var backgroundColor = kb.any(c, kb.sym('http://www.w3.org/ns/ui#backgroundColor'));
2050
+
2051
+ if (backgroundColor) {
2052
+ option.setAttribute('style', 'background-color: ' + backgroundColor.value + '; ');
2053
+ }
2054
+
2055
+ option.AJAR_uri = uri;
2056
+ if (c.toString() === '' + select.currentURI) option.selected = true;
2057
+ return option;
2058
+ }
2059
+
2060
+ if (editable) {
2061
+ select.addEventListener('change', onChange, false);
2062
+ }
2063
+
2064
+ return select;
2065
+ } // makeSelectForChoice
1902
2066
  //# sourceMappingURL=forms.js.map