solid-ui 2.4.22-4f620aea → 2.4.22-580e8bf6

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.
@@ -120,6 +120,6 @@ function slice(s, suffix) {
120
120
 
121
121
  function getWellKnownLabel(thing) {
122
122
  return _solidLogic.store.any(thing, UI.ns.ui('label')) || // Prioritize ui:label
123
- _solidLogic.store.any(thing, UI.ns.link('message')) || _solidLogic.store.any(thing, UI.ns.vcard('fn')) || _solidLogic.store.any(thing, UI.ns.foaf('name')) || _solidLogic.store.any(thing, UI.ns.dct('title')) || _solidLogic.store.any(thing, UI.ns.dc('title')) || _solidLogic.store.any(thing, UI.ns.rss('title')) || _solidLogic.store.any(thing, UI.ns.contact('fullName')) || _solidLogic.store.any(thing, _solidLogic.store.sym('http://www.w3.org/2001/04/roadmap/org#name')) || _solidLogic.store.any(thing, UI.ns.cal('summary')) || _solidLogic.store.any(thing, UI.ns.foaf('nick')) || _solidLogic.store.any(thing, UI.ns.as('name')) || _solidLogic.store.any(thing, UI.ns.schema('name')) || _solidLogic.store.any(thing, UI.ns.rdfs('label'));
123
+ _solidLogic.store.any(thing, UI.ns.link('message')) || _solidLogic.store.any(thing, UI.ns.vcard('fn')) || _solidLogic.store.any(thing, UI.ns.foaf('name')) || _solidLogic.store.any(thing, UI.ns.dct('title')) || _solidLogic.store.any(thing, UI.ns.dc('title')) || _solidLogic.store.any(thing, UI.ns.rss('title')) || _solidLogic.store.any(thing, UI.ns.contact('fullName')) || _solidLogic.store.any(thing, _solidLogic.store.sym('http://www.w3.org/2001/04/roadmap/org#name')) || _solidLogic.store.any(thing, UI.ns.cal('summary')) || _solidLogic.store.any(thing, UI.ns.foaf('nick')) || _solidLogic.store.any(thing, UI.ns.as('name')) || _solidLogic.store.any(thing, UI.ns.schema('name')) || _solidLogic.store.any(thing, UI.ns.rdfs('label')) || _solidLogic.store.any(thing, _solidLogic.store.sym('http://www.w3.org/2004/02/skos/core#prefLabel'));
124
124
  }
125
125
  //# sourceMappingURL=label.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/label.ts"],"names":["UI","log","ns","rdf","label","thing","initialCap","doCap","slice","toUpperCase","cleanUp","result","i","length","toLowerCase","getWellKnownLabel","value","termType","elements","s","uri","toString","split","map","decodeURIComponent","join","e","hex","indexOf","String","fromCharCode","parseInt","hash","slash","lastIndexOf","suffix","store","any","ui","link","vcard","foaf","dct","dc","rss","contact","sym","cal","as","schema","rdfs"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;;;;;AAA8B;AAE9B,IAAMA,EAAE,GAAG;AAAEC,EAAAA,GAAG,EAAHA,GAAF;AAAOC,EAAAA,EAAE,EAAFA,EAAP;AAAWC,EAAAA,GAAG,EAAHA;AAAX,CAAX,C,CAEA;AACA;AACA;;AACO,SAASC,KAAT,CAAgBC,KAAhB,EAAmD;AAAA,MAA5BC,UAA4B,uEAAf,KAAe;;AACxD,WAASC,KAAT,CAAgBH,KAAhB,EAA+B;AAC7B,QAAIE,UAAJ,EAAgB;AACd,aAAOF,KAAK,CAACI,KAAN,CAAY,CAAZ,EAAe,CAAf,EAAkBC,WAAlB,KAAkCL,KAAK,CAACI,KAAN,CAAY,CAAZ,CAAzC;AACD;;AACD,WAAOJ,KAAP;AACD;;AACD,WAASM,OAAT,CAAkBN,KAAlB,EAAiC;AAC/B,QAAIO,MAAM,GAAG,EAAb;AACA,QAAIP,KAAK,CAACI,KAAN,CAAY,CAAC,CAAb,MAAoB,GAAxB,EAA6BJ,KAAK,GAAGA,KAAK,CAACI,KAAN,CAAY,CAAZ,EAAe,CAAC,CAAhB,CAAR,CAFE,CAEyB;;AACxD,SAAK,IAAII,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGR,KAAK,CAACS,MAA1B,EAAkCD,CAAC,EAAnC,EAAuC;AACrC,UAAIR,KAAK,CAACQ,CAAD,CAAL,KAAa,GAAb,IAAoBR,KAAK,CAACQ,CAAD,CAAL,KAAa,GAArC,EAA0C;AACxCD,QAAAA,MAAM,IAAI,GAAV;AACA;AACD;;AACDA,MAAAA,MAAM,IAAIP,KAAK,CAACQ,CAAD,CAAf;;AACA,UACEA,CAAC,GAAG,CAAJ,GAAQR,KAAK,CAACS,MAAd,IACAT,KAAK,CAACQ,CAAD,CAAL,CAASH,WAAT,OAA2BL,KAAK,CAACQ,CAAD,CADhC,IAEAR,KAAK,CAACQ,CAAC,GAAG,CAAL,CAAL,CAAaE,WAAb,OAA+BV,KAAK,CAACQ,CAAC,GAAG,CAAL,CAHtC,EAIE;AACAD,QAAAA,MAAM,IAAI,GAAV;AACD;AACF;;AACD,QAAIA,MAAM,CAACH,KAAP,CAAa,CAAb,EAAgB,CAAhB,MAAuB,MAA3B,EAAmCG,MAAM,GAAGA,MAAM,CAACH,KAAP,CAAa,CAAb,CAAT;AACnC,WAAOD,KAAK,CAACI,MAAD,CAAZ;AACD;;AAED,MAAMP,KAAK,GAAGW,iBAAiB,CAACV,KAAD,CAA/B;;AAEA,MAAID,KAAJ,EAAW;AACT,WAAOG,KAAK,CAACH,KAAK,CAACY,KAAP,CAAZ;AACD,GAhCuD,CAkCxD;;;AAEA,MAAIX,KAAK,CAACY,QAAN,KAAmB,WAAvB,EAAoC;AAClC,WAAO,KAAP;AACD;;AACD,MAAIZ,KAAK,CAACY,QAAN,KAAmB,YAAvB,EAAqC;AACnC,WAAO,MAAMZ,KAAK,CAACa,QAAN,CAAeL,MAArB,GAA8B,GAArC;AACD;;AACD,MAAIM,CAAC,GAAGd,KAAK,CAACe,GAAd;AACA,MAAI,OAAOD,CAAP,KAAa,WAAjB,EAA8B,OAAOd,KAAK,CAACgB,QAAN,EAAP,CA3C0B,CA2CF;AACtD;AACA;AACA;;AACA,MAAI;AACFF,IAAAA,CAAC,GAAGA,CAAC,CACFG,KADC,CACK,GADL,EAEDC,GAFC,CAEGC,kBAFH,EAGDC,IAHC,CAGI,GAHJ,CAAJ,CADE,CAIW;AACd,GALD,CAKE,OAAOC,CAAP,EAAU;AACV;AACA,SAAK,IAAId,CAAC,GAAGO,CAAC,CAACN,MAAF,GAAW,CAAxB,EAA2BD,CAAC,GAAG,CAA/B,EAAkCA,CAAC,EAAnC,EAAuC;AACrC,UAAMe,GAAG,GAAG,uBAAZ,CADqC,CACD;;AACpC,aACER,CAAC,CAACP,CAAD,CAAD,KAAS,GAAT,IACAe,GAAG,CAACC,OAAJ,CAAYT,CAAC,CAACP,CAAC,GAAG,CAAL,CAAb,KAAyB,CADzB,IAEAe,GAAG,CAACC,OAAJ,CAAYT,CAAC,CAACP,CAAC,GAAG,CAAL,CAAb,KAAyB,CAH3B,EAIE;AACAO,QAAAA,CAAC,GACCA,CAAC,CAACX,KAAF,CAAQ,CAAR,EAAWI,CAAX,IACAiB,MAAM,CAACC,YAAP,CAAoBC,QAAQ,CAACZ,CAAC,CAACX,KAAF,CAAQI,CAAC,GAAG,CAAZ,EAAeA,CAAC,GAAG,CAAnB,CAAD,EAAwB,EAAxB,CAA5B,CADA,GAEAO,CAAC,CAACX,KAAF,CAAQI,CAAC,GAAG,CAAZ,CAHF;AAID;AACF;AACF;;AAEDO,EAAAA,CAAC,GAAGX,KAAK,CAACW,CAAD,EAAI,kBAAJ,CAAT;AACAA,EAAAA,CAAC,GAAGX,KAAK,CAACW,CAAD,EAAI,OAAJ,CAAT;AACAA,EAAAA,CAAC,GAAGX,KAAK,CAACW,CAAD,EAAI,KAAJ,CAAT;AAEA,MAAMa,IAAI,GAAGb,CAAC,CAACS,OAAF,CAAU,GAAV,CAAb;AACA,MAAII,IAAI,IAAI,CAAZ,EAAe,OAAOtB,OAAO,CAACS,CAAC,CAACX,KAAF,CAAQwB,IAAI,GAAG,CAAf,CAAD,CAAd,CA1EyC,CA4ExD;;AACA,MAAMC,KAAK,GAAGd,CAAC,CAACe,WAAF,CAAc,GAAd,EAAmBf,CAAC,CAACN,MAAF,GAAW,CAA9B,CAAd,CA7EwD,CA6ET;;AAC/C,MAAIoB,KAAK,IAAI,CAAT,IAAcA,KAAK,GAAG5B,KAAK,CAACe,GAAN,CAAUP,MAApC,EAA4C,OAAOH,OAAO,CAACS,CAAC,CAACX,KAAF,CAAQyB,KAAK,GAAG,CAAhB,CAAD,CAAd;AAE5C,SAAO1B,KAAK,CAACiB,kBAAkB,CAACnB,KAAK,CAACe,GAAP,CAAnB,CAAZ;AACD;;AAED,SAASZ,KAAT,CAAgBW,CAAhB,EAA2BgB,MAA3B,EAA2C;AACzC,MAAMtB,MAAM,GAAGsB,MAAM,CAACtB,MAAP,GAAgB,CAAC,CAAhC;;AACA,MAAIM,CAAC,CAACX,KAAF,CAAQK,MAAR,MAAoBsB,MAAxB,EAAgC;AAC9B,WAAOhB,CAAC,CAACX,KAAF,CAAQ,CAAR,EAAWK,MAAX,CAAP;AACD;;AACD,SAAOM,CAAP;AACD,C,CAED;AACA;;;AACA,SAASJ,iBAAT,CAA4BV,KAA5B,EAAmC;AACjC,SAAO+B,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAMoC,EAAN,CAAS,OAAT,CAAjB,KAAuC;AAC1CF,oBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAMqC,IAAN,CAAW,SAAX,CAAjB,CADG,IAEHH,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAMsC,KAAN,CAAY,IAAZ,CAAjB,CAFG,IAGHJ,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAMuC,IAAN,CAAW,MAAX,CAAjB,CAHG,IAIHL,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAMwC,GAAN,CAAU,OAAV,CAAjB,CAJG,IAKHN,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAMyC,EAAN,CAAS,OAAT,CAAjB,CALG,IAMHP,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAM0C,GAAN,CAAU,OAAV,CAAjB,CANG,IAOHR,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAM2C,OAAN,CAAc,UAAd,CAAjB,CAPG,IAQHT,kBAAMC,GAAN,CAAUhC,KAAV,EAAiB+B,kBAAMU,GAAN,CAAU,4CAAV,CAAjB,CARG,IASHV,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAM6C,GAAN,CAAU,SAAV,CAAjB,CATG,IAUHX,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAMuC,IAAN,CAAW,MAAX,CAAjB,CAVG,IAWHL,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAM8C,EAAN,CAAS,MAAT,CAAjB,CAXG,IAYHZ,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAM+C,MAAN,CAAa,MAAb,CAAjB,CAZG,IAaHb,kBAAMC,GAAN,CAAUhC,KAAV,EAAiBL,EAAE,CAACE,EAAH,CAAMgD,IAAN,CAAW,OAAX,CAAjB,CAbJ;AAcD","sourcesContent":["import * as log from '../log'\nimport { store } from 'solid-logic'\nimport * as ns from '../ns'\nimport * as rdf from 'rdflib' // pull in first avoid cross-refs\n\nconst UI = { log, ns, rdf }\n\n// This ubiquitous function returns the best label for a thing\n//\n// The hacks in this code make a major difference to the usability\nexport function label (thing, initialCap = false): string {\n function doCap (label: string) {\n if (initialCap) {\n return label.slice(0, 1).toUpperCase() + label.slice(1)\n }\n return label\n }\n function cleanUp (label: string) {\n let result = ''\n if (label.slice(-1) === '/') label = label.slice(0, -1) // chop trailing slash\n for (let i = 0; i < label.length; i++) {\n if (label[i] === '_' || label[i] === '-') {\n result += ' '\n continue\n }\n result += label[i]\n if (\n i + 1 < label.length &&\n label[i].toUpperCase() !== label[i] &&\n label[i + 1].toLowerCase() !== label[i + 1]\n ) {\n result += ' '\n }\n }\n if (result.slice(0, 4) === 'has ') result = result.slice(4)\n return doCap(result)\n }\n\n const label = getWellKnownLabel(thing)\n\n if (label) {\n return doCap(label.value)\n }\n\n // Default to label just generated from the URI\n\n if (thing.termType === 'BlankNode') {\n return '...'\n }\n if (thing.termType === 'Collection') {\n return '(' + thing.elements.length + ')'\n }\n let s = thing.uri\n if (typeof s === 'undefined') return thing.toString() // can't be a symbol\n // s = decodeURI(s) // This can crash is random valid @ signs are presentation\n // The idea was to clean up eg URIs encoded in query strings\n // Also encoded character in what was filenames like @ [] {}\n try {\n s = s\n .split('/')\n .map(decodeURIComponent)\n .join('/') // If it is properly encoded\n } catch (e) {\n // try individual decoding of ASCII code points\n for (let i = s.length - 3; i > 0; i--) {\n const hex = '0123456789abcefABCDEF' // The while upacks multiple layers of encoding\n while (\n s[i] === '%' &&\n hex.indexOf(s[i + 1]) >= 0 &&\n hex.indexOf(s[i + 2]) >= 0\n ) {\n s =\n s.slice(0, i) +\n String.fromCharCode(parseInt(s.slice(i + 1, i + 3), 16)) +\n s.slice(i + 3)\n }\n }\n }\n\n s = slice(s, '/profile/card#me')\n s = slice(s, '#this')\n s = slice(s, '#me')\n\n const hash = s.indexOf('#')\n if (hash >= 0) return cleanUp(s.slice(hash + 1))\n\n // Eh? Why not do this? e.g. dc:title needs it only trim URIs, not rdfs:labels\n const slash = s.lastIndexOf('/', s.length - 2) // (len-2) excludes trailing slash\n if (slash >= 0 && slash < thing.uri.length) return cleanUp(s.slice(slash + 1))\n\n return doCap(decodeURIComponent(thing.uri))\n}\n\nfunction slice (s: string, suffix: string) {\n const length = suffix.length * -1\n if (s.slice(length) === suffix) {\n return s.slice(0, length)\n }\n return s\n}\n\n// Hard coded known label predicates\n// @@ TBD: Add subproperties of rdfs:label\nfunction getWellKnownLabel (thing) {\n return store.any(thing, UI.ns.ui('label')) || // Prioritize ui:label\n store.any(thing, UI.ns.link('message')) ||\n store.any(thing, UI.ns.vcard('fn')) ||\n store.any(thing, UI.ns.foaf('name')) ||\n store.any(thing, UI.ns.dct('title')) ||\n store.any(thing, UI.ns.dc('title')) ||\n store.any(thing, UI.ns.rss('title')) ||\n store.any(thing, UI.ns.contact('fullName')) ||\n store.any(thing, store.sym('http://www.w3.org/2001/04/roadmap/org#name')) ||\n store.any(thing, UI.ns.cal('summary')) ||\n store.any(thing, UI.ns.foaf('nick')) ||\n store.any(thing, UI.ns.as('name')) ||\n store.any(thing, UI.ns.schema('name')) ||\n store.any(thing, UI.ns.rdfs('label'))\n}\n"],"file":"label.js"}
1
+ {"version":3,"sources":["../../src/utils/label.ts"],"names":["UI","log","ns","rdf","label","thing","initialCap","doCap","slice","toUpperCase","cleanUp","result","i","length","toLowerCase","getWellKnownLabel","value","termType","elements","s","uri","toString","split","map","decodeURIComponent","join","e","hex","indexOf","String","fromCharCode","parseInt","hash","slash","lastIndexOf","suffix","store","any","ui","link","vcard","foaf","dct","dc","rss","contact","sym","cal","as","schema","rdfs"],"mappings":"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","sourcesContent":["import * as log from '../log'\nimport { store } from 'solid-logic'\nimport * as ns from '../ns'\nimport * as rdf from 'rdflib' // pull in first avoid cross-refs\n\nconst UI = { log, ns, rdf }\n\n// This ubiquitous function returns the best label for a thing\n//\n// The hacks in this code make a major difference to the usability\nexport function label (thing, initialCap = false): string {\n function doCap (label: string) {\n if (initialCap) {\n return label.slice(0, 1).toUpperCase() + label.slice(1)\n }\n return label\n }\n function cleanUp (label: string) {\n let result = ''\n if (label.slice(-1) === '/') label = label.slice(0, -1) // chop trailing slash\n for (let i = 0; i < label.length; i++) {\n if (label[i] === '_' || label[i] === '-') {\n result += ' '\n continue\n }\n result += label[i]\n if (\n i + 1 < label.length &&\n label[i].toUpperCase() !== label[i] &&\n label[i + 1].toLowerCase() !== label[i + 1]\n ) {\n result += ' '\n }\n }\n if (result.slice(0, 4) === 'has ') result = result.slice(4)\n return doCap(result)\n }\n\n const label = getWellKnownLabel(thing)\n\n if (label) {\n return doCap(label.value)\n }\n\n // Default to label just generated from the URI\n\n if (thing.termType === 'BlankNode') {\n return '...'\n }\n if (thing.termType === 'Collection') {\n return '(' + thing.elements.length + ')'\n }\n let s = thing.uri\n if (typeof s === 'undefined') return thing.toString() // can't be a symbol\n // s = decodeURI(s) // This can crash is random valid @ signs are presentation\n // The idea was to clean up eg URIs encoded in query strings\n // Also encoded character in what was filenames like @ [] {}\n try {\n s = s\n .split('/')\n .map(decodeURIComponent)\n .join('/') // If it is properly encoded\n } catch (e) {\n // try individual decoding of ASCII code points\n for (let i = s.length - 3; i > 0; i--) {\n const hex = '0123456789abcefABCDEF' // The while upacks multiple layers of encoding\n while (\n s[i] === '%' &&\n hex.indexOf(s[i + 1]) >= 0 &&\n hex.indexOf(s[i + 2]) >= 0\n ) {\n s =\n s.slice(0, i) +\n String.fromCharCode(parseInt(s.slice(i + 1, i + 3), 16)) +\n s.slice(i + 3)\n }\n }\n }\n\n s = slice(s, '/profile/card#me')\n s = slice(s, '#this')\n s = slice(s, '#me')\n\n const hash = s.indexOf('#')\n if (hash >= 0) return cleanUp(s.slice(hash + 1))\n\n // Eh? Why not do this? e.g. dc:title needs it only trim URIs, not rdfs:labels\n const slash = s.lastIndexOf('/', s.length - 2) // (len-2) excludes trailing slash\n if (slash >= 0 && slash < thing.uri.length) return cleanUp(s.slice(slash + 1))\n\n return doCap(decodeURIComponent(thing.uri))\n}\n\nfunction slice (s: string, suffix: string) {\n const length = suffix.length * -1\n if (s.slice(length) === suffix) {\n return s.slice(0, length)\n }\n return s\n}\n\n// Hard coded known label predicates\n// @@ TBD: Add subproperties of rdfs:label\nfunction getWellKnownLabel (thing) {\n return store.any(thing, UI.ns.ui('label')) || // Prioritize ui:label\n store.any(thing, UI.ns.link('message')) ||\n store.any(thing, UI.ns.vcard('fn')) ||\n store.any(thing, UI.ns.foaf('name')) ||\n store.any(thing, UI.ns.dct('title')) ||\n store.any(thing, UI.ns.dc('title')) ||\n store.any(thing, UI.ns.rss('title')) ||\n store.any(thing, UI.ns.contact('fullName')) ||\n store.any(thing, store.sym('http://www.w3.org/2001/04/roadmap/org#name')) ||\n store.any(thing, UI.ns.cal('summary')) ||\n store.any(thing, UI.ns.foaf('nick')) ||\n store.any(thing, UI.ns.as('name')) ||\n store.any(thing, UI.ns.schema('name')) ||\n store.any(thing, UI.ns.rdfs('label')) ||\n store.any(thing, store.sym('http://www.w3.org/2004/02/skos/core#prefLabel'))\n}\n"],"file":"label.js"}
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.versionInfo = void 0;
7
7
  var versionInfo = {
8
- buildTime: '2022-05-13T07:29:42Z',
9
- commit: '4f620aea3e91daf5ce9591dd83d3c95c161a44ad',
8
+ buildTime: '2022-05-19T17:29:45Z',
9
+ commit: '580e8bf6997815d2b72b0898141a77e3a759185c',
10
10
  npmInfo: {
11
11
  'solid-ui': '2.4.22',
12
12
  npm: '6.14.17',
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/versionInfo.ts"],"names":["versionInfo","buildTime","commit","npmInfo","npm","ares","brotli","cldr","icu","llhttp","modules","napi","nghttp2","node","openssl","tz","unicode","uv","v8","zlib"],"mappings":";;;;;;AAAO,IAAMA,WAAW,GAAG;AACzBC,EAAAA,SAAS,EAAE,sBADc;AAEzBC,EAAAA,MAAM,EAAE,0CAFiB;AAGzBC,EAAAA,OAAO,EACT;AACE,gBAAY,QADd;AAEEC,IAAAA,GAAG,EAAE,SAFP;AAGEC,IAAAA,IAAI,EAAE,QAHR;AAIEC,IAAAA,MAAM,EAAE,OAJV;AAKEC,IAAAA,IAAI,EAAE,MALR;AAMEC,IAAAA,GAAG,EAAE,MANP;AAOEC,IAAAA,MAAM,EAAE,OAPV;AAQEC,IAAAA,OAAO,EAAE,IARX;AASEC,IAAAA,IAAI,EAAE,GATR;AAUEC,IAAAA,OAAO,EAAE,QAVX;AAWEC,IAAAA,IAAI,EAAE,SAXR;AAYEC,IAAAA,OAAO,EAAE,QAZX;AAaEC,IAAAA,EAAE,EAAE,QAbN;AAcEC,IAAAA,OAAO,EAAE,MAdX;AAeEC,IAAAA,EAAE,EAAE,QAfN;AAgBEC,IAAAA,EAAE,EAAE,oBAhBN;AAiBEC,IAAAA,IAAI,EAAE;AAjBR;AAJ2B,CAApB","sourcesContent":["export const versionInfo = {\n buildTime: '2022-05-13T07:29:42Z',\n commit: '4f620aea3e91daf5ce9591dd83d3c95c161a44ad',\n npmInfo:\n{\n 'solid-ui': '2.4.22',\n npm: '6.14.17',\n ares: '1.18.1',\n brotli: '1.0.9',\n cldr: '40.0',\n icu: '70.1',\n llhttp: '2.1.4',\n modules: '83',\n napi: '8',\n nghttp2: '1.42.0',\n node: '14.19.2',\n openssl: '1.1.1n',\n tz: '2021a3',\n unicode: '14.0',\n uv: '1.42.0',\n v8: '8.4.371.23-node.87',\n zlib: '1.2.11'\n}\n}\n"],"file":"versionInfo.js"}
1
+ {"version":3,"sources":["../src/versionInfo.ts"],"names":["versionInfo","buildTime","commit","npmInfo","npm","ares","brotli","cldr","icu","llhttp","modules","napi","nghttp2","node","openssl","tz","unicode","uv","v8","zlib"],"mappings":";;;;;;AAAO,IAAMA,WAAW,GAAG;AACzBC,EAAAA,SAAS,EAAE,sBADc;AAEzBC,EAAAA,MAAM,EAAE,0CAFiB;AAGzBC,EAAAA,OAAO,EACT;AACE,gBAAY,QADd;AAEEC,IAAAA,GAAG,EAAE,SAFP;AAGEC,IAAAA,IAAI,EAAE,QAHR;AAIEC,IAAAA,MAAM,EAAE,OAJV;AAKEC,IAAAA,IAAI,EAAE,MALR;AAMEC,IAAAA,GAAG,EAAE,MANP;AAOEC,IAAAA,MAAM,EAAE,OAPV;AAQEC,IAAAA,OAAO,EAAE,IARX;AASEC,IAAAA,IAAI,EAAE,GATR;AAUEC,IAAAA,OAAO,EAAE,QAVX;AAWEC,IAAAA,IAAI,EAAE,SAXR;AAYEC,IAAAA,OAAO,EAAE,QAZX;AAaEC,IAAAA,EAAE,EAAE,QAbN;AAcEC,IAAAA,OAAO,EAAE,MAdX;AAeEC,IAAAA,EAAE,EAAE,QAfN;AAgBEC,IAAAA,EAAE,EAAE,oBAhBN;AAiBEC,IAAAA,IAAI,EAAE;AAjBR;AAJ2B,CAApB","sourcesContent":["export const versionInfo = {\n buildTime: '2022-05-19T17:29:45Z',\n commit: '580e8bf6997815d2b72b0898141a77e3a759185c',\n npmInfo:\n{\n 'solid-ui': '2.4.22',\n npm: '6.14.17',\n ares: '1.18.1',\n brotli: '1.0.9',\n cldr: '40.0',\n icu: '70.1',\n llhttp: '2.1.4',\n modules: '83',\n napi: '8',\n nghttp2: '1.42.0',\n node: '14.19.2',\n openssl: '1.1.1n',\n tz: '2021a3',\n unicode: '14.0',\n uv: '1.42.0',\n v8: '8.4.371.23-node.87',\n zlib: '1.2.11'\n}\n}\n"],"file":"versionInfo.js"}
@@ -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,6 +156,7 @@ _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]) {
@@ -1042,8 +1044,6 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1042
1044
  var kb = _solidLogic.store;
1043
1045
  var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
1044
1046
 
1045
- var uiMultipleInUse = false; // this signals to ui:choice that it is part of a ui:multiple
1046
-
1047
1047
  var multiSelect = false;
1048
1048
  var p;
1049
1049
  var box = dom.createElement('div');
@@ -1073,91 +1073,77 @@ _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, s
1073
1073
 
1074
1074
  var follow = kb.anyJS(form, ui('follow'), null, formDoc); // data doc moves to new subject?
1075
1075
 
1076
- var possible = [];
1077
- var possibleProperties;
1078
- var firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *'; // if we do NOT have a container it means it is a ui:Multiple
1079
- // only important for the first option text in select
1080
-
1081
- if (!container) {
1082
- uiMultipleInUse = true;
1083
- firstSelectOptionText = utils.label(subject, true);
1084
- }
1085
-
1086
- if (subject.termType === 'BlankNode') {
1087
- firstSelectOptionText = '* Select for ' + utils.label(property) + ' *';
1088
- }
1089
-
1090
1076
  var opts = {
1091
1077
  form: form,
1092
1078
  subForm: subForm,
1093
1079
  multiSelect: multiSelect,
1094
- firstSelectOptionText: firstSelectOptionText,
1095
- uiMultipleInUse: uiMultipleInUse,
1096
1080
  disambiguate: false
1097
1081
  };
1098
- possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1099
1082
 
1100
- for (var x in kb.findMembersNT(uiFrom)) {
1101
- possible.push(kb.fromNT(x));
1102
- } // Use rdfs
1083
+ function getSelectorOptions() {
1084
+ var possible = [];
1085
+ var possibleProperties;
1086
+ possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
1103
1087
 
1088
+ for (var x in kb.findMembersNT(uiFrom)) {
1089
+ possible.push(kb.fromNT(x));
1090
+ } // Use rdfs
1104
1091
 
1105
- if (uiFrom.sameTerm(ns.rdfs('Class'))) {
1106
- for (p in buttons.allClassURIs()) {
1107
- possible.push(kb.sym(p));
1108
- } // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
1109
1092
 
1110
- } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1111
- possibleProperties = buttons.propertyTriage(kb);
1093
+ if (uiFrom.sameTerm(ns.rdfs('Class'))) {
1094
+ for (p in buttons.allClassURIs()) {
1095
+ possible.push(kb.sym(p));
1096
+ } // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
1112
1097
 
1113
- for (p in possibleProperties.op) {
1114
- possible.push(kb.fromNT(p));
1115
- }
1098
+ } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
1099
+ possibleProperties = buttons.propertyTriage(kb);
1116
1100
 
1117
- for (p in possibleProperties.dp) {
1118
- possible.push(kb.fromNT(p));
1119
- }
1101
+ for (p in possibleProperties.op) {
1102
+ possible.push(kb.fromNT(p));
1103
+ }
1104
+
1105
+ for (p in possibleProperties.dp) {
1106
+ possible.push(kb.fromNT(p));
1107
+ }
1120
1108
 
1121
- opts.disambiguate = true; // This is a big class, and the labels won't be enough.
1122
- } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
1123
- possibleProperties = buttons.propertyTriage(kb);
1109
+ opts.disambiguate = true; // This is a big class, and the labels won't be enough.
1110
+ } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
1111
+ possibleProperties = buttons.propertyTriage(kb);
1124
1112
 
1125
- for (p in possibleProperties.op) {
1126
- possible.push(kb.fromNT(p));
1127
- }
1113
+ for (p in possibleProperties.op) {
1114
+ possible.push(kb.fromNT(p));
1115
+ }
1128
1116
 
1129
- opts.disambiguate = true;
1130
- } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1131
- possibleProperties = buttons.propertyTriage(kb);
1117
+ opts.disambiguate = true;
1118
+ } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
1119
+ possibleProperties = buttons.propertyTriage(kb);
1132
1120
 
1133
- for (p in possibleProperties.dp) {
1134
- possible.push(kb.fromNT(p));
1121
+ for (p in possibleProperties.dp) {
1122
+ possible.push(kb.fromNT(p));
1123
+ }
1124
+
1125
+ opts.disambiguate = true;
1135
1126
  }
1136
1127
 
1137
- opts.disambiguate = true;
1138
- }
1128
+ return sortByLabel(possible);
1129
+ } // TODO: this checks for any occurrence, regardless of true or false setting
1139
1130
 
1140
- var sortedPossible = sortByLabel(possible); // TODO: this checks for any occurrence, regardless of true or false setting
1141
1131
 
1142
1132
  if (kb.any(form, ui('canMintNew'))) {
1143
1133
  opts.mint = '* Create new *'; // @@ could be better
1144
1134
  }
1145
1135
 
1146
- var selector = makeSelectForOptions(dom, kb, subject, property, sortedPossible, uiFrom, opts, dataDoc, callbackFunction);
1147
- rhs.appendChild(selector);
1148
- var object;
1149
-
1150
- if (selector.currentURI) {
1151
- object = $rdf.sym(selector.currentURI);
1152
- } else {
1153
- object = kb.any(subject, property);
1154
- }
1136
+ var selector;
1155
1137
 
1156
- if (object && subForm) {
1157
- removeNextSiblingsAfterElement(selector);
1158
- addSubFormChoice(dom, rhs, already, object, subForm, follow ? object.doc() : dataDoc, callbackFunction);
1159
- }
1138
+ rhs.refresh = function () {
1139
+ var selectorOptions = getSelectorOptions();
1140
+ selector = makeSelectForChoice(dom, rhs, kb, subject, property, selectorOptions, uiFrom, opts, dataDoc, callbackFunction);
1141
+ rhs.innerHTML = '';
1142
+ rhs.appendChild(selector);
1143
+ };
1160
1144
 
1145
+ rhs.refresh();
1146
+ if (selector && selector.refresh) selector.refresh();
1161
1147
  return box;
1162
1148
  };
1163
1149
  /**
@@ -1514,10 +1500,9 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1514
1500
  // @param subject - a term, the subject of the statement(s) being edited.
1515
1501
  // @param predicate - a term, the predicate of the statement(s) being edited
1516
1502
  // @param possible - a list of terms, the possible value the object can take
1517
- // @param options.multiSelect - Boolean - Whether more than one at a time is allowed
1518
- // @param options.firstSelectOptionText - a string to be displayed as the
1519
- // option for none selected (for non multiSelect)
1520
- // @param options.uiMultipleInUse - signals that the ui:choise is used with a ui:multiple
1503
+ // @param options.multiple - Boolean - Whether more than one at a time is allowed
1504
+ // @param options.nullLabel - a string to be displayed as the
1505
+ // option for none selected (for non multiple)
1521
1506
  // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1522
1507
  // @param options.subForm - If mint, then the form to be used for minting the new thing
1523
1508
  // @param dataDoc - The web document being edited
@@ -1525,7 +1510,7 @@ function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction)
1525
1510
  */
1526
1511
 
1527
1512
 
1528
- function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
1513
+ function makeSelectForOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
1529
1514
  log.debug('Select list length now ' + possible.length);
1530
1515
  var n = 0;
1531
1516
  var uris = {}; // Count them
@@ -1568,6 +1553,8 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1568
1553
  actual = getActual();
1569
1554
 
1570
1555
  var onChange = function onChange(_e) {
1556
+ select.disabled = true; // until data written back - gives user feedback too
1557
+
1571
1558
  var ds = [];
1572
1559
  var is = [];
1573
1560
 
@@ -1598,14 +1585,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1598
1585
  newObject = newThing(dataDoc);
1599
1586
  }
1600
1587
 
1601
- is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
1602
- if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc)); // not sure if this 'if' is used because I cannot find mintStatementsFun
1588
+ is.push($rdf.st(subject, predicate, newObject, dataDoc)); // not sure if this 'if' is used because I cannot find mintStatementsFun
1603
1589
 
1604
1590
  if (options.mintStatementsFun) {
1605
1591
  is = is.concat(options.mintStatementsFun(newObject));
1606
1592
  }
1607
-
1608
- select.currentURI = newObject;
1609
1593
  }
1610
1594
 
1611
1595
  if (!opt.AJAR_uri) continue; // a prompt or mint
@@ -1613,7 +1597,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1613
1597
  if (opt.selected && !(opt.AJAR_uri in actual)) {
1614
1598
  // new class
1615
1599
  is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
1616
- select.currentURI = opt.AJAR_uri;
1600
+ }
1601
+
1602
+ if (!opt.selected && opt.AJAR_uri in actual) {
1603
+ // old class
1604
+ removeValue(kb.sym(opt.AJAR_uri));
1617
1605
  }
1618
1606
 
1619
1607
  if (opt.selected) select.currentURI = opt.AJAR_uri;
@@ -1633,29 +1621,38 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1633
1621
  sel = sel.superSelect;
1634
1622
  }
1635
1623
 
1636
- log.info('selectForOptions: data doc = ' + dataDoc); // refresh subForm
1624
+ function doneNew(ok, _body) {
1625
+ callbackFunction(ok, {
1626
+ widget: 'select',
1627
+ event: 'new'
1628
+ });
1629
+ }
1630
+
1631
+ log.info('selectForOptions: data doc = ' + dataDoc);
1632
+ kb.updater.update(ds, is, function (uri, ok, body) {
1633
+ actual = getActual(); // refresh
1637
1634
 
1638
- removeNextSiblingsAfterElement(select);
1639
- addSubFormChoice(dom, select.parentNode, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
1640
1635
  if (ok) {
1641
- kb.updater.update(ds, is, function (uri, success, errorBody) {
1642
- actual = getActual(); // refresh
1643
-
1644
- if (!success) select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
1645
- });
1646
- if (callbackFunction) callbackFunction(ok, {
1647
- widget: 'select',
1648
- event: 'new'
1649
- });
1636
+ select.disabled = false; // data written back
1637
+
1638
+ if (newObject) {
1639
+ var fn = (0, _fieldFunction.fieldFunction)(dom, options.subForm);
1640
+ fn(dom, select.parentNode, {}, newObject, options.subForm, dataDoc, doneNew);
1641
+ }
1650
1642
  } else {
1651
- select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
1643
+ return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1652
1644
  }
1645
+
1646
+ if (callbackFunction) callbackFunction(ok, {
1647
+ widget: 'select',
1648
+ event: 'change'
1649
+ });
1653
1650
  });
1654
1651
  };
1655
1652
 
1656
1653
  var select = dom.createElement('select');
1657
1654
  select.setAttribute('style', style.formSelectSTyle);
1658
- if (options.multiSelect) select.setAttribute('multiSelect', 'true');
1655
+ if (options.multiple) select.setAttribute('multiple', 'true');
1659
1656
  select.currentURI = null;
1660
1657
 
1661
1658
  select.refresh = function () {
@@ -1706,14 +1703,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1706
1703
  select.insertBefore(mint, select.firstChild);
1707
1704
  }
1708
1705
 
1709
- if (!select.currentURI && options.uiMultipleInUse) {
1706
+ if (select.currentURI == null && !options.multiple) {
1710
1707
  var prompt = dom.createElement('option');
1711
- prompt.appendChild(dom.createTextNode(options.firstSelectOptionText));
1712
- prompt.disabled = true;
1713
- prompt.value = true;
1714
- prompt.hidden = true;
1715
- prompt.selected = true;
1708
+ prompt.appendChild(dom.createTextNode(options.nullLabel));
1716
1709
  select.insertBefore(prompt, select.firstChild);
1710
+ prompt.selected = true;
1717
1711
  }
1718
1712
 
1719
1713
  if (editable) {
@@ -1732,11 +1726,11 @@ function makeSelectForOptions(dom, kb, subject, predicate, possible, uiFrom, opt
1732
1726
  function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1733
1727
  var du = kb.any(category, ns.owl('disjointUnionOf'));
1734
1728
  var subs;
1735
- var multiSelect = false;
1729
+ var multiple = false;
1736
1730
 
1737
1731
  if (!du) {
1738
1732
  subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
1739
- multiSelect = true;
1733
+ multiple = true;
1740
1734
  } else {
1741
1735
  subs = du.elements;
1742
1736
  }
@@ -1744,15 +1738,16 @@ function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunc
1744
1738
  log.debug('Select list length ' + subs.length);
1745
1739
 
1746
1740
  if (subs.length === 0) {
1747
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiSelect ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1741
+ return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1748
1742
  }
1749
1743
 
1750
1744
  if (subs.length === 1) {
1751
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiSelect ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
1745
+ return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
1752
1746
  }
1753
1747
 
1754
- return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, null, {
1755
- multiSelect: multiSelect
1748
+ return makeSelectForOptions(dom, kb, subject, ns.rdf('type'), subs, {
1749
+ multiple: multiple,
1750
+ nullPrompt: '--classify--'
1756
1751
  }, dataDoc, callbackFunction);
1757
1752
  }
1758
1753
  /** Make SELECT element to select subclasses recurively
@@ -1942,4 +1937,197 @@ function newThing(doc) {
1942
1937
  var now = new Date();
1943
1938
  return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
1944
1939
  }
1940
+ /** Make SELECT element to select options
1941
+ //
1942
+ // @param subject - a term, the subject of the statement(s) being edited.
1943
+ // @param predicate - a term, the predicate of the statement(s) being edited
1944
+ // @param possible - a list of terms, the possible value the object can take
1945
+ // @param options.multiSelect - Boolean - Whether more than one at a time is allowed
1946
+ // @param options.uiMultipleInUse - signals that the ui:choise is used with a ui:multiple
1947
+ // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1948
+ // @param options.subForm - If mint, then the form to be used for minting the new thing
1949
+ // @param dataDoc - The web document being edited
1950
+ // @param callbackFunction - takes (boolean ok, string errorBody)
1951
+ */
1952
+
1953
+
1954
+ function makeSelectForChoice(dom, container, kb, subject, predicate, possible, uiFrom, options, dataDoc, callbackFunction) {
1955
+ var n = 0;
1956
+ var uris = {}; // Count them
1957
+
1958
+ var editable = kb.updater.editable(dataDoc.uri);
1959
+
1960
+ for (var i = 0; i < possible.length; i++) {
1961
+ var sub = possible[i]; // @@ Maybe; make this so it works with blank nodes too
1962
+
1963
+ if (!sub.uri) debug.warn("makeSelectForOptions: option does not have an uri: ".concat(sub, ", with predicate: ").concat(predicate));
1964
+ if (!sub.uri || sub.uri in uris) continue;
1965
+ uris[sub.uri] = true;
1966
+ n++;
1967
+ } // uris is now the set of possible options
1968
+
1969
+
1970
+ if (n === 0 && !options.mint) {
1971
+ return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1972
+ }
1973
+
1974
+ log.debug('makeSelectForOptions: dataDoc=' + dataDoc);
1975
+
1976
+ function determinFirstSelectOption() {
1977
+ var firstSelectOptionText = '--- classify ---';
1978
+ var option = dom.createElement('option');
1979
+
1980
+ if (predicate && !(predicate.termType === 'BlankNode')) {
1981
+ firstSelectOptionText = '* Select for property: ' + utils.label(predicate) + ' *';
1982
+ }
1983
+
1984
+ if (subject && !(subject.termType === 'BlankNode')) {
1985
+ firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *';
1986
+ }
1987
+
1988
+ option.appendChild(dom.createTextNode(firstSelectOptionText));
1989
+ option.disabled = true;
1990
+ option.value = true;
1991
+ option.hidden = true;
1992
+ option.selected = true;
1993
+ return option;
1994
+ }
1995
+
1996
+ var onChange = function onChange(_e) {
1997
+ select.refresh();
1998
+ };
1999
+
2000
+ var select = dom.createElement('select');
2001
+ select.setAttribute('style', style.formSelectSTyle);
2002
+ if (options.multiSelect) select.setAttribute('multiSelect', 'true');
2003
+ select.currentURI = null;
2004
+ var object = kb.any(subject, predicate);
2005
+ if (object) select.currentURI = object;
2006
+
2007
+ for (var uri in uris) {
2008
+ select.appendChild(createOption(uri));
2009
+ }
2010
+
2011
+ if (editable && options.mint) {
2012
+ var mint = dom.createElement('option');
2013
+ mint.appendChild(dom.createTextNode(options.mint));
2014
+ mint.AJAR_mint = true; // Flag it
2015
+
2016
+ select.insertBefore(mint, select.firstChild);
2017
+ }
2018
+
2019
+ if (select.children.length === 0) select.insertBefore(determinFirstSelectOption(), select.firstChild);
2020
+
2021
+ select.refresh = function () {
2022
+ select.disabled = true; // unlocked any conflict we had got into
2023
+
2024
+ var ds = [];
2025
+ var is = [];
2026
+
2027
+ var removeValue = function removeValue(t) {
2028
+ if (kb.holds(subject, predicate, t, dataDoc)) {
2029
+ ds.push($rdf.st(subject, predicate, t, dataDoc));
2030
+ }
2031
+ };
2032
+
2033
+ var newObject;
2034
+
2035
+ for (var _i3 = 0; _i3 < select.options.length; _i3++) {
2036
+ var opt = select.options[_i3];
2037
+
2038
+ if (opt.selected && opt.AJAR_mint) {
2039
+ // not sure if this 'if' is used because I cannot find mintClass
2040
+ if (options.mintClass) {
2041
+ var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
2042
+ if (!ok) {
2043
+ callbackFunction(ok, body, {
2044
+ change: 'new'
2045
+ }); // @@ if ok, need some form of refresh of the select for the new thing
2046
+ }
2047
+ });
2048
+ select.parentNode.appendChild(thisForm);
2049
+ newObject = thisForm.AJAR_subject;
2050
+ } else {
2051
+ newObject = newThing(dataDoc);
2052
+ }
2053
+
2054
+ is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
2055
+ 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
2056
+
2057
+ if (options.mintStatementsFun) {
2058
+ is = is.concat(options.mintStatementsFun(newObject));
2059
+ }
2060
+
2061
+ select.currentURI = newObject;
2062
+ }
2063
+
2064
+ if (!opt.AJAR_uri) continue; // a prompt or mint
2065
+
2066
+ if (opt.selected) select.currentURI = opt.AJAR_uri;
2067
+ }
2068
+
2069
+ var sel = select.subSelect; // All subclasses must also go
2070
+
2071
+ while (sel && sel.currentURI) {
2072
+ removeValue(kb.sym(sel.currentURI));
2073
+ sel = sel.subSelect;
2074
+ }
2075
+
2076
+ sel = select.superSelect; // All superclasses are redundant
2077
+
2078
+ while (sel && sel.currentURI) {
2079
+ removeValue(kb.sym(sel.currentURI));
2080
+ sel = sel.superSelect;
2081
+ }
2082
+
2083
+ log.info('selectForOptions: data doc = ' + dataDoc);
2084
+
2085
+ if (select.currentURI) {
2086
+ removeNextSiblingsAfterElement(select);
2087
+ addSubFormChoice(dom, container, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
2088
+ if (ok) {
2089
+ kb.updater.update(ds, is, function (uri, success, errorBody) {
2090
+ if (!success) container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
2091
+ });
2092
+ if (callbackFunction) callbackFunction(ok, {
2093
+ widget: 'select',
2094
+ event: 'new'
2095
+ }); // widgets.refreshTree(container)
2096
+ } else {
2097
+ container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
2098
+ }
2099
+ });
2100
+ }
2101
+
2102
+ select.disabled = false;
2103
+ };
2104
+
2105
+ function createOption(uri) {
2106
+ var option = dom.createElement('option');
2107
+ var c = kb.sym(uri);
2108
+
2109
+ if (options.disambiguate) {
2110
+ option.appendChild(dom.createTextNode(utils.labelWithOntology(c, true))); // Init. cap
2111
+ } else {
2112
+ option.appendChild(dom.createTextNode(utils.label(c, true))); // Init.
2113
+ }
2114
+
2115
+ var backgroundColor = kb.any(c, kb.sym('http://www.w3.org/ns/ui#backgroundColor'));
2116
+
2117
+ if (backgroundColor) {
2118
+ option.setAttribute('style', 'background-color: ' + backgroundColor.value + '; ');
2119
+ }
2120
+
2121
+ option.AJAR_uri = uri;
2122
+ if (c.toString() === '' + select.currentURI) option.selected = true;
2123
+ return option;
2124
+ }
2125
+
2126
+ if (editable) {
2127
+ select.addEventListener('change', onChange, false);
2128
+ }
2129
+
2130
+ select.refresh();
2131
+ return select;
2132
+ } // makeSelectForChoice
1945
2133
  //# sourceMappingURL=forms.js.map