Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,32 @@ After restarting Redmine, you should be able to see the Redmine GTT FIWARE
plugin in the Plugins page.

More information on installing (and uninstalling) Redmine plugins can be found
[here](http://www.redmine.org/wiki/redmine/Plugins).
[here](https://www.redmine.org/wiki/redmine/Plugins).

## How to use

Detailed instructions on how to use the plugin and its API endpoints can be
found in the [documentation](doc/index.md).

## Development

Run the Ruby test suite from the Redmine root, against a PostGIS test
database (CI runs the same suites across Redmine 6.0 to 7.0, see
`.github/workflows/test-postgis.yml`):

```sh
bundle exec rails test plugins/redmine_gtt_fiware/test/unit
bundle exec rails test plugins/redmine_gtt_fiware/test/functional
```

The subscription form's JavaScript has its own Vitest suite, runnable from
the plugin directory without a Redmine installation:

```sh
npm ci
npm test
```

## Contributing and Support

The GTT Project appreciates any [contributions](https://github.com/gtt-project/.github/blob/main/CONTRIBUTING.md)!
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/subscription_templates_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def edit; end

# The statuses a new issue can take for a tracker/member pair (#103): the
# same workflow data the regular issue form uses. Fetched by the form when
# the tracker or the "Sent from user" member changes.
# the tracker or the "Create issues as" member changes.
def allowed_statuses
tracker = @project.trackers.find_by(id: params[:tracker_id])
member = @project.members.find_by(id: params[:member_id])
Expand Down
4 changes: 2 additions & 2 deletions app/views/subscription_templates/_attachment_row.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
once inside the picker's <template> prototype, which the add link clones
-- so adding still works when every row has been removed. %>
<span class="gtt-fiware-attachment-row" style="display: block; margin-bottom: 4px;">
<input type="text" class="js-attachment-url" value="<%= attachment['url'] %>" placeholder="https://example.com/photo.jpg" size="35" />
<input type="text" class="js-attachment-filename" value="<%= attachment['filename'] %>" placeholder="photo-${id}.jpg" size="20" />
<input type="text" class="js-attachment-url" value="<%= attachment['url'] %>" placeholder="<%= l(:field_attachment_url_placeholder) %>" size="35" />
<input type="text" class="js-attachment-filename" value="<%= attachment['filename'] %>" placeholder="<%= l(:field_attachment_filename_placeholder) %>" size="20" />
<input type="text" class="js-attachment-description" value="<%= attachment['description'] %>" placeholder="<%= l(:field_description) %>" size="20" />
<%# Redmine 6 icons are SVG sprites; a bare icon-del anchor renders 0x0. %>
<a href="#" class="js-attachment-remove icon-only icon-del" title="<%= l(:button_delete) %>" aria-label="<%= l(:button_delete) %>"><%= sprite_icon('del') %></a>
Expand Down
2 changes: 1 addition & 1 deletion app/views/subscription_templates/_form_filters.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
<%# Comma-separated watched attributes; serialized into the attrs JSON array. %>
<p>
<%= content_tag :label, l(:field_subscription_template_watched_attributes) %>
<input type="text" id="gtt-fiware-attrs-input" size="75" value="<%= attrs_list %>" placeholder="temperature, humidity" />
<input type="text" id="gtt-fiware-attrs-input" size="75" value="<%= attrs_list %>" placeholder="<%= l(:field_subscription_template_watched_attrs_placeholder) %>" />
<em class="info"><%= l(:text_watched_attributes_info) %></em>
</p>
<%= f.hidden_field :attrs %>
Expand Down
12 changes: 6 additions & 6 deletions app/views/subscription_templates/_subscription_template.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@
<%= link_to subscription_template.name, edit_project_subscription_template_path(subscription_template.project, subscription_template) %>
</td>
<td>
<%= textilizable subscription_template.standard %>
<%= subscription_template.standard %>
</td>
<td class="text">
<code><%= subscription_template.broker_url %></code>
</td>
<td>
<%= textilizable subscription_template.issue_status.name %>
<%= subscription_template.issue_status.name %>
</td>
<td>
<%= textilizable subscription_template.tracker.name %>
<%= subscription_template.tracker.name %>
</td>
<td>
<%= textilizable subscription_template.status %>
<%= subscription_template.status %>
</td>
<td>
<%= link_to sprite_icon('fiware-clipboard', l(:link_to_copy), :plugin => :redmine_gtt_fiware), copy_project_subscription_template_path(@project, subscription_template),
Expand All @@ -26,10 +26,10 @@
<%= link_to sprite_icon('fiware-sync', l(:link_to_sync), :plugin => :redmine_gtt_fiware), sync_project_subscription_template_path(@project, subscription_template),
method: :post, remote: true, class: 'icon icon-reload', title: l(:link_to_sync_hint) %>
<%= link_to sprite_icon('fiware-unpublish', l(:link_to_unpublish), :plugin => :redmine_gtt_fiware), unpublish_project_subscription_template_path(@project, subscription_template),
method: :post, remote: true, class: 'icon icon-shared' %>
method: :post, remote: true, class: 'icon icon-shared', title: l(:link_to_unpublish_hint) %>
<% else %>
<%= link_to sprite_icon('fiware-publish', l(:link_to_publish), :plugin => :redmine_gtt_fiware), publish_project_subscription_template_path(@project, subscription_template),
method: :post, remote: true, class: 'icon icon-shared' %>
method: :post, remote: true, class: 'icon icon-shared', title: l(:link_to_publish_hint) %>
<% end %>
</td>
<td>
Expand Down
6 changes: 3 additions & 3 deletions app/views/subscription_templates/copy.js.erb
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ function copyToClipboard(command) {
if (navigator.clipboard) {
// If Clipboard API is available
navigator.clipboard.writeText(command).then(function() {
showNotification('Command copied!'); // Show success message
showNotification("<%= raw j l(:command_copied) %>"); // Show success message
}).catch(function(err) {
console.error('Could not copy cURL command to clipboard: ', err);
showNotification('Failed to copy command'); // Show error message
showNotification("<%= raw j l(:command_copy_failed) %>"); // Show error message
});
} else {
// If Clipboard API is not available
showNotification('Clipboard API not available, see console for cURL command');
showNotification("<%= raw j l(:command_clipboard_unavailable) %>");
}
}

Expand Down
2 changes: 1 addition & 1 deletion app/views/subscription_templates/publish.js.erb
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ fetch('<%= raw j(@broker_url) %>', requestOptions)
});

if (!locationHeader) {
throw new Error('Location header is missing in the response');
throw new Error("<%= raw j l(:subscription_published_error) %>");
}

var parts = locationHeader.split('/');
Expand Down
74 changes: 38 additions & 36 deletions config/locales/de.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,6 @@ de:
text_broker_connection_auth_mode_browser_info: 'Der Browser ruft den Broker direkt auf (erfordert einen aus dem Browser erreichbaren Broker mit CORS).'
text_broker_connection_throttling_info: 'Mindestabstand zwischen Benachrichtigungen in Sekunden, für die Subscriptions dieser Verbindung, sofern eine Vorlage ihn nicht überschreibt. Leer bedeutet %{default_value}.'
text_broker_connection_token_info: 'Verschlüsselt gespeichert (database_cipher_key). Leer lassen, um den aktuellen Token zu behalten. Wird nur im Modus "Gespeichert" verwendet; die Modi "Über den Server" und "Browser" nehmen den Token aus dem Browser.'
gtt_fiware:
tracker_not_found: 'Status nicht gefunden'
version_not_found: 'Version nicht gefunden'
relation_not_found: 'Verknüpfung nicht gefunden'
error_plugin_not_enabled: 'GTT FIWARE Plugin ist für dieses Projekt nicht aktiviert'
category_not_found: 'Kategorie nicht gefunden'
detail_not_found: 'Detailangabe nicht gefunden'
priority_not_found: 'Priorität nicht gefunden'
journal_not_found: 'Aufzeichnung nicht gefunden'
user_not_found: 'Benutzer nicht gefunden'
issue_not_found: 'Ticket nicht gefunden'
issue_deletion_error: 'Beim Versuch, das Ticket zu löschen, ist ein Fehler aufgetreten.'
attachement_not_found: 'Anlage nicht gefunden'
project_not_found: 'Projekt nicht gefunden'
status_not_found: 'Tracker nicht gefunden'
# Validation messages referenced by symbol from the models
# (message: :invalid_...), resolved lazily in the request locale.
activerecord:
Expand All @@ -56,6 +41,36 @@ de:
invalid_service_path: 'muss aus /-getrennten Ebenen aus Buchstaben, Ziffern und Unterstrichen bestehen (max. 10 Ebenen)'
invalid_token_header: 'muss ein gültiger HTTP-Header-Name sein'
invalid_subtype: 'muss ein JSON-LD-Term sein: Buchstaben und Ziffern, beginnend mit einem Buchstaben'
# Boundary crossing notes (#87)
field_geofence_notes: 'Notizen zur Projektgrenze'
text_geofence_notes_info: 'Fügt dem Ticket einen Kommentar hinzu, wenn die Entität die Projektgrenze betritt oder verlässt (verglichen zwischen Benachrichtigungen). Funktioniert am besten mit Gebiet auf "Überall": ein geografisch filternder Broker sendet außerhalb des Gebiets keine Benachrichtigungen mehr, sodass das Plugin ein Verlassen nie erkennen kann.'
text_geofence_notes_unavailable: 'Benötigt das GTT-Modul und eine Projektgrenze.'
text_geofence_entered: 'Die Entität hat die Projektgrenze betreten.'
text_geofence_left: 'Die Entität hat die Projektgrenze verlassen.'

# Guided subscription creation (#102)
gtt_fiware_wizard_back: 'Zurück'
gtt_fiware_wizard_next: 'Weiter'
gtt_fiware_wizard_show_all: 'Alle Felder anzeigen'
gtt_fiware_wizard_step_1: 'Verbindung'
gtt_fiware_wizard_step_2: 'Was beobachten'
gtt_fiware_wizard_step_3: 'Das Ticket'
gtt_fiware_wizard_step_4: 'Prüfen & veröffentlichen'
gtt_fiware_wizard_help_1: 'Der Subscription einen Namen geben und die Broker-Verbindung wählen, auf der sie registriert wird.'
gtt_fiware_wizard_help_2: 'Auswählen, welche Entitäten und Änderungen Redmine benachrichtigen. Leere Filter bedeuten: jede Änderung des Entitätstyps.'
gtt_fiware_wizard_help_3: 'Das Ticket definieren, das jede Benachrichtigung erstellt; ${...}-Platzhalter lesen Werte aus der Entität.'
gtt_fiware_wizard_help_4: 'Die Vorlagen gegen eine echte Entität des Brokers prüfen und dann die Subscription erstellen.'

# Tracker-driven issue details (#103)
text_issue_custom_field_values_info: 'Benutzerdefinierte Felder des gewählten Trackers. ${...}-Platzhalter werden gegen die Benachrichtigungsentität gerendert; leere Felder bleiben ungesetzt.'
text_subscription_template_member_info: 'Erstellte Tickets werden als dieses Mitglied verfasst; Berechtigungen und Workflow folgen diesem Benutzer.'

command_copy_failed: 'Der Befehl konnte nicht kopiert werden'
command_clipboard_unavailable: 'Zwischenablage nicht verfügbar; der Befehl steht in der Browser-Konsole'
field_subscription_template_watched_attrs_placeholder: 'temperature, humidity'
field_attachment_url_placeholder: 'https://example.com/photo.jpg'
field_attachment_filename_placeholder: 'photo-${id}.jpg'

model:
subscription_template:
ld_entities_require_type: 'jeder NGSI-LD-Entitätsselektor braucht einen "type"'
Expand All @@ -74,8 +89,6 @@ de:
duplicate_custom_term: 'Terme benutzerdefinierter Felder müssen innerhalb einer Zuordnung eindeutig sein'
connection_not_ngsi_ld: 'Ticket-Übertragung erfordert eine NGSI-LD-Verbindung'
field_subscription_template_fiware_servicepath: 'FIWARE Service Path'
gtt_fiware_settings_broker: 'FIWARE-Einstellungen'

project_module_gtt_fiware_emission: 'GTT FIWARE Ticket-Übertragung'
permission_gtt_fiware_emission: 'Tickets an FIWARE-Broker übertragen'
label_emission_mappings: 'Ticket-Übertragung'
Expand Down Expand Up @@ -106,18 +119,13 @@ de:
(vom Broker bereitgestellt)'
command_copied: 'Befehl in die Zwischenablage kopiert'
field_subscription_auth_token_placeholder: 'Bearer Token'
project_geometry_not_defined: 'Die Projektgrenzen sind nicht definiert'
field_subscription_template_expression_query_placeholder: 'temperature > 30'
field_subscription_template_expression_query: 'Abfrage'
label_subscription_template: 'Subscription'
field_subscription_template_attrs_placeholder: '["temperature"]'
project_geometry_not_supported_multipolygon: 'Die Projektgrenze ist ein Multipolygon,
das für räumliche Suchanfragen nicht unterstützt wird'
subscription_unpublished_warning: 'Die Subscription konnte nicht vom Broker entfernt
werden und ist weiterhin aktiv. Prüfen Sie den Autorisierungstoken und versuchen
Sie es erneut.'
link_to_insert_project_geometry_hint: 'Die Projektgrenze wird dabei als räumliche
Suchmaske für die Subscription verwendet'
gtt_fiware_subscription_template_variable_hint: 'Attributwerte können als <code>${Variable}</code>
eingebettet werden.'
field_subscription_template_expression_coords: 'Koordinaten (lat, lon)'
Expand All @@ -128,8 +136,9 @@ de:
field_subscription_template_fiware_service_placeholder: 'smartcity'
field_subscription_template_attachments_placeholder: '[{"filename": "image.jpg",
"url": "https://example.com/image.jpg"}]'
field_subscription_template_threshold_create_hours_hint: 'Schwellenwert für die
Erstellung eines neuen Tickets in Stunden.'
field_subscription_template_threshold_create_hours_hint: 'Innerhalb dieses Fensters aktualisieren wiederholte Benachrichtigungen
derselben Entität das erste Ticket, statt Duplikate zu erstellen.
0 erstellt jedes Mal ein neues Ticket.'

gtt_fiware_settings_attachment_download: 'Download von Benachrichtigungsanhängen'
field_attachment_download_hosts: 'Zusätzlich erlaubte Hosts'
Expand All @@ -142,11 +151,9 @@ de:
"${location}"}'
subscription_unauthorized_error: 'Nicht berechtigt, diese Aktion durchzuführen'
field_subscription_template_name_placeholder: 'Temperatur-Alarm'
field_subscription_auth_token_hint: 'Der Autorisierungs-Token, der in den Header
der Anfrage eingefügt wird. Wenn keine Autorisierung erforderlich ist, lassen
Sie das Feld leer. Der Token wird nicht in der Datenbank gespeichert. Wenn die
<code>PROXY</code>-Schaltfläche aktiviert ist (grün), wird die Anfrage über den
Server abgewickelt.'
field_subscription_auth_token_hint: 'Der Token wird nur für diese Aktion verwendet und nicht gespeichert.
Ob der Server oder der Browser ihn an den Broker sendet, bestimmt der
Authentifizierungsmodus der Verbindung.'
field_subscription_template_expression_georel: 'Georel'
link_to_publish_hint: 'Die Subscription an den Broker übermitteln'
subscription_unpublished: 'Die Subscription beim Broker wurde aufgehoben'
Expand All @@ -155,7 +162,6 @@ de:
field_subscription_template_status: 'Subscription Status'
field_subscription_template_alteration_types: 'Änderungsarten'
field_subscription_auth_token: 'Autorisierungs-Token'
gtt_fiware_subscription_template_geoquery: 'Geografische Abfrage'
field_subscription_template_broker_url: 'Broker URL'
field_subscription_template_expiration: 'Gültigkeitsdauer'
field_subscription_template_entities_string: 'Entities (Array)'
Expand Down Expand Up @@ -197,7 +203,7 @@ de:
button_create_and_publish: 'Erstellen und veröffentlichen'
label_template_preview: 'Vorschau mit einer Beispiel-Entität'
preview_loading: 'Beispiel-Entität wird vom Broker geladen...'
preview_entity_label: 'Gerendert mit'
preview_entity_label: 'Vorschau basiert auf'
preview_geometry_label: 'Position gefunden'
preview_no_connection: 'Wählen Sie zuerst eine Broker-Verbindung'
preview_no_entity_type: 'Geben Sie zuerst einen Entitätstyp ein'
Expand All @@ -214,28 +220,24 @@ de:
field_subscription_template_comment: 'Anmerkung'
subscription_published_error: 'Es gab ein Problem bei der Übertragung der Subscription
an den Broker'
gtt_fiware_subscription_template_notification: 'Ticket-Vorlage'
field_subscription_template_expression_geometry_placeholder: 'Eine Geometrie auswählen'
permission_manage_subscription_templates: 'Subscriptions verwalten'
field_subscription_template_broker_url_placeholder: 'https://broker.example.com/'
field_subscription_template_context: 'NGSI-LD Context'
field_subscription_template_attrs: 'Attributes (Array)'
field_subscription_template_notification_user: 'Gesendet vom Nutzer'
field_subscription_template_notification_user: 'Tickets erstellen als'
label_subscription_template_plural: 'Subscriptions'
field_subscription_template_geometry_string: 'Ticket-Geometrie (GeoJSON)'
field_subscription_template_fiware_service: 'FIWARE Service'
link_to_unpublish_hint: 'Subscription vom Broker aufheben'
field_subscription_template_subject_placeholder: 'Temperaturalarm in ${Room}'
gtt_fiware_subscription_template_general: 'Allgemein'
field_subscription_template_entities_string_placeholder: '[{"idPattern": ".*", "type":
"Room"}]'
field_subscription_template_expression_georel_placeholder: 'near;maxDistance:1000'
label_gtt_fiware_plural: 'FIWARE'
field_subscription_template_subscription: 'Subscription ID'
link_to_publish: 'Veröffentlichen'
link_to_insert_project_geometry: 'Projektgrenzen eintragen'
field_subscription_template_notes_placeholder: 'Schreiben Sie eine Ticket-Notiz,
anstatt ein neues Ticket zu erstellen, wenn ein Ticket innerhalb der festgelegten
Zeitspanne erstellt worden ist.'
gtt_fiware_subscription_template_subject: 'Einstellungen für Subscriptions'
general_action_error: Beim Ausführen dieser Aktion ist ein Fehler aufgetreten
Loading
Loading