@teipublisher/pb-components 2.18.4 → 2.19.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.
@@ -47,6 +47,9 @@
47
47
  "browse": {
48
48
  "description": "За допомогою цього додатка ви можете експериментувати та тестувати різні файли ODD з інструкціями до нашої моделі. Заімпортуйте власний код та створіть файл ODD, достосований до ваших особистих потреб.",
49
49
  "login": ", щоб заімпортувати файли або переглянути адміністративні функції (користувач за замовчуванням: 'tei-demo', пароль: 'demo').",
50
+ "login-1": "Увійти як ",
51
+ "login-2": "з паролем",
52
+ "login-3": "поекспериментувати зі своїми файлами та ОРДами",
50
53
  "sort": "Сортувати за",
51
54
  "filter": "Фільтрувати за",
52
55
  "filterPlaceholder": "Фільтр",
@@ -60,6 +63,9 @@
60
63
  "confirmDeletion": "Ви дійсно бажаєте видалити цей файл?",
61
64
  "confirmDeletion_plural": "Ви дійсно бажаєте видалити ці {{count}} файли?",
62
65
  "documents": "Документи",
66
+ "documents-removed": "Видалені документи",
67
+ "document-not-found": "Документ не знайдено",
68
+ "document-remove-failed": "Не вдалося видалити документ",
63
69
  "collections": "Локальна колекція",
64
70
  "dts": "Distributed Text Services (експериментальні)",
65
71
  "test": {
@@ -78,6 +84,10 @@
78
84
  "title": "Приклад Markdown",
79
85
  "description": "Приклад використання markdown для статичного контенту."
80
86
  },
87
+ "annotate": {
88
+ "title": "Зразки анотації",
89
+ "description": "Ще один ігровий майданчик для анотації документів."
90
+ },
81
91
  "up": "Перейти на рівень вище"
82
92
  },
83
93
  "upload": {
@@ -111,11 +121,15 @@
111
121
  "reset": "Скинути",
112
122
  "placeholder": "Введіть запит",
113
123
  "sections": "Пошук у секціях",
114
- "headings": "Пошук у заголовках"
124
+ "headings": "Пошук у заголовках",
125
+ "title": "Пошук за заголовками",
126
+ "content": "Що шукати",
127
+ "scope": "Область запиту"
115
128
  },
116
129
  "dts": {
117
130
  "endpoint": "Вибрати Endpoint",
118
- "note": "Експериментальна версія: доступ до редагування за допомогою DTS API"
131
+ "note": "Експериментальна версія: доступ до редагування за допомогою DTS API",
132
+ "requires-login": "Потрібен вхід"
119
133
  },
120
134
  "odd": {
121
135
  "files": "Файли ODD",
@@ -134,6 +148,9 @@
134
148
  "save": "Зберегти",
135
149
  "saving": "Збереження ...",
136
150
  "saved": "Збережено",
151
+ "unsaved": "Є незбережені зміни, які будуть включені в експорт! Все одно продовжити?",
152
+ "download": "Завантажити ODD",
153
+ "save-as": "Зберегти ODD до теки",
137
154
  "denied": "У доступі відмовлено",
138
155
  "denied-message": "У вас недостатньо прав для збереження {{odd}}",
139
156
  "reload": "Оновити",
@@ -162,7 +179,9 @@
162
179
  "custom-behaviour-placeholder": "[Нестандартна поведінка (behaviour)]",
163
180
  "template-placeholder": "[Визначити шаблон коду, який буде використовуватися для параметра content]",
164
181
  "param-name-placeholder": "[Назва параметра]",
165
- "empty": "[Пусто]"
182
+ "empty": "[Пусто]",
183
+ "mode-placeholder": "[Режим обробки - передається до наступних моделей]",
184
+ "set-param": "встановити"
166
185
  },
167
186
  "css-source": "Відкрити файл CSS"
168
187
  }
@@ -170,7 +189,10 @@
170
189
  "facets": {
171
190
  "show": "Показати перші 50",
172
191
  "genre": "Жанр",
173
- "language": "Мова"
192
+ "language": "Мова",
193
+ "feature": "Функція",
194
+ "form": "Форма",
195
+ "period": "Період"
174
196
  },
175
197
  "appgen": {
176
198
  "account": {
@@ -210,5 +232,89 @@
210
232
  },
211
233
  "open": "Відкрити",
212
234
  "success": "Ваш додаток успішно створено!"
235
+ },
236
+ "annotations": {
237
+ "edit": "Редагувати анотацію",
238
+ "delete": "Видалити анотацію",
239
+ "save": "Об'єднати і зберегти анотації в TEI",
240
+ "no-properties": "Властивості не визначено.",
241
+ "person": "Особа",
242
+ "organisation": "Організація",
243
+ "place": "Місце",
244
+ "term": "Термін",
245
+ "date": "Дата",
246
+ "reg": "Регуляризація",
247
+ "app": "Запис апарату",
248
+ "hi": "Основні характеристики",
249
+ "ref": "Посилання (ref)",
250
+ "pb": "Розрив сторінки (pb)",
251
+ "pagenum": "Номер сторінки (@n)",
252
+ "facs": "URL зображення (@facs)",
253
+ "abbreviation": "Абревіатура",
254
+ "occurrences": "Кількість у тексті",
255
+ "correction": "Виправлення",
256
+ "expansion": "Розширення",
257
+ "reference": "Посилання",
258
+ "lookup": "Знайти об'єкт",
259
+ "apply": "Застосувати анотацію",
260
+ "apply-all": "Вибрати та застосувати все",
261
+ "search-other": "Пошук випадків в інших документах",
262
+ "save-other": "Пошук випадків в інших документах і застосування анотацій негайно",
263
+ "changes": "Зміни",
264
+ "undo": "Скасувати останню зміну",
265
+ "download": "Зберегти об'єднаний TEI в локальний файл",
266
+ "reload": "Перезавантажити джерело TEI",
267
+ "preview": "Попередній перегляд результатів злиття",
268
+ "confirm-restore-title": "Підтвердити відновлення",
269
+ "restore": "Знайдено анотації створені для цього документа в попередній сесії. Чи хочете їх завантажити?",
270
+ "confirm-reload-title": "Підтвердити перезавантаження",
271
+ "confirm-reload": "Скасувати поточні анотації та перезавантажити джерело?",
272
+ "modify": "Застосувати редагування до основного тексту",
273
+ "modify-info": "Примітка: це не анотація, але вона змінить основний текст при злитті.",
274
+ "permission": "У доступі відмовлено: Вам не дозволено зберігати анотації.",
275
+ "ner": {
276
+ "title": "Екстракція назв об'єктів",
277
+ "description": "Спробуйте автоматично знайти назви об'єктів у тексті і позначте їх як анотації.",
278
+ "run": "Виконати",
279
+ "model": "Оберіть модель",
280
+ "denied": "Знайдено незбережені зміни: будь ласка, спочатку збережіть або відхиліть їх."
281
+ },
282
+ "confirm-discard-title": "Відмінити",
283
+ "confirm-discard": "Відхилити список траплянь?",
284
+ "doc-count": "{{count}} з {{total}}",
285
+ "toggle": "Показати/приховати панель попереднього перегляду/управління",
286
+ "add-entity": "Створити об'єкт",
287
+ "edit-entity": "Редагувати об'єкт",
288
+ "edit-reference": "Пошук/Редагування посилання",
289
+ "hints": {
290
+ "modify": "позначено об'єкт того ж типу, але з іншим ключем",
291
+ "incomplete": "позначено той самий тип, але без ключа",
292
+ "unmarked": "непозначений фрагмент тексту",
293
+ "open-in-tab": "Відкрити документ у новій вкладці, щоб переглянути"
294
+ }
295
+ },
296
+ "ner": {
297
+ "title": "Тренуйте модель розпізнавання назв об'єктів",
298
+ "not-found": "Ця функція вимагає використання сервера NER TEI Publisher! Не вдалося зв'язатися із сервісом.",
299
+ "found": "Знайдено NER TEI Publisher із версією SpaCy",
300
+ "name-placeholder": "Назва моделі, що створюється",
301
+ "name": "Назва",
302
+ "path": "Стежка",
303
+ "path-placeholder": "Відносна стежка до документа або колекції",
304
+ "path-info": "Введіть стежку до документа або колекції, що будуть використовувати як тренувальні дані. Стежка повинна бути відносна до кореневого каталога даних TEI Publisher.",
305
+ "lang-info": "Ви можете натренувати нову модель для мови, або вибрати нижче існуючу модель для розширення. Якщо ви не розширюєте існуючу модель, то потрібно вказати мову. В іншому випадку залиште поле порожнім.",
306
+ "language-placeholder": "Мова для створення моделі",
307
+ "language": "Мова",
308
+ "language-error": "Необхідні або мова, або базова модель",
309
+ "model": "Базова модель",
310
+ "model-placeholder": "Базова модель для розширення або копіювання",
311
+ "vectors": "Копіювати вектори лише з базової моделі",
312
+ "output": "Результат навчання",
313
+ "prepare": "Підготовка даних для тренування",
314
+ "start": "Виконати"
315
+ },
316
+ "timeline": {
317
+ "unknown": "без дати",
318
+ "clear": "Очистити вибір дати"
213
319
  }
214
320
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teipublisher/pb-components",
3
- "version": "2.18.4",
3
+ "version": "2.19.1",
4
4
  "description": "Collection of webcomponents underlying TEI Publisher",
5
5
  "repository": "https://github.com/eeditiones/tei-publisher-components.git",
6
6
  "main": "index.html",
package/pb-elements.json CHANGED
@@ -12089,6 +12089,14 @@
12089
12089
  "name": "pb-annotation-detail",
12090
12090
  "description": "fired to request additional details about an annotation"
12091
12091
  },
12092
+ {
12093
+ "name": "pb-disable",
12094
+ "description": "if received, disables selection tracking, suppressing pb-selection-changed events"
12095
+ },
12096
+ {
12097
+ "name": "pb-enable",
12098
+ "description": "re-enables selection tracking"
12099
+ },
12092
12100
  {
12093
12101
  "name": "pb-start-update",
12094
12102
  "description": "Fired before the element updates its content"
@@ -162,7 +162,7 @@ export class PbLeafletMap extends pbMixin(LitElement) {
162
162
  marker.bindTooltip(loc.label);
163
163
  }
164
164
  marker.addEventListener('click', () => {
165
- this.emitTo('pb-leaflet-marker-click', loc);
165
+ this.emitTo('pb-leaflet-marker-click', { element: loc });
166
166
  });
167
167
  marker.bindTooltip(loc.label);
168
168
  this.setMarkerIcon(marker);
@@ -192,7 +192,7 @@ export class PbLeafletMap extends pbMixin(LitElement) {
192
192
  marker.bindPopup(loc.popup);
193
193
  }
194
194
  marker.addEventListener('click', () => {
195
- this.emitTo('pb-leaflet-marker-click', loc);
195
+ this.emitTo('pb-leaflet-marker-click', { element: loc });
196
196
  });
197
197
  this.setMarkerIcon(marker);
198
198
  });
@@ -215,7 +215,7 @@ export class PbLeafletMap extends pbMixin(LitElement) {
215
215
  if (!this._hasMarker(this.latitude, this.longitude)) {
216
216
  const marker = L.marker([this.latitude, this.longitude]);
217
217
  marker.addEventListener('click', () => {
218
- this.emitTo('pb-leaflet-marker-click', ev.detail.element);
218
+ this.emitTo('pb-leaflet-marker-click', ev.detail);
219
219
  });
220
220
  if (ev.detail.label) {
221
221
  marker.bindTooltip(ev.detail.label);
@@ -530,7 +530,7 @@ export class PbLeafletMap extends pbMixin(LitElement) {
530
530
  layer.setIcon(this._icons.active);
531
531
  }
532
532
  } else if (this._icons && this._icons.default && layer.getIcon() !== this._icons.default) {
533
- layer.setIcon(this._icons.default);
533
+ layer.setIcon(this._icons.default);
534
534
  }
535
535
  });
536
536
  }
@@ -98,13 +98,24 @@ export class PbTableGrid extends pbMixin(LitElement) {
98
98
 
99
99
  this.subscribeTo('pb-search-resubmit', (ev) => {
100
100
  this._params = Object.assign({}, ev.detail.params);
101
+ for (const [k,v] of Object.entries(this._params)) {
102
+ if (v === null) { delete this._params[k] }
103
+ }
101
104
  this._submit();
102
105
  });
103
106
 
104
107
  registry.subscribe(this, (state) => {
105
108
  this._params = state;
106
109
  this._submit();
107
- })
110
+ });
111
+
112
+ this.subscribeTo('pb-i18n-update', ev => {
113
+ const needsRefresh = this.language && this.language !== ev.detail.language;
114
+ this.language = ev.detail.language;
115
+ if (needsRefresh) {
116
+ this._submit();
117
+ }
118
+ }, []);
108
119
 
109
120
  if (!this.height) {
110
121
  const property = getComputedStyle(this).getPropertyValue('--pb-table-grid-height');
@@ -130,7 +141,10 @@ export class PbTableGrid extends pbMixin(LitElement) {
130
141
  const pbColumns = this.querySelectorAll('pb-table-column');
131
142
  const columns = [];
132
143
  pbColumns.forEach((column) => columns.push(column.data()));
133
- waitOnce('pb-page-ready', () => {
144
+ waitOnce('pb-page-ready', (data) => {
145
+ if (data && data.language) {
146
+ this.language = data.language;
147
+ }
134
148
  this._params = registry.state;
135
149
  const url = this.toAbsoluteURL(this.source);
136
150
  const config = {
@@ -165,7 +179,9 @@ export class PbTableGrid extends pbMixin(LitElement) {
165
179
  }
166
180
  this._params.limit = limit;
167
181
  this._params.start = page * limit + 1;
168
-
182
+ if (this.language) {
183
+ this._params.language = this.language;
184
+ }
169
185
  registry.commit(this, this._params);
170
186
 
171
187
  return `${prev}${prev.indexOf('?') > -1 ? '&' : '?'}${new URLSearchParams(this._params).toString()}`;
@@ -219,6 +219,8 @@ function clearProperties(teiRange) {
219
219
  * @fires pb-selection-changed - fired when user selects text
220
220
  * @fires pb-annotations-changed - fired when an annotation was added or changed
221
221
  * @fires pb-annotation-detail - fired to request additional details about an annotation
222
+ * @fires pb-disable - if received, disables selection tracking, suppressing pb-selection-changed events
223
+ * @fires pb-enable - re-enables selection tracking
222
224
  */
223
225
  class PbViewAnnotate extends PbView {
224
226
  static get properties() {
@@ -260,6 +262,7 @@ class PbViewAnnotate extends PbView {
260
262
  this._ranges = [];
261
263
  this._rangesMap = new Map();
262
264
  this._history = [];
265
+ this._disabled = false;
263
266
  }
264
267
 
265
268
  connectedCallback() {
@@ -326,6 +329,9 @@ class PbViewAnnotate extends PbView {
326
329
  this.emitTo('pb-annotations-changed', { ranges: this._ranges, refresh: true });
327
330
  });
328
331
 
332
+ this.addEventListener('pb-disable', () => { this._disabled = true; });
333
+ this.addEventListener('pb-enable', () => { this._disabled = false; });
334
+
329
335
  this._resizeHandler();
330
336
  }
331
337
 
@@ -535,6 +541,9 @@ class PbViewAnnotate extends PbView {
535
541
  }
536
542
 
537
543
  _selectionChanged() {
544
+ if (this._disabled) {
545
+ return;
546
+ }
538
547
  const selection = this._getSelection();
539
548
  const range = this._selectedRange(selection);
540
549
  if (range) {
@@ -552,6 +561,7 @@ class PbViewAnnotate extends PbView {
552
561
  changed = true;
553
562
  }
554
563
  }
564
+ this._markSelection(range);
555
565
  this._currentSelection = range;
556
566
  console.log('<pb-view-annotate> selection: %o', range);
557
567
 
@@ -568,10 +578,38 @@ class PbViewAnnotate extends PbView {
568
578
  }
569
579
  this.emitTo('pb-selection-changed', { hasContent: true, range, selected: selection.toString()});
570
580
  } else {
581
+ this._clearSelection();
571
582
  this.emitTo('pb-selection-changed', { hasContent: false });
572
583
  }
573
584
  }
574
585
 
586
+ _markSelection(range) {
587
+ const root = this.shadowRoot.getElementById('view');
588
+ const rootRect = root.getBoundingClientRect();
589
+ const markerLayer = this.shadowRoot.getElementById('marker-layer');
590
+ this._clearSelection();
591
+ const rects = range.getClientRects();
592
+ for (let i = 0; i < rects.length; i++) {
593
+ const rect = rects[i];
594
+ const marker = document.createElement('div');
595
+ marker.className = `selection-marker`;
596
+ marker.style.position = 'absolute';
597
+ marker.style.left = `${rect.left - rootRect.left}px`;
598
+ marker.style.top = `${rect.top - rootRect.top}px`;
599
+ marker.style.width = `${rect.width}px`;
600
+ marker.style.height = `${rect.height}px`;
601
+ marker.style.backgroundColor = `var(--pb-annotation-selection, #f9ea7678)`;
602
+ markerLayer.appendChild(marker);
603
+ }
604
+ }
605
+
606
+ _clearSelection() {
607
+ const markerLayer = this.shadowRoot.getElementById('marker-layer');
608
+ markerLayer.querySelectorAll('.selection-marker').forEach((oldMarker) => {
609
+ markerLayer.removeChild(oldMarker);
610
+ });
611
+ }
612
+
575
613
  updateAnnotation(teiRange, batch = false) {
576
614
  teiRange = clearProperties(teiRange);
577
615
  const result = this._updateAnnotation(teiRange, batch);