@teipublisher/pb-components 2.26.1-next.2 → 3.0.0-next-4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/.github/workflows/docker-cypress.yml +54 -0
  2. package/.github/workflows/main.yml +6 -4
  3. package/.github/workflows/node.js.yml +56 -21
  4. package/.github/workflows/release.js.yml +19 -17
  5. package/.releaserc.json +1 -1
  6. package/CHANGELOG.md +351 -9
  7. package/Dockerfile +78 -70
  8. package/README.md +112 -4
  9. package/css/components.css +5 -5
  10. package/css/gridjs/mermaid.min.css +1 -1
  11. package/css/leaflet/Control.Geocoder.css +1 -126
  12. package/css/leaflet/images/layers.png +0 -0
  13. package/css/tify/tify.css +6 -5
  14. package/css/tom-select/tom-select.bootstrap4.min.css +1 -1
  15. package/css/tom-select/tom-select.bootstrap5.min.css +1 -1
  16. package/css/tom-select/tom-select.default.min.css +1 -1
  17. package/css/tom-select/tom-select.default.min.css.map +1 -0
  18. package/css/tom-select/tom-select.min.css +1 -1
  19. package/cypress.config.js +84 -0
  20. package/dist/api.html +1 -1
  21. package/dist/css/design-system.css +607 -0
  22. package/dist/demo/bundle-test.html +4 -3
  23. package/dist/demo/components.css +46 -1
  24. package/dist/demo/design-system.html +710 -0
  25. package/dist/demo/dts-client.html +2 -2
  26. package/dist/demo/pb-autocomplete.html +23 -11
  27. package/dist/demo/pb-autocomplete2.html +66 -55
  28. package/dist/demo/pb-autocomplete3.html +17 -8
  29. package/dist/demo/pb-blacklab-highlight.html +28 -11
  30. package/dist/demo/pb-blacklab-results.html +3 -2
  31. package/dist/demo/pb-browse-docs.html +24 -24
  32. package/dist/demo/pb-browse-docs2.html +3 -3
  33. package/dist/demo/pb-clipboard.html +32 -28
  34. package/dist/demo/pb-code-editor.html +6 -6
  35. package/dist/demo/pb-code-highlight.html +63 -63
  36. package/dist/demo/pb-codepen.html +1 -1
  37. package/dist/demo/pb-collapse.html +1 -1
  38. package/dist/demo/pb-collapse2.html +2 -2
  39. package/dist/demo/pb-combo-box.html +135 -130
  40. package/dist/demo/pb-custom-form.html +64 -55
  41. package/dist/demo/pb-dialog.html +12 -6
  42. package/dist/demo/pb-document.html +1 -1
  43. package/dist/demo/pb-download.html +68 -59
  44. package/dist/demo/pb-drawer.html +67 -46
  45. package/dist/demo/pb-drawer2.html +65 -58
  46. package/dist/demo/pb-edit-app.html +2 -2
  47. package/dist/demo/pb-edit-xml.html +1 -1
  48. package/dist/demo/pb-facsimile-2.html +26 -11
  49. package/dist/demo/pb-facsimile-3.html +25 -10
  50. package/dist/demo/pb-facsimile-dedup-test-2.html +48 -0
  51. package/dist/demo/pb-facsimile-dedup-test.html +48 -0
  52. package/dist/demo/pb-facsimile.html +4 -4
  53. package/dist/demo/pb-formula.html +1 -1
  54. package/dist/demo/pb-grid.html +22 -8
  55. package/dist/demo/pb-highlight.html +2 -2
  56. package/dist/demo/pb-i18n-simple.html +1 -0
  57. package/dist/demo/pb-i18n.html +15 -5
  58. package/dist/demo/pb-image-strip-standalone.html +2 -2
  59. package/dist/demo/pb-image-strip-view.html +2 -2
  60. package/dist/demo/pb-leaflet-map.html +3 -3
  61. package/dist/demo/pb-leaflet-map2.html +2 -2
  62. package/dist/demo/pb-leaflet-map3.html +3 -3
  63. package/dist/demo/pb-link.html +1 -1
  64. package/dist/demo/pb-load.html +2 -6
  65. package/dist/demo/pb-login.html +1 -3
  66. package/dist/demo/pb-manage-odds.html +9 -4
  67. package/dist/demo/pb-markdown.html +1 -1
  68. package/dist/demo/pb-media-query.html +2 -2
  69. package/dist/demo/pb-mei.html +2 -2
  70. package/dist/demo/pb-mei2.html +2 -2
  71. package/dist/demo/pb-message.html +2 -3
  72. package/dist/demo/pb-odd-editor.html +54 -52
  73. package/dist/demo/pb-page-header.html +27 -0
  74. package/dist/demo/pb-popover.html +1 -1
  75. package/dist/demo/pb-print-preview.html +2 -2
  76. package/dist/demo/pb-progress.html +4 -4
  77. package/dist/demo/pb-repeat.html +32 -36
  78. package/dist/demo/pb-search.html +16 -5
  79. package/dist/demo/pb-search2.html +4 -4
  80. package/dist/demo/pb-search3.html +3 -3
  81. package/dist/demo/pb-search4.html +3 -3
  82. package/dist/demo/pb-select-feature.html +4 -4
  83. package/dist/demo/pb-select-feature2.html +4 -4
  84. package/dist/demo/pb-select-feature3.html +2 -2
  85. package/dist/demo/pb-select-i18n.html +58 -53
  86. package/dist/demo/pb-select-odd.html +1 -1
  87. package/dist/demo/pb-select.html +190 -75
  88. package/dist/demo/pb-select2.html +91 -37
  89. package/dist/demo/pb-select3.html +109 -41
  90. package/dist/demo/pb-svg.html +1 -1
  91. package/dist/demo/pb-table-grid.html +26 -15
  92. package/dist/demo/pb-tabs.html +15 -7
  93. package/dist/demo/pb-tify.html +7 -7
  94. package/dist/demo/pb-timeline.html +1 -1
  95. package/dist/demo/pb-timeline2.html +1 -1
  96. package/dist/demo/pb-toggle-feature.html +26 -23
  97. package/dist/demo/pb-toggle-feature2.html +4 -4
  98. package/dist/demo/pb-toggle-feature3.html +2 -2
  99. package/dist/demo/pb-toggle-feature4.html +56 -54
  100. package/dist/demo/pb-version.html +2 -2
  101. package/dist/demo/pb-view.html +78 -40
  102. package/dist/demo/pb-view2.html +69 -46
  103. package/dist/demo/pb-view3.html +53 -48
  104. package/dist/demo/pb-view4.html +70 -49
  105. package/dist/demo/pb-zoom.html +2 -2
  106. package/dist/{es-global-bridge-d8ce175d.js → es-global-bridge-D8ZcUcx_.js} +0 -4
  107. package/dist/focus-mixin-VCsFap6b.js +768 -0
  108. package/dist/images/icons.svg +217 -0
  109. package/dist/jinn-codemirror-DETLdm08.js +1 -0
  110. package/dist/lib/openseadragon.min.js +80 -0
  111. package/dist/lib/openseadragon.min.js.map +1 -0
  112. package/dist/pb-code-editor.js +25 -20
  113. package/dist/pb-component-docs.js +414 -3225
  114. package/dist/pb-components-bundle.js +3046 -4402
  115. package/dist/pb-dialog-tklYGWfc.js +121 -0
  116. package/dist/pb-edit-app.js +208 -107
  117. package/dist/pb-elements.json +716 -249
  118. package/dist/pb-facsimile.js +46 -0
  119. package/dist/pb-i18n-C0NDma4h.js +1 -0
  120. package/dist/pb-leaflet-map.js +23 -23
  121. package/dist/pb-mei.js +152 -134
  122. package/dist/pb-mixin-DHoWQheB.js +1 -0
  123. package/dist/pb-odd-editor.js +1671 -1231
  124. package/dist/pb-tify.js +1 -27
  125. package/dist/unsafe-html-D5VGo9Oq.js +1 -0
  126. package/dist/urls-BEONu_g4.js +1 -0
  127. package/eslint.config.mjs +92 -0
  128. package/gh-pages.js +5 -3
  129. package/i18n/common/en.json +6 -0
  130. package/i18n/common/pl.json +2 -2
  131. package/images/icons.svg +217 -0
  132. package/index.html +0 -5
  133. package/lib/leaflet-src.js.map +1 -0
  134. package/lib/leaflet.markercluster-src.js.map +1 -0
  135. package/lib/openseadragon.min.js +6 -6
  136. package/package.json +56 -81
  137. package/pb-elements.json +716 -249
  138. package/rollup.config.mjs +312 -0
  139. package/src/assets/components.css +5 -5
  140. package/src/assets/design-system.css +607 -0
  141. package/src/authority/airtable.js +20 -21
  142. package/src/authority/anton.js +129 -129
  143. package/src/authority/custom.js +70 -27
  144. package/src/authority/geonames.js +38 -32
  145. package/src/authority/gnd.js +50 -42
  146. package/src/authority/kbga.js +136 -134
  147. package/src/authority/metagrid.js +44 -46
  148. package/src/authority/reconciliation.js +66 -68
  149. package/src/authority/registry.js +4 -4
  150. package/src/docs/demo-utils.js +91 -0
  151. package/src/docs/pb-component-docs.js +287 -147
  152. package/src/docs/pb-component-view.js +380 -273
  153. package/src/docs/pb-components-list.js +115 -51
  154. package/src/docs/pb-demo-snippet.js +199 -174
  155. package/src/dts-client.js +306 -303
  156. package/src/dts-select-endpoint.js +125 -85
  157. package/src/parse-date-service.js +184 -135
  158. package/src/pb-ajax.js +175 -173
  159. package/src/pb-authority-lookup.js +198 -158
  160. package/src/pb-autocomplete.js +731 -313
  161. package/src/pb-blacklab-highlight.js +266 -260
  162. package/src/pb-blacklab-results.js +230 -225
  163. package/src/pb-browse-docs.js +601 -484
  164. package/src/pb-browse.js +68 -65
  165. package/src/pb-clipboard.js +97 -76
  166. package/src/pb-code-editor.js +111 -103
  167. package/src/pb-code-highlight.js +234 -204
  168. package/src/pb-codepen.js +81 -73
  169. package/src/pb-collapse.js +265 -152
  170. package/src/pb-combo-box.js +191 -191
  171. package/src/pb-components-bundle.js +1 -7
  172. package/src/pb-components.js +2 -6
  173. package/src/pb-custom-form.js +230 -141
  174. package/src/pb-dialog.js +99 -63
  175. package/src/pb-document.js +118 -91
  176. package/src/pb-download.js +214 -198
  177. package/src/pb-drawer.js +146 -149
  178. package/src/pb-edit-app.js +471 -240
  179. package/src/pb-edit-xml.js +101 -98
  180. package/src/pb-events.js +126 -107
  181. package/src/pb-facs-link.js +130 -101
  182. package/src/pb-facsimile.js +494 -410
  183. package/src/pb-fetch.js +389 -0
  184. package/src/pb-formula.js +152 -154
  185. package/src/pb-geolocation.js +130 -132
  186. package/src/pb-grid-action.js +59 -56
  187. package/src/pb-grid.js +388 -228
  188. package/src/pb-highlight.js +142 -142
  189. package/src/pb-hotkeys.js +40 -42
  190. package/src/pb-i18n.js +115 -127
  191. package/src/pb-icon-button.js +108 -0
  192. package/src/pb-icon.js +283 -0
  193. package/src/pb-image-strip.js +85 -79
  194. package/src/pb-lang.js +142 -57
  195. package/src/pb-leaflet-map.js +551 -483
  196. package/src/pb-link.js +132 -126
  197. package/src/pb-load.js +495 -428
  198. package/src/pb-login.js +303 -248
  199. package/src/pb-manage-odds.js +384 -338
  200. package/src/pb-map-icon.js +90 -90
  201. package/src/pb-map-layer.js +86 -86
  202. package/src/pb-markdown.js +107 -110
  203. package/src/pb-media-query.js +75 -73
  204. package/src/pb-mei.js +523 -303
  205. package/src/pb-message.js +144 -98
  206. package/src/pb-mixin.js +268 -265
  207. package/src/pb-navigation.js +83 -96
  208. package/src/pb-observable.js +39 -39
  209. package/src/pb-odd-editor.js +1209 -948
  210. package/src/pb-odd-elementspec-editor.js +375 -310
  211. package/src/pb-odd-model-editor.js +1189 -941
  212. package/src/pb-odd-parameter-editor.js +269 -170
  213. package/src/pb-odd-rendition-editor.js +184 -131
  214. package/src/pb-page.js +451 -422
  215. package/src/pb-paginate.js +260 -178
  216. package/src/pb-panel.js +217 -183
  217. package/src/pb-popover-themes.js +16 -9
  218. package/src/pb-popover.js +297 -288
  219. package/src/pb-print-preview.js +128 -128
  220. package/src/pb-progress.js +52 -52
  221. package/src/pb-repeat.js +141 -108
  222. package/src/pb-restricted.js +85 -78
  223. package/src/pb-search.js +258 -230
  224. package/src/pb-select-feature.js +210 -126
  225. package/src/pb-select-odd.js +184 -118
  226. package/src/pb-select-template.js +113 -78
  227. package/src/pb-select.js +330 -229
  228. package/src/pb-split-list.js +181 -176
  229. package/src/pb-svg.js +81 -80
  230. package/src/pb-table-column.js +55 -55
  231. package/src/pb-table-grid.js +334 -205
  232. package/src/pb-tabs.js +238 -61
  233. package/src/pb-tify.js +3331 -126
  234. package/src/pb-timeline.js +394 -255
  235. package/src/pb-toggle-feature.js +196 -188
  236. package/src/pb-upload.js +201 -176
  237. package/src/pb-version.js +22 -34
  238. package/src/pb-view-annotate.js +138 -102
  239. package/src/pb-view.js +1722 -1272
  240. package/src/pb-zoom.js +144 -46
  241. package/src/search-result-service.js +256 -223
  242. package/src/seed-element.js +14 -22
  243. package/src/settings.js +4 -4
  244. package/src/theming.js +98 -91
  245. package/src/urls.js +403 -289
  246. package/src/utils.js +53 -51
  247. package/vite.config.js +86 -0
  248. package/css/pb-styles.css +0 -51
  249. package/dist/iron-form-3b8dcaa7.js +0 -210
  250. package/dist/jinn-codemirror-da0e2d1f.js +0 -1
  251. package/dist/paper-checkbox-515a5284.js +0 -1597
  252. package/dist/paper-icon-button-b1d31571.js +0 -398
  253. package/dist/paper-listbox-a3b7175c.js +0 -1265
  254. package/dist/pb-i18n-0611135a.js +0 -1
  255. package/dist/pb-mixin-b1caa22e.js +0 -158
  256. package/dist/polymer-hack.js +0 -1
  257. package/dist/vaadin-element-mixin-6e4cee3a.js +0 -527
  258. package/lib/Control.Geocoder.min.js +0 -2
  259. package/lib/Control.Geocoder.min.js.map +0 -1
  260. package/src/assets/pb-styles.css +0 -51
  261. package/src/pb-light-dom.js +0 -40
  262. package/src/polymer-hack.js +0 -6
@@ -1,89 +1,89 @@
1
- import { Registry } from "./registry.js";
1
+ import { Registry } from './registry.js';
2
2
 
3
3
  /**
4
4
  * Connector for the corporate archive of Georgfischer AG.
5
5
  */
6
6
  export class Anton extends Registry {
7
-
8
- constructor(configElem) {
9
- super(configElem);
10
- this._url = configElem.getAttribute('url') || `https://archives.georgfischer.com/api`;
11
- this._api = configElem.getAttribute('api');
12
- this._limit = configElem.getAttribute('limit') || 999999;
13
- this._provider = configElem.getAttribute('provider') || configElem.getAttribute('connector')
14
- }
7
+ constructor(configElem) {
8
+ super(configElem);
9
+ this._url = configElem.getAttribute('url') || `https://archives.georgfischer.com/api`;
10
+ this._api = configElem.getAttribute('api');
11
+ this._limit = configElem.getAttribute('limit') || 999999;
12
+ this._provider = configElem.getAttribute('provider') || configElem.getAttribute('connector');
13
+ }
15
14
 
16
- async query(key) {
17
- const results = [];
18
-
19
- const register = this.getRegister();
20
- const url = `${this._url}/${register}?search=${encodeURIComponent(key)}&perPage=${this._limit}`;
21
- const label = this.getLabelField();
22
- return new Promise((resolve) => {
23
- fetch(url)
24
- .then(response => response.json())
25
- .then(json => {
26
- if (!json.data) {
27
- resolve({
28
- totalItems: 0,
29
- items: []
30
- });
31
- return;
32
- }
33
- json.data.forEach(item => {
34
- if ((this._register === 'organization' && item.authority_type === 'Person') ||
35
- (this._register === 'person' && item.authority_type !== 'Person')) {
36
- return;
37
- }
38
- const result = {
39
- register: this._register,
40
- id: (this._prefix ? `${this._prefix}-${item.id}` : item.id),
41
- label: item[label],
42
- details: `${item.id}`,
43
- link: `${this._url}/${register}/${item.id}`,
44
- strings: [item[label]],
45
- provider: this._provider
46
- };
47
- results.push(result);
48
- });
49
- resolve({
50
- totalItems: json.meta.total,
51
- items: results,
52
- });
53
- })
54
- .catch((reason) => Promise.reject(reason));
55
- })
56
- }
15
+ async query(key) {
16
+ const results = [];
57
17
 
58
- info(key, container) {
59
- if (!key) {
60
- return Promise.resolve({});
61
- }
62
- const id = this._prefix ? key.substring(this._prefix.length + 1) : key;
63
- const label = this.getLabelField();
64
- return new Promise((resolve) => {
65
- this.getRecord(id)
18
+ const register = this.getRegister();
19
+ const url = `${this._url}/${register}?search=${encodeURIComponent(key)}&perPage=${this._limit}`;
20
+ const label = this.getLabelField();
21
+ return new Promise(resolve => {
22
+ fetch(url)
23
+ .then(response => response.json())
66
24
  .then(json => {
67
- const died = json.data.death ? `† ${json.data.death}` : '';
68
- const dates = json.data.birth ? `<p>* ${json.data.birth} ${died}</p>` : '';
69
- const note = json.data.note_bio ? `<p>${json.data.note_bio}</p>` : '';
70
- const output = `
25
+ if (!json.data) {
26
+ resolve({
27
+ totalItems: 0,
28
+ items: [],
29
+ });
30
+ return;
31
+ }
32
+ json.data.forEach(item => {
33
+ if (
34
+ (this._register === 'organization' && item.authority_type === 'Person') ||
35
+ (this._register === 'person' && item.authority_type !== 'Person')
36
+ ) {
37
+ return;
38
+ }
39
+ const result = {
40
+ register: this._register,
41
+ id: this._prefix ? `${this._prefix}-${item.id}` : item.id,
42
+ label: item[label],
43
+ details: `${item.id}`,
44
+ link: `${this._url}/${register}/${item.id}`,
45
+ strings: [item[label]],
46
+ provider: this._provider,
47
+ };
48
+ results.push(result);
49
+ });
50
+ resolve({
51
+ totalItems: json.meta.total,
52
+ items: results,
53
+ });
54
+ })
55
+ .catch(reason => Promise.reject(reason));
56
+ });
57
+ }
58
+
59
+ info(key, container) {
60
+ if (!key) {
61
+ return Promise.resolve({});
62
+ }
63
+ const id = this._prefix ? key.substring(this._prefix.length + 1) : key;
64
+ const label = this.getLabelField();
65
+ return new Promise(resolve => {
66
+ this.getRecord(id).then(json => {
67
+ const died = json.data.death ? `† ${json.data.death}` : '';
68
+ const dates = json.data.birth ? `<p>* ${json.data.birth} ${died}</p>` : '';
69
+ const note = json.data.note_bio ? `<p>${json.data.note_bio}</p>` : '';
70
+ const output = `
71
71
  <h3 class="label"><a href="https://${json.wikipediaURL}" target="_blank">${json.data[label]}</a></h3>
72
72
  ${dates}
73
73
  ${note}
74
74
  `;
75
- container.innerHTML = output;
76
- resolve({
77
- id: (this._prefix ? `${this._prefix}-${json.data.id}` : json.data.id),
78
- strings: [json.data[label]]
79
- });
75
+ container.innerHTML = output;
76
+ resolve({
77
+ id: this._prefix ? `${this._prefix}-${json.data.id}` : json.data.id,
78
+ strings: [json.data[label]],
80
79
  });
81
80
  });
82
- }
81
+ });
82
+ }
83
83
 
84
- /**
84
+ /**
85
85
  * Retrieve a raw JSON record for the given key as returned by the endpoint.
86
- *
86
+ *
87
87
  * @param {string} key the key to look up
88
88
  * @returns {Promise<any>} promise resolving to the JSON record returned by the endpoint
89
89
  */
@@ -91,68 +91,68 @@ export class Anton extends Registry {
91
91
  const id = key.replace(/^.*-([^-]+)$/, '$1');
92
92
  const url = `${this._url}/${this.getRegister()}/${id}`;
93
93
  return fetch(url)
94
- .then(response => response.json())
95
- .then(json => {
96
- const output = Object.assign({}, json);
97
- output.name = json.data[this.getLabelField()];
98
- switch (this._register) {
99
- case 'place':
100
- output.country = json.data.country;
101
- if (json.data.location && json.data.location.coordinates) {
102
- output.location = json.data.location.coordinates;
103
- }
104
- output.links = json.data.links.map((link) => link.url);
105
- break;
106
- case 'person':
107
- output.birth = json.data.birth;
108
- output.death = json.data.death;
109
- output.note = json.data.note_bio;
110
- output.links = [`https://${json.wikipediaURL}`];
111
- break;
112
- default:
113
- break;
114
- }
115
- return output;
116
- })
117
- .catch((reason) => Promise.reject(reason));
94
+ .then(response => response.json())
95
+ .then(json => {
96
+ const output = { ...json };
97
+ output.name = json.data[this.getLabelField()];
98
+ switch (this._register) {
99
+ case 'place':
100
+ output.country = json.data.country;
101
+ if (json.data.location && json.data.location.coordinates) {
102
+ output.location = json.data.location.coordinates;
103
+ }
104
+ output.links = json.data.links.map(link => link.url);
105
+ break;
106
+ case 'person':
107
+ output.birth = json.data.birth;
108
+ output.death = json.data.death;
109
+ output.note = json.data.note_bio;
110
+ output.links = [`https://${json.wikipediaURL}`];
111
+ break;
112
+ default:
113
+ break;
114
+ }
115
+ return output;
116
+ })
117
+ .catch(reason => Promise.reject(reason));
118
118
  }
119
119
 
120
- getLabelField() {
121
- let label;
122
- switch (this._register) {
123
- case 'term':
124
- label = 'label';
125
- break;
126
- default:
127
- label = 'fullname';
128
- break;
129
- }
130
- return label;
120
+ getLabelField() {
121
+ let label;
122
+ switch (this._register) {
123
+ case 'term':
124
+ label = 'label';
125
+ break;
126
+ default:
127
+ label = 'fullname';
128
+ break;
131
129
  }
130
+ return label;
131
+ }
132
132
 
133
- getRegister() {
134
- if (this._api) {
135
- return this._api;
136
- }
137
- let register;
138
- switch(this._register) {
139
- case 'person':
140
- case 'organization':
141
- register = 'actors';
142
- break;
143
- case 'origPlace':
144
- case 'place':
145
- register = 'places';
146
- break;
147
- case 'term':
148
- register = 'keywords';
149
- break;
150
- case 'abbreviation':
151
- register = 'abbreviations';
152
- break;
153
- default:
154
- register = this._register;
155
- }
156
- return register;
133
+ getRegister() {
134
+ if (this._api) {
135
+ return this._api;
157
136
  }
137
+ let register;
138
+ switch (this._register) {
139
+ case 'person':
140
+ case 'organization':
141
+ register = 'actors';
142
+ break;
143
+ case 'origPlace':
144
+ case 'place':
145
+ register = 'places';
146
+ break;
147
+ case 'term':
148
+ register = 'keywords';
149
+ break;
150
+ case 'abbreviation':
151
+ register = 'abbreviations';
152
+ break;
153
+ default:
154
+ register = this._register;
155
+ }
156
+ return register;
157
+ }
158
158
  }
@@ -1,15 +1,58 @@
1
1
  import { Registry } from './registry.js';
2
- // eslint-disable-next-line import/no-cycle
3
- import { createConnectors } from './connectors.js';
2
+ // Break circular dep: inline a minimal factory for nested connectors
3
+ import { Metagrid } from './metagrid.js';
4
+ import { GeoNames } from './geonames.js';
5
+ import { Airtable } from './airtable.js';
6
+ import { GND } from './gnd.js';
7
+ import { KBGA } from './kbga.js';
8
+ import { Anton } from './anton.js';
9
+ import { ReconciliationService } from './reconciliation.js';
4
10
 
5
- export class Custom extends Registry {
11
+ function createNestedConnectors(endpoint, root) {
12
+ const authorities = [];
13
+ root.querySelectorAll(':scope > pb-authority').forEach(configElem => {
14
+ const connector = configElem.getAttribute('connector');
15
+ let instance;
16
+ switch (connector) {
17
+ case 'GND':
18
+ instance = new GND(configElem);
19
+ break;
20
+ case 'GeoNames':
21
+ instance = new GeoNames(configElem);
22
+ break;
23
+ case 'Airtable':
24
+ instance = new Airtable(configElem);
25
+ break;
26
+ case 'KBGA':
27
+ instance = new KBGA(configElem);
28
+ break;
29
+ case 'Anton':
30
+ case 'GF':
31
+ instance = new Anton(configElem);
32
+ break;
33
+ case 'ReconciliationService':
34
+ instance = new ReconciliationService(configElem);
35
+ break;
36
+ case 'Custom':
37
+ // Avoid recursive Custom-in-Custom to break cycles; ignore or warn
38
+ console.warn('Nested Custom connector ignored to avoid circular dependency');
39
+ return; // skip push
40
+ default:
41
+ instance = new Metagrid(configElem);
42
+ break;
43
+ }
44
+ authorities.push(instance);
45
+ });
46
+ return authorities;
47
+ }
6
48
 
49
+ export class Custom extends Registry {
7
50
  constructor(endpoint, configElem) {
8
51
  super(configElem);
9
52
  this._editable = configElem.hasAttribute('edit');
10
53
  this._endpoint = endpoint;
11
- this._connectors = createConnectors(endpoint, configElem);
12
- this._connectors.forEach((connector) => {
54
+ this._connectors = createNestedConnectors(endpoint, configElem);
55
+ this._connectors.forEach(connector => {
13
56
  connector.name = this.name;
14
57
  });
15
58
  console.log(
@@ -39,16 +82,15 @@ export class Custom extends Registry {
39
82
  label: item.label,
40
83
  link: item.link,
41
84
  details: item.details,
42
- provider: 'local'
85
+ provider: 'local',
43
86
  });
44
87
  localResults.add(item.id);
45
88
  });
46
89
  let totalItems = json.length;
47
90
 
48
91
  for (const connector of this._connectors) {
49
- // eslint-disable-next-line no-await-in-loop
50
92
  const dr = await connector.query(key);
51
- results = results.concat(dr.items.filter((result) => !localResults.has(result.id)));
93
+ results = results.concat(dr.items.filter(result => !localResults.has(result.id)));
52
94
  totalItems += dr.totalItems;
53
95
  }
54
96
  resolve({
@@ -65,45 +107,44 @@ export class Custom extends Registry {
65
107
  }
66
108
  const id = key;
67
109
  return new Promise((resolve, reject) => {
68
- fetch(`${this._endpoint}/api/register/${this._register}/${encodeURIComponent(id)}`)
69
- .then(async (response) => {
110
+ fetch(`${this._endpoint}/api/register/${this._register}/${encodeURIComponent(id)}`).then(
111
+ async response => {
70
112
  if (response.ok) {
71
113
  const json = await response.json();
72
114
  container.innerHTML = json.details;
73
115
  resolve({
74
116
  id: json.id,
75
117
  strings: json.strings,
76
- editable: this._editable
118
+ editable: this._editable,
77
119
  });
78
120
  return;
79
121
  }
80
122
  if (response.status === 404) {
81
123
  for (const connector of this._connectors) {
82
124
  try {
83
- // eslint-disable-next-line no-await-in-loop
84
125
  const cr = await connector.info(key, container);
85
126
  if (cr) {
86
127
  resolve(cr);
87
128
  }
88
129
  } catch (e) {
89
130
  // not found: continue
90
- };
131
+ }
91
132
  }
92
133
  }
93
134
  reject();
94
- });
135
+ },
136
+ );
95
137
  });
96
138
  }
97
139
 
98
140
  /**
99
- *
100
- * @param {any} item
141
+ *
142
+ * @param {any} item
101
143
  * @returns {Promise}
102
144
  */
103
145
  async select(item) {
104
146
  let entry;
105
147
  for (const connector of this._connectors) {
106
- // eslint-disable-next-line no-await-in-loop
107
148
  entry = await connector.getRecord(item.id).catch(() => null);
108
149
  if (entry) {
109
150
  break;
@@ -112,16 +153,18 @@ export class Custom extends Registry {
112
153
  if (!entry) {
113
154
  return Promise.resolve(item);
114
155
  }
115
- return fetch(`${this._endpoint}/api/register/${this._register}/${encodeURIComponent(item.id)}`, {
116
- method: 'POST',
117
- mode: "cors",
118
- credentials: "same-origin",
119
- headers: {
120
- "Content-Type": "application/json",
121
- },
122
- body: JSON.stringify(entry),
123
- })
124
- .then((response) => {
156
+ return fetch(
157
+ `${this._endpoint}/api/register/${this._register}/${encodeURIComponent(item.id)}`,
158
+ {
159
+ method: 'POST',
160
+ mode: 'cors',
161
+ credentials: 'same-origin',
162
+ headers: {
163
+ 'Content-Type': 'application/json',
164
+ },
165
+ body: JSON.stringify(entry),
166
+ },
167
+ ).then(response => {
125
168
  if (response.ok) {
126
169
  return response.json();
127
170
  }
@@ -1,7 +1,6 @@
1
1
  import { Registry } from './registry.js';
2
2
 
3
3
  export class GeoNames extends Registry {
4
-
5
4
  constructor(configElem) {
6
5
  super(configElem);
7
6
  this.user = configElem.getAttribute('user');
@@ -26,7 +25,7 @@ export class GeoNames extends Registry {
26
25
  details: `${item.fcodeName} - ${item.adminName1}, ${item.countryName}`,
27
26
  link: `https://www.geonames.org/${item.geonameId}`,
28
27
  strings: [item.toponymName],
29
- provider: 'geonames.org'
28
+ provider: 'geonames.org',
30
29
  };
31
30
  results.push(result);
32
31
  });
@@ -43,24 +42,25 @@ export class GeoNames extends Registry {
43
42
  return Promise.resolve({});
44
43
  }
45
44
  return new Promise((resolve, reject) => {
46
- this.getRecord(key).then(json => {
47
- if (json.status) {
48
- reject(json.status.message);
49
- return;
50
- }
51
- const output = `
45
+ this.getRecord(key)
46
+ .then(json => {
47
+ if (json.status) {
48
+ reject(json.status.message);
49
+ return;
50
+ }
51
+ const output = `
52
52
  <h3 class="label">
53
53
  <a href="${json.link}" target="_blank">${json.name}</a>
54
54
  </h3>
55
55
  <p class="fcode">${json.note} - ${json.region}, ${json.country}</p>
56
56
  `;
57
- container.innerHTML = output;
58
- resolve({
59
- id: this._prefix ? `${this._prefix}-${json.geonameId}` : json.geonameId,
60
- strings: [json.name],
61
- });
62
- })
63
- .catch(() => reject());
57
+ container.innerHTML = output;
58
+ resolve({
59
+ id: this._prefix ? `${this._prefix}-${json.geonameId}` : json.geonameId,
60
+ strings: [json.name],
61
+ });
62
+ })
63
+ .catch(() => reject());
64
64
  });
65
65
  }
66
66
 
@@ -73,22 +73,28 @@ export class GeoNames extends Registry {
73
73
  async getRecord(key) {
74
74
  const id = this._prefix ? key.substring(this._prefix.length + 1) : key;
75
75
  return fetch(
76
- `https://secure.geonames.org/getJSON?geonameId=${encodeURIComponent(id)}&username=${this.user}`,
77
- ).then(response => {
78
- if (response.ok) {
79
- return response.json();
80
- }
81
- return Promise.reject(response.status);
82
- })
83
- .then((json) => {
84
- const output = Object.assign({}, json);
85
- output.name = json.toponymName;
86
- output.country = json.countryName;
87
- output.region = json.adminName1;
88
- output.note = json.fcodeName;
89
- output.links = [`https://www.geonames.org/${json.geonameId}`, `https://${json.wikipediaURL}`];
90
- return output;
91
- })
92
- .catch(() => Promise.reject());
76
+ `https://secure.geonames.org/getJSON?geonameId=${encodeURIComponent(id)}&username=${
77
+ this.user
78
+ }`,
79
+ )
80
+ .then(response => {
81
+ if (response.ok) {
82
+ return response.json();
83
+ }
84
+ return Promise.reject(response.status);
85
+ })
86
+ .then(json => {
87
+ const output = { ...json };
88
+ output.name = json.toponymName;
89
+ output.country = json.countryName;
90
+ output.region = json.adminName1;
91
+ output.note = json.fcodeName;
92
+ output.links = [
93
+ `https://www.geonames.org/${json.geonameId}`,
94
+ `https://${json.wikipediaURL}`,
95
+ ];
96
+ return output;
97
+ })
98
+ .catch(() => Promise.reject());
93
99
  }
94
100
  }