solid-ui 2.4.22-05274f4a → 2.4.22-0b2c6704

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() {
@@ -1030,23 +1031,26 @@ _fieldFunction.field[ns.ui('Classifier').uri] = function (dom, container, alread
1030
1031
  ** -- radio buttons
1031
1032
  ** -- auto-complete typing
1032
1033
  **
1033
- ** 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
1034
1035
  */
1035
1036
 
1036
1037
 
1037
1038
  _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
1038
1039
  var ui = ns.ui;
1039
1040
  var kb = _solidLogic.store;
1040
- var multiple = false;
1041
1041
  var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
1042
1042
 
1043
+ var multiSelect = false;
1043
1044
  var p;
1044
- var box = dom.createElement('div'); // Set flexDirection column?
1045
+ var box = dom.createElement('div');
1046
+ box.setAttribute('class', 'choiceBox'); // Set flexDirection column?
1045
1047
 
1046
1048
  if (container) container.appendChild(box);
1047
1049
  var lhs = dom.createElement('div');
1050
+ lhs.setAttribute('class', 'formFieldName choiceBox-label');
1048
1051
  box.appendChild(lhs);
1049
1052
  var rhs = dom.createElement('div');
1053
+ rhs.setAttribute('class', 'formFieldValue choiceBox-selectBox');
1050
1054
  box.appendChild(rhs);
1051
1055
  var property = kb.any(form, ui('property'));
1052
1056
 
@@ -1055,89 +1059,87 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1055
1059
  }
1056
1060
 
1057
1061
  lhs.appendChild((0, _basic.fieldLabel)(dom, property, form));
1062
+ var uiFrom = kb.any(form, ui('from'));
1063
+
1064
+ if (!uiFrom) {
1065
+ return (0, _error.errorMessageBlock)(dom, "No 'from' for Choice: " + form);
1066
+ }
1067
+
1058
1068
  var subForm = kb.any(form, ui('use')); // Optional
1059
1069
 
1060
1070
  var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
1061
1071
 
1062
- var possible = [];
1063
- var possibleProperties;
1064
- var firstSelectOptionText = '* Select from ' + utils.label(subject, true) + ' *';
1065
1072
  var opts = {
1066
1073
  form: form,
1067
1074
  subForm: subForm,
1068
- multiple: multiple,
1069
- firstSelectOptionText: firstSelectOptionText,
1075
+ multiSelect: multiSelect,
1070
1076
  disambiguate: false
1071
1077
  };
1072
- var uiFrom = kb.any(form, ui('from'));
1073
1078
 
1074
- if (!uiFrom) {
1075
- return (0, _error.errorMessageBlock)(dom, "No 'from' for Choice: " + form);
1076
- }
1079
+ function getSelectorOptions() {
1080
+ var possible = [];
1081
+ var possibleProperties;
1082
+ possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1077
1083
 
1078
- possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1084
+ for (var x in kb.findMembersNT(uiFrom)) {
1085
+ possible.push(kb.fromNT(x));
1086
+ } // Use rdfs
1079
1087
 
1080
- for (var x in kb.findMembersNT(uiFrom)) {
1081
- possible.push(kb.fromNT(x));
1082
- } // Use rdfs
1083
1088
 
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)
1084
1093
 
1085
- if (uiFrom.sameTerm(ns.rdfs('Class'))) {
1086
- for (p in buttons.allClassURIs()) {
1087
- possible.push(kb.sym(p));
1088
- } // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
1094
+ } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1095
+ possibleProperties = buttons.propertyTriage(kb);
1089
1096
 
1090
- } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1091
- possibleProperties = buttons.propertyTriage(kb);
1097
+ for (p in possibleProperties.op) {
1098
+ possible.push(kb.fromNT(p));
1099
+ }
1092
1100
 
1093
- for (p in possibleProperties.op) {
1094
- possible.push(kb.fromNT(p));
1095
- }
1101
+ for (p in possibleProperties.dp) {
1102
+ possible.push(kb.fromNT(p));
1103
+ }
1096
1104
 
1097
- for (p in possibleProperties.dp) {
1098
- possible.push(kb.fromNT(p));
1099
- }
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);
1100
1108
 
1101
- opts.disambiguate = true; // This is a big class, and the labels won't be enough.
1102
- } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
1103
- possibleProperties = buttons.propertyTriage(kb);
1109
+ for (p in possibleProperties.op) {
1110
+ possible.push(kb.fromNT(p));
1111
+ }
1104
1112
 
1105
- for (p in possibleProperties.op) {
1106
- possible.push(kb.fromNT(p));
1107
- }
1113
+ opts.disambiguate = true;
1114
+ } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1115
+ possibleProperties = buttons.propertyTriage(kb);
1108
1116
 
1109
- opts.disambiguate = true;
1110
- } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1111
- possibleProperties = buttons.propertyTriage(kb);
1117
+ for (p in possibleProperties.dp) {
1118
+ possible.push(kb.fromNT(p));
1119
+ }
1112
1120
 
1113
- for (p in possibleProperties.dp) {
1114
- possible.push(kb.fromNT(p));
1121
+ opts.disambiguate = true;
1115
1122
  }
1116
1123
 
1117
- opts.disambiguate = true;
1118
- }
1124
+ return sortByLabel(possible);
1125
+ } // TODO: this checks for any occurrence, regardless of true or false setting
1119
1126
 
1120
- var sortedPossible = sortByLabel(possible); // TODO: this checks for any occurance regardles if it is set to true or false
1121
1127
 
1122
1128
  if (kb.any(form, ui('canMintNew'))) {
1123
1129
  opts.mint = '* Create new *'; // @@ could be better
1124
1130
  }
1125
1131
 
1126
- var selector = makeSelectForOptions(dom, kb, subject, property, sortedPossible, uiFrom, opts, dataDoc, callbackFunction);
1127
- rhs.appendChild(selector);
1128
- var object;
1132
+ var selector;
1129
1133
 
1130
- if (selector.currentURI) {
1131
- object = $rdf.sym(selector.currentURI);
1132
- } else {
1133
- object = kb.any(subject, property);
1134
- }
1135
-
1136
- if (object && subForm) {
1137
- removeNextSiblingsAfterElement(selector);
1138
- addSubFormChoice(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
1139
- }
1134
+ rhs.refresh = function () {
1135
+ var selectorOptions = getSelectorOptions();
1136
+ selector = makeSelectForChoice(dom, rhs, kb, subject, property, selectorOptions, uiFrom, opts, dataDoc, callbackFunction);
1137
+ rhs.innerHTML = '';
1138
+ rhs.appendChild(selector);
1139
+ };
1140
1140
 
1141
+ rhs.refresh();
1142
+ if (selector && selector.refresh) selector.refresh();
1141
1143
  return box;
1142
1144
  };
1143
1145
  /**
@@ -1358,7 +1360,8 @@ function promptForNew(dom, kb, subject, predicate, theClass, form, dataDoc, call
1358
1360
  b.setAttribute('type', 'button');
1359
1361
  b.setAttribute('style', 'float: right;');
1360
1362
  b.innerHTML = 'Goto ' + utils.label(theClass);
1361
- b.addEventListener('click', function (_e) {
1363
+ b.addEventListener('click', // TODO fix dependency cycle to solid-panes by calling outlineManager
1364
+ function (_e) {
1362
1365
  dom.outlineManager.GotoSubject(theClass, true, undefined, true, undefined);
1363
1366
  }, false);
1364
1367
  return box;
@@ -1493,17 +1496,15 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1493
1496
  // @param subject - a term, the subject of the statement(s) being edited.
1494
1497
  // @param predicate - a term, the predicate of the statement(s) being edited
1495
1498
  // @param possible - a list of terms, the possible value the object can take
1496
- // @param options.multiple - Boolean - Whether more than one at a time is allowed
1497
- // @param options.firstSelectOptionText - a string to be displayed as the
1499
+ // @param options.nullLabel - a string to be displayed as the
1498
1500
  // option for none selected (for non multiple)
1499
- // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1500
1501
  // @param options.subForm - If mint, then the form to be used for minting the new thing
1501
1502
  // @param dataDoc - The web document being edited
1502
1503
  // @param callbackFunction - takes (boolean ok, string errorBody)
1503
1504
  */
1504
1505
 
1505
1506
 
1506
- function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
1507
+ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
1507
1508
  log.debug('Select list length now ' + possible.length);
1508
1509
  var n = 0;
1509
1510
  var uris = {}; // Count them
@@ -1520,7 +1521,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1520
1521
  } // uris is now the set of possible options
1521
1522
 
1522
1523
 
1523
- if (n === 0 && !options.mint) {
1524
+ if (n === 0) {
1524
1525
  return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1525
1526
  }
1526
1527
 
@@ -1546,6 +1547,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1546
1547
  actual = getActual();
1547
1548
 
1548
1549
  var onChange = function onChange(_e) {
1550
+ select.disabled = true; // until data written back - gives user feedback too
1551
+
1549
1552
  var ds = [];
1550
1553
  var is = [];
1551
1554
 
@@ -1555,43 +1558,18 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1555
1558
  }
1556
1559
  };
1557
1560
 
1558
- var newObject;
1559
-
1560
1561
  for (var _i = 0; _i < select.options.length; _i++) {
1561
1562
  var opt = select.options[_i];
1562
-
1563
- if (opt.selected && opt.AJAR_mint) {
1564
- // not sure if this if is used because I cannot find mintClass
1565
- if (options.mintClass) {
1566
- var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
1567
- if (!ok) {
1568
- callbackFunction(ok, body, {
1569
- change: 'new'
1570
- }); // @@ if ok, need some form of refresh of the select for the new thing
1571
- }
1572
- });
1573
- select.parentNode.appendChild(thisForm);
1574
- newObject = thisForm.AJAR_subject;
1575
- } else {
1576
- newObject = newThing(dataDoc);
1577
- }
1578
-
1579
- is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
1580
- if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc)); // not sure if this if is used because I cannot find mintStatementsFun
1581
-
1582
- if (options.mintStatementsFun) {
1583
- is = is.concat(options.mintStatementsFun(newObject));
1584
- }
1585
-
1586
- select.currentURI = newObject;
1587
- }
1588
-
1589
1563
  if (!opt.AJAR_uri) continue; // a prompt or mint
1590
1564
 
1591
1565
  if (opt.selected && !(opt.AJAR_uri in actual)) {
1592
1566
  // new class
1593
1567
  is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
1594
- select.currentURI = opt.AJAR_uri;
1568
+ }
1569
+
1570
+ if (!opt.selected && opt.AJAR_uri in actual) {
1571
+ // old class
1572
+ removeValue(kb.sym(opt.AJAR_uri));
1595
1573
  }
1596
1574
 
1597
1575
  if (opt.selected) select.currentURI = opt.AJAR_uri;
@@ -1611,27 +1589,25 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1611
1589
  sel = sel.superSelect;
1612
1590
  }
1613
1591
 
1614
- log.info('selectForOptions: data doc = ' + dataDoc); // refresh subForm
1592
+ log.info('selectForOptions: data doc = ' + dataDoc);
1593
+ kb.updater.update(ds, is, function (uri, ok, body) {
1594
+ actual = getActual(); // refresh
1615
1595
 
1616
- removeNextSiblingsAfterElement(select);
1617
- addSubFormChoice(dom, select.parentNode, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
1618
1596
  if (ok) {
1619
- kb.updater.update(ds, is, function (uri, success, errorBody) {
1620
- actual = getActual(); // refresh
1597
+ select.disabled = false; // data written back
1598
+ } else {
1599
+ return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1600
+ }
1621
1601
 
1622
- if (!success) return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + errorBody));
1623
- if (callbackFunction) callbackFunction(success, {
1624
- widget: 'select',
1625
- event: 'new'
1626
- });
1627
- });
1628
- } else return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
1602
+ if (callbackFunction) callbackFunction(ok, {
1603
+ widget: 'select',
1604
+ event: 'change'
1605
+ });
1629
1606
  });
1630
1607
  };
1631
1608
 
1632
1609
  var select = dom.createElement('select');
1633
1610
  select.setAttribute('style', style.formSelectSTyle);
1634
- if (options.multiple) select.setAttribute('multiple', 'true');
1635
1611
  select.currentURI = null;
1636
1612
 
1637
1613
  select.refresh = function () {
@@ -1674,22 +1650,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1674
1650
  select.appendChild(option);
1675
1651
  }
1676
1652
 
1677
- if (editable && options.mint) {
1678
- var mint = dom.createElement('option');
1679
- mint.appendChild(dom.createTextNode(options.mint));
1680
- mint.AJAR_mint = true; // Flag it
1681
-
1682
- select.insertBefore(mint, select.firstChild);
1683
- }
1684
-
1685
- if (!select.currentURI && !options.multiple) {
1653
+ if (!select.currentURI) {
1686
1654
  var prompt = dom.createElement('option');
1687
- prompt.appendChild(dom.createTextNode(options.firstSelectOptionText));
1688
- prompt.selected = true;
1689
- prompt.disabled = true;
1690
- prompt.value = true;
1691
- prompt.hidden = true;
1655
+ prompt.appendChild(dom.createTextNode(options.nullLabel));
1692
1656
  select.insertBefore(prompt, select.firstChild);
1657
+ prompt.selected = true;
1693
1658
  }
1694
1659
 
1695
1660
  if (editable) {
@@ -1708,27 +1673,16 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1708
1673
  function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1709
1674
  var du = kb.any(category, ns.owl('disjointUnionOf'));
1710
1675
  var subs;
1711
- var multiple = false;
1712
1676
 
1713
1677
  if (!du) {
1714
1678
  subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
1715
- multiple = true;
1716
1679
  } else {
1717
1680
  subs = du.elements;
1718
1681
  }
1719
1682
 
1720
1683
  log.debug('Select list length ' + subs.length);
1721
-
1722
- if (subs.length === 0) {
1723
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1724
- }
1725
-
1726
- if (subs.length === 1) {
1727
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
1728
- }
1729
-
1730
- return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, null, {
1731
- multiple: multiple
1684
+ return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, {
1685
+ nullLabel: '* Select type *'
1732
1686
  }, dataDoc, callbackFunction);
1733
1687
  }
1734
1688
  /** Make SELECT element to select subclasses recurively
@@ -1762,8 +1716,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
1762
1716
  function onChange(ok, body) {
1763
1717
  if (ok) update();
1764
1718
  callbackFunction(ok, body);
1765
- } // eslint-disable-next-line prefer-const
1766
-
1719
+ }
1767
1720
 
1768
1721
  var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
1769
1722
  container.appendChild(select);
@@ -1918,4 +1871,197 @@ function newThing(doc) {
1918
1871
  var now = new Date();
1919
1872
  return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
1920
1873
  }
1874
+ /** Make SELECT element to select options
1875
+ //
1876
+ // @param subject - a term, the subject of the statement(s) being edited.
1877
+ // @param predicate - a term, the predicate of the statement(s) being edited
1878
+ // @param possible - a list of terms, the possible value the object can take
1879
+ // @param options.multiSelect - Boolean - Whether more than one at a time is allowed
1880
+ // @param options.uiMultipleInUse - signals that the ui:choise is used with a ui:multiple
1881
+ // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1882
+ // @param options.subForm - If mint, then the form to be used for minting the new thing
1883
+ // @param dataDoc - The web document being edited
1884
+ // @param callbackFunction - takes (boolean ok, string errorBody)
1885
+ */
1886
+
1887
+
1888
+ function makeSelectForChoice(dom, container, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
1889
+ var n = 0;
1890
+ var uris = {}; // Count them
1891
+
1892
+ var editable = kb.updater.editable(dataDoc.uri);
1893
+
1894
+ for (var i = 0; i < possible.length; i++) {
1895
+ var sub = possible[i]; // @@ Maybe; make this so it works with blank nodes too
1896
+
1897
+ if (!sub.uri) debug.warn("makeSelectForOptions: option does not have an uri: ".concat(sub, ", with predicate: ").concat(predicate));
1898
+ if (!sub.uri || sub.uri in uris) continue;
1899
+ uris[sub.uri] = true;
1900
+ n++;
1901
+ } // uris is now the set of possible options
1902
+
1903
+
1904
+ if (n === 0 && !options.mint) {
1905
+ return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1906
+ }
1907
+
1908
+ log.debug('makeSelectForOptions: dataDoc=' + dataDoc);
1909
+
1910
+ function determinFirstSelectOption() {
1911
+ var firstSelectOptionText = '--- classify ---';
1912
+ var option = dom.createElement('option');
1913
+
1914
+ if (predicate && !(predicate.termType === 'BlankNode')) {
1915
+ firstSelectOptionText = '* Select for property: ' + utils.label(predicate) + ' *';
1916
+ }
1917
+
1918
+ if (subject && !(subject.termType === 'BlankNode')) {
1919
+ firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *';
1920
+ }
1921
+
1922
+ option.appendChild(dom.createTextNode(firstSelectOptionText));
1923
+ option.disabled = true;
1924
+ option.value = true;
1925
+ option.hidden = true;
1926
+ option.selected = true;
1927
+ return option;
1928
+ }
1929
+
1930
+ var onChange = function onChange(_e) {
1931
+ select.refresh();
1932
+ };
1933
+
1934
+ var select = dom.createElement('select');
1935
+ select.setAttribute('style', style.formSelectSTyle);
1936
+ if (options.multiSelect) select.setAttribute('multiSelect', 'true');
1937
+ select.currentURI = null;
1938
+ var object = kb.any(subject, predicate);
1939
+ if (object) select.currentURI = object;
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
+ select.refresh();
2065
+ return select;
2066
+ } // makeSelectForChoice
1921
2067
  //# sourceMappingURL=forms.js.map