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

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 (154) hide show
  1. package/.github/workflows/main.yml +3 -3
  2. package/.github/workflows/node.js.yml +3 -3
  3. package/.github/workflows/release.js.yml +4 -4
  4. package/.releaserc.json +2 -2
  5. package/CHANGELOG.md +267 -9
  6. package/Dockerfile +78 -70
  7. package/css/components.css +5 -5
  8. package/css/leaflet/images/layers.png +0 -0
  9. package/dist/demo/components.css +46 -1
  10. package/dist/demo/pb-browse-docs2.html +1 -1
  11. package/dist/demo/pb-dialog.html +3 -5
  12. package/dist/demo/pb-drawer2.html +1 -1
  13. package/dist/demo/pb-facsimile.html +2 -2
  14. package/dist/demo/pb-grid.html +19 -6
  15. package/dist/demo/pb-leaflet-map.html +1 -1
  16. package/dist/demo/pb-login.html +0 -2
  17. package/dist/demo/pb-message.html +1 -2
  18. package/dist/demo/pb-progress.html +2 -2
  19. package/dist/demo/pb-repeat.html +1 -3
  20. package/dist/demo/pb-search.html +7 -4
  21. package/dist/demo/pb-search3.html +1 -1
  22. package/dist/demo/pb-search4.html +2 -2
  23. package/dist/demo/pb-view3.html +1 -1
  24. package/dist/{iron-form-3b8dcaa7.js → iron-form-dfb3e3b1.js} +95 -95
  25. package/dist/paper-checkbox-645e1077.js +200 -0
  26. package/dist/{paper-icon-button-b1d31571.js → paper-icon-button-984162bd.js} +1 -1
  27. package/dist/{paper-checkbox-515a5284.js → paper-inky-focus-behavior-fa16796b.js} +58 -247
  28. package/dist/{paper-listbox-a3b7175c.js → paper-listbox-5f5d1cec.js} +152 -162
  29. package/dist/pb-code-editor.js +25 -20
  30. package/dist/pb-component-docs.js +68 -64
  31. package/dist/pb-components-bundle.js +1983 -2293
  32. package/dist/pb-edit-app.js +167 -107
  33. package/dist/pb-elements.json +176 -120
  34. package/dist/{pb-i18n-0611135a.js → pb-i18n-4cc00bfe.js} +1 -1
  35. package/dist/pb-leaflet-map.js +23 -23
  36. package/dist/pb-mei.js +56 -41
  37. package/dist/{pb-mixin-b1caa22e.js → pb-mixin-886ece32.js} +1 -1
  38. package/dist/pb-odd-editor.js +1023 -782
  39. package/dist/pb-tify.js +2 -2
  40. package/dist/vaadin-element-mixin-beb74ffd.js +545 -0
  41. package/gh-pages.js +5 -3
  42. package/i18n/common/en.json +6 -0
  43. package/i18n/common/pl.json +2 -2
  44. package/lib/openseadragon.min.js +6 -6
  45. package/package.json +3 -3
  46. package/pb-elements.json +176 -120
  47. package/src/assets/components.css +5 -5
  48. package/src/authority/airtable.js +20 -21
  49. package/src/authority/anton.js +129 -129
  50. package/src/authority/custom.js +23 -21
  51. package/src/authority/geonames.js +38 -32
  52. package/src/authority/gnd.js +50 -42
  53. package/src/authority/kbga.js +137 -134
  54. package/src/authority/metagrid.js +44 -46
  55. package/src/authority/reconciliation.js +66 -67
  56. package/src/authority/registry.js +4 -4
  57. package/src/docs/pb-component-docs.js +2 -2
  58. package/src/docs/pb-component-view.js +5 -5
  59. package/src/docs/pb-components-list.js +2 -2
  60. package/src/docs/pb-demo-snippet.js +2 -2
  61. package/src/dts-client.js +299 -297
  62. package/src/dts-select-endpoint.js +90 -82
  63. package/src/parse-date-service.js +184 -135
  64. package/src/pb-ajax.js +158 -171
  65. package/src/pb-authority-lookup.js +191 -156
  66. package/src/pb-autocomplete.js +292 -280
  67. package/src/pb-blacklab-highlight.js +264 -259
  68. package/src/pb-blacklab-results.js +236 -221
  69. package/src/pb-browse-docs.js +540 -475
  70. package/src/pb-browse.js +68 -65
  71. package/src/pb-clipboard.js +79 -76
  72. package/src/pb-code-editor.js +110 -102
  73. package/src/pb-code-highlight.js +209 -204
  74. package/src/pb-codepen.js +79 -72
  75. package/src/pb-collapse.js +211 -151
  76. package/src/pb-combo-box.js +190 -190
  77. package/src/pb-components-bundle.js +1 -1
  78. package/src/pb-components.js +1 -0
  79. package/src/pb-custom-form.js +173 -153
  80. package/src/pb-dialog.js +98 -62
  81. package/src/pb-document.js +89 -90
  82. package/src/pb-download.js +212 -196
  83. package/src/pb-drawer.js +145 -148
  84. package/src/pb-edit-app.js +301 -229
  85. package/src/pb-edit-xml.js +100 -97
  86. package/src/pb-events.js +114 -107
  87. package/src/pb-facs-link.js +104 -102
  88. package/src/pb-facsimile.js +474 -410
  89. package/src/pb-formula.js +151 -153
  90. package/src/pb-geolocation.js +129 -131
  91. package/src/pb-grid-action.js +53 -56
  92. package/src/pb-grid.js +231 -228
  93. package/src/pb-highlight.js +140 -140
  94. package/src/pb-hotkeys.js +40 -42
  95. package/src/pb-i18n.js +101 -104
  96. package/src/pb-image-strip.js +84 -78
  97. package/src/pb-lang.js +142 -57
  98. package/src/pb-leaflet-map.js +488 -485
  99. package/src/pb-link.js +126 -124
  100. package/src/pb-load.js +431 -429
  101. package/src/pb-login.js +299 -244
  102. package/src/pb-manage-odds.js +352 -336
  103. package/src/pb-map-icon.js +89 -89
  104. package/src/pb-map-layer.js +85 -85
  105. package/src/pb-markdown.js +90 -99
  106. package/src/pb-media-query.js +74 -72
  107. package/src/pb-mei.js +306 -295
  108. package/src/pb-message.js +139 -97
  109. package/src/pb-mixin.js +269 -264
  110. package/src/pb-navigation.js +80 -95
  111. package/src/pb-observable.js +38 -38
  112. package/src/pb-odd-editor.js +1054 -958
  113. package/src/pb-odd-elementspec-editor.js +349 -298
  114. package/src/pb-odd-model-editor.js +1075 -909
  115. package/src/pb-odd-parameter-editor.js +200 -178
  116. package/src/pb-odd-rendition-editor.js +136 -124
  117. package/src/pb-page.js +431 -422
  118. package/src/pb-paginate.js +228 -179
  119. package/src/pb-panel.js +198 -182
  120. package/src/pb-popover-themes.js +15 -8
  121. package/src/pb-popover.js +296 -287
  122. package/src/pb-print-preview.js +127 -127
  123. package/src/pb-progress.js +51 -51
  124. package/src/pb-repeat.js +105 -104
  125. package/src/pb-restricted.js +84 -77
  126. package/src/pb-search.js +256 -228
  127. package/src/pb-select-feature.js +127 -120
  128. package/src/pb-select-odd.js +132 -124
  129. package/src/pb-select-template.js +89 -78
  130. package/src/pb-select.js +251 -227
  131. package/src/pb-split-list.js +179 -174
  132. package/src/pb-svg.js +80 -79
  133. package/src/pb-table-column.js +54 -54
  134. package/src/pb-table-grid.js +221 -203
  135. package/src/pb-tabs.js +61 -63
  136. package/src/pb-tify.js +154 -154
  137. package/src/pb-timeline.js +382 -249
  138. package/src/pb-toggle-feature.js +195 -187
  139. package/src/pb-upload.js +184 -174
  140. package/src/pb-version.js +30 -30
  141. package/src/pb-view-annotate.js +135 -98
  142. package/src/pb-view.js +1282 -1270
  143. package/src/pb-zoom.js +127 -45
  144. package/src/polymer-hack.js +1 -1
  145. package/src/search-result-service.js +256 -223
  146. package/src/seed-element.js +13 -20
  147. package/src/settings.js +4 -4
  148. package/src/theming.js +98 -91
  149. package/src/urls.js +289 -289
  150. package/src/utils.js +53 -51
  151. package/css/pb-styles.css +0 -51
  152. package/dist/vaadin-element-mixin-6e4cee3a.js +0 -527
  153. package/src/assets/pb-styles.css +0 -51
  154. package/src/pb-light-dom.js +0 -40
@@ -1,18 +1,13 @@
1
1
  import { LitElement, html, css } from 'lit-element';
2
- import '@polymer/paper-dialog';
3
- import '@polymer/paper-dialog-scrollable';
2
+ import './pb-dialog.js';
4
3
  import '@polymer/iron-ajax';
5
- import '@polymer/paper-checkbox';
6
- import '@polymer/paper-button';
7
- import '@polymer/paper-icon-button';
8
- import '@polymer/paper-input/paper-input.js';
9
- import '@polymer/app-layout/app-toolbar/app-toolbar.js';
10
4
  import { pbMixin, waitOnce } from './pb-mixin.js';
11
5
  import { translate } from './pb-i18n.js';
12
6
  import './pb-restricted.js';
13
7
  import './pb-ajax.js';
14
8
  import './pb-edit-xml.js';
15
9
  import { cmpVersion } from './utils.js';
10
+ import { themableMixin } from './theming.js';
16
11
 
17
12
  /**
18
13
  * High-level component implementing the ODD management panel
@@ -22,342 +17,363 @@ import { cmpVersion } from './utils.js';
22
17
  * @fires pb-load - Sending the ODD to be used
23
18
  * @fires pb-refresh-odds When received, refresh the list of ODDs
24
19
  */
25
- export class PbManageOdds extends pbMixin(LitElement) {
26
- static get properties() {
27
- return {
28
- ...super.properties,
29
- /**
30
- * array of ODD-files to be listed
31
- */
32
- odds: {
33
- type: Array
34
- },
35
- target: {
36
- type: String
37
- },
38
- _valid: {
39
- type: Boolean
40
- },
41
- _current: {
42
- type: String
43
- }
44
- };
20
+ export class PbManageOdds extends themableMixin(pbMixin(LitElement)) {
21
+ static get properties() {
22
+ return {
23
+ ...super.properties,
24
+ /**
25
+ * array of ODD-files to be listed
26
+ */
27
+ odds: {
28
+ type: Array,
29
+ },
30
+ target: {
31
+ type: String,
32
+ },
33
+ _valid: {
34
+ type: Boolean,
35
+ },
36
+ _current: {
37
+ type: String,
38
+ },
39
+ };
40
+ }
41
+
42
+ constructor() {
43
+ super();
44
+ this.odds = [];
45
+ }
46
+
47
+ connectedCallback() {
48
+ super.connectedCallback();
49
+
50
+ this.subscribeTo('pb-refresh-odds', ev => {
51
+ this._refresh();
52
+
53
+ // regenerate newly uploaded ODDs
54
+ const regenAjax = this.shadowRoot.getElementById('regenerate');
55
+ const params = ev.detail.odds.map(odd => `odd=${odd}`).join('&');
56
+ if (this.minApiVersion('1.0.0')) {
57
+ regenAjax.url = `api/odd?${params}`;
58
+ } else {
59
+ regenAjax.url = `modules/lib/regenerate.xql?${params}`;
60
+ }
61
+ regenAjax.trigger();
62
+ });
63
+ }
64
+
65
+ firstUpdated() {
66
+ super.firstUpdated();
67
+
68
+ this._loader = this.shadowRoot.getElementById('load');
69
+
70
+ waitOnce('pb-page-ready', options => {
71
+ if (cmpVersion(options.apiVersion, '1.0.0') < 0) {
72
+ this._loader.url = `${options.endpoint}/modules/lib/components-odd.xql`;
73
+ } else {
74
+ this._loader.url = `${options.endpoint}/api/odd`;
75
+ }
76
+ this._refresh();
77
+ });
78
+ }
79
+
80
+ _refresh(params) {
81
+ this.emitTo('pb-start-update');
82
+
83
+ this._loader.params = params;
84
+ this._loader.generateRequest();
85
+ }
86
+
87
+ _update() {
88
+ this.emitTo('pb-end-update');
89
+
90
+ this.odds = this._loader.lastResponse;
91
+ this.requestUpdate();
92
+ }
93
+
94
+ _selectODD(ev) {
95
+ const selected = ev.model.itemsIndex;
96
+ this.odds.forEach((odd, index) => {
97
+ if (index !== selected && odd.current) {
98
+ this.set(`odds.${index}.current`, false);
99
+ this.set(`odds.${selected}.current`, true);
100
+ }
101
+ });
102
+ const params = { odd: `${ev.model.item.name}.odd` };
103
+ console.log('<pb-manage-odds> selected ODD: %o', params);
104
+
105
+ this.emitTo('pb-load', {
106
+ params,
107
+ });
108
+ }
109
+
110
+ _createODD(ev) {
111
+ ev.preventDefault();
112
+
113
+ const name = this.shadowRoot.querySelector('input[name="new_odd"]').value;
114
+ const title = this.shadowRoot.querySelector('input[name="title"]').value;
115
+ console.log('<pb-manage-odds> create ODD: %s, %s', name, title);
116
+ if (this.lessThanApiVersion('1.0.0')) {
117
+ this._refresh({ new_odd: name, title });
118
+ } else {
119
+ const createRequest = this.shadowRoot.getElementById('create');
120
+ createRequest.url = `${this.getEndpoint()}/api/odd/${name}`;
121
+ createRequest.params = {
122
+ title,
123
+ };
124
+ this.emitTo('pb-start-update');
125
+ createRequest.generateRequest();
45
126
  }
46
-
47
- constructor() {
48
- super();
49
- this.odds = [];
127
+ }
128
+
129
+ _created(ev) {
130
+ this.emitTo('pb-end-update');
131
+ if (ev.detail.status === 201) {
132
+ this._refresh();
133
+ } else {
134
+ console.log('<pb-manage-odds> unexpected response for create odd: %o', ev.detail);
50
135
  }
51
-
52
- connectedCallback() {
53
- super.connectedCallback();
54
-
55
- this.subscribeTo('pb-refresh-odds', (ev) => {
56
- this._refresh();
57
-
58
- // regenerate newly uploaded ODDs
59
- const regenAjax = this.shadowRoot.getElementById('regenerate');
60
- const params = ev.detail.odds.map(odd => `odd=${odd}`).join('&');
61
- if (this.minApiVersion('1.0.0')) {
62
- regenAjax.url = `api/odd?${params}`;
63
- } else {
64
- regenAjax.url = `modules/lib/regenerate.xql?${params}`;
65
- }
66
- regenAjax.trigger();
67
- });
136
+ }
137
+
138
+ _createByExample() {
139
+ const name = this.shadowRoot.querySelector('input[name="new_odd"]').value;
140
+ const title = this.shadowRoot.querySelector('input[name="title"]').value;
141
+ const params = { new_odd: name, title };
142
+ const fileBrowser = document.getElementById(this.target);
143
+ if (!(fileBrowser || fileBrowser.getSelected)) {
144
+ console.error('<pb-manage-odds> target %s not found', this.target);
68
145
  }
69
-
70
- firstUpdated() {
71
- super.firstUpdated();
72
-
73
- this._loader = this.shadowRoot.getElementById('load');
74
-
75
- waitOnce('pb-page-ready', (options) => {
76
- if (cmpVersion(options.apiVersion, '1.0.0') < 0) {
77
- this._loader.url = `${options.endpoint}/modules/lib/components-odd.xql`;
78
- } else {
79
- this._loader.url = `${options.endpoint}/api/odd`;
80
- }
81
- this._refresh();
82
- });
83
- }
84
-
85
- _refresh(params) {
146
+ const selected = fileBrowser.getSelected();
147
+ document.querySelectorAll('.document-select paper-checkbox[checked]').forEach(checkbox => {
148
+ selected.push(checkbox.value);
149
+ });
150
+ console.log('<pb-manage-odds> create ODD by example: %o', selected);
151
+ params.byExample = selected;
152
+ this._refresh(params);
153
+ }
154
+
155
+ _delete(odd) {
156
+ this._current = odd;
157
+ this.shadowRoot.getElementById('deleteDialog').openDialog();
158
+ }
159
+
160
+ _confirmDelete() {
161
+ if (this._current) {
162
+ console.log('<pb-manage-odds> deleting ODD: %s', this._current);
163
+ if (this.lessThanApiVersion('1.0.0')) {
164
+ this._refresh({ delete: this._current });
165
+ } else {
86
166
  this.emitTo('pb-start-update');
87
-
88
- this._loader.params = params;
89
- this._loader.generateRequest();
90
- }
91
-
92
- _update() {
93
- this.emitTo('pb-end-update');
94
-
95
- this.odds = this._loader.lastResponse;
96
- this.requestUpdate();
97
- }
98
-
99
- _selectODD(ev) {
100
- const selected = ev.model.itemsIndex;
101
- this.odds.forEach((odd, index) => {
102
- if (index !== selected && odd.current) {
103
- this.set('odds.' + index + '.current', false);
104
- this.set('odds.' + selected + '.current', true);
105
- }
106
- });
107
- const params = { odd: ev.model.item.name + '.odd' };
108
- console.log('<pb-manage-odds> selected ODD: %o', params);
109
-
110
- this.emitTo('pb-load', {
111
- "params": params
112
- });
113
- }
114
-
115
- _createODD() {
116
- const name = this.shadowRoot.querySelector('paper-input[name="new_odd"]').value;
117
- const title = this.shadowRoot.querySelector('paper-input[name="title"]').value;
118
- console.log('<pb-manage-odds> create ODD: %s, %s', name, title);
119
- if (this.lessThanApiVersion('1.0.0')) {
120
- this._refresh({ new_odd: name, title });
121
- } else {
122
- const createRequest = this.shadowRoot.getElementById('create');
123
- createRequest.url = `${this.getEndpoint()}/api/odd/${name}`;
124
- createRequest.params = {
125
- title
126
- };
127
- this.emitTo('pb-start-update');
128
- createRequest.generateRequest();
129
- }
130
- }
131
-
132
- _created(ev) {
133
- this.emitTo('pb-end-update');
134
- if (ev.detail.status === 201) {
135
- this._refresh();
136
- } else {
137
- console.log('<pb-manage-odds> unexpected response for create odd: %o', ev.detail);
138
- }
139
- }
140
-
141
- _createByExample() {
142
- const name = this.shadowRoot.querySelector('paper-input[name="new_odd"]').value;
143
- const title = this.shadowRoot.querySelector('paper-input[name="title"]').value;
144
- const params = { new_odd: name, title };
145
- const fileBrowser = document.getElementById(this.target);
146
- if (!(fileBrowser || fileBrowser.getSelected)) {
147
- console.error('<pb-manage-odds> target %s not found', this.target);
148
- }
149
- const selected = fileBrowser.getSelected();
150
- document.querySelectorAll('.document-select paper-checkbox[checked]').forEach((checkbox) => {
151
- selected.push(checkbox.value);
152
- });
153
- console.log('<pb-manage-odds> create ODD by example: %o', selected);
154
- params['byExample'] = selected;
155
- this._refresh(params);
156
- }
157
-
158
- _delete(odd) {
159
- this._current = odd;
160
- this.shadowRoot.getElementById('deleteDialog').open();
161
- }
162
-
163
- _confirmDelete() {
164
- if (this._current) {
165
- console.log('<pb-manage-odds> deleting ODD: %s', this._current);
166
- if (this.lessThanApiVersion('1.0.0')) {
167
- this._refresh({ 'delete': this._current });
168
- } else {
169
- this.emitTo('pb-start-update');
170
- const deleteRequest = this.shadowRoot.getElementById('delete');
171
- deleteRequest.url = `${this.getEndpoint()}/api/odd/${this._current}`;
172
- deleteRequest.generateRequest();
173
- }
174
- this._current = null;
175
- } else {
176
- console.error('<pb-manage-odds> no file marked for deletion');
177
- }
178
- }
179
-
180
- _deleted() {
181
167
  const deleteRequest = this.shadowRoot.getElementById('delete');
182
- const error = deleteRequest.lastError;
183
- if (error.status === 410) {
184
- this._refresh();
185
- } else {
186
- console.error('<pb-manage-odds> failed to delete odd: %d %o', error.status, error.response);
187
- this.emitTo('pb-end-update');
188
- }
168
+ deleteRequest.url = `${this.getEndpoint()}/api/odd/${this._current}`;
169
+ deleteRequest.generateRequest();
170
+ }
171
+ this._current = null;
172
+ } else {
173
+ console.error('<pb-manage-odds> no file marked for deletion');
189
174
  }
190
-
191
- _validate() {
192
- // Validate the entire form to see if we should enable the `Submit` button.
193
- const valid = this.shadowRoot.getElementById('ironform').validate();
194
- this.shadowRoot.getElementById('createBtn').disabled = !valid;
195
- this.shadowRoot.getElementById('createByEx').disabled = !valid;
175
+ }
176
+
177
+ _deleted() {
178
+ const deleteRequest = this.shadowRoot.getElementById('delete');
179
+ const error = deleteRequest.lastError;
180
+ if (error.status === 410) {
181
+ this._refresh();
182
+ } else {
183
+ console.error('<pb-manage-odds> failed to delete odd: %d %o', error.status, error.response);
184
+ this.emitTo('pb-end-update');
196
185
  }
197
-
198
- render() {
199
- if (!this.odds) {
200
- return null;
201
- }
202
- const regenUrl = this.lessThanApiVersion('1.0.0') ? 'modules/lib/regenerate.xql' : "api/odd";
203
- return html`
204
- <pb-restricted login="login">
205
- <pb-ajax id="regenerateAll" url="${regenUrl}" method="post" title="${translate('odd.manage.regenerate-all')}"
206
- emit="${this.emit ? this.emit : ''}" .emitConfig="${this.emitConfig}">
207
- <h3 slot="title">${translate('odd.manage.regenerate-all')}</h3>
208
- <paper-button raised="raised"><a href="#">${translate('odd.manage.regenerate-all')}</a></paper-button>
209
- </pb-ajax>
210
- </pb-restricted>
211
- ${this.odds.map((odd) =>
212
- html`
213
- <div class="odd">
214
- <a href="odd-editor.html?odd=${odd.name}.odd" target="_blank"
215
- title="edit ODD in graphical editor">${odd.label}</a>
216
- <!-- TODO this toolbar should only appear once per ODD files papercard -->
217
- <app-toolbar>
218
- ${
219
- odd.canWrite ?
220
- html`
221
- <pb-restricted login="login">
222
- <pb-ajax url="${regenUrl}?odd=${odd.name}.odd" method="post" class="editor-link"
223
- emit="${this.emit ? this.emit : ''}" .emitConfig="${this.emitConfig}">
224
- <h2 slot="title">${translate('menu.admin.recompile')}</h2>
225
- <paper-icon-button title="Regenerate ODD" icon="update"></paper-icon-button>
226
- </pb-ajax>
227
- <paper-icon-button title="Delete ODD" icon="delete" @click="${() => this._delete(`${odd.name}.odd`)}"
228
- class="editor-link"></paper-icon-button>
229
- </pb-restricted>
230
- ` : null
231
- }
232
- <a href="odd-editor.html?odd=${odd.name}.odd" target="_blank" class="editor-link"
233
- title="edit ODD in graphical editor"><iron-icon icon="reorder"></iron-icon></a>
234
- <pb-edit-xml path="${odd.path}" class="editor-link">
235
- <paper-icon-button title="Edit XML" icon="create"></paper-icon-button>
236
- </pb-edit-xml>
237
- </app-toolbar>
238
- </div>
239
- <div class="odd-description">${odd.description}</div>
240
- `)}
241
- <pb-restricted login="login">
242
- <form action="" method="GET">
243
- <paper-input name="new_odd" label="${translate('odd.manage.filename')}" required auto-validate pattern="[a-zA-Z0-9-_]+"
244
- error-message="${translate('odd.manage.filename-error')}"></paper-input>
245
- <paper-input name="title" label="${translate('odd.manage.title')}" auto-validate required minlength="1"
246
- error-message="${translate('odd.manage.title-error')}"></paper-input>
247
- <paper-button id="createBtn" @click="${this._createODD}">
248
- <iron-icon icon="create"></iron-icon>${translate('odd.manage.create')}
249
- </paper-button>
250
- <!--paper-button id="createByEx" @click="${this._createByExample}">
251
- <iron-icon icon="build"></iron-icon>
252
- ${translate('odd.manage.create-from-example')}
253
- </paper-button-->
254
- </form>
255
- </pb-restricted>
256
- <pb-ajax id="regenerate" url="${regenUrl}" method="post"></pb-ajax>
257
- <iron-ajax
258
- id="load"
259
- verbose
260
- handle-as="json"
261
- method="get"
262
- with-credentials
263
- @response="${this._update}">
264
- </iron-ajax>
265
- <iron-ajax id="delete" method="delete" with-credentials @error="${this._deleted}"></iron-ajax>
266
- <iron-ajax id="create" method="post" with-credentials @response="${this._created}" @error="${this._created}"></iron-ajax>
267
- <paper-dialog id="deleteDialog">
268
- <h2>${translate('browse.delete')}</h2>
269
- <paper-dialog-scrollable>
270
- <p>${translate('odd.manage.delete', { file: this.file })}</p>
271
- </paper-dialog-scrollable>
272
- <div class="buttons">
273
- <paper-button dialog-confirm="dialog-confirm" autofocus @click="${this._confirmDelete}">
274
- ${translate('dialogs.yes')}
275
- </paper-button>
276
- <paper-button dialog-confirm="dialog-cancel">
277
- ${translate('dialogs.no')}
278
- </paper-button>
279
- </div>
280
- </paper-dialog>
281
- `;
282
- }
283
-
284
- static get styles() {
285
- return css`
286
- :host {
287
- display: block;
288
- }
289
-
290
- .odd {
291
- display: flex;
292
- flex-direction: row;
293
- align-items: center;
294
- }
295
-
296
- .odd paper-checkbox {
297
- display: block;
298
- flex: 0 0;
299
- margin-right: 1em;
300
- }
301
-
302
- .odd a,
303
- .odd a:link,
304
- .odd a:visited{
305
- display: block;
306
- flex: 10 0;
307
- color:var(--pb-manage-odds-link-color);
308
- }
309
-
310
- .odd app-toolbar {
311
- flex: 1 0;
312
- justify-content: flex-end;
313
- padding: 0;
314
- min-height:0.25rem;
315
- }
316
-
317
- pb-restricted {
318
- display: flex;
319
- }
320
-
321
- .odd-description {
322
- color: #888888;
323
- font-size: 0.8em;
324
- margin-bottom: 0.25rem;
325
- }
326
-
327
- #regenerateAll {
328
- display: block;
329
- width: 100%;
330
- margin-top: 10px;
331
- text-align: right;
332
- }
333
-
334
- #regenerateAll a{
335
- text-decoration: none;
336
- color: inherit;
337
- }
338
-
339
- [icon]{
340
- color:var(--pb-manage-odds-icon-color);
341
- }
342
-
343
- [icon='reorder']
344
- {
345
- width:24px;
346
- height: 24px;
347
- }
348
-
349
- /* @media (hover:hover) and (pointer: fine){
350
- .odd app-toolbar .editor-link{
351
- opacity: 0;
352
- }
353
- .odd:hover .editor-link{
354
- opacity: 1;
355
- transition: opacity 0.6s;
356
- }
357
- } */
358
- `;
186
+ }
187
+
188
+ _validate() {
189
+ // Validate the entire form to see if we should enable the `Submit` button.
190
+ const valid = this.shadowRoot.getElementById('ironform').validate();
191
+ this.shadowRoot.getElementById('createBtn').disabled = !valid;
192
+ this.shadowRoot.getElementById('createByEx').disabled = !valid;
193
+ }
194
+
195
+ render() {
196
+ if (!this.odds) {
197
+ return null;
359
198
  }
199
+ const regenUrl = this.lessThanApiVersion('1.0.0') ? 'modules/lib/regenerate.xql' : 'api/odd';
200
+ return html`
201
+ ${this.odds.map(
202
+ odd =>
203
+ html`
204
+ <div class="odd-container">
205
+ <div class="odd">
206
+ <a
207
+ href="odd-editor.html?odd=${odd.name}.odd"
208
+ target="_blank"
209
+ title="edit ODD in graphical editor"
210
+ >${odd.label}</a
211
+ >
212
+ <!-- TODO this toolbar should only appear once per ODD files papercard -->
213
+ <header role="group">
214
+ ${odd.canWrite
215
+ ? html`
216
+ <pb-restricted login="login">
217
+ <pb-ajax
218
+ url="${regenUrl}?odd=${odd.name}.odd"
219
+ method="post"
220
+ class="editor-link"
221
+ emit="${this.emit ? this.emit : ''}"
222
+ .emitConfig="${this.emitConfig}"
223
+ >
224
+ <h2 slot="title">${translate('menu.admin.recompile')}</h2>
225
+ <button title="Regenerate ODD">
226
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-counterclockwise" viewBox="0 0 16 16">
227
+ <path fill-rule="evenodd" d="M8 3a5 5 0 1 1-4.546 2.914.5.5 0 0 0-.908-.417A6 6 0 1 0 8 2z"/>
228
+ <path d="M8 4.466V.534a.25.25 0 0 0-.41-.192L5.23 2.308a.25.25 0 0 0 0 .384l2.36 1.966A.25.25 0 0 0 8 4.466"/>
229
+ </svg>
230
+ </button
231
+ </pb-ajax>
232
+ </pb-restricted>
233
+ <pb-restricted login="login">
234
+ <button title="Delete ODD" @click="${() => this._delete(`${odd.name}.odd`)}">
235
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-trash3" viewBox="0 0 16 16">
236
+ <path d="M6.5 1h3a.5.5 0 0 1 .5.5v1H6v-1a.5.5 0 0 1 .5-.5M11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3A1.5 1.5 0 0 0 5 1.5v1H1.5a.5.5 0 0 0 0 1h.538l.853 10.66A2 2 0 0 0 4.885 16h6.23a2 2 0 0 0 1.994-1.84l.853-10.66h.538a.5.5 0 0 0 0-1zm1.958 1-.846 10.58a1 1 0 0 1-.997.92h-6.23a1 1 0 0 1-.997-.92L3.042 3.5zm-7.487 1a.5.5 0 0 1 .528.47l.5 8.5a.5.5 0 0 1-.998.06L5 5.03a.5.5 0 0 1 .47-.53Zm5.058 0a.5.5 0 0 1 .47.53l-.5 8.5a.5.5 0 1 1-.998-.06l.5-8.5a.5.5 0 0 1 .528-.47M8 4.5a.5.5 0 0 1 .5.5v8.5a.5.5 0 0 1-1 0V5a.5.5 0 0 1 .5-.5"/>
237
+ </svg>
238
+ </button>
239
+ </pb-restricted>
240
+ `
241
+ : null}
242
+ <a
243
+ href="odd-editor.html?odd=${odd.name}.odd"
244
+ target="_blank"
245
+ class="editor-link"
246
+ title="edit ODD in graphical editor"
247
+ >
248
+ <button>
249
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-card-heading" viewBox="0 0 16 16">
250
+ <path d="M14.5 3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-13a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5zm-13-1A1.5 1.5 0 0 0 0 3.5v9A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 14.5 2z"/>
251
+ <path d="M3 8.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5m0 2a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1h-6a.5.5 0 0 1-.5-.5m0-5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-9a.5.5 0 0 1-.5-.5z"/>
252
+ </svg>
253
+ </button>
254
+ </a>
255
+ <pb-edit-xml path="${odd.path}" class="editor-link">
256
+ <button title="Edit XML">
257
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-pencil" viewBox="0 0 16 16">
258
+ <path d="M12.146.146a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1 0 .708l-10 10a.5.5 0 0 1-.168.11l-5 2a.5.5 0 0 1-.65-.65l2-5a.5.5 0 0 1 .11-.168l10-10zM11.207 2.5 13.5 4.793 14.793 3.5 12.5 1.207 11.207 2.5zm1.586 3L10.5 3.207 4 9.707V10l.293.293 6.5-6.5zm-9.761 5.175-.106.106-1.528 3.881 3.881-1.528.106-.106A.5.5 0 0 1 5 12.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.468-.325z"/>
259
+ </svg>
260
+ </button>
261
+ </pb-edit-xml>
262
+ </header>
263
+ </div>
264
+ <div class="odd-description">${odd.description}</div>
265
+ </div>
266
+ `,
267
+ )}
268
+ <pb-restricted login="login">
269
+ <form action="" method="GET">
270
+ <input
271
+ id="new_odd"
272
+ name="new_odd"
273
+ type="text"
274
+ required
275
+ pattern="[a-zA-Z0-9-_]+"
276
+ placeholder="${translate('odd.manage.filename')}"
277
+ />
278
+ <input
279
+ id="title"
280
+ name="title"
281
+ type="text"
282
+ required
283
+ minlength="1"
284
+ placeholder="${translate('odd.manage.title')}"
285
+ />
286
+ <button id="createBtn" @click="${this._createODD}">
287
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-plus" viewBox="0 0 16 16">
288
+ <path d="M8 6.5a.5.5 0 0 1 .5.5v1.5H10a.5.5 0 0 1 0 1H8.5V11a.5.5 0 0 1-1 0V9.5H6a.5.5 0 0 1 0-1h1.5V7a.5.5 0 0 1 .5-.5"/>
289
+ <path d="M14 4.5V14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h5.5zm-3 0A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V4.5z"/>
290
+ </svg>
291
+ <span>${translate('odd.manage.create')}</span>
292
+ </button>
293
+ </form>
294
+ </pb-restricted>
295
+ <pb-ajax id="regenerate" url="${regenUrl}" method="post"></pb-ajax>
296
+ <iron-ajax
297
+ id="load"
298
+ verbose
299
+ handle-as="json"
300
+ method="get"
301
+ with-credentials
302
+ @response="${this._update}"
303
+ >
304
+ </iron-ajax>
305
+ <iron-ajax id="delete" method="delete" with-credentials @error="${this._deleted}"></iron-ajax>
306
+ <iron-ajax
307
+ id="create"
308
+ method="post"
309
+ with-credentials
310
+ @response="${this._created}"
311
+ @error="${this._created}"
312
+ ></iron-ajax>
313
+ <pb-dialog id="deleteDialog" title="${translate('browse.delete')}">
314
+ <p>${translate('odd.manage.delete', { file: this.file })}</p>
315
+ <div slot="footer">
316
+ <button autofocus @click="${this._confirmDelete}" rel="prev">
317
+ ${translate('dialogs.yes')}
318
+ </button>
319
+ <button rel="prev">
320
+ ${translate('dialogs.no')}
321
+ </button>
322
+ </div>
323
+ </pb-dialog>
324
+ `;
325
+ }
326
+
327
+ static get styles() {
328
+ return css`
329
+ :host {
330
+ display: block;
331
+ }
332
+
333
+ .odd-container {
334
+ margin-bottom: .5rem;
335
+ border-bottom: 1px solid var(--pb-manage-odds-border-color, #e0e0e0);
336
+ padding-bottom: .5rem;
337
+ }
338
+
339
+ .odd {
340
+ display: flex;
341
+ flex-direction: row;
342
+ align-items: center;
343
+ justify-content: space-between;
344
+ gap: .5rem;
345
+ }
346
+
347
+ .odd a,
348
+ .odd a:link,
349
+ .odd a:visited {
350
+ display: block;
351
+ color: var(--pb-manage-odds-link-color);
352
+ }
353
+
354
+ .odd > header {
355
+ display: inline-flex;
356
+ column-gap: .25rem;
357
+ justify-content: flex-end;
358
+ align-items: center;
359
+ }
360
+
361
+ pb-restricted {
362
+ display: inline-block;
363
+ }
364
+
365
+ .odd-description {
366
+ color: #888888;
367
+ font-size: 0.8em;
368
+ margin-top: 0.5rem;
369
+ }
370
+
371
+ form {
372
+ margin-top: 1rem;
373
+ }
374
+ `;
375
+ }
360
376
  }
361
- if(!customElements.get('pb-manage-odds')){
362
- customElements.define('pb-manage-odds', PbManageOdds);
377
+ if (!customElements.get('pb-manage-odds')) {
378
+ customElements.define('pb-manage-odds', PbManageOdds);
363
379
  }