commit ca4cc6ec1bae67d2914872e1e329583f63502e0f Author: magdev Date: Sat Apr 15 10:14:26 2023 +0200 Initial commit diff --git a/.dbdiff b/.dbdiff new file mode 100644 index 0000000..e8c2e4c --- /dev/null +++ b/.dbdiff @@ -0,0 +1,14 @@ +server1: + user: user + password: password + port: 3306 + host: 127.0.0.1 +server2: + user: user + password: password + port: 3306 + host: 127.0.0.1 +template: ./.migrate.tmpl +type: all +include: all +nocomments: true diff --git a/.editorconfig b/.editorconfig new file mode 100755 index 0000000..a6ab8eb --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] +indent_style = space +indent_size = 2 + +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.migrate.tmpl b/.migrate.tmpl new file mode 100644 index 0000000..e172722 --- /dev/null +++ b/.migrate.tmpl @@ -0,0 +1,8 @@ +SQL_UP = u""" +{{ $up }} +""" + +SQL_DOWN = u""" +{{ $down }} +""" + diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..efd7793 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "nuxt.isNuxtApp": false +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..f38f6ca --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Redmine BauPM Core Plugin + +Common modifications to run Redmine as project management tool on medium- and large-scale construction sites. + +## Installation + +```bash +cd {redmine_dir}/plugins +git clone http://laptop.local:4000/magdev/baupm-core.git baupm_core +``` + +Now restart redmine and you're done. diff --git a/app/controllers/manifest_controller.rb b/app/controllers/manifest_controller.rb new file mode 100755 index 0000000..b610df4 --- /dev/null +++ b/app/controllers/manifest_controller.rb @@ -0,0 +1,9 @@ +class ManifestController < ApplicationController + unloadable + + skip_before_action :check_if_login_required + + def index + render :layout => false, :action => 'index' + end +end diff --git a/app/helpers/manifest_helper.rb b/app/helpers/manifest_helper.rb new file mode 100644 index 0000000..cbdb322 --- /dev/null +++ b/app/helpers/manifest_helper.rb @@ -0,0 +1,2 @@ +module ManifestHelper +end diff --git a/app/views/application/_header.html.erb b/app/views/application/_header.html.erb new file mode 100755 index 0000000..e49c242 --- /dev/null +++ b/app/views/application/_header.html.erb @@ -0,0 +1,21 @@ +<%= javascript_include_tag "jquery-fab.min.js", :plugin => 'baupm_core' %> +<%= javascript_include_tag "baupm.js", :plugin => 'baupm_core' %> +<%= stylesheet_link_tag 'jquery-fab.css', :plugin => 'baupm_core', :media => "screen" %> +<%= stylesheet_link_tag 'baupm.css', :plugin => 'baupm_core', :media => "screen" %> + + + + + + + + +<% if Setting.plugin_baupm_core['baupm_theme_color'].present? %> + +<% end %> +<% if Setting.plugin_baupm_core['baupm_manifest_orientation'].present? %> + +<% end %> + + + diff --git a/app/views/manifest/index.json.erb b/app/views/manifest/index.json.erb new file mode 100755 index 0000000..23b9b0c --- /dev/null +++ b/app/views/manifest/index.json.erb @@ -0,0 +1,41 @@ +{ + "name": "<%= Setting.plugin_baupm_core['baupm_application_title'] %>", + <% if Setting.plugin_baupm_core['baupm_application_short_title'].present? %> + "short_name": "<%= Setting.plugin_baupm_core['baupm_application_short_title'] %>", + <% end %> + <% if Setting.plugin_baupm_core['baupm_application_description'].present? %> + "description": "<%= Setting.plugin_baupm_core['baupm_application_description'] %>", + <% end %> + <% if Setting.plugin_baupm_core['baupm_manifest_display'].present? %> + "display": "<%= Setting.plugin_baupm_core['baupm_manifest_display'] %>", + <% end %> + <% if Setting.plugin_baupm_core['baupm_manifest_orientation'].present? %> + "orientation": "<%= Setting.plugin_baupm_core['baupm_manifest_orientation'] %>", + <% end %> + <% if Setting.plugin_baupm_core['baupm_manifest_start_url'].present? %> + "start_url": "<%= Setting.plugin_baupm_core['baupm_manifest_start_url'] %>", + <% end %> + <% if Setting.plugin_baupm_core['baupm_theme_color'].present? %> + "theme_color": "<%= Setting.plugin_baupm_core['baupm_theme_color'] %>", + <% end %> + <% if Setting.plugin_baupm_core['baupm_background_color'].present? %> + "background_color": "<%= Setting.plugin_baupm_core['baupm_background_color'] %>", + <% end %> + "icons": [ + { + "src": "/themes/<%= Setting.ui_theme %>/images/icons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/themes/<%= Setting.ui_theme %>/images/icons/android-chrome-256x256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "/themes/<%= Setting.ui_theme %>/images/icons/apple-touch-icon.png", + "sizes": "180x180", + "type": "image/png" + } + ] +} diff --git a/app/views/settings/_baupm_settings.html.erb b/app/views/settings/_baupm_settings.html.erb new file mode 100644 index 0000000..41eef47 --- /dev/null +++ b/app/views/settings/_baupm_settings.html.erb @@ -0,0 +1,95 @@ +
+ <%= l(:baupm_manifest_settings) %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<%= l(:baupm_application_title) %> + +
<%= l(:baupm_application_short_title) %> + +
<%= l(:baupm_application_description) %> + +
<%= l(:baupm_manifest_orientation) %> + +
<%= l(:baupm_manifest_display) %> + +
<%= l(:baupm_manifest_start_url) %> + +
<%= l(:baupm_theme_color) %> + +
<%= l(:baupm_background_color) %> + +
+
diff --git a/assets/javascripts/baupm.js b/assets/javascripts/baupm.js new file mode 100644 index 0000000..7c5228b --- /dev/null +++ b/assets/javascripts/baupm.js @@ -0,0 +1,20 @@ +$(document).ready(function() { + $('#wrapper').append('
'); + var findLinks = function() { + var elements = []; + + $('#new-object').closest('li').find('.menu-children a').each(function() { + elements.push({ + url: $(this).prop('href'), + icon: '' + }); + }); + elements.push({ + icon: '' + }); + return elements.reverse(); + }; + if ($('#new-object').get(0)) { + $('#fb-wrapper').jqueryFab(findLinks(), {}); + } +}); diff --git a/assets/javascripts/jquery-fab.min.js b/assets/javascripts/jquery-fab.min.js new file mode 100644 index 0000000..94a293a --- /dev/null +++ b/assets/javascripts/jquery-fab.min.js @@ -0,0 +1,9 @@ +/* + * Copyright 2015 + * Released under the MIT license + * https://github.com/jeffersonrpn/jquery-fab/blob/master/LICENSE.md + * + * @author: Jefferson Neves + * @version: 0.1.0 + */ +!function(t){t.jfab||(t.jfab=new Object),t.jfab.fab=function(n,a,i){var l,o,e=this;e.$el=t(n),e.el=n,e.$el.data("kc.fab",e),e.$el.addClass("jfab_wrapper");var r=function(){t(this).attr("data-link-href").length>0&&(t(this).attr("data-link-target")?window.open(t(this).attr("data-link-href"),t(this).attr("data-link-target")):window.location.href=t(this).attr("data-link-href")),o.animate({opacity:"toggle",height:"toggle"},200),i.rotate&&l.toggleClass("rotate")},s=function(){o.animate({opacity:"hide",height:"hide"},100),i.rotate&&l.removeClass("rotate")};e.init=function(){if(("undefined"==typeof a||null===a)&&(a=[{url:null,bgcolor:"#e74c3c",icon:"+"}]),("undefined"==typeof i||null===i)&&(i={rotate:!1}),e.options=t.extend({},t.jfab.fab.defaultOptions,i),e.links=a,e.links.length>0){mainBtnLink=e.links[0],colorStyle=mainBtnLink.color?"color:"+mainBtnLink.color+";":"",bgColorStyle=mainBtnLink.bgcolor?"background-color:"+mainBtnLink.bgcolor+";":"",mainBtnLinkHtml="",subBtnsHtml="",e.links.shift();for(var n=0;n";subBtnsHtml="
"+subBtnsHtml+"
",e.$el.append(subBtnsHtml).append(mainBtnLinkHtml)}else"undefined"==typeof console&&(window.console={log:function(t){alert(t)}}),console.log("Invalid links array param");l=e.$el.find(".jfab_main_btn"),o=e.$el.find(".jfab_btns_wrapper"),l.click(r),l.focusout(s),o.find(".sub_fab_btn").on("mousedown",function(){t(this).attr("data-link-href").length>0&&(t(this).attr("data-link-target")?window.open(t(this).attr("data-link-href"),t(this).attr("data-link-target")):window.location.href=t(this).attr("data-link-href"))})},e.init()},t.jfab.fab.defaultOptions={},t.fn.jqueryFab=function(n,a){return this.each(function(){new t.jfab.fab(this,n,a)})}}(jQuery); \ No newline at end of file diff --git a/assets/stylesheets/baupm.css b/assets/stylesheets/baupm.css new file mode 100644 index 0000000..6f79d3a --- /dev/null +++ b/assets/stylesheets/baupm.css @@ -0,0 +1,4 @@ +.baupm-settings th { + text-align: left!important; + min-width: 130px; +} \ No newline at end of file diff --git a/assets/stylesheets/jquery-fab.css b/assets/stylesheets/jquery-fab.css new file mode 100644 index 0000000..031925e --- /dev/null +++ b/assets/stylesheets/jquery-fab.css @@ -0,0 +1,86 @@ +/* + * Copyright 2015 + * Released under the MIT license + * https://github.com/jeffersonrpn/jquery-fab/blob/master/LICENSE.md + * + * @author: Jefferson Neves + * @version: 0.1.0 + */ +.jfab_wrapper{ + z-index: 9999; + width:100%; + height:240px; + position:fixed; + right:0px; + bottom:0px; + pointer-events:none; +} +.jfab_btns_wrapper{ + right:0; + bottom:75px; + position:absolute; + display:none; + -webkit-transition: opacity 0.3s ease-in; + -moz-transition: opacity 0.3s ease-in; + -ms-transition: opacity 0.3s ease-in; + -o-transition: opacity 0.3s ease-in; + transition: opacity 0.3s ease-in; + pointer-events:all; +} +.jfab_btns_wrapper.show{ + display:block; + opacity: 1; +} +.jfab_btns_wrapper button{ + width:40px; + height:40px; + border-radius:100%; + background:#e74c3c; + margin-bottom:12px; + margin-right:26px; + padding:0; + border:none; + outline:none; + color:#ffffff; + font-size: 19px; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); + transition:.3s; + pointer-events:all; + cursor: pointer; +} +.jfab_btns_wrapper button:hover{ + box-shadow: 0 3px 6px rgba(0,0,0,0.32), 0 3px 6px rgba(0,0,0,0.46); +} +button.jfab_main_btn{ + background-color:#e74c3c; + width:60px; + height:60px; + border-radius:100%; + background:#e74c3c; + right:16px; + bottom:16px; + position:absolute; + margin-right:0; + margin-bottom:0; + padding:0; + border:none; + outline:none; + color:#ffffff; + font-size:24px; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); + transition:.3s; + -webkit-tap-highlight-color: rgba(0,0,0,0); + cursor: pointer; + pointer-events:all; +} +button:hover.jfab_main_btn{ + box-shadow: 0 3px 6px rgba(0,0,0,0.32), 0 3px 6px rgba(0,0,0,0.46); +} +.jfab_main_btn span{ + transition:.5s; +} +.jfab_main_btn.rotate { + transform:rotate(45deg); + -ms-transform: rotate(45deg); + -webkit-transform: rotate(45deg); +} \ No newline at end of file diff --git a/config/locales/de.yml b/config/locales/de.yml new file mode 100644 index 0000000..35707ed --- /dev/null +++ b/config/locales/de.yml @@ -0,0 +1,184 @@ +de: + # BauPM related translations + baupm_theme_color: Theme-Farbe + baupm_background_color: Hintergrundfarbe + baupm_manifest_settings: Webapp-Manifest-Einstellungen + baupm_application_title: Name + baupm_application_short_title: Kurzname + baupm_application_description: Beschreibung + baupm_manifest_start_url: Start-URL + baupm_manifest_orientation: Ausrichtung + baupm_manifest_display: Ansicht + baupm_orientation_portrait: Hochformat + baupm_orientation_landscape: Querformat + baupm_display_standalone: Standalone + baupm_display_browser: Browser + baupm_display_fullscreen: Vollbild + baupm_display_minimal_ui: Minimal + + # Redmine translation modifications + notice_unable_delete_version: Der Meilenstein konnte nicht gelöscht werden + error_can_not_reopen_issue_on_closed_version: Diese Aufgabe ist einem abgeschlossenen Meilenstein zugeordnet und kann daher nicht wieder geöffnet werden. + field_fixed_version: Meilenstein + field_version: Meilenstein + permission_manage_versions: Meilensteine verwalten + label_version: Meilenstein + label_version_new: Neuer Meilenstein + label_version_plural: Meilensteine + label_close_versions: Abgeschlossene Meilensteine schließen + label_roadmap_no_issues: Keine Aufgaben für diesen Meilenstein + label_current_version: Aktueller Meilenstein + label_show_completed_versions: Abgeschlossene Meilensteine anzeigen + setting_enabled_scm: Aktivierte Revisionskontrollsysteme + label_scm: Revisionskontrollsystem + text_scm_command_version: Revision + label_completed_versions: Abgeschlossene Revisionen + field_is_in_roadmap: In den Meilensteinen anzeigen + label_roadmap: Meilensteine + label_roadmap_due_in: "Fällig in %{value}" + label_roadmap_overdue: "%{value} verspätet" + field_login: Mitarbeitername + field_attr_login: Mitarbeitername-Attribut + permission_manage_members: Mitarbeiter verwalten + label_member: Mitarbeiter + label_member_new: Neuer Mitarbeiter + label_member_plural: Mitarbeiter + label_role_non_member: Kein Mitarbeiter + project_module_wiki: "Dokumentation (Wiki)" + label_wiki: Dokumentation + label_overall_spent_time: Zeitaufwand aller Projekte anzeigen + label_spent_time: Zeitaufwand + label_total_spent_time: Zeitaufwand aller Projekte anzeigen + label_gantt: Gantt-Plan + label_gantt_progress_line: Fortschritt + permission_view_gantt: Gantt-Plan anzeigen + activerecord: + errors: + messages: + cant_link_an_issue_with_a_descendant: "Eine Aufgabe kann nicht mit einer Ihrer Unteraufgaben verlinkt werden" + earlier_than_minimum_start_date: "kann wegen einer Vorgängeraufgabe nicht vor %{date} liegen" + open_issue_with_closed_parent: "Eine offene Aufgabe kann nicht an einen geschlossenen Vater gehängt werden" + button_copy_and_follow: Kopieren und Aufgabe anzeigen + button_move_and_follow: Verschieben und Aufgabe anzeigen + enumeration_issue_priorities: Aufgaben-Prioritäten + error_can_not_delete_tracker: Dieser Tracker enthält noch Aufgaben und kann nicht gelöscht werden. + error_issue_done_ratios_not_updated: Der Aufgaben-Fortschritt wurde nicht aktualisiert. + error_issue_not_found_in_project: 'Die Aufgabe wurde nicht gefunden oder gehört nicht zu diesem Projekt.' + error_no_default_issue_status: Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter "Administration -> Aufgaben-Status"). + error_unable_delete_issue_status: "Der Aufgaben-Status konnte nicht gelöscht werden. (%{value})" + field_assignable: Aufgaben können dieser Rolle zugewiesen werden + field_is_closed: Aufgabe geschlossen + field_issue: Aufgabe + field_issue_to: Zugehörige Aufgabe + field_issues_visibility: Augaben-Sichtbarkeit + label_any_issues_in_project: irgendeine Aufgabe im Projekt + label_any_issues_not_in_project: irgendeine Aufgabe nicht im Projekt + label_assigned_to_me_issues: Mir zugewiesene Aufgaben + label_attribute_of_issue: "%{name} der Aufgabe" + label_bulk_edit_selected_issues: Alle ausgewählten Aufgaben bearbeiten + label_issue: Aufgaben + label_issue_added: Aufgabe hinzugefügt + label_issue_category: Aufgaben-Kategorie + label_issue_category_plural: Aufgaben-Kategorien + label_issue_new: Neue Aufgabe + label_issue_plural: Aufgaben + label_issue_status: Aufgaben-Status + label_issue_status_plural: Aufgaben-Status + label_issue_tracking: Aufgaben + label_issue_updated: Aufgabe aktualisiert + label_issue_view_all: Alle Aufgaben anzeigen + label_issue_watchers: Beobachter + label_issues_by: "Aufgaben pro %{value}" + label_issues_visibility_all: Alle Aufgaben + label_issues_visibility_own: Aufgaben die folgender Benutzer erstellt hat oder die ihm zugewiesen sind + label_issues_visibility_public: Alle öffentlichen Aufgaben + label_link_copied_issue: Kopierte Aufgaben verlinken + label_no_issues_in_project: Keine Aufgaben im Projekt vorhanden + label_related_issues: Zugehörige Aufgaben + label_reported_issues: Erstellte Aufgaben + label_update_issue_done_ratios: Aufgaben-Fortschritt aktualisieren + label_watched_issues: Beobachtete Aufgaben + label_x_issues: + zero: 0 Aufgaben + one: 1 Aufgabe + other: "%{count} Aufgaben" + mail_body_reminder: "%{count} Aufgaben, die Ihnen zugewiesen sind, müssen in den nächsten %{days} Tagen abgegeben werden:" + mail_subject_reminder: "%{count} Aufgaben müssen in den nächsten %{days} Tagen abgegeben werden" + notice_failed_to_save_issues: "%{count} von %{total} ausgewählten Aufgaben konnte(n) nicht gespeichert werden: %{ids}." + notice_issue_done_ratios_updated: Der Aufgaben-Fortschritt wurde aktualisiert. + notice_issue_successful_create: Aufgabe %{id} erstellt. + notice_issue_update_conflict: Die Aufgabe wurde während Ihrer Bearbeitung von einem anderen Nutzer überarbeitet. + notice_no_issue_selected: "Keine Aufgabe ausgewählt! Bitte wählen Sie die Aufgaben, die Sie bearbeiten möchten." + permission_add_issues: Aufgaben hinzufügen + permission_delete_issues: Aufgaben löschen + permission_edit_issues: Aufgaben bearbeiten + permission_manage_categories: Aufgaben-Kategorien verwalten + permission_manage_issue_relations: Aufgaben-Beziehungen verwalten + permission_manage_related_issues: Zugehörige Aufgaben verwalten + permission_set_issues_private: Aufgaben privat oder öffentlich markieren + permission_set_own_issues_private: Eigene Aufgaben privat oder öffentlich markieren + permission_view_issues: Aufgaben anzeigen + project_module_issue_tracking: Aufgaben + setting_commit_cross_project_ref: Erlaube Aufgaben aller anderen Projekte zu referenzieren + setting_cross_project_issue_relations: Aufgaben-Beziehungen zwischen Projekten erlauben + setting_default_issue_start_date_to_creation_date: Aktuelles Datum als Beginn für neue Aufgaben verwenden + setting_display_subprojects_issues: Aufgaben aus Unterprojekten im Hauptprojekt anzeigen + setting_issue_done_ratio: Berechne den Aufgaben-Fortschritt mittels + setting_issue_done_ratio_issue_field: Aufgaben-Feld % erledigt + setting_issue_done_ratio_issue_status: Aufgaben-Status + setting_issue_group_assignment: Aufgabenzuweisung an Gruppen erlauben + setting_issue_list_default_columns: Standard-Spalten in der Aufgabenliste + setting_issues_export_limit: Max. Anzahl Aufgaben bei CSV/PDF-Export + setting_link_copied_issue: Aufgaben beim Kopieren verlinken + text_destroy_time_entries_question: Es wurden bereits %{hours} Stunden auf diese Aufgabe gebucht. Was soll mit den Aufwänden geschehen? + text_issue_added: "Aufgabe %{id} wurde erstellt von %{author}." + text_issue_category_destroy_question: "Einige Aufgaben (%{count}) sind dieser Kategorie zugeordnet. Was möchten Sie tun?" + text_issue_category_reassign_to: Aufgaben dieser Kategorie zuordnen + text_issue_updated: "Aufgabe %{id} wurde aktualisiert von %{author}." + text_issues_destroy_confirmation: 'Sind Sie sicher, dass Sie die ausgewählten Aufgaben löschen möchten?' + text_issues_ref_in_commit_messages: Aufgaben-Beziehungen und -Status in Commit-Nachrichten + text_no_configuration_data: "Rollen, Tracker, Aufgaben-Status und Workflows wurden noch nicht konfiguriert.\nEs ist sehr zu empfehlen, die Standard-Konfiguration zu laden. Sobald sie geladen ist, können Sie diese abändern." + text_reassign_time_entries: 'Gebuchte Aufwände dieser Aufgabe zuweisen:' + label_search_open_issues_only: Nur offene Aufgaben + permission_copy_issues: Aufgaben kopieren + permission_import_issues: Aufgaben importieren + label_import_issues: Aufgaben importieren + label_assigned_issues: Zugewiesene Aufgaben + label_any_open_issues: irgendeine offene Aufgabe + label_no_open_issues: keine offene Aufgabe + label_new_project_issue_tab_enabled: Tab "Neue Aufgabe" anzeigen + error_no_projects_with_tracker_allowed_for_new_issue: Es gibt keine Projekte mit Trackern, für welche sie Aufgaben anlegen können + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Zeitbuchungen für Aufgaben, die gelöscht werden sind nicht möglich + setting_show_status_changes_in_mail_subject: Zeige Statusänderungen im Betreff der Mailbenachrichtigung für Aufgaben + permission_edit_own_issues: Eigene Aufgaben bearbeiten + label_updated_issues: Aktualisierte Aufgaben + field_history_default_tab: Standard-Tab für Aufgabenhistorie + my_issues_due: "Meine berfälligen Aufgaben" + my_issues_today : "Meine heutigen Aufgaben" + my_issues_next : "Meine nächsten Aufgaben" + issues_due: "Überfällige Aufgaben" + issues_today : "Heutige Aufgaben" + issues_next : "Nächste Aufgaben" + my_issues_opened_closed_today : "Meine heutige offenen und geschlossenen Aufgaben" + my_issues_summary : "Zusammenfassung meiner Aufgaben" + my_issues_by_priority : "Meine Aufgaben nach Priorität" + my_issues_by_status : "Meine Aufgaben nach Status" + my_issues_by_tracker : "Meine Aufgabe nach Tracker" + issue_template: Aufgabenvorlage + about_template_help_message: Dies ist die Onlinehilfe für Aufgabenvorlagen in diesem Projekt. + help_for_issue_title: "Der hier angegebene Text wird als Thema in die neue Aufgabe übernommen, falls die Vorlage ausgewählt wird." + project_module_issue_templates: Aufgabenvorlagen + text_no_tracker_enabled: Bisher wurde keine Konfiguration der Tracker und Aufgabenvorlagen für dieses Projekt vorgenommen.\nBitte konfigurieren Sie diese notwendige Einstellung, um die Funktion zu nutzen. + global_issue_templates: Globale Aufgabenvorlagen + no_issue_templates_for_this_redmine: Es sind keine globalen Aufgabenvorlagen definiert. + label_apply_global_template_to_all_projects: "Wende Globale Aufgabenvorlagen auf alle Projekte an." + note_apply_global_template_to_all_projects_setting_enabled: "Diese Globale Aufgabenvorlage wird auf alle Projekte angewendet weil das Vorlagen-Plugin entsprechend konfiguriert ist." + project_module_default_custom_query: Angepasste Standardabfrage + permission_manage_default_query: Standardabfrage verwalten + field_query: Angepasste Standardabfrage + default_custom_query: + label_setting: Angepasste Standardabfrage + label_view_default_issues: Standardanzeige für Aufgaben + label_queries_for_all_projects: Für alle Projekte + label_queries_for_current_project: Für das aktuelle Projekt + text_allowed_queries: Nur öffentliche Abfragen auswählbar diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000..f1dc064 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,186 @@ +en: + # BauPM related translations + baupm_theme_color: Theme-Color + baupm_background_color: Background-Color + baupm_manifest_settings: Webapp-Manifest-Settings + baupm_application_title: Name + baupm_application_short_title: Shortname + baupm_application_description: Description + baupm_manifest_start_url: Start-URL + baupm_manifest_orientation: Orientation + baupm_manifest_display: Display + baupm_orientation_portrait: Potrait + baupm_orientation_landscape: Landscape + baupm_display_standalone: Standalone + baupm_display_browser: Browser + baupm_display_fullscreen: Fullscreen + baupm_display_minimal_ui: Minimal UI + + # Redmine translation modifications (@TODO Translate this) + notice_unable_delete_version: Unable to delete the Milestone + error_can_not_reopen_issue_on_closed_version: This Task is bound to a closed Milestone and cannot be opened again. + field_fixed_version: Milestone + field_version: Milestone + permission_manage_versions: Manage Milestones + label_version: Milestone + label_version_new: New Milestone + label_version_plural: Milestones + label_close_versions: Close finished Milestones + label_roadmap_no_issues: No Tasks for this Milestone + label_current_version: Current Milestone + label_show_completed_versions: Show closed Milestones + setting_enabled_scm: Active Revision-Control-Systems + label_scm: Revision-Control-System + text_scm_command_version: Revision + label_completed_versions: Closed Revisions + field_is_in_roadmap: Show in Milestones + label_roadmap: Milestones + label_roadmap_due_in: "Due to %{value}" + label_roadmap_overdue: "%{value} late" + field_login: Employeename + field_attr_login: Attribute for Employeename + permission_manage_members: Manage Employees + label_member: Employee + label_member_new: New Employee + label_member_plural: Employee + label_role_non_member: No Employee + project_module_wiki: "Documentation (Wiki)" + label_wiki: Documentation + + + label_overall_spent_time: Zeitaufwand aller Projekte anzeigen + label_spent_time: Zeitaufwand + label_total_spent_time: Zeitaufwand aller Projekte anzeigen + label_gantt: Gantt-Plan + label_gantt_progress_line: Fortschritt + permission_view_gantt: Gantt-Plan anzeigen + activerecord: + errors: + messages: + cant_link_an_issue_with_a_descendant: "Eine Aufgabe kann nicht mit einer Ihrer Unteraufgaben verlinkt werden" + earlier_than_minimum_start_date: "kann wegen einer Vorgängeraufgabe nicht vor %{date} liegen" + open_issue_with_closed_parent: "Eine offene Aufgabe kann nicht an einen geschlossenen Vater gehängt werden" + button_copy_and_follow: Kopieren und Aufgabe anzeigen + button_move_and_follow: Verschieben und Aufgabe anzeigen + enumeration_issue_priorities: Aufgaben-Prioritäten + error_can_not_delete_tracker: Dieser Tracker enthält noch Aufgaben und kann nicht gelöscht werden. + error_issue_done_ratios_not_updated: Der Aufgaben-Fortschritt wurde nicht aktualisiert. + error_issue_not_found_in_project: 'Die Aufgabe wurde nicht gefunden oder gehört nicht zu diesem Projekt.' + error_no_default_issue_status: Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter "Administration -> Aufgaben-Status"). + error_unable_delete_issue_status: "Der Aufgaben-Status konnte nicht gelöscht werden. (%{value})" + field_assignable: Aufgaben können dieser Rolle zugewiesen werden + field_is_closed: Aufgabe geschlossen + field_issue: Aufgabe + field_issue_to: Zugehörige Aufgabe + field_issues_visibility: Augaben-Sichtbarkeit + label_any_issues_in_project: irgendeine Aufgabe im Projekt + label_any_issues_not_in_project: irgendeine Aufgabe nicht im Projekt + label_assigned_to_me_issues: Mir zugewiesene Aufgaben + label_attribute_of_issue: "%{name} der Aufgabe" + label_bulk_edit_selected_issues: Alle ausgewählten Aufgaben bearbeiten + label_issue: Aufgaben + label_issue_added: Aufgabe hinzugefügt + label_issue_category: Aufgaben-Kategorie + label_issue_category_plural: Aufgaben-Kategorien + label_issue_new: Neue Aufgabe + label_issue_plural: Aufgaben + label_issue_status: Aufgaben-Status + label_issue_status_plural: Aufgaben-Status + label_issue_tracking: Aufgaben + label_issue_updated: Aufgabe aktualisiert + label_issue_view_all: Alle Aufgaben anzeigen + label_issue_watchers: Beobachter + label_issues_by: "Aufgaben pro %{value}" + label_issues_visibility_all: Alle Aufgaben + label_issues_visibility_own: Aufgaben die folgender Benutzer erstellt hat oder die ihm zugewiesen sind + label_issues_visibility_public: Alle öffentlichen Aufgaben + label_link_copied_issue: Kopierte Aufgaben verlinken + label_no_issues_in_project: Keine Aufgaben im Projekt vorhanden + label_related_issues: Zugehörige Aufgaben + label_reported_issues: Erstellte Aufgaben + label_update_issue_done_ratios: Aufgaben-Fortschritt aktualisieren + label_watched_issues: Beobachtete Aufgaben + label_x_issues: + zero: 0 Aufgaben + one: 1 Aufgabe + other: "%{count} Aufgaben" + mail_body_reminder: "%{count} Aufgaben, die Ihnen zugewiesen sind, müssen in den nächsten %{days} Tagen abgegeben werden:" + mail_subject_reminder: "%{count} Aufgaben müssen in den nächsten %{days} Tagen abgegeben werden" + notice_failed_to_save_issues: "%{count} von %{total} ausgewählten Aufgaben konnte(n) nicht gespeichert werden: %{ids}." + notice_issue_done_ratios_updated: Der Aufgaben-Fortschritt wurde aktualisiert. + notice_issue_successful_create: Aufgabe %{id} erstellt. + notice_issue_update_conflict: Die Aufgabe wurde während Ihrer Bearbeitung von einem anderen Nutzer überarbeitet. + notice_no_issue_selected: "Keine Aufgabe ausgewählt! Bitte wählen Sie die Aufgaben, die Sie bearbeiten möchten." + permission_add_issues: Aufgaben hinzufügen + permission_delete_issues: Aufgaben löschen + permission_edit_issues: Aufgaben bearbeiten + permission_manage_categories: Aufgaben-Kategorien verwalten + permission_manage_issue_relations: Aufgaben-Beziehungen verwalten + permission_manage_related_issues: Zugehörige Aufgaben verwalten + permission_set_issues_private: Aufgaben privat oder öffentlich markieren + permission_set_own_issues_private: Eigene Aufgaben privat oder öffentlich markieren + permission_view_issues: Aufgaben anzeigen + project_module_issue_tracking: Aufgaben + setting_commit_cross_project_ref: Erlaube Aufgaben aller anderen Projekte zu referenzieren + setting_cross_project_issue_relations: Aufgaben-Beziehungen zwischen Projekten erlauben + setting_default_issue_start_date_to_creation_date: Aktuelles Datum als Beginn für neue Aufgaben verwenden + setting_display_subprojects_issues: Aufgaben aus Unterprojekten im Hauptprojekt anzeigen + setting_issue_done_ratio: Berechne den Aufgaben-Fortschritt mittels + setting_issue_done_ratio_issue_field: Aufgaben-Feld % erledigt + setting_issue_done_ratio_issue_status: Aufgaben-Status + setting_issue_group_assignment: Aufgabenzuweisung an Gruppen erlauben + setting_issue_list_default_columns: Standard-Spalten in der Aufgabenliste + setting_issues_export_limit: Max. Anzahl Aufgaben bei CSV/PDF-Export + setting_link_copied_issue: Aufgaben beim Kopieren verlinken + text_destroy_time_entries_question: Es wurden bereits %{hours} Stunden auf diese Aufgabe gebucht. Was soll mit den Aufwänden geschehen? + text_issue_added: "Aufgabe %{id} wurde erstellt von %{author}." + text_issue_category_destroy_question: "Einige Aufgaben (%{count}) sind dieser Kategorie zugeordnet. Was möchten Sie tun?" + text_issue_category_reassign_to: Aufgaben dieser Kategorie zuordnen + text_issue_updated: "Aufgabe %{id} wurde aktualisiert von %{author}." + text_issues_destroy_confirmation: 'Sind Sie sicher, dass Sie die ausgewählten Aufgaben löschen möchten?' + text_issues_ref_in_commit_messages: Aufgaben-Beziehungen und -Status in Commit-Nachrichten + text_no_configuration_data: "Rollen, Tracker, Aufgaben-Status und Workflows wurden noch nicht konfiguriert.\nEs ist sehr zu empfehlen, die Standard-Konfiguration zu laden. Sobald sie geladen ist, können Sie diese abändern." + text_reassign_time_entries: 'Gebuchte Aufwände dieser Aufgabe zuweisen:' + label_search_open_issues_only: Nur offene Aufgaben + permission_copy_issues: Aufgaben kopieren + permission_import_issues: Aufgaben importieren + label_import_issues: Aufgaben importieren + label_assigned_issues: Zugewiesene Aufgaben + label_any_open_issues: irgendeine offene Aufgabe + label_no_open_issues: keine offene Aufgabe + label_new_project_issue_tab_enabled: Tab "Neue Aufgabe" anzeigen + error_no_projects_with_tracker_allowed_for_new_issue: Es gibt keine Projekte mit Trackern, für welche sie Aufgaben anlegen können + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Zeitbuchungen für Aufgaben, die gelöscht werden sind nicht möglich + setting_show_status_changes_in_mail_subject: Zeige Statusänderungen im Betreff der Mailbenachrichtigung für Aufgaben + permission_edit_own_issues: Eigene Aufgaben bearbeiten + label_updated_issues: Aktualisierte Aufgaben + field_history_default_tab: Standard-Tab für Aufgabenhistorie + my_issues_due: "Meine berfälligen Aufgaben" + my_issues_today : "Meine heutigen Aufgaben" + my_issues_next : "Meine nächsten Aufgaben" + issues_due: "Überfällige Aufgaben" + issues_today : "Heutige Aufgaben" + issues_next : "Nächste Aufgaben" + my_issues_opened_closed_today : "Meine heutige offenen und geschlossenen Aufgaben" + my_issues_summary : "Zusammenfassung meiner Aufgaben" + my_issues_by_priority : "Meine Aufgaben nach Priorität" + my_issues_by_status : "Meine Aufgaben nach Status" + my_issues_by_tracker : "Meine Aufgabe nach Tracker" + issue_template: Aufgabenvorlage + about_template_help_message: Dies ist die Onlinehilfe für Aufgabenvorlagen in diesem Projekt. + help_for_issue_title: "Der hier angegebene Text wird als Thema in die neue Aufgabe übernommen, falls die Vorlage ausgewählt wird." + project_module_issue_templates: Aufgabenvorlagen + text_no_tracker_enabled: Bisher wurde keine Konfiguration der Tracker und Aufgabenvorlagen für dieses Projekt vorgenommen.\nBitte konfigurieren Sie diese notwendige Einstellung, um die Funktion zu nutzen. + global_issue_templates: Globale Aufgabenvorlagen + no_issue_templates_for_this_redmine: Es sind keine globalen Aufgabenvorlagen definiert. + label_apply_global_template_to_all_projects: "Wende Globale Aufgabenvorlagen auf alle Projekte an." + note_apply_global_template_to_all_projects_setting_enabled: "Diese Globale Aufgabenvorlage wird auf alle Projekte angewendet weil das Vorlagen-Plugin entsprechend konfiguriert ist." + project_module_default_custom_query: Angepasste Standardabfrage + permission_manage_default_query: Standardabfrage verwalten + field_query: Angepasste Standardabfrage + default_custom_query: + label_setting: Angepasste Standardabfrage + label_view_default_issues: Standardanzeige für Aufgaben + label_queries_for_all_projects: Für alle Projekte + label_queries_for_current_project: Für das aktuelle Projekt + text_allowed_queries: Nur öffentliche Abfragen auswählbar diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000..67d9340 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,5 @@ +if Redmine::Plugin.installed? :baupm_core + RedmineApp::Application.routes.draw do + get '/manifest.json', :controller => 'manifest', :action => 'index', :as => 'manifest_json' + end +end diff --git a/init.rb b/init.rb new file mode 100644 index 0000000..9a259a4 --- /dev/null +++ b/init.rb @@ -0,0 +1,27 @@ +require 'redmine' + +class Hooks < Redmine::Hook::ViewListener + render_on :view_layouts_base_html_head, :partial => 'header', :layout => false +end + +Redmine::Plugin.register :baupm_core do + name 'BauPM Core Plugin' + url 'https://git.bundespruefstelle.ch/magdev/baupm_core' + author 'Marco Grätsch' + author_url 'https://github.com/magdev' + description "Common modifications for BauPM" + version '0.1.0' + + requires_redmine :version_or_higher => '4.1.0' + + settings :default => { + 'baupm_background_color' => '#ffffff', + 'baupm_theme_color' => '#575757', + 'baupm_application_title' => 'BauPM', + 'baupm_application_short_title' => 'BauPM', + 'baupm_application_description' => 'Baustellen-Management-System auf Redmine-Basis', + 'baupm_manifest_orientation' => 'portrait', + 'baupm_manifest_display' => 'standalone', + 'baupm_manifest_start_url' => '.' + }, :partial => 'settings/baupm_settings' +end diff --git a/scripts/crontab b/scripts/crontab new file mode 100644 index 0000000..264f955 --- /dev/null +++ b/scripts/crontab @@ -0,0 +1,7 @@ + +# Fetch emails +*/5 * * * * /home/bitnami/apps/redmine/fetch-mails >/dev/null 2>&1 + +# Update Letsencrypt Certificate +#### Don't forget to set the --email and --domain arguments! #### +# 0 0 * * * sudo /opt/bitnami/letsencrypt/lego --path /opt/bitnami/letsencrypt --email="" --http --http-timeout 30 --http.webroot /opt/bitnami/apps/letsencrypt --domains="" renew && sudo /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf -k graceful diff --git a/scripts/fetch-mails.sh b/scripts/fetch-mails.sh new file mode 100644 index 0000000..b5de37b --- /dev/null +++ b/scripts/fetch-mails.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# Email-address of the system +mail_address="" + +# Email-Account username and password +mail_username="$mail_address" +mail_password="" + +# IMAP-Server address and port +mail_host="" +mail_port=993 +mail_ssl=true + +# IMAP-INBOX-Folder +mail_folder="INBOX" + +# Default project and tracker +project="meta" +tracker="Support" + +# Redmine Settings +unknown_user_action="ignore" +allow_override="all" +no_permission_check=true +app_root="/home/bitnami/apps/redmine/htdocs" + +if [[ -n "$mail_address" ]] && [[ -n "$mail_username" ]] && [[ -n "$mail_password" ]] && [[ -n "$mail_host" ]]; then + sudo /opt/bitnami/ruby/bin/rake -f $app_root/Rakefile --silent redmine:email:receive_imap RAILS_ENV="production" \ + host="$mail_host" \ + port=$mail_port \ + username="$mail_username" \ + password="$mail_password" \ + ssl=$mail_ssl \ + move_on_success="$mail_folder.success" \ + move_on_failure="$mail_folder.failed" \ + unknown_user="$unknown_user_action" \ + tracker="$tracker" \ + allow_override="$allow_override" \ + folder="$mail_folder" \ + project="$project" \ + no_permission_check=$no_permission_check +fi diff --git a/scripts/git-post-receive.sh b/scripts/git-post-receive.sh new file mode 100644 index 0000000..f7b7aca --- /dev/null +++ b/scripts/git-post-receive.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +TARGET="/home/bitnami/apps/redmine/htdocs/public/themes/Ossig" +GIT_DIR="/repo/ossig-theme.git" +BRANCH="master" +RESTART_APACHE="" + +# shellcheck disable=SC2034 +# shellcheck disable=SC2162 +while read oldrev newrev ref; do + if [ "$ref" = "refs/heads/$BRANCH" ]; then + echo "Ref $ref received. Deploying ${BRANCH} branch to production..." + git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH + + if [[ -n $RESTART_APACHE ]]; then + echo "Restarting Apache Webserver" + sudo "$HOME/stack/ctlscript.sh" restart apache >>/dev/null 2>&1 + fi + else + echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server." + fi +done