solid-ui 2.4.22-8fef4f19 → 2.4.22-993ab4aa

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
@@ -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;
@@ -727,16 +728,13 @@ _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already,
727
728
  if (kb.updater.editable(dataDoc.uri)) {
728
729
  var tail = box.appendChild(dom.createElement('div'));
729
730
  tail.style.padding = '0.5em';
730
- var label = kb.any(form, ui('label'));
731
- if (!label) label = utils.label(property, true); // Init capital
732
-
733
731
  var img = tail.appendChild(dom.createElement('img'));
734
732
  img.setAttribute('src', plusIconURI); // plus sign
735
733
 
736
734
  img.setAttribute('style', 'margin: 0.2em; width: 1.5em; height:1.5em');
737
- img.title = 'Click to add one or more ' + label;
735
+ img.title = 'Click to add another ' + multipleUIlabel;
738
736
  var prompt = dom.createElement('span');
739
- prompt.textContent = (values.length === 0 ? 'Add one or more ' : 'Add more ') + utils.predicateLabel(property, reverse);
737
+ prompt.textContent = (values.length === 0 ? 'Add another ' : 'Add ') + multipleUIlabel;
740
738
  tail.addEventListener('click', /*#__PURE__*/function () {
741
739
  var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(_eventNotUsed) {
742
740
  return _regenerator["default"].wrap(function _callee5$(_context5) {
@@ -1033,7 +1031,7 @@ _fieldFunction.field[ns.ui('Classifier').uri] = function (dom, container, alread
1033
1031
  ** -- radio buttons
1034
1032
  ** -- auto-complete typing
1035
1033
  **
1036
- ** 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
1037
1035
  */
1038
1036
 
1039
1037
 
@@ -1042,6 +1040,7 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1042
1040
  var kb = _solidLogic.store;
1043
1041
  var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
1044
1042
 
1043
+ var multiSelect = false;
1045
1044
  var p;
1046
1045
  var box = dom.createElement('div');
1047
1046
  box.setAttribute('class', 'choiceBox'); // Set flexDirection column?
@@ -1070,87 +1069,79 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1070
1069
 
1071
1070
  var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
1072
1071
 
1073
- var possible = [];
1074
- var possibleProperties;
1075
- var multiple = false;
1076
- var firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *'; // if we do NOT have a container it means it is a ui:Multiple
1077
- // only important for the first option text in select
1078
-
1079
- if (!container) {
1080
- multiple = true;
1081
- firstSelectOptionText = utils.label(subject, true);
1082
- }
1083
-
1084
1072
  var opts = {
1085
1073
  form: form,
1086
1074
  subForm: subForm,
1087
- multiple: multiple,
1088
- firstSelectOptionText: firstSelectOptionText,
1075
+ multiSelect: multiSelect,
1089
1076
  disambiguate: false
1090
1077
  };
1091
- possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1092
1078
 
1093
- for (var x in kb.findMembersNT(uiFrom)) {
1094
- possible.push(kb.fromNT(x));
1095
- } // Use rdfs
1079
+ function getSelectorOptions() {
1080
+ var possible = [];
1081
+ var possibleProperties;
1082
+ possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1096
1083
 
1084
+ for (var x in kb.findMembersNT(uiFrom)) {
1085
+ possible.push(kb.fromNT(x));
1086
+ } // Use rdfs
1097
1087
 
1098
- if (uiFrom.sameTerm(ns.rdfs('Class'))) {
1099
- for (p in buttons.allClassURIs()) {
1100
- possible.push(kb.sym(p));
1101
- } // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
1102
1088
 
1103
- } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1104
- 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)
1105
1093
 
1106
- for (p in possibleProperties.op) {
1107
- possible.push(kb.fromNT(p));
1108
- }
1094
+ } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1095
+ possibleProperties = buttons.propertyTriage(kb);
1109
1096
 
1110
- for (p in possibleProperties.dp) {
1111
- possible.push(kb.fromNT(p));
1112
- }
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
+ }
1113
1104
 
1114
- opts.disambiguate = true; // This is a big class, and the labels won't be enough.
1115
- } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
1116
- 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);
1117
1108
 
1118
- for (p in possibleProperties.op) {
1119
- possible.push(kb.fromNT(p));
1120
- }
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);
1121
1116
 
1122
- opts.disambiguate = true;
1123
- } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1124
- possibleProperties = buttons.propertyTriage(kb);
1117
+ for (p in possibleProperties.dp) {
1118
+ possible.push(kb.fromNT(p));
1119
+ }
1125
1120
 
1126
- for (p in possibleProperties.dp) {
1127
- possible.push(kb.fromNT(p));
1121
+ opts.disambiguate = true;
1128
1122
  }
1129
1123
 
1130
- opts.disambiguate = true;
1131
- }
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
1132
1128
 
1133
- var sortedPossible = sortByLabel(possible); // TODO: this checks for any occurrence, regardless of true or false setting
1134
1129
 
1135
1130
  if (kb.any(form, ui('canMintNew'))) {
1136
1131
  opts.mint = '* Create new *'; // @@ could be better
1137
1132
  }
1138
1133
 
1139
- var selector = makeSelectForOptions(dom, kb, subject, property, sortedPossible, uiFrom, opts, dataDoc, callbackFunction);
1140
- rhs.appendChild(selector);
1141
- var object;
1134
+ var selector;
1142
1135
 
1143
- if (selector.currentURI) {
1144
- object = $rdf.sym(selector.currentURI);
1145
- } else {
1146
- object = kb.any(subject, property);
1147
- }
1148
-
1149
- if (object && subForm) {
1150
- removeNextSiblingsAfterElement(selector);
1151
- addSubFormChoice(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
1152
- }
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
+ };
1153
1142
 
1143
+ rhs.refresh();
1144
+ if (selector && selector.refresh) selector.refresh();
1154
1145
  return box;
1155
1146
  };
1156
1147
  /**
@@ -1371,7 +1362,8 @@ function promptForNew(dom, kb, subject, predicate, theClass, form, dataDoc, call
1371
1362
  b.setAttribute('type', 'button');
1372
1363
  b.setAttribute('style', 'float: right;');
1373
1364
  b.innerHTML = 'Goto ' + utils.label(theClass);
1374
- b.addEventListener('click', function (_e) {
1365
+ b.addEventListener('click', // TODO fix dependency cycle to solid-panes by calling outlineManager
1366
+ function (_e) {
1375
1367
  dom.outlineManager.GotoSubject(theClass, true, undefined, true, undefined);
1376
1368
  }, false);
1377
1369
  return box;
@@ -1506,17 +1498,15 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1506
1498
  // @param subject - a term, the subject of the statement(s) being edited.
1507
1499
  // @param predicate - a term, the predicate of the statement(s) being edited
1508
1500
  // @param possible - a list of terms, the possible value the object can take
1509
- // @param options.multiple - Boolean - Whether more than one at a time is allowed
1510
- // @param options.firstSelectOptionText - a string to be displayed as the
1501
+ // @param options.nullLabel - a string to be displayed as the
1511
1502
  // option for none selected (for non multiple)
1512
- // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1513
1503
  // @param options.subForm - If mint, then the form to be used for minting the new thing
1514
1504
  // @param dataDoc - The web document being edited
1515
1505
  // @param callbackFunction - takes (boolean ok, string errorBody)
1516
1506
  */
1517
1507
 
1518
1508
 
1519
- function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
1509
+ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
1520
1510
  log.debug('Select list length now ' + possible.length);
1521
1511
  var n = 0;
1522
1512
  var uris = {}; // Count them
@@ -1533,7 +1523,7 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1533
1523
  } // uris is now the set of possible options
1534
1524
 
1535
1525
 
1536
- if (n === 0 && !options.mint) {
1526
+ if (n === 0) {
1537
1527
  return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1538
1528
  }
1539
1529
 
@@ -1559,6 +1549,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1559
1549
  actual = getActual();
1560
1550
 
1561
1551
  var onChange = function onChange(_e) {
1552
+ select.disabled = true; // until data written back - gives user feedback too
1553
+
1562
1554
  var ds = [];
1563
1555
  var is = [];
1564
1556
 
@@ -1568,43 +1560,18 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1568
1560
  }
1569
1561
  };
1570
1562
 
1571
- var newObject;
1572
-
1573
1563
  for (var _i = 0; _i < select.options.length; _i++) {
1574
1564
  var opt = select.options[_i];
1575
-
1576
- if (opt.selected && opt.AJAR_mint) {
1577
- // not sure if this 'if' is used because I cannot find mintClass
1578
- if (options.mintClass) {
1579
- var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
1580
- if (!ok) {
1581
- callbackFunction(ok, body, {
1582
- change: 'new'
1583
- }); // @@ if ok, need some form of refresh of the select for the new thing
1584
- }
1585
- });
1586
- select.parentNode.appendChild(thisForm);
1587
- newObject = thisForm.AJAR_subject;
1588
- } else {
1589
- newObject = newThing(dataDoc);
1590
- }
1591
-
1592
- is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
1593
- 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
1594
-
1595
- if (options.mintStatementsFun) {
1596
- is = is.concat(options.mintStatementsFun(newObject));
1597
- }
1598
-
1599
- select.currentURI = newObject;
1600
- }
1601
-
1602
1565
  if (!opt.AJAR_uri) continue; // a prompt or mint
1603
1566
 
1604
1567
  if (opt.selected && !(opt.AJAR_uri in actual)) {
1605
1568
  // new class
1606
1569
  is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
1607
- select.currentURI = opt.AJAR_uri;
1570
+ }
1571
+
1572
+ if (!opt.selected && opt.AJAR_uri in actual) {
1573
+ // old class
1574
+ removeValue(kb.sym(opt.AJAR_uri));
1608
1575
  }
1609
1576
 
1610
1577
  if (opt.selected) select.currentURI = opt.AJAR_uri;
@@ -1624,29 +1591,25 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1624
1591
  sel = sel.superSelect;
1625
1592
  }
1626
1593
 
1627
- log.info('selectForOptions: data doc = ' + dataDoc); // refresh subForm
1594
+ log.info('selectForOptions: data doc = ' + dataDoc);
1595
+ kb.updater.update(ds, is, function (uri, ok, body) {
1596
+ actual = getActual(); // refresh
1628
1597
 
1629
- removeNextSiblingsAfterElement(select);
1630
- addSubFormChoice(dom, select.parentNode, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
1631
1598
  if (ok) {
1632
- kb.updater.update(ds, is, function (uri, success, errorBody) {
1633
- actual = getActual(); // refresh
1634
-
1635
- if (!success) select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
1636
- });
1637
- if (callbackFunction) callbackFunction(ok, {
1638
- widget: 'select',
1639
- event: 'new'
1640
- });
1599
+ select.disabled = false; // data written back
1641
1600
  } else {
1642
- select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
1601
+ return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1643
1602
  }
1603
+
1604
+ if (callbackFunction) callbackFunction(ok, {
1605
+ widget: 'select',
1606
+ event: 'change'
1607
+ });
1644
1608
  });
1645
1609
  };
1646
1610
 
1647
1611
  var select = dom.createElement('select');
1648
- select.setAttribute('style', style.formSelectSTyle); // if (options.multiple) select.setAttribute('multiple', 'true') // use case merged with ui:Multiple
1649
-
1612
+ select.setAttribute('style', style.formSelectSTyle);
1650
1613
  select.currentURI = null;
1651
1614
 
1652
1615
  select.refresh = function () {
@@ -1689,22 +1652,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1689
1652
  select.appendChild(option);
1690
1653
  }
1691
1654
 
1692
- if (editable && options.mint) {
1693
- var mint = dom.createElement('option');
1694
- mint.appendChild(dom.createTextNode(options.mint));
1695
- mint.AJAR_mint = true; // Flag it
1696
-
1697
- select.insertBefore(mint, select.firstChild);
1698
- }
1699
-
1700
- if (!select.currentURI && options.multiple) {
1655
+ if (!select.currentURI) {
1701
1656
  var prompt = dom.createElement('option');
1702
- prompt.appendChild(dom.createTextNode(options.firstSelectOptionText));
1703
- prompt.disabled = true;
1704
- prompt.value = true;
1705
- prompt.hidden = true;
1706
- prompt.selected = true;
1657
+ prompt.appendChild(dom.createTextNode(options.nullLabel));
1707
1658
  select.insertBefore(prompt, select.firstChild);
1659
+ prompt.selected = true;
1708
1660
  }
1709
1661
 
1710
1662
  if (editable) {
@@ -1723,27 +1675,16 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1723
1675
  function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1724
1676
  var du = kb.any(category, ns.owl('disjointUnionOf'));
1725
1677
  var subs;
1726
- var multiple = false;
1727
1678
 
1728
1679
  if (!du) {
1729
1680
  subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
1730
- multiple = true;
1731
1681
  } else {
1732
1682
  subs = du.elements;
1733
1683
  }
1734
1684
 
1735
1685
  log.debug('Select list length ' + subs.length);
1736
-
1737
- if (subs.length === 0) {
1738
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1739
- }
1740
-
1741
- if (subs.length === 1) {
1742
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
1743
- }
1744
-
1745
- return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, null, {
1746
- multiple: multiple
1686
+ return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, {
1687
+ nullLabel: '* Select type *'
1747
1688
  }, dataDoc, callbackFunction);
1748
1689
  }
1749
1690
  /** Make SELECT element to select subclasses recurively
@@ -1777,8 +1718,7 @@ function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callba
1777
1718
  function onChange(ok, body) {
1778
1719
  if (ok) update();
1779
1720
  callbackFunction(ok, body);
1780
- } // eslint-disable-next-line prefer-const
1781
-
1721
+ }
1782
1722
 
1783
1723
  var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
1784
1724
  container.appendChild(select);
@@ -1933,4 +1873,194 @@ function newThing(doc) {
1933
1873
  var now = new Date();
1934
1874
  return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
1935
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
1936
2066
  //# sourceMappingURL=forms.js.map