\\\n`;\n }\n });\n\nvar $ = jQuery;\n$(function() {\n $(document).on(\"focus\", \".recurring_select\", function() {\n return $(this).recurring_select('set_initial_values');\n });\n\n return $(document).on(\"change\", \".recurring_select\", function() {\n return $(this).recurring_select('changed');\n });\n});\n\nvar methods = {\n set_initial_values() {\n this.data('initial-value-hash', this.val());\n return this.data('initial-value-str', $(this.find(\"option\").get()[this.prop(\"selectedIndex\")]).text());\n },\n\n changed() {\n if (this.val() === \"custom\") {\n return methods.open_custom.apply(this);\n } else {\n return methods.set_initial_values.apply(this);\n }\n },\n\n open_custom() {\n this.data(\"recurring-select-active\", true);\n new RecurringSelectDialog(this);\n return this.blur();\n },\n\n save(new_rule) {\n this.find(\"option[data-custom]\").remove();\n const new_json_val = JSON.stringify(new_rule.hash);\n\n // TODO: check for matching name, and replace that value if found\n\n if ($.inArray(new_json_val, this.find(\"option\").map(function() { return $(this).val(); })) === -1) {\n methods.insert_option.apply(this, [new_rule.str, new_json_val]);\n }\n\n this.val(new_json_val);\n methods.set_initial_values.apply(this);\n return this.trigger(\"recurring_select:save\");\n },\n\n current_rule() {\n return {\n str: this.data(\"initial-value-str\"),\n hash: $.parseJSON(this.data(\"initial-value-hash\"))\n };\n },\n\n cancel() {\n this.val(this.data(\"initial-value-hash\"));\n this.data(\"recurring-select-active\", false);\n return this.trigger(\"recurring_select:cancel\");\n },\n\n\n insert_option(new_rule_str, new_rule_json) {\n let separator = this.find(\"option:disabled\");\n if (separator.length === 0) {\n separator = this.find(\"option\");\n }\n separator = separator.last();\n\n const new_option = $(document.createElement(\"option\"));\n new_option.attr(\"data-custom\", true);\n\n if (new_rule_str.substr(new_rule_str.length - 1) !== \"*\") {\n new_rule_str+=\"*\";\n }\n\n new_option.text(new_rule_str);\n new_option.val(new_rule_json);\n return new_option.insertBefore(separator);\n },\n\n methods() {\n return methods;\n }\n};\n\n$.fn.recurring_select = function(method) {\n if (method in methods) {\n return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) );\n } else {\n return $.error( `Method ${method} does not exist on jQuery.recurring_select` );\n }\n};\n\n$.fn.recurring_select.options = {\n monthly: {\n show_week: [true, true, true, true, false, false]\n }\n};\n\n$.fn.recurring_select.texts = {\n locale_iso_code: \"en\",\n repeat: \"Repeat\",\n last_day: \"Last Day\",\n frequency: \"Frequency\",\n daily: \"Daily\",\n weekly: \"Weekly\",\n monthly: \"Monthly\",\n yearly: \"Yearly\",\n every: \"Every\",\n days: \"day(s)\",\n weeks_on: \"week(s) on\",\n months: \"month(s)\",\n years: \"year(s)\",\n day_of_month: \"Day of month\",\n day_of_week: \"Day of week\",\n cancel: \"Cancel\",\n ok: \"OK\",\n summary: \"Summary\",\n first_day_of_week: 0,\n days_first_letter: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\" ],\n order: [\"1st\", \"2nd\", \"3rd\", \"4th\", \"5th\", \"Last\"],\n show_week: [true, true, true, true, false, false]\n};\n\n$.fn.recurring_select.texts = {\n locale_iso_code: \"de\",\n repeat: \"Wiederholen\",\n last_day: \"Letzter Tag\",\n frequency: \"Häufigkeit\",\n daily: \"Täglich\",\n weekly: \"Wöchentlich\",\n monthly: \"Monatlich\",\n yearly: \"Jährlich\",\n every: \"Alle\",\n days: \"Tag(e)\",\n weeks_on: \"Woche(n) am\",\n months: \"Monat(e)\",\n years: \"Jahr(e)\",\n day_of_month: \"Tag des Monats\",\n day_of_week: \"Tag der Woche\",\n cancel: \"Abbrechen\",\n ok: \"OK\",\n summary: \"Zusammenfassung\",\n first_day_of_week: 1,\n days_first_letter: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\" ],\n order: [\"1.\", \"2.\", \"3.\", \"4.\", \"5.\", \"6.\"],\n show_week: [true, true, true, true, false, false]\n};\n","# Clickable table rows with link\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n $('.linkable-row').click ->\n if Turbolinks\n Turbolinks.visit $(this).data('href')\n else\n window.document.location = $(this).data('href')\n\n\n# Highlight action_nav_link when its an anchor and active\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n $('.action_nav_link').each ->\n if $(this).attr('href') == window.location.hash\n $(this).addClass('active')\n return\n\n# On scroll, highlight the action_nav_link for which the corresponding .action_nav_target is in view\n$(document).on 'turbolinks:load', ->\n $(window).scroll ->\n scroll_pos = $(document).scrollTop()\n $('.action_nav_target').each ->\n if $(this).offset().top <= scroll_pos + 100\n alert = $(this).attr('id')\n target_id = $(this).attr('id')\n $('.action_nav_link').removeClass('active')\n $('.action_nav_link[href=\"#' + target_id + '\"]').addClass('active')\n return\n\n\n# Off Canvas navigation\n# ---------------------------------------------------------------------\n\n# Fold out\n$(document).on 'turbolinks:load', ->\n openSidebarDropdown()\n $(document).click ->\n openSidebarDropdown()\n\nopenSidebarDropdown = ->\n $('.navmenu-nav .dropdown li').each ->\n if $(this).hasClass('active')\n $(this).closest('.dropdown').addClass('open')\n\n# Keep dropdowns open (important)\n$(document).on 'turbolinks:load', ->\n $('#page_content').on 'click', '.dropdown-toggle', ->\n $('.navmenu .dropdown').on 'hide.bs.dropdown', ->\n false\n\n# Hide the toggle-nav button unless #sidebar is present\n$(document).on 'turbolinks:load', ->\n unless $('#page_sidenav').length\n $('#toggle_sidenav').hide()\n\n# Toggle collapse button\n$(document).on 'turbolinks:load', ->\n $('#page_sidenav').on 'show.bs.offcanvas', (e) ->\n $('#toggle_sidenav .hamburger_button').removeClass('collapsed')\n return\n $('#page_sidenav').on 'hide.bs.offcanvas', (e) ->\n $('#toggle_sidenav .hamburger_button').addClass('collapsed')\n return\n\n# Hide offcanvas on sidenav click, so swiping back in iOS doesn't crap\n# out the page\n$(document).on 'turbolinks:load', ->\n $('#page_sidenav').on 'shown.bs.offcanvas', (e) ->\n $('#page_sidenav a:not(.dropdown-toggle)').on 'click', (e) ->\n $('#page_sidenav').offcanvas('hide')\n\n# Permanent #page_sidenav (turbolinks)\n# $(document).on 'turbolinks:load', ->\n# $('#page_sidenav a').click ->\n# $('#page_sidenav li').removeClass('active')\n# unless $(this).parent('li').hasClass('dropdown')\n# $(this).parent('li').addClass('active')\n# # unless $(this).closest('li.dropdown').hasClass('open')\n# # $(this).closest('li.dropdown').addClass('gorka')\n#\n# $('#page_sidenav li.dropdown a').on 'click', (event) ->\n# # $('#page_sidenav li.dropdown').removeClass('open')\n# $(this).parent('li.dropdown').toggleClass('open')\n# return\n\n\n# Prevent links where Turbolinks is disabled or data-remote=\"true\" to open new window in mobile Safari standalone Webapps (Homescreen links)\n# https://gist.github.com/kylebarrow/1042026\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n # For iOS Web apps, so they do not open in new window\n if 'standalone' of window.navigator and window.navigator.standalone\n # If you want to prevent remote links in standalone web apps opening Mobile Safari, change 'remotes' to true\n link = undefined\n remotes = true\n document.addEventListener 'click', ((event) ->\n link = event.target\n # Bubble up until we hit link or top HTML element. Warning: BODY element is not compulsory so better to stop on HTML\n while link.nodeName != 'A' and link.nodeName != 'HTML'\n link = link.parentNode\n if 'href' of link and link.href.indexOf('http') != -1 and (link.href.indexOf(document.location.host) != -1 or remotes) and event.target.constructor.name != 'HTMLAnchorElement'\n event.preventDefault()\n # do not redirect page on data-remote links\n (document.location.href = link.href) unless $(link).data('remote') == true\n return\n ), false\n\n\n# Tooltips\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n $(\"[data-toggle=\\\"tooltip\\\"]\").tooltip()\n\n\n# Filter search\n# ---------------------------------------------------------------------\n\n# Sets the filter search button active\n$(document).on 'turbolinks:load', ->\n if $('#filter_search').hasClass('in')\n $('[aria-controls=\\'filter_search\\']').addClass('active')\n\n# Sets the filter search button active\n$(document).on 'turbolinks:load', ->\n $('#filter_search').on 'show.bs.collapse', ->\n $('[aria-controls=\\'filter_search\\']').addClass('active')\n $('#filter_search').on 'hide.bs.collapse', ->\n $('[aria-controls=\\'filter_search\\']').removeClass('active')\n\n\n# Data confirm modals\n# ---------------------------------------------------------------------\n\n$.rails.allowAction = (element) ->\n # The message is something like \"Are you sure?\"\n message = element.data('confirm')\n ok_text = element.data('ok')\n cancel_text = element.data('cancel')\n hint_text = element.data('hint')\n # If there's no message, there's no data-confirm attribute,\n # which means there's nothing to confirm\n return true unless message\n # Clone the clicked element (probably a delete link) so we can use it in the dialog box.\n $link = element.clone()\n # We don't necessarily want the same styling as the original link/button.\n .removeAttr('class')\n # We don't want to pop up another confirmation (recursion)\n .removeAttr('data-confirm')\n # We want a button\n .addClass('btn btn-danger confirm')\n # We want it to sound confirmy\n .html(\"#{ok_text}\")\n\n # Create the modal box with the message\n modal_html = \"\"\"\n
\n
\n
\n
\n
#{message}
\n \n
\n
\n
#{hint_text}
\n
\n \n
\n
\n
\n \"\"\"\n $modal_html = $(modal_html)\n # Add the new button to the modal box\n $modal_html.find('.modal-footer').append($link)\n # Pop it up\n $modal_html.modal('show')\n # Prevent the original link from working\n return false\n\n# Focus modal confirmation button\n$(document).on 'turbolinks:load', ->\n $(document.body).on 'shown.bs.modal', '#confirmation_modal', (e) ->\n $('#confirmation_modal').find('.confirm').focus()\n return\n\n\n# Remove :hover for touch devices globally\n# ---------------------------------------------------------------------\n\n# $(document).on 'turbolinks:load', ->\n# removeHover()\n\n\n# Enable Organization switching inside modal\n# ---------------------------------------------------------------------\n\n# Append a modal dialog div to the HTML body which can be shown in case an #export_pdf_document_link is on a page an populated with the request path from above\n$(document).on 'turbolinks:load', ->\n if $(\"a[data-toggle*='modal']\").length > 0\n # Create the modal box\n # TODO add .modal-dialog-scrollable to .modal-dialog\n modal_html = \"\"\"\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n \"\"\"\n $modal_html = $(modal_html)\n $(\"body\").append($modal_html)\n return false\n\n$(document).on 'turbolinks:load', ->\n $('#main_modal').on 'show.bs.modal', (event) ->\n modal = $(this)\n button = event.relatedTarget\n modal.find('.modal-body').load button.href + '?modal_layout=true', (response, status, xhr) ->\n modal.find('.modal-title').html($(response).find('h1').text())\n return\n\n\n# Fix (f)ugly iOS fixed positioning bug when using form elements\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n if 'ontouchstart' of window\n $('input, select, textarea').on 'focus', ->\n $('#page_headernav').css\n 'position': 'absolute'\n 'top': $('body').scrollTop()\n $('#page_sidenav').css\n 'position': 'absolute'\n 'top': $('body').scrollTop()\n focusing = true\n return\n $('input, select, textarea').on 'blur', ->\n $('#page_headernav').css\n 'position': 'fixed'\n 'top': 0\n $('#page_sidenav').css\n 'position': 'fixed'\n 'top': 0\n focusing = false\n return\n return\n$(window).scroll ->\n if 'ontouchstart' of window\n unless typeof focusing == 'undefined'\n if focusing\n $('#page_headernav').css 'top': $(document).scrollTop()\n $('#page_sidenav').css 'top': $(document).scrollTop()\n return\n\n\n# Asynchronous content loader\n# ---------------------------------------------------------------------\n$(document).on 'turbolinks:load', ->\n $('#page_content').on 'submit', 'form.async', ->\n content = \"\"\"\n \n \"\"\"\n $('.async_content').html(content)\n $('.async_content').fadeIn(50)\n\n\n# Add active class to card headings\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n $('.card-collapse').on 'show.bs.collapse', ->\n $(this).siblings('.card-header').addClass 'active'\n return\n $('.card-collapse').on 'hide.bs.collapse', ->\n $(this).siblings('.card-header').removeClass 'active'\n return\n return\n\n\n# Hide flash after x seconds\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n setTimeout (->\n $('#flash_message').removeClass('animate__fadeInDown').addClass('animate__fadeOutUp')\n return\n ), 5000\n return\n\n$(document).on 'turbolinks:load', ->\n $(\"#flash_message button.close\").click ->\n $(this).parent().removeClass('animate__fadeInDown').addClass('animate__fadeOutUp')\n\n\n# Deep linking for Tabs\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n url = location.href.replace(/\\/$/, '')\n if location.hash\n hash = url.split('#')\n $('#linkableTabs a[href=\"#' + hash[1] + '\"]').tab 'show'\n url = location.href.replace(/\\/#/, '#')\n history.replaceState null, null, url\n $('a[data-toggle=\"tab\"]').on 'click', ->\n `var hash`\n newUrl = undefined\n hash = $(this).attr('href')\n if hash == '#home'\n newUrl = url.split('#')[0]\n else\n newUrl = url.split('#')[0] + hash\n newUrl += '/'\n history.replaceState null, null, newUrl\n return\n return\n\n\n# Organization list search field\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n $(document).on 'shown.bs.modal', '#main_modal', (e) ->\n searchField = $('#organization-list-search')\n\n # Check if the search field exists in the modal\n if searchField.length > 0\n # Focus search field by pressing 'f'\n $(document).on 'keydown', (e) ->\n if e.keyCode == 70 && !searchField.is(':focus')\n searchField.focus()\n e.preventDefault()\n\n # Handle search form input\n searchField.on 'input', (e) ->\n searchTerm = e.target.value.toUpperCase()\n # Handle each list element\n $('.organization_selector li').each ->\n organizationName = $(this).find('.nameing').text().toUpperCase()\n $(this).toggle(organizationName.includes(searchTerm))\n\n # Clean up event handlers when the modal is hidden\n $(document).on 'hidden.bs.modal', '#main_modal', (e) ->\n $(document).off 'keydown'\n $('#organization-list-search').off 'input'\n\n\n# Rating (stars)\n# See rating_helper.rb\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n $('.rating.form').each ->\n rating_form_id = '#' + $(this).attr('id')\n rating_star_selector = rating_form_id + ' .rating_star'\n\n $(rating_star_selector).hover ->\n $(this).prevAll().addClass('full')\n $(this).nextAll().removeClass('full')\n , ->\n if $(rating_star_selector + ':checked').length > 0\n $(rating_star_selector + ':checked').prevAll().addClass('full')\n $(rating_star_selector + ':checked').nextAll().removeClass('full')\n else\n $(rating_star_selector).removeClass('full')\n\n $(rating_star_selector).click ->\n $(this).prevAll().addClass('full')\n $(this).nextAll().removeClass('full')\n\n# Reset processing_time selects\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n $('#reset_processing_time_button').on 'click', ->\n # Reset all three processing_time select fields to its default value\n $('#processing_time_days').val('')\n $('#processing_time_hours').val('')\n $('#processing_time_minutes').val('')\n return\n","$(document).on 'turbolinks:load', ->\n # Select all\n $('.checkbox_select_all').change ->\n $(this).closest('.card').find('.custom-control input').prop 'checked', $(this).prop('checked')\n return\n return\n\n$(document).on 'turbolinks:load', ->\n # Hide Estate/Service Group Category selection for Controller and Manager\n $('#role_selection').click ->\n if $('#new_role_controller').is(':checked') || $('#new_role_manager').is(':checked')\n # removeClass workaround for https://github.com/twbs/bootstrap/issues/9237\n if $('#estate_service_group_category_selection').hasClass('d-flex')\n $('#estate_service_group_category_selection').removeClass('d-flex').show()\n $('#estate_service_group_category_selection').hide('fast')\n else\n # removeClass workaround for https://github.com/twbs/bootstrap/issues/9237\n if $('#estate_service_group_category_selection').hasClass('d-none')\n $('#estate_service_group_category_selection').removeClass('d-none').hide()\n $('#estate_service_group_category_selection').show('fast')\n","/*!\n * Jasny Bootstrap v3.1.3 (http://jasny.github.io/bootstrap)\n * Copyright 2012-2014 Arnold Daniels\n * Licensed under Apache-2.0 (https://github.com/jasny/bootstrap/blob/master/LICENSE)\n */\n\nif (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\\'s JavaScript requires jQuery') }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.1.3\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n 'use strict';\n\n // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n // ============================================================\n\n function transitionEnd() {\n var el = document.createElement('bootstrap')\n\n var transEndEventNames = {\n WebkitTransition : 'webkitTransitionEnd',\n MozTransition : 'transitionend',\n OTransition : 'oTransitionEnd otransitionend',\n transition : 'transitionend'\n }\n\n for (var name in transEndEventNames) {\n if (el.style[name] !== undefined) {\n return { end: transEndEventNames[name] }\n }\n }\n\n return false // explicit for ie8 ( ._.)\n }\n\n if ($.support.transition !== undefined) return // Prevent conflict with Twitter Bootstrap\n\n // http://blog.alexmaccaw.com/css-transitions\n $.fn.emulateTransitionEnding = function (duration) {\n var called = false, $el = this\n $(this).one($.support.transition.end, function () { called = true })\n var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n setTimeout(callback, duration)\n return this\n }\n\n $(function () {\n $.support.transition = transitionEnd()\n })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: offcanvas.js v3.1.3\n * http://jasny.github.io/bootstrap/javascript/#offcanvas\n * ========================================================================\n * Copyright 2013-2014 Arnold Daniels\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\")\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n+function ($) { \"use strict\";\n\n // OFFCANVAS PUBLIC CLASS DEFINITION\n // =================================\n\n var OffCanvas = function (element, options) {\n this.$element = $(element)\n this.options = $.extend({}, OffCanvas.DEFAULTS, options)\n this.state = null\n this.placement = null\n\n if (this.options.recalc) {\n this.calcClone()\n $(window).on('resize', $.proxy(this.recalc, this))\n }\n\n if (this.options.autohide)\n $(document).on('click', $.proxy(this.autohide, this))\n\n if (this.options.toggle) this.toggle()\n\n if (this.options.disablescrolling) {\n this.options.disableScrolling = this.options.disablescrolling\n delete this.options.disablescrolling\n }\n }\n\n OffCanvas.DEFAULTS = {\n toggle: true,\n placement: 'auto',\n autohide: true,\n recalc: true,\n disableScrolling: true\n }\n\n OffCanvas.prototype.offset = function () {\n switch (this.placement) {\n case 'left':\n case 'right': return this.$element.outerWidth()\n case 'top':\n case 'bottom':\n }\n }\n\n OffCanvas.prototype.calcPlacement = function () {\n if (this.options.placement !== 'auto') {\n this.placement = this.options.placement\n return\n }\n\n if (!this.$element.hasClass('in')) {\n this.$element.css('visiblity', 'hidden !important').addClass('in')\n }\n\n var horizontal = $(window).width() / this.$element.width()\n var vertical = $(window).height() / this.$element.height()\n\n var element = this.$element\n function ab(a, b) {\n if (element.css(b) === 'auto') return a\n if (element.css(a) === 'auto') return b\n\n var size_a = parseInt(element.css(a), 10)\n var size_b = parseInt(element.css(b), 10)\n\n return size_a > size_b ? b : a\n }\n\n this.placement = horizontal >= vertical ? ab('left', 'right') : ab('top', 'bottom')\n\n if (this.$element.css('visibility') === 'hidden !important') {\n this.$element.removeClass('in').css('visiblity', '')\n }\n }\n\n OffCanvas.prototype.opposite = function (placement) {\n switch (placement) {\n case 'top': return 'bottom'\n case 'left': return 'right'\n case 'bottom': return 'top'\n case 'right': return 'left'\n }\n }\n\n OffCanvas.prototype.getCanvasElements = function() {\n // Return a set containing the canvas plus all fixed elements\n var canvas = this.options.canvas ? $(this.options.canvas) : this.$element\n\n var fixed_elements = canvas.find('*').filter(function() {\n return $(this).css('position') === 'fixed'\n }).not(this.options.exclude)\n\n return canvas.add(fixed_elements)\n }\n\n OffCanvas.prototype.slide = function (elements, offset, callback) {\n // Use jQuery animation if CSS transitions aren't supported\n if (!$.support.transition) {\n var anim = {}\n anim[this.placement] = \"+=\" + offset\n return elements.animate(anim, 350, callback)\n }\n\n var placement = this.placement\n var opposite = this.opposite(placement)\n\n elements.each(function() {\n if ($(this).css(placement) !== 'auto')\n $(this).css(placement, (parseInt($(this).css(placement), 10) || 0) + offset)\n\n if ($(this).css(opposite) !== 'auto')\n $(this).css(opposite, (parseInt($(this).css(opposite), 10) || 0) - offset)\n })\n\n this.$element\n .one($.support.transition.end, callback)\n .emulateTransitionEnding(350)\n }\n\n OffCanvas.prototype.disableScrolling = function() {\n var bodyWidth = $('body').width()\n var prop = 'padding-' + this.opposite(this.placement)\n\n if ($('body').data('offcanvas-style') === undefined) {\n $('body').data('offcanvas-style', $('body').attr('style') || '')\n }\n\n $('body').css('overflow', 'hidden')\n\n if ($('body').width() > bodyWidth) {\n var padding = parseInt($('body').css(prop), 10) + $('body').width() - bodyWidth\n\n setTimeout(function() {\n $('body').css(prop, padding)\n }, 1)\n }\n }\n\n OffCanvas.prototype.show = function () {\n if (this.state) return\n\n var startEvent = $.Event('show.bs.offcanvas')\n this.$element.trigger(startEvent)\n if (startEvent.isDefaultPrevented()) return\n\n this.state = 'slide-in'\n this.calcPlacement();\n\n var elements = this.getCanvasElements()\n var placement = this.placement\n var opposite = this.opposite(placement)\n var offset = this.offset()\n\n if (elements.index(this.$element) !== -1) {\n $(this.$element).data('offcanvas-style', $(this.$element).attr('style') || '')\n this.$element.css(placement, -1 * offset)\n this.$element.css(placement); // Workaround: Need to get the CSS property for it to be applied before the next line of code\n }\n\n elements.addClass('canvas-sliding').each(function() {\n if ($(this).data('offcanvas-style') === undefined) $(this).data('offcanvas-style', $(this).attr('style') || '')\n if ($(this).css('position') === 'static') $(this).css('position', 'relative')\n if (($(this).css(placement) === 'auto' || $(this).css(placement) === '0px') &&\n ($(this).css(opposite) === 'auto' || $(this).css(opposite) === '0px')) {\n $(this).css(placement, 0)\n }\n })\n\n if (this.options.disableScrolling) this.disableScrolling()\n\n var complete = function () {\n if (this.state != 'slide-in') return\n\n this.state = 'slid'\n\n elements.removeClass('canvas-sliding').addClass('canvas-slid')\n this.$element.trigger('shown.bs.offcanvas')\n }\n\n setTimeout($.proxy(function() {\n this.$element.addClass('in')\n this.slide(elements, offset, $.proxy(complete, this))\n }, this), 1)\n }\n\n OffCanvas.prototype.hide = function (fast) {\n if (this.state !== 'slid') return\n\n var startEvent = $.Event('hide.bs.offcanvas')\n this.$element.trigger(startEvent)\n if (startEvent.isDefaultPrevented()) return\n\n this.state = 'slide-out'\n\n var elements = $('.canvas-slid')\n var placement = this.placement\n var offset = -1 * this.offset()\n\n var complete = function () {\n if (this.state != 'slide-out') return\n\n this.state = null\n this.placement = null\n\n this.$element.removeClass('in')\n\n elements.removeClass('canvas-sliding')\n elements.add(this.$element).add('body').each(function() {\n $(this).attr('style', $(this).data('offcanvas-style')).removeData('offcanvas-style')\n })\n\n this.$element.trigger('hidden.bs.offcanvas')\n }\n\n elements.removeClass('canvas-slid').addClass('canvas-sliding')\n\n setTimeout($.proxy(function() {\n this.slide(elements, offset, $.proxy(complete, this))\n }, this), 1)\n }\n\n OffCanvas.prototype.toggle = function () {\n if (this.state === 'slide-in' || this.state === 'slide-out') return\n this[this.state === 'slid' ? 'hide' : 'show']()\n }\n\n OffCanvas.prototype.calcClone = function() {\n this.$calcClone = this.$element.clone()\n .html('')\n .addClass('offcanvas-clone').removeClass('in')\n .appendTo($('body'))\n }\n\n OffCanvas.prototype.recalc = function () {\n if (this.$calcClone.css('display') === 'none' || (this.state !== 'slid' && this.state !== 'slide-in')) return\n\n this.state = null\n this.placement = null\n var elements = this.getCanvasElements()\n\n this.$element.removeClass('in')\n\n elements.removeClass('canvas-slid')\n elements.add(this.$element).add('body').each(function() {\n $(this).attr('style', $(this).data('offcanvas-style')).removeData('offcanvas-style')\n })\n }\n\n OffCanvas.prototype.autohide = function (e) {\n if ($(e.target).closest(this.$element).length === 0) this.hide()\n }\n\n // OFFCANVAS PLUGIN DEFINITION\n // ==========================\n\n var old = $.fn.offcanvas\n\n $.fn.offcanvas = function (option) {\n return this.each(function () {\n var $this = $(this)\n var data = $this.data('bs.offcanvas')\n var options = $.extend({}, OffCanvas.DEFAULTS, $this.data(), typeof option === 'object' && option)\n\n if (!data) $this.data('bs.offcanvas', (data = new OffCanvas(this, options)))\n if (typeof option === 'string') data[option]()\n })\n }\n\n $.fn.offcanvas.Constructor = OffCanvas\n\n\n // OFFCANVAS NO CONFLICT\n // ====================\n\n $.fn.offcanvas.noConflict = function () {\n $.fn.offcanvas = old\n return this\n }\n\n\n // OFFCANVAS DATA-API\n // =================\n\n $(document).on('click.bs.offcanvas.data-api', '[data-toggle=offcanvas]', function (e) {\n var $this = $(this), href\n var target = $this.attr('data-target')\n || e.preventDefault()\n || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n var $canvas = $(target)\n var data = $canvas.data('bs.offcanvas')\n var option = data ? 'toggle' : $this.data()\n\n e.stopPropagation()\n\n if (data) data.toggle()\n else $canvas.offcanvas(option)\n })\n\n}(window.jQuery);\n","# QrCode data_acquisition_type\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n\n select_data_acquisition_type = $('#qr_code_data_acquisition_type')\n select_sgc_sg_group = $('#select_sgc_sg_group')\n select_service_group = $('.select_service_group')\n select_notice_kind_group = $('#select_notice_kind_group')\n select_notice_kind = $('.select_notice_kind')\n select_ticket_kind_group = $('#select_ticket_kind_group')\n select_ticket_kind = $('.select_ticket_kind')\n select_time_tracking_types_group = $('#select_time_tracking_types_group')\n select_time_tracking_types = $('.select_time_tracking_types')\n select_monitoring_template_group = $('#select_monitoring_template_group')\n select_monitoring_template = $('.select_monitoring_template')\n\n select_data_acquisition_type.change ->\n # First disable everything\n select_sgc_sg_group.addClass('d-none')\n select_service_group.attr('name', 'disabled')\n select_notice_kind_group.addClass('d-none')\n select_notice_kind.attr('name', 'disabled')\n select_ticket_kind_group.addClass('d-none')\n select_ticket_kind.attr('name', 'disabled')\n select_time_tracking_types_group.addClass('d-none')\n select_time_tracking_types.attr('name', 'disabled')\n select_monitoring_template_group.addClass('d-none')\n select_monitoring_template.attr('name', 'disabled')\n # … then enable conditionally\n switch select_data_acquisition_type.val()\n when 'Inspection'\n select_sgc_sg_group.removeClass('d-none')\n select_service_group.attr('name', 'qr_code[service_group_id]')\n when 'Notice'\n select_notice_kind_group.removeClass('d-none')\n select_notice_kind.attr('name', 'qr_code[notice_kind_id]')\n when 'Ticket'\n select_ticket_kind_group.removeClass('d-none')\n select_ticket_kind.attr('name', 'qr_code[ticket_kind_id]')\n when 'TimeTracking'\n select_time_tracking_types_group.removeClass('d-none')\n select_time_tracking_types.attr('name', 'qr_code[time_tracking_type_id]')\n when 'Monitoring'\n select_monitoring_template_group.removeClass('d-none')\n select_monitoring_template.attr('name', 'qr_code[monitoring_template_id]')\n\n # IMPORTANT\n # Also trigger everything after page (re)load, e.g. validation fail\n select_data_acquisition_type.trigger 'change'\n\n\n# QrCode location_type\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n\n select_location_type = $('#qr_code_location_type')\n select_estate_group = $('#qr_code_form .form-group.select_estate')\n select_estate = $('#qr_code_form .select_location_estate')\n select_building_group = $('#qr_code_form .form-group.select_building')\n select_building = $('#qr_code_form .select_location_building')\n select_floor_group = $('#qr_code_form .form-group.select_floor')\n select_floor = $('#qr_code_form .select_location_floor')\n input_room_name_group = $('#qr_code_form .form-group.select_room_name')\n input_room_name = $('#qr_code_room_name')\n\n select_location_type.change ->\n # First disable everything\n select_estate_group.addClass('d-none')\n select_estate.attr('name', 'disabled')\n select_building_group.addClass('d-none')\n select_building.attr('name', 'disabled')\n select_floor_group.addClass('d-none')\n select_building.attr('name', 'disabled')\n input_room_name_group.addClass('d-none')\n input_room_name.attr('disabled', true)\n # … then enable conditionally\n switch select_location_type.val()\n when 'Estate'\n select_estate_group.removeClass('d-none')\n select_estate.attr('name', 'qr_code[location_id]')\n when 'Building'\n select_estate_group.removeClass('d-none')\n select_building_group.removeClass('d-none')\n select_building.attr('name', 'qr_code[location_id]')\n when 'Floor'\n select_estate_group.removeClass('d-none')\n select_building_group.removeClass('d-none')\n select_floor_group.removeClass('d-none')\n select_floor.attr('name', 'qr_code[location_id]')\n input_room_name_group.removeClass('d-none')\n input_room_name.attr('disabled', false)\n\n # IMPORTANT\n # Also trigger everything after page (re)load, e.g. validation fail\n select_location_type.trigger 'change'\n\n\n# QrCode location_id\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n\n select_estate = $('.select_location_estate')\n select_building = $('.select_location_building')\n select_floor = $('.select_location_floor')\n buildings = select_building.html()\n floors = select_floor.html()\n\n empty_option = \"\"\n\n # Disable secondary/tertiary selects of cascades\n select_building.prop('disabled', true) if select_estate.val() == ''\n select_floor.prop('disabled', true) if select_building.val() == ''\n\n # Populate buildings\n selected_building = select_building.find('option:selected').val()\n select_estate.change ->\n selected_estate = select_estate.find('option:selected').val()\n options = $(buildings).filter(\"optgroup[label='#{selected_estate}']\").html()\n number_of_buildings = if options then (options.match(/value/g) || []).length else 0\n if options\n select_building.prop('disabled', false)\n select_building.html(options)\n # If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Building is selectable\n unless selected_building > 0 || number_of_buildings == 1\n select_building.prepend(empty_option)\n select_floor.prop('disabled', true) if select_building.val() == ''\n else\n select_building.empty()\n populate_select_floors()\n\n # Populate floors\n select_building.change ->\n select_floor.prop('disabled', false) if select_building.val() != ''\n populate_select_floors()\n\n populate_select_floors = ->\n building = select_building.find(':selected').val()\n options = $(floors).filter(\"optgroup[label='#{building}']\").html()\n floor = select_floor.find('option:selected').val()\n number_of_floors = if options then (options.match(/value/g) || []).length else 0\n if options\n select_floor.prop('disabled', false)\n select_floor.html(options)\n # If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Floor is selectable\n unless floor > 0 || number_of_floors == 1 || select_floor.find('option:first-child').val() != ''\n select_floor.prepend(empty_option)\n else\n select_floor.empty()\n\n # IMPORTANT\n # Also trigger everything after page (re)load, e.g. validation fail\n select_estate.trigger 'change'\n\n\n# QrCode ServiceGroup\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n select_service_group_category = $('.select_service_group_category')\n select_service_group = $('.select_service_group')\n service_groups = select_service_group.html()\n\n empty_option = \"\"\n\n select_service_group.prop('disabled', true) if select_service_group.val() == ''\n\n # Populate service groups\n selected_service_group = select_service_group.find('option:selected').val()\n select_service_group_category.change ->\n selected_service_group_category = select_service_group_category.find('option:selected').val()\n options = $(service_groups).filter(\"optgroup[label='#{selected_service_group_category}']\").html()\n number_of_service_groups = if options then (options.match(/value/g) || []).length else 0\n if options\n select_service_group.prop('disabled', false)\n select_service_group.html(options)\n # If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one ServiceGroup is selectable\n unless selected_service_group > 0 || number_of_service_groups == 1\n select_service_group.prepend(empty_option)\n select_service_group.prop('disabled', true) if select_service_group_category.val() == ''\n else\n select_service_group.empty()\n\n # IMPORTANT\n # Also trigger everything after page (re)load, e.g. validation fail\n select_service_group_category.trigger 'change'\n","# Polls the path specified within an HTML elements (#static_document) data-document-id attribute every setTimeout interval milliseconds.\n# This path should return a link with the URL of the StaticDocument that was requested by the user.\n\n# Destroy modal content once it gets closed\n$(document).on 'turbolinks:load', ->\n $('body').on 'hidden.bs.modal', '#static_document_modal', (e) ->\n $(this).removeData('bs.modal')\n $('.modal-content', this).empty()\n return\n\n\n# Append a modal dialog div to the HTML body which can be shown in case an #export_static_document_link is on a page an populated with the request path from above\n$(document).on 'turbolinks:load', ->\n if $('#export_xlsx_document_link').length > 0 || $('#export_pdf_document_link').length > 0\n # Create the modal box\n modal_html = \"\"\"\n
\n
\n
\n
\n
\n
\n \"\"\"\n $modal_html = $(modal_html)\n $(\"body\").append($modal_html)\n # Prevent the original link from working\n # return false\n\n$(document).on 'turbolinks:load', ->\n $('#static_document_modal').on 'show.bs.modal', (event) ->\n modal = $(this)\n button = event.relatedTarget\n modal.find('.modal-content').load(button.href)\n return\n","import Turbolinks from 'turbolinks'\nTurbolinks.start()\n","import { DirectUpload } from '@rails/activestorage'\n\n// See DirectUploadController from Rails Active Storage source\nexport class CustomUploader {\n constructor(input, file) {\n this.input = input\n this.file = file\n this.directUpload = new DirectUpload(this.file, this.url, this)\n this.dispatch('initialize')\n }\n\n start() {\n const hiddenInput = document.createElement('input')\n hiddenInput.type = 'hidden'\n hiddenInput.name = this.input.name\n hiddenInput.classList.add('cache')\n this.input.insertAdjacentElement('beforebegin', hiddenInput)\n\n this.dispatch('start')\n\n this.directUpload.create((error, attributes) => {\n if (error) {\n hiddenInput.parentNode.removeChild(hiddenInput)\n this.dispatchError(error)\n } else {\n hiddenInput.value = attributes.signed_id\n }\n\n this.dispatch('end')\n // callback(error)\n })\n }\n\n uploadRequestDidProgress(event) {\n const progress = event.loaded / event.total * 100\n if (progress) {\n this.dispatch('progress', { progress })\n }\n }\n\n get url() {\n return this.input.getAttribute('data-direct-upload-url')\n }\n\n dispatch(name, detail = {}) {\n detail.file = this.file\n detail.id = this.directUpload.id\n return dispatchEvent(this.input, `direct-upload:${name}`, { detail })\n }\n\n dispatchError(error) {\n const event = this.dispatch('error', { error })\n if (!event.defaultPrevented) {\n alert(error)\n }\n }\n\n directUploadWillStoreFileWithXHR(xhr) {\n this.dispatch('before-storage-request', { xhr })\n xhr.upload.addEventListener('progress', event => this.uploadRequestDidProgress(event))\n }\n}\n\nfunction dispatchEvent(element, type, eventInit = {}) {\n const { disabled } = element\n const { bubbles, cancelable, detail } = eventInit\n const event = document.createEvent('Event')\n\n event.initEvent(type, bubbles || true, cancelable || true)\n event.detail = detail || {}\n\n try {\n element.disabled = false\n element.dispatchEvent(event)\n } finally {\n element.disabled = disabled\n }\n\n return event\n}\n","import { I18n } from 'i18n-js'\n\nconst { locale } = window.I18n\n\n\nconst translations = {\"en\":{\"date\":{\"formats\":{\"default\":\"%m/%d/%Y\",\"short\":\"%e/%b\",\"long\":\"%e. %B %Y\",\"only_day\":\"%e\",\"month_short\":\"%b %Y\",\"month_short_alt\":\"%m %Y\",\"month_short_alt2\":\"%B %Y\",\"short_alt\":\"%B %Y\"},\"day_names\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"abbr_day_names\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"month_names\":[null,\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\"abbr_month_names\":[null,\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],\"order\":[\"year\",\"month\",\"day\"],\"today\":\"Today\",\"yesterday\":\"Yesterday\",\"input\":{\"formats\":[\"default\",\"long\",\"short\"]}},\"time\":{\"formats\":{\"default\":\"%A, %e %B %Y, %H:%M\",\"short\":\"%e. %B, %H:%M\",\"long\":\"%A, %e. %B %Y, %H:%M\",\"short_alt\":\"%m/%d/%y, %H:%M\",\"short_alt_time\":\"%m/%d/%y, %H:%M\",\"time\":\"%H:%M\",\"time_clock\":\"%H:%M\",\"day\":\"%B %d, %Y\",\"day_name\":\"%A, %B %e %Y\",\"day_name_time\":\"%A, %m/%d/%Y, %H:%M\",\"day_month_short\":\"%d/%m\",\"day_short\":\"%m/%d/%Y\",\"day_shorter\":\"%m/%d/%y\",\"month_short\":\"%b %Y\",\"month_short_alt\":\"%m %Y\",\"month_short_alt2\":\"%B %Y\",\"hour_minute\":\"%H:%M\",\"year\":\"%Y\"},\"am\":\"am\",\"pm\":\"pm\",\"input\":{\"formats\":[\"long\",\"medium\",\"short\",\"default\",\"time\"]}},\"support\":{\"array\":{\"words_connector\":\", \",\"two_words_connector\":\" and \",\"last_word_connector\":\", and \"}},\"number\":{\"format\":{\"separator\":\".\",\"delimiter\":\",\",\"precision\":1,\"round_mode\":\"default\",\"significant\":false,\"strip_insignificant_zeros\":false},\"currency\":{\"format\":{\"format\":\"%u%n\",\"negative_format\":\"-%u%n\",\"unit\":\"$\",\"separator\":\".\",\"delimiter\":\",\",\"precision\":2,\"significant\":false,\"strip_insignificant_zeros\":false}},\"percentage\":{\"format\":{\"delimiter\":\"\",\"format\":\"%n%\"}},\"precision\":{\"format\":{\"delimiter\":\"\"}},\"human\":{\"format\":{\"delimiter\":\"\",\"precision\":3,\"significant\":true,\"strip_insignificant_zeros\":true},\"storage_units\":{\"format\":\"%n %u\",\"units\":{\"byte\":{\"one\":\"Byte\",\"other\":\"Bytes\"},\"kb\":\"KB\",\"mb\":\"MB\",\"gb\":\"GB\",\"tb\":\"TB\",\"pb\":\"PB\",\"eb\":\"EB\",\"zb\":\"ZB\"}},\"decimal_units\":{\"format\":\"%n %u\",\"units\":{\"unit\":\"\",\"thousand\":\"Thousand\",\"million\":\"Million\",\"billion\":\"Billion\",\"trillion\":\"Trillion\",\"quadrillion\":\"Quadrillion\"}}},\"nth\":{\"ordinals\":{},\"ordinalized\":{}}},\"errors\":{\"format\":\"%{attribute} %{message}\",\"messages\":{\"model_invalid\":\"Validation failed: %{errors}\",\"inclusion\":\"is not included in the list\",\"exclusion\":\"is reserved\",\"invalid\":\"is invalid\",\"confirmation\":\"doesn't match %{attribute}\",\"accepted\":\"must be accepted\",\"empty\":\"can't be empty\",\"blank\":\"can't be blank\",\"present\":\"must be blank\",\"too_long\":{\"one\":\"is too long (maximum is %{count} character)\",\"other\":\"is too long (maximum is %{count} characters)\"},\"password_too_long\":\"is too long\",\"too_short\":{\"one\":\"is too short (minimum is %{count} character)\",\"other\":\"is too short (minimum is %{count} characters)\"},\"wrong_length\":{\"one\":\"is the wrong length (should be %{count} character)\",\"other\":\"is the wrong length (should be %{count} characters)\"},\"not_a_number\":\"is not a number\",\"not_an_integer\":\"must be an integer\",\"greater_than\":\"must be greater than %{count}\",\"greater_than_or_equal_to\":\"must be greater than or equal to %{count}\",\"equal_to\":\"must be equal to %{count}\",\"less_than\":\"must be less than %{count}\",\"less_than_or_equal_to\":\"must be less than or equal to %{count}\",\"other_than\":\"must be other than %{count}\",\"in\":\"must be in %{count}\",\"odd\":\"must be odd\",\"even\":\"must be even\",\"required\":\"must exist\",\"taken\":\"has already been taken\",\"already_confirmed\":\"was already confirmed, please try signing in\",\"confirmation_period_expired\":\"needs to be confirmed within %{period}, please request a new one\",\"expired\":\"has expired, please request a new one\",\"not_found\":\"not found\",\"not_locked\":\"was not locked\",\"not_saved\":{\"one\":\"1 error prohibited this %{resource} from being saved:\",\"other\":\"%{count} errors prohibited this %{resource} from being saved:\"},\"content_type_invalid\":{\"one\":\"has an invalid content type (authorized content type is %{authorized_human_content_types})\",\"other\":\"has an invalid content type (authorized content types are %{authorized_human_content_types})\"},\"content_type_spoofed\":{\"one\":\"has a content type that is not equivalent to the one that is detected through its content (authorized content type is %{authorized_human_content_types})\",\"other\":\"has a content type that is not equivalent to the one that is detected through its content (authorized content types are %{authorized_human_content_types})\"},\"file_size_not_less_than\":\"file size must be less than %{max} (current size is %{file_size})\",\"file_size_not_less_than_or_equal_to\":\"file size must be less than or equal to %{max} (current size is %{file_size})\",\"file_size_not_greater_than\":\"file size must be greater than %{min} (current size is %{file_size})\",\"file_size_not_greater_than_or_equal_to\":\"file size must be greater than or equal to %{min} (current size is %{file_size})\",\"file_size_not_between\":\"file size must be between %{min} and %{max} (current size is %{file_size})\",\"total_file_size_not_less_than\":\"total file size must be less than %{max} (current size is %{total_file_size})\",\"total_file_size_not_less_than_or_equal_to\":\"total file size must be less than or equal to %{max} (current size is %{total_file_size})\",\"total_file_size_not_greater_than\":\"total file size must be greater than %{min} (current size is %{total_file_size})\",\"total_file_size_not_greater_than_or_equal_to\":\"total file size must be greater than or equal to %{min} (current size is %{total_file_size})\",\"total_file_size_not_between\":\"total file size must be between %{min} and %{max} (current size is %{total_file_size})\",\"duration_not_less_than\":\"duration must be less than %{max} (current duration is %{duration})\",\"duration_not_less_than_or_equal_to\":\"duration must be less than or equal to %{max} (current duration is %{duration})\",\"duration_not_greater_than\":\"duration must be greater than %{min} (current duration is %{duration})\",\"duration_not_greater_than_or_equal_to\":\"duration must be greater than or equal to %{min} (current duration is %{duration})\",\"duration_not_between\":\"duration must be between %{min} and %{max} (current duration is %{duration})\",\"limit_out_of_range\":{\"zero\":\"no files attached (must have between %{min} and %{max} files)\",\"one\":\"only 1 file attached (must have between %{min} and %{max} files)\",\"other\":\"total number of files must be between %{min} and %{max} files (there are %{count} files attached)\"},\"limit_min_not_reached\":{\"zero\":\"no files attached (must have at least %{min} files)\",\"one\":\"only 1 file attached (must have at least %{min} files)\",\"other\":\"%{count} files attached (must have at least %{min} files)\"},\"limit_max_exceeded\":{\"zero\":\"no files attached (maximum is %{max} files)\",\"one\":\"too many files attached (maximum is %{max} files, got %{count})\",\"other\":\"too many files attached (maximum is %{max} files, got %{count})\"},\"media_metadata_missing\":\"is not a valid media file\",\"dimension_min_not_included_in\":\"must be greater than or equal to %{width} x %{height} pixel\",\"dimension_max_not_included_in\":\"must be less than or equal to %{width} x %{height} pixel\",\"dimension_width_not_included_in\":\"width is not included between %{min} and %{max} pixel\",\"dimension_height_not_included_in\":\"height is not included between %{min} and %{max} pixel\",\"dimension_width_not_greater_than_or_equal_to\":\"width must be greater than or equal to %{length} pixel\",\"dimension_height_not_greater_than_or_equal_to\":\"height must be greater than or equal to %{length} pixel\",\"dimension_width_not_less_than_or_equal_to\":\"width must be less than or equal to %{length} pixel\",\"dimension_height_not_less_than_or_equal_to\":\"height must be less than or equal to %{length} pixel\",\"dimension_width_not_equal_to\":\"width must be equal to %{length} pixel\",\"dimension_height_not_equal_to\":\"height must be equal to %{length} pixel\",\"aspect_ratio_not_square\":\"must be square (current file is %{width}x%{height}px)\",\"aspect_ratio_not_portrait\":\"must be portrait (current file is %{width}x%{height}px)\",\"aspect_ratio_not_landscape\":\"must be landscape (current file is %{width}x%{height}px)\",\"aspect_ratio_not_x_y\":\"must be %{authorized_aspect_ratios} (current file is %{width}x%{height}px)\",\"aspect_ratio_invalid\":\"has an invalid aspect ratio (valid aspect ratios are %{authorized_aspect_ratios})\",\"file_not_processable\":\"is not identified as a valid media file\",\"restrict_dependent_destroy\":{\"one\":\"Cannot delete record because a dependent %{record} exists.\",\"many\":\"Cannot delete record because dependent %{record} exist.\",\"count_one\":\"Cannot delete record because %{count} dependent record exists.\",\"count_other\":\"Cannot delete record because %{count} dependent records exist.\"}},\"template\":{\"body\":\"There were problems with the following fields:\",\"header\":{\"one\":\"%{count} error prohibited this %{model} from being saved\",\"other\":\"%{count} errors prohibited this %{model} from being saved\"}},\"active_job_error\":\"Error while processing background job. Please contact support.\",\"active_job_error_will_retry\":\"Error while processing background job. We'll retry, please wait …\",\"active_job_not_found\":\"Background job not found. Pleas contact support.\",\"active_job_unknown_status\":\"Unknown state of background job. Please contact support.\",\"connection_refused\":\"Connection refused\",\"file_corrupted\":\"File corrupted.\",\"file_invalid\":\"Invalid file format.\",\"has_errors\":\"This object has the following errors:\",\"no_estate_or_service_group_category_assigned\":\"No Estate and no Service Group Category have been assigned.\",\"no_resource_selected\":\"No %{resource} selected\",\"no_resource_this_month\":\"No %{resource} for this month.\",\"not_authorized\":\"You are not authorized to perform this action.\",\"not_found\":\"Not found\",\"not_found_item\":\"%{item} not found\",\"not_found_within_organization\":\"Record not available (within your currently selected Organization).\",\"record\":{\"one\":\"record\",\"other\":\"records\"},\"session_expired\":\"Session expired, please reload.\",\"session_memberships_none_confirmed\":\"No User account is confirmed/activated.\",\"ticket_no_workflow_yet\":\"No Workflow set up for this location yet.\",\"too_many_children\":\"At max %{number} %{resource} per %{parent} permitted.\"},\"activerecord\":{\"errors\":{\"messages\":{\"record_invalid\":\"Validation failed: %{errors}\",\"restrict_dependent_destroy\":{\"has_one\":\"Cannot delete record because a dependent %{record} exists\",\"has_many\":\"Cannot delete record because dependent %{record} exist\"}},\"models\":{\"contact_person\":{\"attributes\":{\"email\":{\"email\":\"is not valid\"}}},\"inspection\":{\"attributes\":{\"rated_inspected_services\":{\"too_short\":\"can't be all deselected\"}}},\"monitoring\":{\"attributes\":{\"template_fields_at_least_one\":\"at least one has to be created\"}}}},\"attributes\":{\"contact_person\":{\"estate_ids\":\"Estates\",\"emails\":\"E-Mail(s)\",\"contact_type_list\":{\"internal\":\"Internal\",\"external\":\"External\"}},\"document\":{\"document_category_id\":\"Category\"},\"inspection\":{\"additional_inspectors_short\":\"Add. Inspectors\",\"administered_by_short\":\"Admin. by\",\"administered_by_list\":{\"contractor\":\"Contractor\",\"client\":\"Client\",\"both\":\"Both\"},\"building\":\"Building\",\"floor\":\"Floor\",\"floor_id\":\"Floor\",\"corrected\":\"Corrected\",\"corrected_inspections_short\":\"Corr.\",\"defect\":\"Deficiency\",\"defects\":\"Deficiencies\",\"estate\":\"Estate\",\"membership_id\":\"Inspector\",\"room_name\":\"Unit/Room\",\"edited_on\":\"Edited on ✓\",\"fixed_on\":\"Fixed on ✓\",\"service_group_category\":\"Service Group Category\",\"service_group_category_short\":\"SG-Category\",\"service_group_id\":\"Service Group\",\"service_group_weight\":\"Weight\",\"service_name\":\"Service\",\"rated_inspected_services\":\"Services\",\"result_short\":\"Res.\"},\"inspected_service\":{\"correction_comment\":\"Comment for correction\",\"correction_date\":\"Date of correction\",\"correction_details\":\"Corrected %{date} from %{corrector}: %{correction_comment}\",\"comment\":\"Comment\",\"image\":\"Image\"},\"inspection_settings\":{\"estate_id\":\"Estate\",\"rating_type\":\"Rating type\",\"rating_type_list\":{\"rating_lights\":\"3-Steps (Lights)\",\"rating_ten_percent_steps\":\"10%-Steps\"},\"evaluation_system\":\"Evaluation system\",\"evaluation_system_list\":{\"evaluation_grades\":\"Grades\",\"evaluation_lights\":\"Traffic lights\"},\"inspection_evaluation_lights\":\"Traffic Lights\",\"inspection_evaluation_grades\":{\"one\":\"Grade\",\"other\":\"Grades\"}},\"notice\":{\"completed_at\":\"Closed/rejected\",\"contact_person_id\":\"Contact Person/Recipient\",\"cost_center\":\"Cost Center\",\"duration\":\"Response time\",\"duration_dd_hh_mm_ss\":\"Response time (DD:HH:MM:SS)\",\"membership_id\":\"Notifier\",\"notice_kind_id\":\"Notice Type\",\"priority_short\":\"Prio\",\"priority_list\":{\"low\":\"low\",\"medium\":\"normal\",\"high\":\"high\"},\"room_name\":\"Unit/Room\",\"state_short\":\"Stat.\",\"state_list\":{\"accept\":\"accepted\",\"approve\":\"approved\",\"close\":\"closed\",\"open\":\"open\",\"deny\":\"rejec./resp.\",\"begin_work\":\"in the works\"}},\"notice/message\":{\"billing\":\"Verrechnung\",\"state_change_list\":{\"accept\":\"accept\",\"approve\":\"freigeben\",\"begin_work\":\"begin work\",\"close\":\"close\",\"deny\":\"reject\",\"open\":\"open\"}},\"notice/kind\":{\"cost_center\":\"Cost Center\"},\"monitoring/sheet\":{\"room_name\":\"Unit/Room\"},\"monitoring/template_field\":{\"kind\":\"Type\",\"kind_list\":{\"text\":\"Text\",\"boolean\":\"Yes/No\",\"integer\":\"Integer\",\"decimal\":\"Decimal\",\"time\":\"Time\",\"selection\":\"Selection\"},\"name\":\"Name\",\"required\":\"Required\"},\"organization\":{\"latest_data_acquisition\":\"Latest Acquisiton\"},\"qr_code\":{\"blank\":\"blank\",\"non_blank\":\"non blank\",\"report_type\":\"Report type\",\"location\":\"Location\",\"location_type\":\"Location type\",\"use_count\":\"Number of Scans\",\"room_name\":\"Unit/Room\",\"notice_kind_id\":\"Notice Type\",\"service_group_id\":\"Service Group\",\"ticket_kind_id\":\"Ticket Kind\",\"time_tracking_type_ids\":\"Time Tracking Types\"},\"qr_code/settings\":{\"show_meta_data\":\"Show Metadata\",\"show_logo\":\"Show logo\"},\"reports_schedule\":{\"mailer_active\":\"Active Mailers\",\"administered_by\":\"Administered by\",\"administered_by_list\":{\"contractor\":\"Contractor\",\"client\":\"Client\",\"both\":\"Both\"}},\"role\":{\"available_roles\":{\"acquisitor\":\"Acquisitor\",\"analyst\":\"Analyst\",\"controller\":\"Controller\",\"manager\":\"Manager\"}},\"service\":{\"points\":\"Points\"},\"ticket\":{\"accountless_author_name\":\"Author\",\"accountless_author_email\":\"E-Mail\",\"completed_at\":\"Completed\",\"cost_center\":\"Cost Center\",\"description\":\"Description\",\"estate\":\"Estate\",\"files\":\"Attachments\",\"floor_id\":\"Floor\",\"membership_id\":\"Author\",\"priority\":{\"one\":\"Priority\",\"other\":\"Priorities\"},\"priority_short\":\"Prio\",\"priority_list\":{\"low\":\"low\",\"medium\":\"normal\",\"high\":\"high\"},\"room_name\":\"Unit/Room\",\"state\":{\"one\":\"State\",\"other\":\"State\"},\"state_short\":\"Stat.\",\"state_list\":{\"closed\":\"closed\",\"open\":\"open\"},\"ticket_kind_id\":\"Ticket Kind\",\"workflow_progress\":\"Progress\",\"workflow_progress_steps\":{\"closed\":\"Geschlossen\",\"waiting_for_edit\":\"Waiting for processing\",\"waiting_for_edit_by\":\"Waiting for processing by %{membership}\"}},\"ticket/kind\":{\"cost_center\":\"Cost Center\",\"tickets\":\"Tickets\"},\"ticket/settings\":{\"budget_facility_manager\":\"Budget Facility manager\",\"budget_estate_supervisor\":\"Budget Estate supervisor\",\"workflow_step_reminder_delay_days\":\"Reminder E-Mail for non-processing\"},\"ticket/trade\":{\"estate_ids\":\"Estates\",\"name\":\"Name\",\"city\":\"City\",\"zipcode\":\"Zipcode\",\"street\":\"Street\",\"web\":\"Website (URL)\",\"contact_full_name\":\"Contact Person\",\"contact_first_name\":\"Contact Person first name\",\"contact_last_name\":\"Contact Person last name\",\"contact_email\":\"Contact Person E-Mail\",\"contact_phone\":\"Contact Person Phone\"},\"ticket/order\":{\"description\":\"Description\",\"progress\":\"Progress\",\"progress_steps\":{\"waiting_for_cost_estimate\":\"Inquiry sent to Trade\",\"waiting_for_cost_estimate_approval\":\"Waiting for Cost Estimate approval\",\"waiting_for_completion\":\"Waiting for completion\",\"completed\":\"Completed\",\"approved\":\"Approved\"},\"trade_id\":\"Trade\"},\"ticket/order/comment\":{\"add_comment_approval\":\"Approve/Comment\",\"add_comment\":\"Comment\",\"content\":\"Comment\",\"files\":\"Attachments\"},\"ticket/order/bill\":{\"files\":\"Attachments\",\"amount_net\":\"Amount (net)\",\"billing_date\":\"Billing date\",\"description\":\"Description\",\"due_date\":\"Due date\"},\"ticket/order/cost_estimate\":{\"files\":\"Attachments\",\"amount_net\":\"Amount (net)\",\"approved\":\"Approved\",\"approved_by\":\"Approved by\",\"description\":\"Description\",\"implementation_date\":\"Implementation date\"},\"ticket/order/completion\":{\"approved\":\"Approved\",\"files\":\"Attachments\",\"description\":\"Description\"},\"ticket/workflow\":{\"estate_id\":\"Estate\",\"ticket_workflow_memberships\":{\"one\":\"User\",\"other\":\"Users\"}},\"ticket/workflow_membership\":{\"membership_id\":\"User\",\"role\":\"Role\",\"role_list\":{\"main_contact\":\"Main contact\",\"estate_supervisor\":\"Estate supervisor\",\"facility_manager\":\"Facility manager\",\"chief_executive\":\"Chief Executive\"},\"authorized_for_completion_approval\":\"Approval authorization Completion\"},\"ticket/workflow_step\":{\"description\":\"Description\",\"files\":\"Attachments\",\"role\":\"Role\",\"role_list\":{\"main_contact\":\"Main contact\",\"estate_supervisor\":\"Estate supervisor\",\"facility_manager\":\"Facility manager\",\"chief_executive\":\"Chief Executive\",\"cost_estimate_approver\":\"User authorized to approve Cost Estimate\",\"completion_approver\":\"User authorized to approve Completion\",\"trade\":\"Trade\"}},\"time_tracking\":{\"capture_location_true\":\"Location captured\",\"capture_location_progress\":\"Location capturing in progress\",\"capture_location_false\":\"Could not capture location\",\"duration_dd_hh_mm_ss\":\"Duration (DD:HH:MM:SS)\",\"membership_id\":\"Employee\",\"time_tracking_type_id\":\"Time Tracking Type\",\"time_tracking_type_ids\":\"Time Tracking Type(s)\"},\"user\":{\"email_backup\":\"E-Mail\",\"current_sign_in_at\":\"Current sign in\",\"settings_language\":\"Language\",\"settings_view_list\":{\"table_view\":\"Table view\",\"table_view_short\":\"Table\",\"grid_view\":\"Grid view\",\"grid_view_short\":\"Grid\"}},\"vehicle\":{\"classification\":\"Classification\",\"classification_list\":{\"automobile\":\"Car\",\"truck\":\"Truck\",\"bicycle\":\"Motorcycle/Biycle\",\"utility\":\"Utility\",\"other_class\":\"Other\"},\"maker\":\"Maker\",\"model\":\"Model\",\"first_registration\":\"First registration\",\"vin\":\"Vehicle identification number/VIN\",\"vin_short\":\"VIN\"}},\"abbreviations\":{\"contact_person\":\"CP\"},\"models\":{\"building\":{\"one\":\"Building\",\"other\":\"Buildings\"},\"check_in\":{\"one\":\"Check-In\",\"other\":\"Check-Ins\"},\"contact_person\":{\"one\":\"Contact person\",\"other\":\"Contact persons\"},\"document\":{\"one\":\"Document\",\"other\":\"Documents\"},\"document_category\":{\"one\":\"Document category\",\"other\":\"Document categories\"},\"estate\":{\"one\":\"Estate\",\"other\":\"Estates\"},\"feature_module\":{\"one\":\"Module\",\"other\":\"Modules\"},\"floor\":{\"one\":\"Floor\",\"other\":\"Floors\"},\"inspection\":{\"one\":\"Inspection\",\"other\":\"Inspections\"},\"inspection_settings\":{\"one\":\"Inspection settings\",\"other\":\"Inspection settings\"},\"inspection_evaluation_grades\":{\"one\":\"Grades\",\"other\":\"Grades\"},\"inspection_evaluation_lights\":{\"one\":\"Traffic Lights\",\"other\":\"Traffic Lights\"},\"membership\":{\"one\":\"Membership\",\"other\":\"Memberships\"},\"notice\":{\"one\":\"Notice\",\"other\":\"Notices\"},\"notice/kind\":{\"one\":\"Notice Type\",\"other\":\"Notice Types\"},\"notice/settings\":{\"one\":\"Notice settings\",\"other\":\"Notice settings\"},\"organization\":{\"one\":\"Organization\",\"other\":\"Organizations\"},\"qr_code\":{\"one\":\"QR-Code\",\"other\":\"QR-Codes\"},\"qr_code/settings\":{\"one\":\"QR-Code-Settings\",\"other\":\"QR-Code-Settings\"},\"reports_schedule\":{\"one\":\"Report Schedule\",\"other\":\"Report Schedules\"},\"service\":{\"one\":\"Service\",\"other\":\"Services\"},\"service_group\":{\"one\":\"Service Group\",\"other\":\"Service Groups\"},\"service_group_category\":{\"one\":\"Service Group Category\",\"other\":\"Service Group Categories\"},\"ticket\":{\"one\":\"Ticket\",\"other\":\"Tickets\"},\"ticket/order/bill\":{\"one\":\"Bill\",\"other\":\"Bills\"},\"ticket/order/cost_estimate\":{\"one\":\"Cost Estimate\",\"other\":\"Cost Estimates\"},\"ticket/order/completion\":{\"one\":\"Order Completion\",\"other\":\"Order Completions\"},\"ticket/kind\":{\"one\":\"Ticket Kind\",\"other\":\"Ticket Kinds\"},\"ticket/trade\":{\"one\":\"Trade\",\"other\":\"Trades\"},\"ticket/settings\":{\"one\":\"Ticket settings\",\"other\":\"Ticket settings\"},\"ticket/order\":{\"one\":\"Order\",\"other\":\"Orders\"},\"ticket/order/comment\":{\"one\":\"Comment\",\"other\":\"Comments\"},\"ticket/workflow\":{\"one\":\"Workflow\",\"other\":\"Workflows\"},\"ticket/workflow_membership\":{\"one\":\"User\",\"other\":\"User\"},\"time_tracking_type\":{\"one\":\"Time Tracking Type\",\"other\":\"Time Tracking Types\"},\"time_tracking\":{\"one\":\"Time Tracking\",\"other\":\"Time Trackings\"},\"time_tracking/membership_notification_setting\":{\"one\":\"Notification Time Trackings\",\"other\":\"Notifications Time Trackings\"},\"time_tracking/membership_notification_contact\":{\"one\":\"Notified contact\",\"other\":\"Notified contacts\"},\"user\":{\"one\":\"User\",\"other\":\"Users\"}}},\"datetime\":{\"distance_in_words\":{\"half_a_minute\":\"0.5 min\",\"less_than_x_seconds\":{\"one\":\"\\u003c 1 sec\",\"other\":\"\\u003c %{count} secs\"},\"x_seconds\":{\"one\":\"1 second\",\"other\":\"%{count} seconds\"},\"less_than_x_minutes\":{\"one\":\"\\u003c a min\",\"other\":\"\\u003c %{count} mins\"},\"x_minutes\":{\"one\":\"1 min\",\"other\":\"%{count} mins\"},\"about_x_hours\":{\"one\":\"ca. 1 hr\",\"other\":\"ca. %{count} hrs\"},\"x_days\":{\"one\":\"1 day\",\"other\":\"%{count} days\"},\"about_x_months\":{\"one\":\"ca. 1 mth\",\"other\":\"ca. %{count} mths\"},\"x_months\":{\"one\":\"1 mth\",\"other\":\"%{count} mths\"},\"about_x_years\":{\"one\":\"ca. 1 yr\",\"other\":\"ca. %{count} yrs\"},\"over_x_years\":{\"one\":\"\\u003e 1 yr\",\"other\":\"\\u003e %{count} yrs\"},\"almost_x_years\":{\"one\":\"almost 1 yr\",\"other\":\"almost %{count} yrs\"},\"x_years\":{\"one\":\"1 yr\",\"other\":\"%{count} yrs\"}},\"prompts\":{\"year\":\"Year\",\"month\":\"Month\",\"day\":\"Day\",\"hour\":\"Hour\",\"minute\":\"Minute\",\"second\":\"Seconds\",\"days\":\"Days\",\"hours\":\"Hours\",\"minutes\":\"Minutes\"},\"string_regexes\":{\"year\":\" \\\\d{4}\",\"year_month\":\" \\\\d{2}\\\\/\\\\d{4}\",\"year_month_day\":\"\\\\d{2}\\\\/\\\\d{2}\\\\/\\\\d{4}\"},\"string_formats\":{\"year\":\" yyyy\",\"year_month\":\" mm/yyyy\",\"year_month_day\":\"mm/dd/yyyy\"},\"strftime\":{\"year\":\" %Y\",\"year_month\":\" %m/%Y\",\"year_month_day\":\"%m/%d/%Y\"}},\"helpers\":{\"select\":{\"prompt\":\"Please select\"},\"submit\":{\"create\":\"Create %{model}\",\"update\":\"Update %{model}\",\"submit\":\"Save %{model}\"}},\"flash\":{\"actions\":{\"create\":{\"notice\":\"%{resource_name} was successfully created.\"},\"update\":{\"notice\":\"%{resource_name} was successfully updated.\"},\"destroy\":{\"notice\":\"%{resource_name} was successfully destroyed.\",\"alert\":\"%{resource_name} could not be destroyed.\"}},\"create\":\"%{resource} successfully created.\",\"exists\":\"%{resource} already exists.\",\"exists_not\":\"%{resource} was not found.\",\"update\":\"%{resource} successfully updated.\",\"destroy\":\"%{resource} successfully deleted.\",\"found\":\"%{resource} found.\"},\"ice_cube\":{\"pieces_connector\":\" / \",\"not\":\"not %{target}\",\"not_on\":\"not on %{target}\",\"date\":{\"formats\":{\"default\":\"%B %-d, %Y\"}},\"times\":{\"other\":\"%{count} times\",\"one\":\"%{count} time\"},\"until\":\"until %{date}\",\"days_of_week\":\"%{segments} %{day}\",\"days_of_month\":{\"other\":\"%{segments} days of the month\",\"one\":\"%{segments} day of the month\"},\"days_of_year\":{\"other\":\"%{segments} days of the year\",\"one\":\"%{segments} day of the year\"},\"at_hours_of_the_day\":{\"other\":\"on the %{segments} hours of the day\",\"one\":\"on the %{segments} hour of the day\"},\"on_minutes_of_hour\":{\"other\":\"on the %{segments} minutes of the hour\",\"one\":\"on the %{segments} minute of the hour\"},\"at_seconds_of_minute\":{\"other\":\"at the %{segments} seconds\",\"one\":\"at the %{segments} second\"},\"on_seconds_of_minute\":{\"other\":\"on the %{segments} seconds of the minute\",\"one\":\"on the %{segments} second of the minute\"},\"each_second\":{\"one\":\"Secondly\",\"other\":\"Every %{count} seconds\"},\"each_minute\":{\"one\":\"Minutely\",\"other\":\"Every %{count} minutes\"},\"each_hour\":{\"one\":\"Hourly\",\"other\":\"Every %{count} hours\"},\"each_day\":{\"one\":\"Daily\",\"other\":\"Every %{count} days\"},\"each_week\":{\"one\":\"Weekly\",\"other\":\"Every %{count} weeks\"},\"each_month\":{\"one\":\"Monthly\",\"other\":\"Every %{count} months\"},\"each_year\":{\"one\":\"Yearly\",\"other\":\"Every %{count} years\"},\"on\":\"on the %{sentence}\",\"in\":\"in %{target}\",\"integer\":{\"negative\":\"%{ordinal} to last\",\"literal_ordinals\":{\"-1\":\"last\",\"-2\":\"2nd to last\"},\"ordinal\":\"%{number}%{ordinal}\",\"ordinals\":{\"default\":\"th\",\"1\":\"st\",\"2\":\"nd\",\"3\":\"rd\",\"11\":\"th\",\"12\":\"th\",\"13\":\"th\"}},\"on_weekends\":\"on Weekends\",\"on_weekdays\":\"on Weekdays\",\"days_on\":[\"Sundays\",\"Mondays\",\"Tuesdays\",\"Wednesdays\",\"Thursdays\",\"Fridays\",\"Saturdays\"],\"on_days\":\"on %{days}\",\"array\":{\"last_word_connector\":\", and \",\"two_words_connector\":\" and \",\"words_connector\":\", \"},\"string\":{\"format\":{\"day\":\"%{rest} %{current}\",\"day_of_week\":\"%{rest} %{current}\",\"day_of_month\":\"%{rest} %{current}\",\"day_of_year\":\"%{rest} %{current}\",\"hour_of_day\":\"%{rest} %{current}\",\"minute_of_hour\":\"%{rest} %{current}\",\"until\":\"%{rest} %{current}\",\"count\":\"%{rest} %{current}\",\"default\":\"%{rest} %{current}\"}}},\"i18n\":{\"plural\":{\"keys\":[\"one\",\"other\"],\"rule\":{}}},\"pagy\":{\"aria_label\":{\"nav\":{\"one\":\"Page\",\"other\":\"Pages\"},\"prev\":\"Previous\",\"next\":\"Next\"},\"prev\":\"\\u0026#XF104;\",\"next\":\"\\u0026#XF105;\",\"gap\":\"\\u0026hellip;\",\"item_name\":{\"one\":\"item\",\"other\":\"items\"},\"info\":{\"no_items\":\"No %{item_name} found\",\"single_page\":\"Displaying %{count} %{item_name}\",\"multiple_pages\":\"Displaying %{item_name} %{from}-%{to} of %{count} in total\"},\"combo_nav_js\":\"Page %{page_input} of %{pages}\",\"limit_selector_js\":\"Show %{limit_input} %{item_name} per page\"},\"devise\":{\"confirmations\":{\"confirmed\":\"Your email address has been successfully confirmed.\",\"send_instructions\":\"You will receive an email with instructions for how to confirm your email address in a few minutes.\",\"send_paranoid_instructions\":\"If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes.\",\"didn_t_receive_confirmation_instructions\":\"Didn't receive confirmation instructions?\",\"confirmation_pending\":\"Currently waiting confirmation for: %{resource}\",\"conformation_pending_custom\":\"This User account is not verified yet. Please confirm the registration via the E-Mail that was sent to %{email} on %{date_sent}.\",\"resend\":\"Resend\",\"resend_instruction\":\"Resend confirmation instructions\"},\"failure\":{\"already_authenticated\":\"You are already signed in.\",\"inactive\":\"Your account is not activated yet.\",\"invalid\":\"Invalid %{authentication_keys} or password.\",\"locked\":\"Your account is locked.\",\"last_attempt\":\"You have one more attempt before your account is locked.\",\"not_found_in_database\":\"Invalid %{authentication_keys} or password.\",\"timeout\":\"Your session expired. Please sign in again to continue.\",\"unauthenticated\":\"You need to sign in or sign up before continuing.\",\"unconfirmed\":\"You have to confirm your email address before continuing.\"},\"mailer\":{\"confirmation_instructions\":{\"subject\":\"Confirmation instructions\",\"confirm_through_link\":\"You can confirm your account email through the link below:\",\"confirm_link\":\"Confirm my account\"},\"reset_password_instructions\":{\"subject\":\"Reset password instructions\"},\"unlock_instructions\":{\"subject\":\"Unlock instructions\"},\"email_changed\":{\"subject\":\"Email Changed\"},\"password_change\":{\"subject\":\"Password change\"}},\"omniauth_callbacks\":{\"failure\":\"Could not authenticate you from %{kind} because \\\"%{reason}\\\".\",\"success\":\"Successfully authenticated from %{kind} account.\"},\"passwords\":{\"no_token\":\"You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided.\",\"send_instructions\":\"You will receive an email with instructions on how to reset your password in a few minutes.\",\"send_paranoid_instructions\":\"If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes.\",\"updated\":\"Your password has been changed successfully. You are now signed in.\",\"updated_not_active\":\"Your password has been changed successfully.\",\"change_password\":\"Change my password\",\"changed_explanation\":\"We're contacting you to notify you that your password for %{email} has been changed.\",\"change_password_ignore\":\"If you didn't request this, please ignore this email.\",\"change_password_only_if_linkaccess\":\"Your password won't change until you access the link above and create a new one.\",\"change_password_requested\":\"Someone has requested a link to change your password. You can do this through the link below.\",\"create_password\":\"Create password\",\"create_password_first\":\"Welcome! Please create a password before continuing.\",\"send\":\"Send\",\"mail_instructions\":\"Send me reset password instructions\"},\"registrations\":{\"destroyed\":\"Bye! Your account has been successfully cancelled. We hope to see you again soon.\",\"signed_up\":\"Welcome! You have signed up successfully.\",\"signed_up_but_inactive\":\"You have signed up successfully. However, we could not sign you in because your account is not yet activated.\",\"signed_up_but_locked\":\"You have signed up successfully. However, we could not sign you in because your account is locked.\",\"signed_up_but_unconfirmed\":\"A message with a confirmation link has been sent to your email address. Please follow the link to activate your account.\",\"update_needs_confirmation\":\"You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address.\",\"updated\":\"Account has been updated successfully.\",\"updated_but_not_signed_in\":\"Your account has been updated successfully, but since your password was changed, you need to sign in again.\",\"sign_up\":\"Sign up\",\"register\":\"Register new Organization\",\"help\":\"If you're a member of an existing group in our system, click the activate link in the invitation email from your organization's admin. You should not sign up for a new organizational account.\",\"need_current_password\":\"We need your current password to confirm your changes\"},\"sessions\":{\"signed_in\":\"Signed in successfully.\",\"signed_out\":\"Signed out successfully.\",\"already_signed_out\":\"Signed out successfully.\",\"forgot_your_password\":\"Forgot your password?\",\"remember_me\":\"Remember me\",\"sign_in\":\"Sign in\",\"sign_in_to_account\":\"Sign into your account\"},\"unlocks\":{\"send_instructions\":\"You will receive an email with instructions for how to unlock your account in a few minutes.\",\"send_paranoid_instructions\":\"If your account exists, you will receive an email with instructions for how to unlock it in a few minutes.\",\"unlocked\":\"Your account has been unlocked successfully. Please sign in to continue.\",\"account_was_locked\":\"Your account has been locked due to an excessive number of unsuccessful sign in attempts.\",\"click_link_to_unlock\":\"Click the link below to unlock your account:\",\"didn_t_receive_unlock_instructions\":\"Didn't receive unlock instructions?\",\"unlock_my_account\":\"Unlock my account\"}},\"good_job\":{\"actions\":{\"destroy\":\"Destroy\",\"discard\":\"Discard\",\"force_discard\":\"Force discard\",\"inspect\":\"Inspect\",\"reschedule\":\"Reschedule\",\"retry\":\"Retry\"},\"batches\":{\"actions\":{\"confirm_retry\":\"Are you sure you want to retry this batch?\",\"retry\":\"Retry\"},\"index\":{\"older_batches\":\"Older batches\",\"title\":\"Batches\"},\"jobs\":{\"actions\":{\"confirm_destroy\":\"Are you sure you want to destroy this job?\",\"confirm_discard\":\"Are you sure you want to discard this job?\",\"confirm_reschedule\":\"Are you sure you want to reschedule this job?\",\"confirm_retry\":\"Are you sure you want to retry this job?\",\"destroy\":\"Destroy Job\",\"discard\":\"Discard Job\",\"reschedule\":\"Reschedule Job\",\"retry\":\"Retry Job\",\"title\":\"Actions\"},\"no_jobs_found\":\"No jobs found.\"},\"retry\":{\"notice\":\"Batch has been retried\"},\"show\":{\"attributes\":\"Attributes\",\"batched_jobs\":\"Batched Jobs\",\"callback_jobs\":\"Callback Jobs\"},\"table\":{\"no_batches_found\":\"No batches found.\"}},\"cleaner\":{\"index\":{\"all\":\"All\",\"class\":\"Class\",\"exception\":\"Exception\",\"grouped_by_class\":\"Discards grouped by Class\",\"grouped_by_exception\":\"Discards grouped by Exception\",\"last_1_hour\":\"Last 1 hour\",\"last_24_hours\":\"Last 24 hours\",\"last_3_days\":\"Last 3 days\",\"last_3_hours\":\"Last 3 hours\",\"last_7_days\":\"Last 7 days\",\"title\":\"Discard Cleaner\",\"total\":\"Total\"}},\"cron_entries\":{\"actions\":{\"confirm_disable\":\"Are you sure you want to disable this cron entry?\",\"confirm_enable\":\"Are you sure you want to enable this cron entry?\",\"confirm_enqueue\":\"Are you sure you want to enqueue this cron entry?\",\"disable\":\"Disable cron entry\",\"enable\":\"Enable cron entry\",\"enqueue\":\"Enqueue cron entry now\"},\"disable\":{\"notice\":\"Cron entry has been disabled.\"},\"enable\":{\"notice\":\"Cron entry has been enabled.\"},\"enqueue\":{\"notice\":\"Cron entry has been enqueued.\"},\"index\":{\"no_cron_schedules_found\":\"No cron schedules found.\",\"title\":\"Cron Schedules\"},\"show\":{\"cron_entry_key\":\"Cron Entry Key\"}},\"datetime\":{\"distance_in_words\":{\"about_x_hours\":{\"one\":\"about 1 hour\",\"other\":\"about %{count} hours\"},\"about_x_months\":{\"one\":\"about 1 month\",\"other\":\"about %{count} months\"},\"about_x_years\":{\"one\":\"about 1 year\",\"other\":\"about %{count} years\"},\"almost_x_years\":{\"one\":\"almost 1 year\",\"other\":\"almost %{count} years\"},\"half_a_minute\":\"half a minute\",\"less_than_x_minutes\":{\"one\":\"less than a minute\",\"other\":\"less than %{count} minutes\"},\"less_than_x_seconds\":{\"one\":\"less than 1 second\",\"other\":\"less than %{count} seconds\"},\"over_x_years\":{\"one\":\"over 1 year\",\"other\":\"over %{count} years\"},\"x_days\":{\"one\":\"1 day\",\"other\":\"%{count} days\"},\"x_minutes\":{\"one\":\"1 minute\",\"other\":\"%{count} minutes\"},\"x_months\":{\"one\":\"1 month\",\"other\":\"%{count} months\"},\"x_seconds\":{\"one\":\"1 second\",\"other\":\"%{count} seconds\"},\"x_years\":{\"one\":\"1 year\",\"other\":\"%{count} years\"}}},\"duration\":{\"hours\":\"%{hour}h %{min}m\",\"less_than_10_seconds\":\"%{sec}s\",\"milliseconds\":\"%{ms}ms\",\"minutes\":\"%{min}m %{sec}s\",\"seconds\":\"%{sec}s\"},\"error_event\":{\"discarded\":\"Discarded\",\"handled\":\"Handled\",\"interrupted\":\"Interrupted\",\"retried\":\"Retried\",\"retry_stopped\":\"Retry stopped\",\"unhandled\":\"Unhandled\"},\"helpers\":{\"relative_time\":{\"future\":\"in %{time}\",\"past\":\"%{time} ago\"}},\"jobs\":{\"actions\":{\"confirm_destroy\":\"Are you sure you want to destroy the job?\",\"confirm_discard\":\"Are you sure you want to discard the job?\",\"confirm_force_discard\":\"Are you sure you want to force discard this job? The job will be marked as discarded but the running job will not be stopped - it will, however, not be retried on failures.\",\"confirm_reschedule\":\"Are you sure you want to reschedule the job?\",\"confirm_retry\":\"Are you sure you want to retry the job?\",\"destroy\":\"Destroy job\",\"discard\":\"Discard job\",\"force_discard\":\"Force discard job\",\"reschedule\":\"Reschedule job\",\"retry\":\"Retry job\"},\"destroy\":{\"notice\":\"Job has been destroyed\"},\"discard\":{\"notice\":\"Job has been discarded\"},\"executions\":{\"application_trace\":\"Application Trace\",\"full_trace\":\"Full Trace\",\"in_queue\":\"in queue\",\"runtime\":\"runtime\",\"title\":\"Executions\"},\"force_discard\":{\"notice\":\"Job has been force discarded. It will continue to run but it will not be retried on failures\"},\"index\":{\"job_pagination\":\"Job pagination\",\"older_jobs\":\"Older jobs\"},\"reschedule\":{\"notice\":\"Job has been rescheduled\"},\"retry\":{\"notice\":\"Job has been retried\"},\"show\":{\"jobs\":\"Jobs\"},\"table\":{\"actions\":{\"apply_to_all\":{\"one\":\"Apply to all 1 job.\",\"other\":\"Apply to all %{count} jobs.\"},\"confirm_destroy_all\":\"Are you sure you want to destroy the selected jobs?\",\"confirm_discard_all\":\"Are you sure you want to discard the selected jobs?\",\"confirm_reschedule_all\":\"Are you sure you want to reschedule the selected jobs?\",\"confirm_retry_all\":\"Are you sure you want to retry the selected jobs?\",\"destroy_all\":\"Destroy all\",\"discard_all\":\"Discard all\",\"reschedule_all\":\"Reschedule all\",\"retry_all\":\"Retry all\",\"title\":\"Actions\"},\"no_jobs_found\":\"No jobs found.\",\"toggle_actions\":\"Toggle Actions\",\"toggle_all_jobs\":\"Toggle all jobs\"}},\"models\":{\"batch\":{\"created\":\"Created\",\"created_at\":\"Created at\",\"discarded\":\"Discarded\",\"discarded_at\":\"Discarded at\",\"enqueued\":\"Enqueued\",\"enqueued_at\":\"Enqueued at\",\"finished\":\"Finished\",\"finished_at\":\"Finished at\",\"jobs\":\"Jobs\",\"name\":\"Name\"},\"cron\":{\"class\":\"Class\",\"last_run\":\"Last run\",\"next_scheduled\":\"Next scheduled\",\"schedule\":\"Schedule\"},\"job\":{\"arguments\":\"Arguments\",\"attempts\":\"Attempts\",\"labels\":\"Labels\",\"priority\":\"Priority\",\"queue\":\"Queue\"}},\"number\":{\"format\":{\"delimiter\":\",\",\"separator\":\".\"},\"human\":{\"decimal_units\":{\"delimiter\":\",\",\"format\":\"%n%u\",\"precision\":3,\"separator\":\".\",\"units\":{\"billion\":\"B\",\"million\":\"M\",\"quadrillion\":\"Q\",\"thousand\":\"K\",\"trillion\":\"T\",\"unit\":\"\"}}}},\"pauses\":{\"index\":{\"confirm_pause\":\"Are you sure you want to pause %{value}?\",\"confirm_unpause\":\"Are you sure you want to resume %{value}?\",\"disabled\":\"GoodJob's experimental Pauses feature is disabled by default because it may degrade performance. Configure to enable\",\"job_class\":\"Job Class\",\"label\":\"Label\",\"pause\":\"Pause\",\"queue\":\"Queue\",\"title\":\"Pauses\",\"type\":\"Pause Type\",\"unpause\":\"Resume\",\"value\":\"Value\"}},\"performance\":{\"index\":{\"average_duration\":\"Average duration\",\"chart_title\":\"Total job execution time in seconds\",\"executions\":\"Executions\",\"job_class\":\"Job class\",\"maximum_duration\":\"Maximum duration\",\"minimum_duration\":\"Minimum duration\",\"queue_name\":\"Queue name\",\"title\":\"Performance\"},\"show\":{\"slow\":\"Slow\",\"title\":\"Performance\"}},\"processes\":{\"index\":{\"cron_enabled\":\"Cron enabled\",\"no_good_job_processes_found\":\"No GoodJob processes found.\",\"process\":\"Process\",\"schedulers\":\"Schedulers\",\"started\":\"Started\",\"title\":\"Processes\",\"updated\":\"Updated\"}},\"shared\":{\"boolean\":{\"false\":\"No\",\"true\":\"Yes\"},\"error\":\"Error\",\"filter\":{\"all\":\"All\",\"all_jobs\":\"All jobs\",\"all_queues\":\"All queues\",\"clear\":\"Clear\",\"job_name\":\"Job name\",\"placeholder\":\"Search by class, job id, job params, and error text.\",\"queue_name\":\"Queue name\",\"search\":\"Search\"},\"navbar\":{\"batches\":\"Batches\",\"cleaner\":\"Discard Cleaner\",\"cron_schedules\":\"Cron\",\"jobs\":\"Jobs\",\"live_poll\":\"Live Poll\",\"name\":\"GoodJob 👍\",\"pauses\":\"Pauses\",\"performance\":\"Performance\",\"processes\":\"Processes\",\"theme\":{\"auto\":\"Auto\",\"dark\":\"Dark\",\"light\":\"Light\",\"theme\":\"Theme\"}},\"pending_migrations\":\"GoodJob has pending database migrations.\",\"secondary_navbar\":{\"inspiration\":\"Remember, you're doing a Good Job too!\",\"last_updated\":\"Last updated\"}},\"status\":{\"discarded\":\"Discarded\",\"queued\":\"Queued\",\"retried\":\"Retried\",\"running\":\"Running\",\"scheduled\":\"Scheduled\",\"succeeded\":\"Succeeded\"}},\"recurring_select\":{\"not_recurring\":\"- not recurring -\",\"change_schedule\":\"Change schedule...\",\"set_schedule\":\"Set schedule...\",\"new_custom_schedule\":\"New custom schedule...\",\"custom_schedule\":\"Custom schedule...\",\"or\":\"or\"},\"boolean\":{\"nil\":\"-\",\"no\":\"No\",\"yes\":\"Yes\"},\"email\":\"E-Mail\",\"password\":\"Password\",\"phone\":\"Phone\",\"image\":\"Image\",\"attachment\":\"Attachment\",\"attributes\":{\"created_at\":\"Created at\",\"created_at_month\":\"Created at\",\"email\":\"E-Mail\",\"id\":\"ID\",\"file_name\":\"File name\",\"file_type\":\"File type\",\"file_size\":\"File size\",\"location\":\"Position\",\"password\":\"Password\",\"updated_at\":\"Updated at\",\"revision\":{\"one\":\"Revision\",\"other\":\"Revisions\"}},\"info\":{\"inspections\":{\"correct_service\":\"Fix\",\"correct_services\":\"Fix defects\",\"correct_services_short\":\"Fix\",\"correct_services_of_resource\":\"Fix defects of %{resource}\",\"rate_services\":\"Rate Services\",\"rate_services_all\":\"Rate all Services\",\"rate_services_all_value\":\"Set all Services to %{value}\",\"toggle_inspected_service_enable\":\"Enable Service\",\"toggle_inspected_service_disable\":\"Disable Service\"},\"notices\":{\"already_rated\":\"Notice already rated.\",\"autoclose_job\":{\"content\":\"Automatically closed upon expiry of processing time.\",\"content_short\":\"Upon expiry of processing time\"},\"notice_will_be_autoclosed_after_processing_time\":\"Notices with this Notice Type, will be automatically closed, after processing time, if it is set here.\"},\"static_documents\":{\"document_ready\":\"File is ready\",\"link_valid_for\":\"The link to the file is valid for %{lifetime}.\",\"preparation_in_progress\":\"Exporting file\",\"preparation_may_take_its_time\":\"\\\"%{filename}\\\" will be ready shortly.\",\"excel_documents\":{\"retroactive_one_year\":\"max. 10k, up till sel. date\"}},\"invite_user\":\"Add a User to %{organization}\",\"invite_user_description\":\"The new user of your organization will receive an email with an activation link within minutes.\",\"membership_in\":\"Member of these Organizations\",\"inactive\":\"(Inactive)\",\"not_disable_self\":\"You can not disable your own Account\",\"tickets\":{\"ticket_will_be_autoclosed_on_last_workflow_step\":\"Last Workflow step, Ticket will be closed on save automatically.\"}},\"form\":{\"choose_resource\":\"Choose %{resource}\",\"help\":{\"between_x_and_y\":\"Value must be between %{x} and %{y}\",\"confirm_input\":\"Verify input\",\"file_formats_allowed\":\"Allowed file formats: %{formats}\",\"including_international_area_code\":\"Incl. intl area code\",\"optional\":\"Optional\",\"unique\":\"Must be unique\",\"min_length\":\"Has to be at least %{min_length} characters\",\"notified_by_mail\":\"Will be notified by E-Mail\",\"set_automatically\":\"Set automatically\",\"user_has_not_submitted_location\":\"%{user} has not submitted his/her location.\"},\"hint\":{\"contact_person_type\":\"Please choose type 'internal' for contact persons, that already have a user account. This can't be changed later.\",\"for_sorting\":\"For sorting (1-n; 1 is lowest)\",\"instance_must_be_saved\":\"The data listed below was successfully created and can be saved by you now. Please verify this data thoroughly, as it can't be modified afterwards\",\"irreversible\":\"This action can't be undone\",\"no_elements_for_instance\":\"There are no %{elements} for this %{model} yet. Add %{elements} to this %{model} first.\",\"new_access_to_resource\":\"You can grant access to %{resource} to Users from different Organizations/Accounts.\",\"new_order_for_trade\":\"The Trade selected here, will receive a request to submit a Cost Estimate for this Ticket.\",\"while_data_acquisition_is_running\":\"While a %{data_acquisition} is running, you can start other acquisitions within this app or close it and return later. An Incomplete %{data_acquisition} will be deleted after 24 hours.\",\"fix_defect_inspection\":\"Here you can fix/correct a defect Inspection. If you comment on a Service, points actual are set automatically to match points target. When the Inspection has no more defect Inspections, the result is set to 100% and the Inspection is not listed under defect Inspections anymore. You can also cancel the correction process if you want.\",\"defect_inspection_max_correction_timeframe_exceeded\":\"As the maximum timeframe for corrections was exceeded, corrections made now won't change the result for this Inspection.\",\"inspection_settings_rating_system\":\"System used to rate of single Services\",\"inspection_settings_evaluation_system\":\"System used for evaluation, e.g. Reports\",\"inspection_settings_max_correction_timeframe\":\"If set, the correction of Inspections must happen within this timeframe or the result won't be changed.\",\"reports_will_be_sent_if_there_are_any_data_acquisitions\":\"Reports will be sent, when there are any Data Acquisitions for the selected Reports kind, time period and Estate.\"}},\"navigation\":{\"administration\":\"Administration\",\"access\":\"Access\",\"acquisition_of_data\":\"Acquisition\",\"acquisitions\":\"Acquisitions\",\"back\":\"Previous\",\"cancel\":\"Cancel\",\"cancel_data_acquisition\":\"Cancel %{data_acquisition}\",\"crud\":{\"add\":\"Add\",\"add_resource\":\"Add %{resource}\",\"add_another_resource\":\"Add another %{resource}\",\"actions\":\"Actions\",\"activate\":\"Activate %{resource}\",\"change_resource\":\"Change %{resource}\",\"close_resource\":\"Close %{resource}\",\"confirm_resource\":\"Confirm %{resource}\",\"copy\":\"Copy\",\"copy_resource\":\"Copy %{resource}\",\"deactivate\":\"Deactivate\",\"deactivate_resource\":\"Deactivate %{resource}\",\"delete\":\"Delete\",\"delete_resource\":\"Delete %{resource}\",\"destroy\":\"Delete\",\"edit\":\"Edit\",\"edit_resource\":\"Edit %{resource}\",\"new\":\"New\",\"new_resource\":\"Add %{resource}\",\"number_of_resources\":\"Number of %{resources}\",\"rate_resource\":\"Rate %{resource}\",\"save\":\"Save\",\"save_resource\":\"Save %{resource}\",\"show\":\"Show\",\"show_resource\":\"Show %{resource}\"},\"filter\":\"Filter\",\"filter_search\":\"Filter search\",\"filter_from\":\"From\",\"filter_till\":\"Till\",\"filter_by\":\"Filter by:\",\"finalize\":\"Finalize\",\"filter_inactive\":\"Show inactive\",\"index\":\"Overview\",\"index_resource\":\"%{resource} overview\",\"inspection_end\":\"Finish Inspection\",\"inspections\":\"Inspections\",\"jump_to_content\":\"Jump to content\",\"hide\":\"Hide\",\"languages\":{\"de\":\"German\",\"en\":\"English\"},\"legend\":\"Legend\",\"login\":\"Login\",\"logout\":\"Logout\",\"my_user_account\":\"My User Account\",\"new_check_in\":\"New Check-In\",\"new_inspection\":\"New Inspection\",\"new_monitoring_sheet\":\"New Monitoring Sheet\",\"new_notice\":\"New Notice\",\"new_ticket\":\"New Ticket\",\"new_time_tracking\":\"New Time Tracking\",\"next\":\"Next\",\"none\":\"–\",\"of\":\"of\",\"ok\":\"OK\",\"page\":\"Page\",\"print\":\"Print\",\"search\":\"Search\",\"select\":\"Please select …\",\"reload\":\"Reload\",\"remove\":\"Remove\",\"reset\":\"Reset\",\"send\":\"Senden\",\"settings\":\"Settings\",\"show\":\"Show\",\"status\":\"Status\",\"step_x_of_y\":\"Step %{x} of %{y}\",\"switch_organization\":\"Switch Organization\",\"switched_organization\":\"Switched to %{organization}.\",\"time_tracking_start\":\"Start Time Tracking\",\"time_tracking_end\":\"Finish Time Tracking\",\"time_tracking_settings\":\"Time Tracking settings\",\"toggle_nav\":\"Toggle Navigation\",\"toggle_sidenav\":\"Toggle Sidebar\",\"top\":\"Back to top\",\"value_transfer\":\"Transfer values and …\"},\"pages\":{\"administration\":\"Administration\",\"analysis\":\"Analysis\",\"dashboard\":\"Dashboard\",\"help\":\"Help\",\"home\":\"Home\",\"imprint\":\"Imprint\",\"news\":\"New Features (de)\",\"privacy_policy\":\"Privacy Policy\",\"privacy_policy_statement\":\"Privacy Policy\",\"safety_of_processing\":\"Safety of data processing\",\"report_problem\":\"Report a Problem\",\"rights_management\":\"Rights Management\",\"user_profile_edit\":\"Edit User Profile\"},\"sms\":{\"time_tracking_started\":\"Hello %{contact_name}, a new Time Tracking was started at %{time} by %{membership_name} at %{organization_name} - %{estate_name}.\",\"time_tracking_ended\":\"Hello %{contact_name}, a Time Tracking was finished at %{time} by %{membership_name} at %{organization_name} - %{estate_name}.\"},\"snippets\":{\"account\":\"Account\",\"activity_pending\":\"%{activity} pending\",\"all\":\"All\",\"already_registerd\":\"Already registerd?\",\"by_percent\":\"by percent\",\"choose_all\":\"Choose all/none\",\"consumption\":\"Consumption\",\"contact\":\"Contact\",\"count_finished\":\"%{count} finished\",\"count\":\"Count\",\"created_at\":\"Created at\",\"date\":\"Date\",\"deactivate_resource\":\"Deactivate/activate %{resource}\",\"deactivate_contact_person_hint_html\":\"\\u003cp\\u003eAssociated notices are still saved.\\u003c/p\\u003e \\u003cp\\u003eAssociations to estates and report mailers will be deleted.\\u003c/p\\u003e \\u003cp\\u003eDeactivated contact persons will be shown with a name affix, e.g. “John Doe (Inactive)”\\u003c/p\\u003e \\u003cp\\u003eThis action can be undone.\\u003c/p\\u003e\",\"deactivate_user_hint_html\":\"\\u003cp\\u003eAll records are stored, but the user can't login anymore. \\u003c/p\\u003e \\u003cp\\u003eDeactivated users will be shown with a name affix, e.g. “John Doe (Inactive)”.\\u003c/p\\u003e \\u003cp\\u003eThis action can be undone.\\u003c/p\\u003e\",\"deactivate_user_with_contact_person_hint_html\":\"\\u003cp\\u003eIf this user is registered as a \\u003cb\\u003econtact person\\u003c/b\\u003e for Notices, this will be (de)activated as well.\\u003c/p\\u003e\",\"deactivate_ticket_trade_hint_html\":\"\\u003cp\\u003eAll records are stored, but the trade can't be used for new tickets.\\u003c/p\\u003e \\u003cp\\u003eDeactivated trades will be shown with a name affix, e.g. “Acme Corp (Inactive)”.\\u003c/p\\u003e \\u003cp\\u003eThis action can be undone.\\u003c/p\\u003e\",\"download\":\"Download\",\"export\":\"Export\",\"export_resource\":\"Export %{resource}\",\"for\":\"for\",\"free_text\":\"Free text\",\"from\":\"from\",\"general\":\"General\",\"goodbye\":\"Best regards\",\"greetings\":\"Hello\",\"inactive_email\":\"not@active.com\",\"inspection_template\":\"Template\",\"latest\":\"Latest\",\"more_than\":\"More than\",\"new_here\":\"New here?\",\"no_content\":\"No content\",\"only\":\"only\",\"overall\":\"Overall\",\"overview\":\"Overview\",\"rate_all\":\"Rate all\",\"rating\":\"Rating\",\"running_since\":\"%{resource}\",\"search\":\"Search\",\"set_x\":\"Set %{resource}\",\"type\":\"Type\",\"unconfirmed\":\"Unconfirmed\",\"up_to\":\"Up to\",\"view\":\"View\",\"was\":\"was\",\"welcome\":\"Welcome\"},\"monitoring_mailer\":{\"template_notification\":{\"subject\":\"Acquisition of Operating data is due soon\",\"greeting\":\"the following Operating data should be acquired at %{time}:\",\"create_monitoring_sheet\":\"You can start to input the data via the following link:\"}},\"mailer\":{\"links\":\"Some old E-Mail clients have problems with links. Please copy and paste the following link into your webbrowser, if you encounter problems.\",\"texts\":{\"and_number_of_other_attachments\":\"… and %{number} more file(s).\"},\"user_mailer\":{\"subjects\":{\"new_membership\":\"Access %{sender}\"},\"headings\":{\"new_membership\":\"You received access to another Organization\"},\"texts\":{\"confirm_my_membership\":\"Add my User account (%{user}) to the Organization %{organization}\",\"new_membership_details\":\"You received clearance to access %{organization}. From now on, you can access this Organization via the main navigation to view and enter data, according to the User rights you were given.\",\"access_organization\":\"To confirm your membership in this Organization, plese open the following link with your webbrowser\"}},\"notice_mailer\":{\"headings\":{\"close\":\"Finish/Close\",\"contact_details\":\"Contact details\",\"content\":\"Content\",\"overview\":\"Overwiew\"},\"subjects\":{\"notice_created\":\"New Notice %{id} from %{sender}\",\"notice_updated\":\"Notice %{id} has been updated.\"},\"texts\":{\"number_of_attachments\":\"%{number} file(s) in total.\",\"following_notice_was_sent\":\"the following notice was just sent from %{messenger_name} (%{account_name}).\",\"see_below\":\"See below how you can view and/or edit the notice.\",\"view_notice_in_browser\":\"You can view this notice in a webbrowser\"}},\"ticket_mailer\":{\"headings\":{\"approve\":\"Approve\",\"comment_approve_reject\":\"Approve/Reject\",\"kind\":\"Kind\",\"close\":\"Reject\",\"categorization\":\"Categorization\",\"content\":\"Content\",\"edit\":\"Edit\",\"message\":\"Message\",\"overview\":\"Overview\",\"ticket_from\":\"Ticket %{id} from %{sender}\"},\"subjects\":{\"ticket_created\":\"New Ticket from %{sender}\",\"ticket_has_new_cost_estimate\":\"New cost estimate for Ticket\",\"ticket_has_new_completion\":\"Order for Ticket is completed\",\"ticket_order_has_new_comment\":\"New comment for Order\",\"ticket_has_new_workflow_step\":\"Ticket\",\"ticket_has_new_order\":\"New order from %{sender}\",\"ticket_closed\":\"Ticket closed\",\"ticket_workflow_step_reminder\":\"Ticket %{id} is waiting to be processed\"},\"texts\":{\"number_of_attachments\":\"%{number} Datei(en) insgesamt.\",\"following_ticket_was_sent\":\"the following Ticket was submitted by %{messenger_name}.\",\"order_completed\":\"the Order for Ticket %{id} has been marked as completed by the Trade.\",\"new_comment\":\"a new comment for Ticket %{id} has been submitted.\",\"new_cost_estimate\":\"a new Cost Estimate for Ticket %{id} has been submitted.\",\"please_submit_cost_estimate\":\"please submit a Cost Estimate for the following Ticket.\",\"see_below\":\"See below how you can view and/or edit the ticket.\",\"thanks_for_creating_this_ticket\":\"thank you for submitting a new Ticket.\",\"ticket_closed\":\"the Ticket submitted by you, has been closed.\",\"view_ticket_in_browser\":\"You can view this Ticket in your webbrowser, by clicking on this button\",\"ticket_workflow_step_reminder\":\"Ticket %{id} is waiting since %{days} days for your processing.\"}},\"time_tracking_mailer\":{\"subjects\":{\"time_tracking_started\":\"New Time Tracking %{id} at %{organization} started\",\"time_tracking_ended\":\"Time Tracking %{id} at %{organization} ended\"},\"texts\":{\"time_tracking_started\":\"%{membership_name} has started a Time Tracking:\"}},\"reports_mailer\":{\"subjects\":{\"new_report_name\":\"New %{report_name}\"},\"texts\":{\"please_find_attachment_kind\":\"attached you find your \\\"%{report_name}\\\" (PDF-Format)\"}}},\"reports\":{\"report\":\"Report\",\"reports\":\"Reports\",\"inspections\":{\"achieved_points\":\"Points achieved\",\"achievable_points\":\"achievable\",\"before_correct_services_short\":\"before correction\",\"grouped_by_administered_by\":\"Administered by\",\"grouped_by_service_group_category\":\"Grouped by Service Group\",\"grade\":\"Grade\",\"of_which_are_red\":\"Of which are red\",\"of_which_are_yellow\":\"Of which are yellow\",\"of_which_are_green\":\"Of which are green\",\"rating_scale\":\"Rating scale\",\"result\":\"Result\",\"service_group_category_service_group\":\"Category / Service Group\",\"status\":\"Status\",\"toplist\":\"Most frequent defective Services\",\"toplist_short\":\"frequent defective Services\",\"toplist_empty\":\"No defective Services in this time period\",\"weight\":\"Weight\",\"with_100_percent\":\"Inspections passed (100%)\",\"with_less_than_100_percent\":\"Inspections not passed (\\u003c 100%)\",\"inspections_with_100_percent_quota\":\"Quota of passed Inspections\"},\"monitoring_sheets\":{\"grouped_by_template\":\"By Monitoring Template\"},\"charts\":{\"count_per\":{\"daily\":\"Number of %{acquisition} per hour\",\"monthly\":\"Number of %{acquisition} per day\",\"yearly\":\"Number of %{acquisition} per month\"},\"result_per\":{\"daily\":\"Result of %{acquisition} per hour\",\"monthly\":\"Result of %{acquisition} per day\",\"yearly\":\"Result of %{acquisition} per month\"},\"grouped_by_priority\":\"Grouped by Priority\",\"grouped_by_state\":\"Grouped by State\",\"accumulated_time\":\"Totaled duration in days\"},\"not_enough_data_yet\":\"Not enough records to generate a report (for the shown time period) yet.\",\"number_short\":\"Qty\",\"preparation_in_progress\":\"Report is being generated\",\"rank\":\"Rank\",\"reports_daily\":{\"title\":{\"one\":\"Daily Report\",\"other\":\"Daily Reports\"},\"time_trackings\":null},\"reports_defect_inspections\":{\"title\":\"Inspections/Deficiencies\"},\"reports_monthly\":{\"notices\":{\"grouped_by_notice_kind\":\"Grouped by Notice Type\",\"of_which_are_open\":\"Open\",\"of_which_are_closed\":\"Closed\",\"of_which_are_rejected\":\"Rejected\",\"title\":\"Monthly Report Notices\"},\"tickets\":{\"of_which_are_open\":\"Open\",\"of_which_are_closed\":\"Closed\",\"title\":\"Monthly Report Tickets\"},\"time_trackings\":{\"title\":\"Monthly Report Time Trackings\"},\"title\":{\"one\":\"Monthly Report\",\"other\":\"Monthly Reports\"}},\"reports_yearly\":{\"title\":{\"one\":\"Annual Report\",\"other\":\"Annual Reports\"}},\"select_time_period\":\"Period\",\"check_ins\":{\"grouped_by_location\":\"By Location\",\"no_room_name\":\"n. s.\"},\"time_trackings\":{\"locations\":\"Frequent Locations\",\"hint_locations\":\"For better performance, max. 100 locations are shown simultaneously\",\"grouped_by_time_tracking_type\":\"By Time Tracking Type\",\"grouped_by_duration\":\"By duration\",\"hint_time_tracking_types_count\":\"As there can be assigned multiple Time Tracking Types per Time Tracking, the number of of Trackings per Type does not necessarly correspond with the total number for the given time frame.\"},\"title\":{\"one\":\"Report\",\"other\":\"Reports\"}}},\"de\":{\"ice_cube\":{\"pieces_connector\":\" / \",\"not\":\"außer %{target}\",\"not_on\":\"außer am %{target}\",\"date\":{\"formats\":{\"default\":\"%-d. %B %Y\"},\"month_names\":[null,\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"],\"day_names\":[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"]},\"times\":{\"other\":\"%{count} mal\",\"one\":\"%{count} mal\"},\"until\":\"bis zum %{date}\",\"days_of_week\":\"%{segments} %{day}\",\"days_of_month\":{\"one\":\"%{segments} Tag des Monats\",\"other\":\"%{segments} Tag des Monats\"},\"days_of_year\":{\"one\":\"%{segments} Tag des Jahres\",\"other\":\"%{segments} Tag des Jahres\"},\"at_hours_of_the_day\":{\"one\":\"in der %{segments} Stunde des Tages\",\"other\":\"in der %{segments} Stunde des Tages\"},\"on_minutes_of_hour\":{\"one\":\"in der %{segments} Minute der Stunde\",\"other\":\"in der %{segments} Minute der Stunde\"},\"at_seconds_of_minute\":{\"one\":\"in der %{segments} Sekunde\",\"other\":\"in der %{segments} Sekunde\"},\"on_seconds_of_minute\":{\"one\":\"in der %{segments} Sekunde der Minute\",\"other\":\"in der %{segments} Sekunde der Minute\"},\"each_second\":{\"one\":\"Jede Sekunde\",\"other\":\"Alle %{count} Sekunden\"},\"each_minute\":{\"one\":\"Jede Minute\",\"other\":\"Alle %{count} Minuten\"},\"each_hour\":{\"one\":\"Stündlich\",\"other\":\"Alle %{count} Stunden\"},\"each_day\":{\"one\":\"Täglich\",\"other\":\"Alle %{count} Tage\"},\"each_week\":{\"one\":\"Wöchentlich\",\"other\":\"Alle %{count} Wochen\"},\"each_month\":{\"one\":\"Monatlich\",\"other\":\"Alle %{count} Monate\"},\"each_year\":{\"one\":\"Jährlich\",\"other\":\"Alle %{count} Jahre\"},\"on\":\"am %{sentence}\",\"in\":\"im %{target}\",\"integer\":{\"negative\":\"%{ordinal}. letzter\",\"literal_ordinals\":{\"-1\":\"letzten\",\"-2\":\"vorletzten\"},\"ordinal\":\"%{number}%{ordinal}\",\"ordinals\":{\"default\":\".\"}},\"on_weekends\":\"am Wochenende\",\"on_weekdays\":\"an Wochentagen\",\"days_on\":[\"Sonntags\",\"Montags\",\"Dienstags\",\"Mittwochs\",\"Donnerstags\",\"Freitags\",\"Samstags\"],\"on_days\":\"%{days}\",\"array\":{\"last_word_connector\":\" und \",\"two_words_connector\":\" und \",\"words_connector\":\", \"},\"string\":{\"format\":{\"day\":\"%{rest} %{current}\",\"day_of_week\":\"%{rest} %{current}\",\"day_of_month\":\"%{rest} %{current}\",\"day_of_year\":\"%{rest} %{current}\",\"hour_of_day\":\"%{rest} %{current}\",\"minute_of_hour\":\"%{rest} %{current}\",\"until\":\"%{rest} %{current}\",\"count\":\"%{rest} %{current}\",\"default\":\"%{rest} %{current}\"}}},\"date\":{\"abbr_day_names\":[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],\"abbr_month_names\":[null,\"Jan\",\"Feb\",\"Mär\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"],\"day_names\":[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],\"formats\":{\"default\":\"%d.%m.%Y\",\"long\":\"%e. %B %Y\",\"short\":\"%e. %b\",\"only_day\":\"%e\",\"month_short\":\"%b %Y\",\"month_short_alt\":\"%m %Y\",\"month_short_alt2\":\"%B %Y\",\"short_alt\":\"%B %Y\"},\"month_names\":[null,\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"],\"order\":[\"day\",\"month\",\"year\"],\"today\":\"Heute\",\"yesterday\":\"Gestern\",\"input\":{\"formats\":[\"default\",\"long\",\"short\"]}},\"time\":{\"am\":\"vormittags\",\"formats\":{\"default\":\"%A, %e. %B %Y, %H:%M Uhr\",\"long\":\"%A, %e. %B %Y, %H:%M Uhr\",\"short\":\"%e. %B, %H:%M Uhr\",\"short_alt\":\"%d.%m.%y, %H:%M\",\"short_alt_time\":\"%d.%m.%y, %H:%M Uhr\",\"time\":\"%H:%M\",\"time_clock\":\"%H:%M\",\"day\":\"%d. %B %Y\",\"day_name\":\"%A, %d. %B %Y\",\"day_name_time\":\"%A, %d.%m.%Y, %H:%M Uhr\",\"day_month_short\":\"%d.%m\",\"day_short\":\"%d.%m.%Y\",\"day_shorter\":\"%d.%m.%y\",\"month_short\":\"%b %Y\",\"month_short_alt\":\"%m %Y\",\"month_short_alt2\":\"%B %Y\",\"hour_minute\":\"%H:%M\",\"year\":\"%Y\"},\"pm\":\"nachmittags\",\"input\":{\"formats\":[\"long\",\"medium\",\"short\",\"default\",\"time\"]}},\"activerecord\":{\"errors\":{\"messages\":{\"record_invalid\":\"Gültigkeitsprüfung ist fehlgeschlagen: %{errors}\",\"restrict_dependent_destroy\":{\"has_one\":\"Datensatz kann nicht gelöscht werden, da ein abhängiger %{record}-Datensatz existiert.\",\"has_many\":\"Datensatz kann nicht gelöscht werden, da abhängige %{record} existieren.\"},\"min_size_error\":\"Dateigröße sollte weniger als %{min_size} betragen\",\"max_size_error\":\"Dateigröße sollte weniger als %{max_size} betragen\"},\"models\":{\"inspection\":{\"attributes\":{\"rated_inspected_services\":{\"too_short\":\"dürfen nicht alle abgewählt sein\"}}},\"monitoring\":{\"attributes\":{\"template_fields_at_least_one\":\"müssen vorhanden sein (mindestens ein Messpunkt)\"}}}},\"attributes\":{\"building\":{\"buildings\":\"Gebäude\",\"estate_id\":\"Objekt\",\"floors\":\"Stockwerke\"},\"check_in\":{\"building\":\"Gebäude\",\"date_today\":\"Datum/Zeitpunkt\",\"estate\":\"Objekt\",\"floor_id\":\"Stockwerk\",\"membership_id\":\"Benutzer\",\"room_name\":\"Einheit/Raum\",\"user_full_name\":\"Name\"},\"contact_person\":{\"contact_persons\":\"Kontaktpersonen\",\"contact_type\":\"Zuordnung\",\"contact_type_list\":{\"internal\":\"Intern\",\"external\":\"Extern\"},\"estate_ids\":\"Objekte\",\"first_name\":\"Vorname\",\"last_name\":\"Nachname\",\"full_name\":\"Name\",\"emails\":\"E-Mail(s)\",\"kind\":\"Zuordnung\",\"kind_list\":{\"external\":\"Extern\",\"internal\":\"Intern\"},\"membership_id\":\"Benutzer\",\"role\":\"Rolle\",\"phone\":\"Telefon\",\"notices\":\"Meldungen\"},\"document\":{\"file\":\"Datei\",\"estate_id\":\"Objekt\",\"document_category_id\":\"Kategorie\"},\"email\":{\"address\":\"Adresse\"},\"estate\":{\"address\":\"Adresse\",\"city\":\"Stadt\",\"zipcode\":\"Postleitzahl\",\"street\":\"Straße/Nr.\",\"buildings\":\"Gebäude\",\"contact_persons\":\"Kontaktpersonen\",\"time_trackings\":\"Zeiterfassungen\"},\"floor\":{\"floors\":\"Stockwerke\",\"estate_id\":\"Objekt\",\"building_id\":\"Gebäude\",\"inspections\":\"Prüfungen\",\"notices\":\"Meldungen\",\"position\":\"Reihenfolge\",\"time_trackings\":\"Zeiterfassungen\"},\"inspected_service\":{\"correction_comment\":\"Begründung\",\"correction_date\":\"Korrekturzeitpunkt\",\"correction_details\":\"Korrigiert am %{date} von %{corrector}: %{correction_comment}\",\"comment\":\"Anmerkung\",\"images\":\"Bilder\",\"image\":{\"one\":\"Bild\",\"other\":\"Bilder\"},\"points_actual\":\"Ist\",\"points_target\":\"Soll\"},\"inspection\":{\"additional_inspectors\":\"Zusätzliche Prüfer\",\"additional_inspectors_short\":\"Zus. Prüfer\",\"administered_by\":\"Durchgeführt von\",\"administered_by_short\":\"Durchgef. von\",\"administered_by_list\":{\"contractor\":\"Dienstleister\",\"client\":\"Kunde\",\"both\":\"Beide\"},\"building\":\"Gebäude\",\"comment\":\"Anmerkung\",\"corrected_inspections_short\":\"Beh.\",\"corrected_inspections\":\"Mängel behoben\",\"corrected\":\"Behoben\",\"date_time\":\"Datum \\u0026 Uhrzeit\",\"date_today\":\"Datum\",\"defect\":\"Mangel\",\"defects\":\"Mängel\",\"edited_on\":\"Bearbeitet am ✓\",\"estate\":\"Objekt\",\"fixed_on\":\"Behoben am ✓\",\"floor_id\":\"Stockwerk\",\"inspected_services\":\"Leistungen\",\"inspections\":\"Prüfungen\",\"membership_id\":\"Prüfer\",\"points_actual\":\"Ist\",\"points_target\":\"Soll\",\"rated_inspected_services\":\"Leistungen\",\"result_short\":\"Erg.\",\"result\":\"Ergebnis\",\"result_before_correction\":\"Ergebnis vor Mängelbehebung\",\"room_name\":\"Einh./Raum\",\"service_group_category\":\"Leistungsgruppen-Kategorie\",\"service_group_category_short\":\"LG-Kategorie\",\"service_group_id\":\"Leistungsgruppe\",\"service_group_weight\":\"Gewichtung\",\"service_name\":\"Leistung\",\"weight\":\"Gewichtung\",\"your_comment\":\"Ihre Anmerkung\"},\"inspection/inspected_services\":{\"correction_comment\":\"Begründung\"},\"inspection_settings\":{\"estate_id\":\"Objekt\",\"rating_type\":\"Bewertungsart\",\"rating_type_list\":{\"rating_lights\":\"Drei Abstufungen (Ampel)\",\"rating_ten_percent_steps\":\"10%-Schritte\"},\"evaluation_system\":\"Auswertungssystem\",\"evaluation_system_list\":{\"evaluation_grades\":\"Noten\",\"evaluation_lights\":\"Ampel\"},\"inspection_evaluation_lights\":\"Ampel\",\"inspection_evaluation_grades\":{\"one\":\"Note\",\"other\":\"Noten\"},\"max_correction_timeframe\":\"Mängelbehebungszeitraum\"},\"inspection_evaluation_grades\":{\"five_from\":\"5 von\",\"five_to\":\"5 bis\",\"four_from\":\"4 von\",\"four_to\":\"4 bis\",\"three_from\":\"3 von\",\"three_to\":\"3 bis\",\"two_from\":\"2 von\",\"two_to\":\"2 bis\",\"one_from\":\"1 von\",\"one_to\":\"1 bis\"},\"inspection_evaluation_lights\":{\"estate_id\":\"Objekt\",\"red_from\":\"Rot von\",\"red_to\":\"Rot bis\",\"yellow_from\":\"Gelb von\",\"yellow_to\":\"Gelb bis\",\"green_from\":\"Grün von\",\"green_to\":\"Grün bis\"},\"news_article\":{\"title\":\"Titel\",\"lead\":\"Aufmacher\",\"content\":\"Inhalt\",\"published_at\":\"Veröffentlichungsdatum\"},\"notice\":{\"notices\":\"Meldungen\",\"building\":\"Gebäude\",\"completed_at\":\"Geschlossen/abgelehnt\",\"contact_person_id\":\"Ansprechpartner/Empfänger\",\"contact_person_comment\":\"Kommentar des Ansprechpartners\",\"rework_comment\":\"Kommentar zur Nacharbeit\",\"description\":\"Beschreibung\",\"duration\":\"Reaktionszeit\",\"duration_dd_hh_mm_ss\":\"Reaktionszeit (DD:HH:MM:SS)\",\"estate\":\"Objekt\",\"floor_id\":\"Stockwerk\",\"membership_id\":\"Absender\",\"messenger_name\":\"Melder\",\"notice_kind_id\":\"Meldungsart\",\"cost_center\":\"Kostenstelle\",\"priority\":{\"one\":\"Priorität\",\"other\":\"Prioritäten\"},\"priority_short\":\"Prio\",\"priority_list\":{\"low\":\"niedrig\",\"medium\":\"normal\",\"high\":\"hoch\"},\"room_name\":\"Einheit/Raum\",\"rating\":\"Bewertung\",\"rateable_by_user\":\"Von mir bewertbar\",\"rating_quality\":\"Bewertung Qualität\",\"rating_speed\":\"Bewertung Geschwindigkeit\",\"rating_safety\":\"Bewertung Sicherheit\",\"state\":{\"one\":\"Status\",\"other\":\"Status\"},\"state_short\":\"Stat.\",\"state_list\":{\"accept\":\"abgenommen\",\"approve\":\"freigegeben\",\"close\":\"geschlossen\",\"open\":\"offen\",\"deny\":\"rückgem./abgel.\",\"begin_work\":\"in Arbeit\"}},\"notice/message\":{\"billing\":\"Verrechnung\",\"content\":\"Inhalt\",\"files\":\"Anhänge\",\"recipient\":\"Empfänger\",\"sender\":\"Absender\",\"state_change\":\"Statusänderung\",\"state_change_list\":{\"accept\":\"abnehmen\",\"approve\":\"freigeben\",\"begin_work\":\"Arbeit starten\",\"close\":\"schließen\",\"deny\":\"ablehnen\",\"open\":\"offen lassen\"},\"amount_gross\":\"Gesamtkosten\",\"amount_materials\":\"Materialkosten\",\"amount_surcharges\":\"Zahlungspfl. Zuschläge\",\"amount_hours\":\"Benötigte Stunden\"},\"notice/kind\":{\"cost_center\":\"Kostenstelle\",\"processing_time\":\"Bearbeitungszeit\",\"notice_description_required\":\"Beschreibung Meldung Pflichtfeld\",\"notice_rating_required\":\"Bewertung bei Abnahme benötigt\",\"notices\":\"Meldungen\"},\"notice/settings\":{\"send_autoclose_email\":\"Benachrichtigung via E-Mail bei automatischem Schließen\"},\"monitoring/sheet\":{\"building\":\"Gebäude\",\"estate\":\"Objekt\",\"date_today\":\"Datum\",\"floor\":\"Stockwerk\",\"location\":\"Position\",\"location_type\":\"Position Art\",\"location_id\":\"Position Name\",\"membership_id\":\"Kontrolleur\",\"template_id\":\"Betriebsdatenblatt\",\"room_name\":\"Einheit/Raum\"},\"monitoring/sheet_entry\":{\"images\":\"Bilder\"},\"monitoring/template\":{\"header_infos\":\"Kopfdaten\",\"field\":\"Messpunkte\",\"fields\":\"Messpunkte\",\"membership_id\":\"Zu benachrichtigen\",\"next_occurrence\":\"Nächste(r) Termin(e)\",\"recurring\":\"Wiederkehrend\",\"start_at\":\"Start\"},\"monitoring/template_field\":{\"name\":\"Name Messpunkt\",\"kind\":\"Art d. Feldes\",\"kind_list\":{\"boolean\":\"Ja/Nein\",\"date\":\"Datum\",\"decimal\":\"Dezimalzahl\",\"integer\":\"Ganzzahl\",\"link\":\"Link\",\"text\":\"Text\",\"time\":\"Zeit\",\"selection\":\"Auswahl\"},\"options\":\"Optionen\",\"required\":\"Pflichtfeld\",\"allow_images\":\"Bilder erlauben\"},\"organization\":{\"contractor_name\":\"Name Dienstleister\",\"contractor_legal_form\":\"Rechtsf. Dienstl.\",\"latest_data_acquisition\":\"Letzte Erfassung\",\"legal_form\":\"Rechtsform\",\"name\":\"Name\",\"inspections_quota\":\"Kontingent Prüfungen\",\"notices_quota\":\"Kontingent Meldungen\",\"tickets_quota\":\"Kontingent Tickets\",\"time_trackings_quota\":\"Kontingent Zeiterfassungen\"},\"qr_code\":{\"blank\":\"Blanko\",\"non_blank\":\"Ausgefüllt(e)\",\"data_acquisition_type\":\"Art Datenerfassung\",\"location\":\"Position\",\"location_type\":\"Art der Position\",\"url_key\":\"URL Schlüssel\",\"use_count\":\"Anzahl Scans\",\"room_name\":\"Einheit/Raum\",\"notice_kind_id\":\"Meldungsart\",\"ticket_kind_id\":\"Ticketart\",\"service_group_id\":\"Leistungsgruppe\",\"time_tracking_type_ids\":\"Zeiterfassungsarten\"},\"qr_code/settings\":{\"show_meta_data\":\"Metadaten anzeigen\",\"show_logo\":\"Logo anzeigen\"},\"reports_schedule\":{\"report_type\":\"Art des Berichts\",\"estate_id\":\"Objekt\",\"mailer_active\":\"Aktive Mailer\",\"time_period\":\"Zeitraum\",\"administered_by\":\"Durchgeführt von\",\"administered_by_list\":{\"contractor\":\"Dienstleister\",\"client\":\"Kunde\",\"both\":\"Beide\"},\"service_group_category_id\":\"Leistungsgruppen-Kategorie\",\"frequency\":{\"daily\":\"Täglich\",\"weekly\":\"Wöchentlich\",\"monthly\":\"Monatlich\"}},\"role\":{\"resource_type\":\"Ressourcentyp\",\"role\":\"Rolle\",\"estate_estate_id\":\"Objekt\",\"estate\":\"Objekt\",\"service_group_category\":\"Leistungsgruppen-Kategorie\",\"available_roles\":{\"acquisitor\":\"Erfasser/in\",\"analyst\":\"Analyst/in\",\"controller\":\"Controller/in\",\"manager\":\"Manager/in\"}},\"room\":{\"floors\":\"Stockwerke\",\"estate\":\"Objekt\",\"building\":\"Gebäude\",\"floor_id\":\"Stockwerk\",\"position\":\"Reihenfolge\"},\"service_group_category\":{\"service_groups\":\"Leistungsgruppen\"},\"service_group\":{\"service_groups\":\"Leistungsgruppen\",\"services\":\"Leistungen\",\"inspections\":\"Prüfungen\",\"name\":\"Name\",\"service_group_category_id\":\"Leistungsgruppen-Kategorie\",\"weight\":\"Gewichtung\"},\"service\":{\"services\":\"Leistungen\",\"service_group_category_id\":\"Leistungsgruppen-Kategorie\",\"service_group_id\":\"Leistungsgruppe\",\"frequency\":\"Häufigkeit\",\"points\":\"Punkte\",\"description\":\"Beschreibung\"},\"ticket\":{\"author_name\":\"Absender\",\"accountless_author_name\":\"Absender\",\"accountless_author_email\":\"E-Mail\",\"building\":\"Gebäude\",\"completed_at\":\"Abgeschlossen\",\"cost_center\":\"Kostenstelle\",\"description\":\"Beschreibung\",\"estate\":\"Objekt\",\"files\":\"Anhänge\",\"floor_id\":\"Stockwerk\",\"membership_id\":\"Absender\",\"priority\":{\"one\":\"Priorität\",\"other\":\"Prioritäten\"},\"priority_short\":\"Prio\",\"priority_list\":{\"low\":\"niedrig\",\"medium\":\"normal\",\"high\":\"hoch\"},\"progress\":\"Verlauf\",\"room_name\":\"Einheit/Raum\",\"state\":{\"one\":\"Status\",\"other\":\"Status\"},\"state_short\":\"Stat.\",\"state_list\":{\"close\":\"geschlossen\",\"open\":\"offen\"},\"ticket_kind_id\":\"Ticketart\",\"workflow_progress\":\"Bearbeitungsstatus\",\"workflow_progress_steps\":{\"approved\":\"Freigegeben\",\"closed\":\"Geschlossen\",\"waiting_Verlauffor_edit\":\"Warten auf Bearbeitung\",\"waiting_for_edit_by\":\"Warten auf Bearbeitung durch %{membership}\"}},\"ticket/kind\":{\"cost_center\":\"Kostenstelle\",\"tickets\":\"Tickets\"},\"ticket/settings\":{\"budget_facility_manager\":\"Budget Hausmeister\",\"budget_estate_supervisor\":\"Budget Standortverantwortliche/r\",\"cost_estimate_file_needed_from\":\"Max. Betrag Kostenvoranschlag o. Datei\",\"workflow_step_reminder_delay_days\":\"Erinnerungsmail wg. Nichtbearbeitung\"},\"ticket/trade\":{\"estate_ids\":\"Objekte\",\"name\":\"Name\",\"city\":\"Stadt\",\"zipcode\":\"Postleitzahl\",\"street\":\"Straße/Nr.\",\"web\":\"Website (URL)\",\"contact_full_name\":\"Ansprechpartner\",\"contact_first_name\":\"Ansprechpartner Vorname\",\"contact_last_name\":\"Ansprechpartner Nachname\",\"contact_email\":\"Ansprechpartner E-Mail\",\"contact_phone\":\"Ansprechpartner Telefon\"},\"ticket/order\":{\"description\":\"Beschreibung\",\"progress\":\"Fortschritt\",\"progress_steps\":{\"waiting_for_cost_estimate\":\"Gewerk angefragt\",\"waiting_for_cost_estimate_approval\":\"Warten auf Freigabe KV\",\"waiting_for_completion\":\"Warten auf Fertigstellung\",\"completed\":\"Fertiggestellt\",\"approved\":\"Abgenommen\"},\"trade_id\":\"Gewerk\"},\"ticket/order/comment\":{\"add_comment_approval\":\"Freigeben/Kommentieren\",\"add_comment\":\"Kommentieren\",\"content\":\"Kommentar\",\"files\":\"Anhänge\"},\"ticket/order/bill\":{\"files\":\"Anhänge\",\"amount_net\":\"Betrag (netto)\",\"billing_date\":\"Rechnungsdatum\",\"description\":\"Beschreibung\",\"due_date\":\"Fälligkeitsdatum\"},\"ticket/order/cost_estimate\":{\"files\":\"Anhänge\",\"amount_net\":\"Betrag (netto)\",\"approved\":\"Freigegeben\",\"approved_by\":\"Freigegeben durch\",\"description\":\"Beschreibung\",\"implementation_date\":\"Umsetzungsdatum\"},\"ticket/order/completion\":{\"approved\":\"Abgenommen\",\"files\":\"Anhänge\",\"description\":\"Beschreibung\"},\"ticket/workflow\":{\"estate\":\"Objekt\",\"estate_id\":\"Objekt\",\"ticket_workflow_memberships\":{\"one\":\"Benutzer\",\"other\":\"Benutzer\"},\"main_contact\":\"1. Ansprechpartner\",\"estate_supervisor\":\"Standortverantwortliche/r\",\"facility_manager\":\"Hausmeister\",\"chief_executive\":\"Geschäftsführer\"},\"ticket/workflow_membership\":{\"membership_id\":\"Benutzer\",\"role\":\"Rolle\",\"role_list\":{\"main_contact\":\"1. Ansprechpartner\",\"estate_supervisor\":\"Standortverantwortliche/r\",\"facility_manager\":\"Hausmeister\",\"chief_executive\":\"Geschäftsführer\"},\"authorized_for_completion_approval\":\"Freigabebefugnis Fertigstellung\"},\"ticket/workflow_step\":{\"description\":\"Beschreibung\",\"files\":\"Anhänge\",\"role\":\"Rolle\",\"role_list\":{\"main_contact\":\"1. Ansprechpartner\",\"estate_supervisor\":\"Standortverantwortliche/r\",\"facility_manager\":\"Hausmeister\",\"chief_executive\":\"Geschäftsführer\",\"cost_estimate_approver\":\"Freigabeberechtigte/r KV\",\"completion_approver\":\"Freigabeberechtigte/r Fertigstellung\",\"trade\":\"Gewerk\"}},\"time_tracking\":{\"address\":\"Adresse\",\"capture_location_true\":\"Standort erfasst\",\"capture_location_progress\":\"Standorterfassung läuft\",\"capture_location_false\":\"Standort nicht erkannt\",\"description\":\"Beschreibung\",\"attachments\":\"Anhänge\",\"duration\":\"Dauer\",\"duration_dd_hh_mm_ss\":\"Dauer (DD:HH:MM:SS)\",\"estate_id\":\"Objekt\",\"end_time\":\"Endzeitpunkt\",\"latitude\":\"Breitengrad\",\"longitude\":\"Längengrad\",\"membership_id\":\"Mitarbeiter\",\"start_time\":\"Startzeitpunkt\",\"time_tracking_type_id\":\"Zeiterfassungsart\",\"time_tracking_type_ids\":\"Zeiterfassungsart(en)\",\"time_trackings\":\"Zeiterfassungen\"},\"time_tracking/membership_notification_setting\":{\"notify_on_time_tracking\":\"Benachr. bei Zeiterfassungen\"},\"time_tracking/membership_notification_contact\":{\"phone_mobile\":\"Telefon (mobil)\"},\"time_tracking_type\":{\"name\":\"Name\",\"time_trackings\":\"Zeiterfassungen\"},\"user\":{\"active\":\"Aktiv\",\"email\":\"E-Mail\",\"email_backup\":\"E-Mail\",\"confirmed_at\":\"Bestätigt am\",\"confirmation_token\":\"Bestätigungscode\",\"current_sign_in_at\":\"Letzte Anmeldung\",\"first_name\":\"Vorname\",\"full_name\":\"Name\",\"last_name\":\"Nachname\",\"last_sign_in_at\":\"Zuletzt angemeldet am\",\"personnel_number\":\"Personalnummer\",\"phone\":\"Telefon\",\"role\":\"Rolle\",\"settings_language\":\"Sprache\",\"selected_role\":\"Zugewiesene Rolle\",\"sign_in_count\":\"Anmeldungen\",\"settings_view_list\":{\"table_view\":\"Tabellenansicht\",\"table_view_short\":\"Tabelle\",\"grid_view\":\"Blockansicht\",\"grid_view_short\":\"Block\"}},\"vehicle\":{\"additional_infos\":\"Anmerkungen\",\"classification\":\"Fahrzeugklasse\",\"classification_list\":{\"automobile\":\"PKW\",\"truck\":\"LKW\",\"bicycle\":\"Zweirad\",\"utility\":\"Nutzfahrzeug\",\"other_class\":\"Andere\"},\"commission_number\":\"Kommissionsnummer\",\"commission_number_short\":\"Kom.-Nr.\",\"condition\":\"Zustand\",\"condition_list\":{\"brand_new\":\"Neu\",\"used\":\"Gebraucht\",\"damaged\":\"Beschädigt\",\"other_condition\":\"Andere\"},\"maker\":\"Hersteller\",\"model\":\"Modell\",\"first_registration\":\"Erstzulassung\",\"vin\":\"Fahrgestellnummer (FIN)\",\"vin_short\":\"FIN\",\"registration_number\":\"Fahrzeugbriefnummer\",\"license_plate\":\"Kennzeichen\",\"fuel_type\":\"Kraftstoffart\",\"fuel_type_list\":{\"electric\":\"Elektro\",\"hydrogen\":\"Wasserstoff\",\"hybride\":\"Hybrid\",\"gasoline\":\"Benzin\",\"diesel\":\"Diesel\",\"natural_gas\":\"Autogas/Erdgas\",\"other_fuel_type\":\"Andere\"},\"images\":\"Bilder\",\"documents\":\"Dokumente\"}},\"abbreviations\":{\"contact_person\":\"AP\"},\"models\":{\"building\":{\"one\":\"Gebäude\",\"other\":\"Gebäude\"},\"check_in\":{\"one\":\"Check-In\",\"other\":\"Check-Ins\"},\"contact_person\":{\"one\":\"Ansprechpartner\",\"other\":\"Ansprechpartner\"},\"document\":{\"one\":\"Dokument\",\"other\":\"Dokumente\"},\"document_category\":{\"one\":\"Dokumentenkategorie\",\"other\":\"Dokumentenkategorien\"},\"estate\":{\"one\":\"Objekt\",\"other\":\"Objekte\"},\"feature_module\":{\"one\":\"Modul\",\"other\":\"Module\"},\"floor\":{\"one\":\"Stockwerk\",\"other\":\"Stockwerke\"},\"good_job/job\":{\"one\":\"Job\",\"other\":\"Jobs\"},\"inspection\":{\"one\":\"Prüfung\",\"other\":\"Prüfungen\"},\"inspected_service\":{\"one\":\"Leistung\",\"other\":\"Leistungen\"},\"inspection_settings\":{\"one\":\"Prüfungseinstellungen\",\"other\":\"Prüfungseinstellungen\"},\"inspection_evaluation_grades\":{\"one\":\"Noten\",\"other\":\"Noten\"},\"inspection_evaluation_lights\":{\"one\":\"Ampel\",\"other\":\"Ampeln\"},\"membership\":{\"one\":\"Mitgliedschaft\",\"other\":\"Mitgliedschaften\"},\"monitoring\":{\"one\":\"Betriebsdaten\",\"other\":\"Betriebsdaten\"},\"monitoring/sheet\":{\"one\":\"Betriebsdaten\",\"other\":\"Betriebsdaten\"},\"monitoring/sheet_entry\":{\"one\":\"Messpunkt\",\"other\":\"Messpunkte\"},\"monitoring/template\":{\"one\":\"Betriebsdatenblatt\",\"other\":\"Betriebsdatenblätter\"},\"news_article\":{\"one\":\"Neuigkeit\",\"other\":\"Neuigkeiten\"},\"notice\":{\"one\":\"Meldung\",\"other\":\"Meldungen\"},\"notice/message\":{\"one\":\"Nachricht\",\"other\":\"Nachrichten\"},\"notice/kind\":{\"one\":\"Meldungsart\",\"other\":\"Meldungsarten\"},\"notice/settings\":{\"one\":\"Meldungseinstellungen\",\"other\":\"Meldungseinstellungen\"},\"organization\":{\"one\":\"Organisation\",\"other\":\"Organisationen\"},\"pdf_document\":{\"one\":\"PDF-Dokument\",\"other\":\"PDF-Dokumente\"},\"qr_code\":{\"one\":\"QR-Code\",\"other\":\"QR-Codes\"},\"qr_code/settings\":{\"one\":\"QR-Code-Einstellungen\",\"other\":\"QR-Code-Einstellungen\"},\"reports_schedule\":{\"one\":\"Berichtsversand\",\"other\":\"Berichtsversand\"},\"role\":{\"one\":\"Rolle\",\"other\":\"Rollen\"},\"room\":{\"one\":\"Einheit/Raum\",\"other\":\"Einheiten/Räume\"},\"service\":{\"one\":\"Leistung\",\"other\":\"Leistungen\"},\"service_group\":{\"one\":\"Leistungsgruppe\",\"other\":\"Leistungsgruppen\"},\"service_group_category\":{\"one\":\"Leistungsgruppen-Kategorie\",\"other\":\"Leistungsgruppen-Kategorien\"},\"ticket\":{\"one\":\"Ticket\",\"other\":\"Tickets\"},\"ticket/order/bill\":{\"one\":\"Rechnung\",\"other\":\"Rechnungen\"},\"ticket/order/cost_estimate\":{\"one\":\"Kostenvoranschlag\",\"other\":\"Kostenvoranschläge\"},\"ticket/order/completion\":{\"one\":\"Fertigstellung\",\"other\":\"Fertigstellungen\"},\"ticket/kind\":{\"one\":\"Ticketart\",\"other\":\"Ticketarten\"},\"ticket/trade\":{\"one\":\"Gewerk\",\"other\":\"Gewerke\"},\"ticket/settings\":{\"one\":\"Ticketeinstellungen\",\"other\":\"Ticketeinstellungen\"},\"ticket/order\":{\"one\":\"Auftrag\",\"other\":\"Aufträge\"},\"ticket/order/comment\":{\"one\":\"Kommentar\",\"other\":\"Kommentare\"},\"ticket/workflow\":{\"one\":\"Workflow\",\"other\":\"Workflows\"},\"ticket/workflow_membership\":{\"one\":\"Benutzer\",\"other\":\"Benutzer\"},\"ticket/workflow_step\":{\"one\":\"Arbeitsschritt\",\"other\":\"Arbeitsschritte\"},\"time_tracking\":{\"one\":\"Zeiterfassung\",\"other\":\"Zeiterfassungen\"},\"time_tracking/membership_notification_setting\":{\"one\":\"Benachrichtigung Zeiterfassungen\",\"other\":\"Benachrichtigungen Zeiterfassungen\"},\"time_tracking/membership_notification_contact\":{\"one\":\"Kontakt für Benachrichtigung\",\"other\":\"Kontakte für Benachrichtigung\"},\"time_tracking_type\":{\"one\":\"Zeiterfassungsart\",\"other\":\"Zeiterfassungsarten\"},\"user\":{\"one\":\"Benutzer\",\"other\":\"Benutzer\"},\"vehicle\":{\"one\":\"Fahrzeug\",\"other\":\"Fahrzeuge\"}}},\"datetime\":{\"distance_in_words\":{\"about_x_hours\":{\"one\":\"ca. 1 Std.\",\"other\":\"ca. %{count} Std.\"},\"about_x_months\":{\"one\":\"ca. 1 Mon.\",\"other\":\"ca. %{count} Mon.\"},\"about_x_years\":{\"one\":\"ca. 1 Jahr\",\"other\":\"ca. %{count} Jahre\"},\"almost_x_years\":{\"one\":\"fast 1 Jahr\",\"other\":\"fast %{count} Jahre\"},\"half_a_minute\":\"0,5 Min.\",\"less_than_x_seconds\":{\"one\":\"\\u003c 1 Sek.\",\"other\":\"\\u003c %{count} Sek.\"},\"less_than_x_minutes\":{\"one\":\"\\u003c 1 Min.\",\"other\":\"\\u003c %{count} Min.\"},\"over_x_years\":{\"one\":\"\\u003e 1 Jahr\",\"other\":\"\\u003e %{count} Jahre\"},\"x_seconds\":{\"one\":\"1 Sek.\",\"other\":\"%{count} Sek.\"},\"x_minutes\":{\"one\":\"1 Min.\",\"other\":\"%{count} Min.\"},\"x_days\":{\"one\":\"1 Tag\",\"other\":\"%{count} Tage\"},\"x_months\":{\"one\":\"1 Mon.\",\"other\":\"%{count} Monate\"},\"x_years\":{\"one\":\"1 Jahr\",\"other\":\"%{count} Jahre\"}},\"prompts\":{\"second\":\"Sekunde\",\"minute\":\"Minute\",\"hour\":\"Stunde\",\"day\":\"Tag\",\"month\":\"Monat\",\"year\":\"Jahr\",\"days\":\"Tage\",\"hours\":\"Stunden\",\"minutes\":\"Minuten\"},\"string_regexes\":{\"year\":\" \\\\d{4}\",\"year_month\":\" \\\\d{2}\\\\.\\\\d{4}\",\"year_month_day\":\"\\\\d{2}\\\\.\\\\d{2}\\\\.\\\\d{4}\"},\"string_formats\":{\"year\":\" yyyy\",\"year_month\":\" mm.yyyy\",\"year_month_day\":\"dd.mm.yyyy\"},\"strftime\":{\"year\":\" %Y\",\"year_month\":\" %m.%Y\",\"year_month_day\":\"%d.%m.%Y\"}},\"errors\":{\"format\":\"%{attribute} %{message}\",\"messages\":{\"accepted\":\"muss akzeptiert werden\",\"blank\":\"muss ausgefüllt werden\",\"confirmation\":\"stimmt nicht mit %{attribute} überein\",\"empty\":\"muss ausgefüllt werden\",\"equal_to\":\"muss genau %{count} sein\",\"even\":\"muss gerade sein\",\"exclusion\":\"ist nicht verfügbar\",\"greater_than\":\"muss größer als %{count} sein\",\"greater_than_or_equal_to\":\"muss größer oder gleich %{count} sein\",\"inclusion\":\"ist kein gültiger Wert\",\"invalid\":\"ist nicht gültig\",\"less_than\":\"muss kleiner als %{count} sein\",\"less_than_or_equal_to\":\"muss kleiner oder gleich %{count} sein\",\"model_invalid\":\"Gültigkeitsprüfung ist fehlgeschlagen: %{errors}\",\"not_a_number\":\"ist keine Zahl\",\"not_an_integer\":\"muss ganzzahlig sein\",\"odd\":\"muss ungerade sein\",\"other_than\":\"darf nicht gleich %{count} sein\",\"present\":\"darf nicht ausgefüllt werden\",\"required\":\"muss ausgefüllt werden\",\"taken\":\"ist bereits vergeben\",\"too_long\":{\"one\":\"ist zu lang (mehr als %{count} Zeichen)\",\"other\":\"ist zu lang (mehr als %{count} Zeichen)\"},\"too_short\":{\"one\":\"ist zu kurz (weniger als %{count} Zeichen)\",\"other\":\"ist zu kurz (weniger als %{count} Zeichen)\"},\"wrong_length\":{\"one\":\"hat die falsche Länge (muss genau %{count} Zeichen haben)\",\"other\":\"hat die falsche Länge (muss genau %{count} Zeichen haben)\"},\"content_type_invalid\":{\"one\":\"hat einen ungültigen Inhaltstyp (autorisierter Inhaltstyp ist %{authorized_human_content_types})\",\"other\":\"hat einen ungültigen Inhaltstyp (autorisierte Inhaltstypen sind %{authorized_human_content_types})\"},\"content_type_spoofed\":{\"one\":\"hat einen Inhaltstyp, der nicht dem entspricht, der durch seinen Inhalt erkannt wird (autorisierter Inhaltstyp ist %{authorized_human_content_types})\",\"other\":\"hat einen Inhaltstyp, der nicht dem entspricht, der durch seinen Inhalt erkannt wird (autorisierte Inhaltstypen sind %{authorized_human_content_types})\"},\"file_size_not_less_than\":\"Dateigröße muss kleiner als %{max} sein (aktuelle Dateigröße ist %{file_size})\",\"file_size_not_less_than_or_equal_to\":\"Dateigröße muss kleiner oder gleich %{max} sein (aktuelle Dateigröße ist %{file_size})\",\"file_size_not_greater_than\":\"Dateigröße muss größer als %{min} sein (aktuelle Dateigröße ist %{file_size})\",\"file_size_not_greater_than_or_equal_to\":\"Dateigröße muss größer oder gleich %{min} sein (aktuelle Dateigröße ist %{file_size})\",\"file_size_not_between\":\"Dateigröße muss zwischen %{min} und %{max} liegen (aktuelle Dateigröße ist %{file_size})\",\"total_file_size_not_less_than\":\"Die gesamte Dateigröße muss kleiner als %{max} sein (aktuelle Dateigröße ist %{total_file_size})\",\"total_file_size_not_less_than_or_equal_to\":\"Die gesamte Dateigröße muss kleiner oder gleich %{max} sein (aktuelle Dateigröße ist %{total_file_size})\",\"total_file_size_not_greater_than\":\"Die gesamte Dateigröße muss größer als %{min} sein (aktuelle Dateigröße ist %{total_file_size})\",\"total_file_size_not_greater_than_or_equal_to\":\"Die gesamte Dateigröße muss größer oder gleich %{min} sein (aktuelle Dateigröße ist %{total_file_size})\",\"total_file_size_not_between\":\"Die gesamte Dateigröße muss zwischen %{min} und %{max} liegen (aktuelle Dateigröße ist %{total_file_size})\",\"duration_not_less_than\":\"Die Dauer muss kleiner als %{max} sein (die aktuelle Dauer beträgt %{duration})\",\"duration_not_less_than_or_equal_to\":\"Die Dauer muss kleiner oder gleich %{max} sein (die aktuelle Dauer beträgt %{duration})\",\"duration_not_greater_than\":\"Die Dauer muss größer als %{min} sein (die aktuelle Dauer beträgt %{duration})\",\"duration_not_greater_than_or_equal_to\":\"Die Dauer muss größer oder gleich %{min} sein (die aktuelle Dauer beträgt %{duration})\",\"duration_not_between\":\"Die Dauer muss zwischen %{min} und %{max} liegen (die aktuelle Dauer beträgt %{duration})\",\"limit_out_of_range\":{\"zero\":\"Keine Dateien angehängt (müssen zwischen %{min} und %{max} Dateien haben)\",\"one\":\"Nur 1 Datei ist angehängt (müssen zwischen %{min} und %{max} Dateien haben)\",\"other\":\"Die Gesamtzahl der Dateien muss zwischen %{min} und %{max} liegen (es sind Dateien mit %{count} angehängt).\"},\"limit_min_not_reached\":{\"zero\":\"Keine Dateien angehängt (müssen mindestens %{min} Dateien haben)\",\"one\":\"Nur 1 Datei ist angehängt (müssen mindestens %{min} Dateien haben)\",\"other\":\"%{count} Dateien angehängt (müssen mindestens %{min} Dateien haben)\"},\"limit_max_exceeded\":{\"zero\":\"Keine Dateien angehängt (maximal %{max} Dateien)\",\"one\":\"zu viele angehängte Dateien (maximal %{max} Dateien, %{count})\",\"other\":\"Zu viele angehängte Dateien (maximal %{max} Dateien, %{count})\"},\"media_metadata_missing\":\"ist keine gültige Mediendatei\",\"dimension_min_not_included_in\":\"muss größer oder gleich %{width} x %{height} Pixel sein\",\"dimension_max_not_included_in\":\"muss kleiner oder gleich %{width} x %{height} Pixel sein\",\"dimension_width_not_included_in\":\"Bildbreite muss zwischen %{min} und %{max} Pixel liegen\",\"dimension_height_not_included_in\":\"Bildhöhe muss zwischen %{min} und %{max} Pixel liegen\",\"dimension_width_not_greater_than_or_equal_to\":\"Bildbreite muss größer oder gleich %{length} Pixel sein\",\"dimension_height_not_greater_than_or_equal_to\":\"Bildhöhe muss größer oder gleich %{length} Pixel sein\",\"dimension_width_not_less_than_or_equal_to\":\"Breite muss kleiner oder gleich %{length} Pixel sein\",\"dimension_height_not_less_than_or_equal_to\":\"Höhe muss kleiner oder gleich %{length} Pixel sein\",\"dimension_width_not_equal_to\":\"Bildbreite muss genau %{length} Pixel sein\",\"dimension_height_not_equal_to\":\"Bildhöhe muss genau %{length} Pixel sein\",\"aspect_ratio_not_square\":\"muss quadratisch sein (aktuelle Datei ist %{width}x%{height}px)\",\"aspect_ratio_not_portrait\":\"muss Porträt sein (aktuelle Datei ist %{width}x%{height}px)\",\"aspect_ratio_not_landscape\":\"muss landschaftlich sein (aktuelle Datei ist %{width}x%{height}px)\",\"aspect_ratio_not_x_y\":\"muss %{authorized_aspect_ratios} sein (aktuelle Datei ist %{width}x%{height}px)\",\"aspect_ratio_invalid\":\"hat ein ungültiges Seitenverhältnis (gültige Seitenverhältnisse sind %{authorized_aspect_ratios})\",\"file_not_processable\":\"wird nicht als gültige Mediendatei identifiziert\",\"already_confirmed\":\"wurde schon bestätigt, bitte versuchen Sie sich anzumelden\",\"confirmation_period_expired\":\"muss innerhalb von %{period} bestätigt werden, bitte fordern Sie eine(n) neue(n) an\",\"expired\":\"has expired, please request a new one\",\"not_found\":\"nicht gefunden\",\"not_locked\":\"war nicht gesperrt\",\"not_saved\":{\"one\":\"%{resource} konnte auf Grund eines Fehlers nicht angelegt werden:\",\"other\":\"%{resource} konnte auf Grund von %{count} Fehlern nicht angelegt werden:\"},\"restrict_dependent_destroy\":{\"one\":\"Datensatz kann nicht gelöscht werden, da ein abhängiger %{record.titleize} existiert.\",\"other\":\"Datensatz kann nicht gelöscht werden, da abhängige %{record.titleize} existieren.\",\"count_one\":\"Datensatz kann nicht gelöscht werden, da %{count} abhängiger Datensatz existiert.\",\"count_other\":\"Datensatz kann nicht gelöscht werden, da %{count} abhängige Datensätze existieren.\"}},\"template\":{\"body\":\"Bitte überprüfen Sie die folgenden Felder:\",\"header\":{\"one\":\"Konnte %{model} nicht speichern: ein Fehler.\",\"other\":\"Konnte %{model} nicht speichern: %{count} Fehler.\"}},\"active_job_error\":\"Fehler beim Ausführen des Hintergrundprozesses. Bitte Support kontaktieren.\",\"active_job_error_will_retry\":\"Fehler beim Ausführen des Hintergrundprozesses. Wird nochmal ausgeführt, bitte warten …\",\"active_job_not_found\":\"Hintergrundprozess nicht gefunden. Bitte Support kontaktieren.\",\"active_job_unknown_status\":\"Hintergrundprozesses wird geladen.\",\"has_errors\":\"Dieser Datensatz enthält folgende Fehler:\",\"connection_refused\":\"Keine Verbindung möglich\",\"file_corrupted\":\"Datei beschädigt.\",\"file_invalid\":\"Ungültiges Dateiformat.\",\"no_feature_module_assigned\":\"Kein Modul zugewiesen\",\"no_estate_or_service_group_category_assigned\":\"Kein Objekt und keine Leistungsgruppenkategorie zugewiesen.\",\"no_resource_selected\":\"Kein(e) %{resource} ausgewählt\",\"no_resource_this_month\":\"Kein(e) %{resource} für diesen Monat.\",\"not_authorized\":\"Sie sind nicht berechtigt auf diesen Bereich zuzugreifen.\",\"not_found\":\"Nicht gefunden\",\"not_found_item\":\"%{item} nicht gefunden\",\"not_found_within_organization\":\"Datensatz (in der von ihnen momentan ausgewählten Organisation) nicht verfügbar.\",\"qr_code_cant_be_generated\":\"QR-Code kann nicht erzeugt werden.\",\"record\":{\"one\":\"Datensatz\",\"other\":\"Datensätze\"},\"session_expired\":\"Sitzung abgelaufen, bitte Seite neu laden.\",\"session_memberships_none_confirmed\":\"Kein Benutzeraccount ist bestätigt/aktiviert.\",\"ticket_no_workflow_yet\":\"Noch kein Workflow für diese Position eingerichtet.\",\"too_many_children\":\"Maximal %{number} %{resource} je %{parent} zugelassen.\"},\"helpers\":{\"select\":{\"prompt\":\"Bitte wählen\"},\"submit\":{\"create\":\"%{model} erstellen\",\"submit\":\"%{model} speichern\",\"update\":\"%{model} aktualisieren\"}},\"number\":{\"currency\":{\"format\":{\"delimiter\":\".\",\"format\":\"%n %u\",\"precision\":2,\"separator\":\",\",\"significant\":false,\"strip_insignificant_zeros\":false,\"unit\":\"€\"}},\"format\":{\"delimiter\":\".\",\"precision\":1,\"round_mode\":\"default\",\"separator\":\",\",\"significant\":false,\"strip_insignificant_zeros\":false},\"human\":{\"decimal_units\":{\"format\":\"%n %u\",\"units\":{\"billion\":{\"one\":\"Milliarde\",\"other\":\"Milliarden\"},\"million\":{\"one\":\"Million\",\"other\":\"Millionen\"},\"quadrillion\":{\"one\":\"Billiarde\",\"other\":\"Billiarden\"},\"thousand\":\"Tausend\",\"trillion\":{\"one\":\"Billion\",\"other\":\"Billionen\"},\"unit\":\"\"}},\"format\":{\"delimiter\":\"\",\"precision\":3,\"significant\":true,\"strip_insignificant_zeros\":true},\"storage_units\":{\"format\":\"%n %u\",\"units\":{\"byte\":{\"one\":\"Byte\",\"other\":\"Bytes\"},\"eb\":\"EB\",\"gb\":\"GB\",\"kb\":\"KB\",\"mb\":\"MB\",\"pb\":\"PB\",\"tb\":\"TB\"}}},\"percentage\":{\"format\":{\"delimiter\":\"\",\"format\":\"%n %\"}},\"precision\":{\"format\":{\"delimiter\":\"\"}},\"nth\":{\"ordinals\":\".\",\"ordinalized\":\"%{number}.\"}},\"support\":{\"array\":{\"last_word_connector\":\" und \",\"two_words_connector\":\" und \",\"words_connector\":\", \"}},\"i18n\":{\"plural\":{\"keys\":[\"one\",\"other\"],\"rule\":{}},\"transliterate\":{\"rule\":{\"ä\":\"ae\",\"é\":\"e\",\"ü\":\"ue\",\"ö\":\"oe\",\"Ä\":\"Ae\",\"Ü\":\"Ue\",\"Ö\":\"Oe\",\"ß\":\"ss\",\"ẞ\":\"SS\"}}},\"pagy\":{\"aria_label\":{\"nav\":{\"one\":\"Seite\",\"other\":\"Seiten\"},\"prev\":\"Zurück\",\"next\":\"Weiter\"},\"prev\":\"\\u0026#XF104;\",\"next\":\"\\u0026#XF105;\",\"gap\":\"\\u0026hellip;\",\"item_name\":{\"one\":\"Eintrag\",\"other\":\"Einträge\"},\"info\":{\"no_items\":\"Keine %{item_name} gefunden\",\"single_page\":\"Zeige %{count} %{item_name}\",\"multiple_pages\":\"Zeige %{item_name} %{from}-%{to} von %{count} gesamt\"},\"combo_nav_js\":\"Seite %{page_input} von %{pages}\",\"limit_selector_js\":\"Zeige %{limit_input} %{item_name} pro Seite\"},\"good_job\":{\"actions\":{\"destroy\":\"Zerstören\",\"discard\":\"Verwerfen\",\"force_discard\":\"Verwerfen erzwingen\",\"inspect\":\"Prüfen\",\"reschedule\":\"Umplanen\",\"retry\":\"Wiederholen\"},\"batches\":{\"actions\":{\"confirm_retry\":\"Bist du sicher, dass du diesen Batch wiederholen willst?\",\"retry\":\"Batch wiederholen\"},\"index\":{\"older_batches\":\"Ältere Batches\",\"title\":\"Batches\"},\"jobs\":{\"actions\":{\"confirm_destroy\":\"Bist du sicher, dass du diesen Job zerstören wilst?\",\"confirm_discard\":\"Bist du sicher, dass du diesen Job verwerfen willst?\",\"confirm_reschedule\":\"Bist du sicher, dass du diesen Job verschieben willst?\",\"confirm_retry\":\"Bist du sicher, dass du diesen Job erneut versuchen willst?\",\"destroy\":\"Job zerstören\",\"discard\":\"Job verwerfen\",\"reschedule\":\"Job neu planen\",\"retry\":\"Job wiederholen\",\"title\":\"Aktionen\"},\"no_jobs_found\":\"Keine Jobs gefunden.\"},\"retry\":{\"notice\":\"Batch wurde wiederholt\"},\"show\":{\"attributes\":\"Attribute\",\"batched_jobs\":\"Batch-Jobs\",\"callback_jobs\":\"Callback-Jobs\"},\"table\":{\"no_batches_found\":\"Keine Batches gefunden.\"}},\"cleaner\":{\"index\":{\"all\":\"All\",\"class\":\"Class\",\"exception\":\"Exception\",\"grouped_by_class\":\"Discards grouped by Class\",\"grouped_by_exception\":\"Discards grouped by Exception\",\"last_1_hour\":\"Last 1 hour\",\"last_24_hours\":\"Last 24 hours\",\"last_3_days\":\"Last 3 days\",\"last_3_hours\":\"Last 3 hours\",\"last_7_days\":\"Last 7 days\",\"title\":\"Discard Cleaner\",\"total\":\"Total\"}},\"cron_entries\":{\"actions\":{\"confirm_disable\":\"Bist du sicher, dass du diesen Cron-Eintrag deaktivieren willst?\",\"confirm_enable\":\"Bist du sicher, dass du diesen Cron-Eintrag aktivieren willst?\",\"confirm_enqueue\":\"Bist du sicher, dass du diesen Cron-Eintrag in die Warteschlange stellen willst?\",\"disable\":\"Cron-Eintrag deaktivieren\",\"enable\":\"Cron-Eintrag aktivieren\",\"enqueue\":\"Cron-Eintrag jetzt einreihen\"},\"disable\":{\"notice\":\"Der Cron-Eintrag wurde deaktiviert.\"},\"enable\":{\"notice\":\"Cron-Eintrag wurde aktiviert.\"},\"enqueue\":{\"notice\":\"Cron-Eintrag wurde in die Warteschlange eingereiht.\"},\"index\":{\"no_cron_schedules_found\":\"Keine Cron-Zeitpläne gefunden.\",\"title\":\"Cron-Zeitpläne\"},\"show\":{\"cron_entry_key\":\"Cron-Schlüssel\"}},\"datetime\":{\"distance_in_words\":{\"about_x_hours\":{\"one\":\"ca. 1 Stunde\",\"other\":\"ca. %{count} Stunden\"},\"about_x_months\":{\"one\":\"ca. 1 Monat\",\"other\":\"ca. %{count} Monate\"},\"about_x_years\":{\"one\":\"ca. 1 Jahr\",\"other\":\"ca. %{count} Jahre\"},\"almost_x_years\":{\"one\":\"fast 1 Jahr\",\"other\":\"fast %{count} Jahre\"},\"half_a_minute\":\"eine halbe Minute\",\"less_than_x_minutes\":{\"one\":\"weniger als eine Minute\",\"other\":\"weniger als %{count} Minuten\"},\"less_than_x_seconds\":{\"one\":\"weniger als eine Sekunde\",\"other\":\"weniger als %{count} Sekunden\"},\"over_x_years\":{\"one\":\"über 1 Jahr\",\"other\":\"über %{count} Jahre\"},\"x_days\":{\"one\":\"1 Tag\",\"other\":\"%{count} Tage\"},\"x_minutes\":{\"one\":\"1 Minute\",\"other\":\"%{count} Minuten\"},\"x_months\":{\"one\":\"1 Monat\",\"other\":\"%{count} Monate\"},\"x_seconds\":{\"one\":\"1 Sekunde\",\"other\":\"%{count} Sekunden\"},\"x_years\":{\"one\":\"1 Jahr\",\"other\":\"%{count} Jahre\"}}},\"duration\":{\"hours\":\"%{hour}h %{min}m\",\"less_than_10_seconds\":\"%{sec}s\",\"milliseconds\":\"%{ms}ms\",\"minutes\":\"%{min}m %{sec}s\",\"seconds\":\"%{sec}s\"},\"error_event\":{\"discarded\":\"Verworfen\",\"handled\":\"Abgewickelt\",\"interrupted\":\"Unterbrochen\",\"retried\":\"Wiederholt\",\"retry_stopped\":\"Wiederholung gestoppt\",\"unhandled\":\"Unbehandelt\"},\"helpers\":{\"relative_time\":{\"future\":\"in %{time}\",\"past\":\"Vor %{time}\"}},\"jobs\":{\"actions\":{\"confirm_destroy\":\"Bist du sicher, dass du diesen Job zerstören willst?\",\"confirm_discard\":\"Bist du sicher, dass du diesen Job verwerfen willst?\",\"confirm_force_discard\":\"Bist du sicher, dass du das Verwerfen dieses Jobs erzwingen möchten? Der Job wird als verworfen markiert, aber der laufende Job wird nicht gestoppt – er wird jedoch bei Fehlern nicht erneut versucht.\",\"confirm_reschedule\":\"Bist du sicher, dass du diesen Job verschieben willst?\",\"confirm_retry\":\"Bist du sicher, dass du diesen Job wiederholen willst?\",\"destroy\":\"Job zerstören\",\"discard\":\"Job verwerfen\",\"force_discard\":\"Job verwerfen erzwingen\",\"reschedule\":\"Job neu planen\",\"retry\":\"Job wiederholen\"},\"destroy\":{\"notice\":\"Hiob wurde zerstört\"},\"discard\":{\"notice\":\"Job wurde verworfen\"},\"executions\":{\"application_trace\":\"Application Trace\",\"full_trace\":\"Full Trace\",\"in_queue\":\"in der Warteschlange\",\"runtime\":\"Laufzeit\",\"title\":\"Hinrichtungen\"},\"force_discard\":{\"notice\":\"Der Job wurde zwangsweise verworfen. Die Ausführung wird fortgesetzt, bei Fehlern wird der Vorgang jedoch nicht wiederholt\"},\"index\":{\"job_pagination\":\"Job-Paginierung\",\"older_jobs\":\"Ältere Jobs\"},\"reschedule\":{\"notice\":\"Job wurde neu planen\"},\"retry\":{\"notice\":\"Job wurde wiederholt\"},\"show\":{\"jobs\":\"Jobs\"},\"table\":{\"actions\":{\"apply_to_all\":{\"one\":\"Auf einen Job anwenden.\",\"other\":\"Auf alle %{count} Jobs anwenden.\"},\"confirm_destroy_all\":\"Bist du sicher, dass du die ausgewählten Jobs löschen willst?\",\"confirm_discard_all\":\"Bist du sicher, dass du die ausgewählten Jobs verferfen willst?\",\"confirm_reschedule_all\":\"Bist du sicher, dass du die ausgewählten Jobs neu planen willst?\",\"confirm_retry_all\":\"Bist du sicher, dass du die ausgewählten Jobs wiederholen willst?\",\"destroy_all\":\"Alle zerstören\",\"discard_all\":\"Alle verwerfen\",\"reschedule_all\":\"Alle neu planen\",\"retry_all\":\"Alle wiederholen\",\"title\":\"Aktionen\"},\"no_jobs_found\":\"Keine Jobs gefunden.\",\"toggle_actions\":\"Aktionen umschalten\",\"toggle_all_jobs\":\"Alle Jobs umschalten\"}},\"models\":{\"batch\":{\"created\":\"Erstellt\",\"created_at\":\"Hergestellt in\",\"discarded\":\"Verworfen\",\"discarded_at\":\"Abgelegt bei\",\"enqueued\":\"Eingereiht\",\"enqueued_at\":\"Eingereiht bei\",\"finished\":\"Fertig\",\"finished_at\":\"Fertig um\",\"jobs\":\"Jobs\",\"name\":\"Name\"},\"cron\":{\"class\":\"Klasse\",\"last_run\":\"Letzter Lauf\",\"next_scheduled\":\"Als nächstes geplant\",\"schedule\":\"Zeitplan\"},\"job\":{\"arguments\":\"Argumente\",\"attempts\":\"Versuche\",\"labels\":\"Etiketten\",\"priority\":\"Priorität\",\"queue\":\"Warteschlange\"}},\"number\":{\"format\":{\"delimiter\":\".\",\"separator\":\",\"},\"human\":{\"decimal_units\":{\"delimiter\":\".\",\"format\":\"%n%u\",\"precision\":3,\"separator\":\",\",\"units\":{\"billion\":\"B\",\"million\":\"M\",\"quadrillion\":\"Q\",\"thousand\":\"K\",\"trillion\":\"T\",\"unit\":\"\"}}}},\"pauses\":{\"index\":{\"confirm_pause\":\"Sind Sie sicher, dass Sie %{value} pausieren möchten?\",\"confirm_unpause\":\"Sind Sie sicher, dass Sie %{value} fortsetzen möchten?\",\"disabled\":\"Die experimentelle Pausenfunktion von GoodJob ist standardmäßig deaktiviert, da sie die Leistung beeinträchtigen kann. Konfigurieren Sie sie zur Aktivierung\",\"job_class\":\"Job-Klasse\",\"label\":\"Label\",\"pause\":\"Pausieren\",\"queue\":\"Warteschlange\",\"title\":\"Pausen\",\"type\":\"Pausentyp\",\"unpause\":\"Fortsetzen\",\"value\":\"Wert\"}},\"performance\":{\"index\":{\"average_duration\":\"Durchschnittliche Dauer\",\"chart_title\":\"Gesamtausführungszeit in Sekunden\",\"executions\":\"Ausführungen\",\"job_class\":\"Job-Klasse\",\"maximum_duration\":\"Maximale Dauer\",\"minimum_duration\":\"Minimale Dauer\",\"queue_name\":\"Warteschlangenname\",\"title\":\"Leistung\"},\"show\":{\"slow\":\"Langsam\",\"title\":\"Leistung\"}},\"processes\":{\"index\":{\"cron_enabled\":\"Cron aktiviert\",\"no_good_job_processes_found\":\"Keine GoodJob-Prozesse gefunden.\",\"process\":\"Prozess\",\"schedulers\":\"Scheduler\",\"started\":\"Gestartet\",\"title\":\"Prozesse\",\"updated\":\"Aktualisiert\"}},\"shared\":{\"boolean\":{\"false\":\"Nein\",\"true\":\"Ja\"},\"error\":\"Fehler\",\"filter\":{\"all\":\"Alle\",\"all_jobs\":\"Alle Jobs\",\"all_queues\":\"Alle Warteschlangen\",\"clear\":\"Löschen\",\"job_name\":\"Job-Name\",\"placeholder\":\"Suche nach Klasse, Job-ID, Jobparameter und Fehlertext.\",\"queue_name\":\"Warteschlangenname\",\"search\":\"Suchen\"},\"navbar\":{\"batches\":\"Batches\",\"cleaner\":\"Discard Cleaner\",\"cron_schedules\":\"Cron\",\"jobs\":\"Jobs\",\"live_poll\":\"Live Poll\",\"name\":\"GoodJob 👍\",\"pauses\":\"Pausen\",\"performance\":\"Leistung\",\"processes\":\"Prozesse\",\"theme\":{\"auto\":\"Auto\",\"dark\":\"Dunkel\",\"light\":\"Hell\",\"theme\":\"Theme\"}},\"pending_migrations\":\"GoodJob hat ausstehende Datenbankmigrationen.\",\"secondary_navbar\":{\"inspiration\":\"Denk daran, auch du machst einen guten Job!\",\"last_updated\":\"Zuletzt aktualisiert\"}},\"status\":{\"discarded\":\"Verworfen\",\"queued\":\"In der Warteschlange\",\"retried\":\"Wiederholt\",\"running\":\"Laufend\",\"scheduled\":\"Geplant\",\"succeeded\":\"Erfolgreich\"}},\"boolean\":{\"nil\":\"-\",\"no\":\"Nein\",\"yes\":\"Ja\"},\"email\":\"E-Mail\",\"password\":\"Passwort\",\"phone\":\"Telefon\",\"image\":\"Bild\",\"attachment\":\"Anhang\",\"attributes\":{\"created_at\":\"Erstellt\",\"created_at_month\":\"Erstellt im\",\"email\":\"E-Mail\",\"id\":\"ID\",\"password\":\"Passwort\",\"password_confirmation\":\"Passwortbestätigung\",\"current_password\":\"Aktuelles Passwort\",\"file_name\":\"Dateiname\",\"file_type\":\"Dateityp\",\"file_size\":\"Dateigröße\",\"location\":\"Position\",\"updated_at\":\"Aktualisiert\",\"revision\":{\"one\":\"Revision\",\"other\":\"Revisionen\"}},\"info\":{\"inspections\":{\"correct_service\":\"Korrigieren\",\"correct_services\":\"Mängelbehebung\",\"correct_services_short\":\"Mängelbeh.\",\"correct_services_of_resource\":\"Mängelbehebung der %{resource}\",\"rate_services\":\"Leistungen bewerten\",\"rate_services_all\":\"Alle Leistungen bewerten\",\"rate_services_all_value\":\"Alle Leistungen auf %{value}\",\"toggle_inspected_service_enable\":\"Leistung hinzuwählen\",\"toggle_inspected_service_disable\":\"Leistung abwählen\"},\"notices\":{\"already_rated\":\"Meldung wurde bereits bewertet.\",\"autoclose_job\":{\"content\":\"Nach Ablauf Bearbeitungszeit automatisch geschlossen.\",\"content_short\":\"Nach Ablauf Bearbeitungszeit\"},\"notice_will_be_autoclosed_after_processing_time\":\"Meldungen mit dieser Meldungsart, werden nach der Bearbeitungszeit automatisch geschlossen, falls diese hier eingestellt wird.\"},\"static_documents\":{\"document_ready\":\"Datei steht bereit\",\"link_valid_for\":\"Der Link zur Datei ist %{lifetime} lang gültig.\",\"preparation_in_progress\":\"Datei wird exportiert\",\"preparation_may_take_its_time\":\"„%{filename}“ wird erstellt.\",\"excel_documents\":{\"retroactive_one_year\":\"max. 10 tsd, bis ausgew. Datum\"},\"pdf_documents\":null},\"invite_user\":\"Einen Benutzer zu %{organization} hinzufügen\",\"invite_user_description\":\"Das neue Mitglied ihrer Organisation erhält innerhalb weniger Minuten eine E-Mail mit einem Bestätigungslink.\",\"membership_in\":\"Mitglied folgender Organisationen\",\"inactive\":\"(inaktiv)\",\"tickets\":{\"ticket_will_be_autoclosed_on_last_workflow_step\":\"Letzter Arbeitsschritt, Ticket wird beim Speichern automatisch geschlossen.\"}},\"flash\":{\"can_not_disable_self\":\"Sie können nicht Ihren eigenen Benutzerzugang deaktivieren\",\"create\":\"%{resource} erfolgreich angelegt.\",\"exists\":\"%{resource} wurde bereits angelegt.\",\"exists_not\":\"%{resource} wurde nicht gefunden.\",\"update\":\"%{resource} erfolgreich aktualisiert.\",\"destroy\":\"%{resource} erfolgreich gelöscht.\",\"found\":\"%{resource} gefunden.\"},\"form\":{\"choose_resource\":\"%{resource} auswählen\",\"help\":{\"between_x_and_y\":\"Wert muss zwischen %{x} und %{y} liegen\",\"confirm_input\":\"Eingabe bestätigen\",\"file_formats_allowed\":\"Erlaubte Dateitypen: %{formats}\",\"including_international_area_code\":\"Inkl. Landesvorwahl\",\"min_length\":\"Muss mindestens %{min_length} Zeichen lang sein\",\"notified_by_mail\":\"Wird per E-Mail benachrichtigt\",\"optional\":\"Optional\",\"set_automatically\":\"Wird automatisch gesetzt\",\"unique\":\"Darf noch nicht vergeben worden sein\",\"user_has_not_submitted_location\":\"%{user} hat bei der %{model} keine Position übermittelt.\"},\"hint\":{\"contact_person_type\":\"Bitte Typ „intern“ für Ansprechpartner wählen, für die ein Benutzeraccount bei CGX exisitiert. Dies kann später nicht mehr geändert werden.\",\"for_sorting\":\"Für die Sortierung (1-n; 1 ist am niedrigsten)\",\"instance_must_be_saved\":\"Die unten aufgelisteten Daten wurden erfolgreich angelegt und können nun von Ihnen gespeichert werden. Bitte prüfen Sie Ihre Eingaben sorgfältig. Sie können die Daten später nicht mehr ändern.\",\"irreversible\":\"Diese Aktion kann nicht mehr rückgängig gemacht werden.\",\"no_elements_for_instance\":\"Es wurden noch keine %{elements} für diese %{model} angelegt. Legen Sie zuerst zu dieser %{model} zugehörige %{elements} an.\",\"new_access_to_resource\":\"Hier können Sie Benutzern aus anderen Organisationen Zugriff auf %{resource} geben.\",\"new_order_for_trade\":\"Das hier ausgewählte Gewerk, erhält eine Anfrage einen Kostenvoranschlag für dieses Ticket abzugeben.\",\"while_data_acquisition_is_running\":\"Während eine %{data_acquisition} läuft, können Sie andere Vorgänge innerhalb der App starten oder die App schließen und später zurückkehren. Eine nicht abgeschlossene %{data_acquisition} wird nach 24 Stunden gelöscht.\",\"fix_defect_inspection\":\"Hier können Sie mangelhafte Einzelleistungen korrigieren. Für jede korrigierte Leistung wird der Ist-Wert automatisch zum Soll-Wert. Wenn die Prüfung keine mangelhaften Leistungen mehr aufweist, hat diese wieder 100% und wird nicht mehr unter den mangelhaften Prüfungen aufgelistet.\",\"defect_inspection_max_correction_timeframe_exceeded\":\"Da der Mängelbehebungszeitraum überschritten wurde, führen Korrekturen nicht mehr zu einer Veränderung der Punktzahl.\",\"inspection_settings_rating_system\":\"System das bei der Bewertung einzelner Prüfungsleistungen verwendet wird.\",\"inspection_settings_evaluation_system\":\"System das bei der Auswertung (z. B. Berichte) verwendet wird.\",\"inspection_settings_max_correction_timeframe\":\"Falls angegeben, muss die Mängelbehebung für Prüfungen innerhalb dieses Zeitraums geschehen, da ansonsten keine Korrektur der Punktzahl mehr erfolgt\",\"reports_will_be_sent_if_there_are_any_data_acquisitions\":\"Berichte werden verschickt, sofern für den ausgwählten Berichtstyp, Zeitraum und das gewählte Objekt Datensätze vorhanden sind.\"}},\"navigation\":{\"access\":\"Zugang\",\"acquisition_of_data\":\"Erfassung\",\"acquisitions\":\"Erfassungen\",\"back\":\"Zurück\",\"beginning\":\"Anfang\",\"cancel\":\"Abbrechen\",\"cancel_data_acquisition\":\"%{data_acquisition} abbrechen\",\"crud\":{\"activate\":\"Aktivieren\",\"activate_resource\":\"%{resource} aktivieren\",\"add_resource\":\"%{resource} hinzufügen\",\"add_another_resource\":\"Weitere(s) %{resource} hinzufügen\",\"actions\":\"Aktionen\",\"change_resource\":\"%{resource} ändern\",\"close\":\"Schließen\",\"close_resource\":\"%{resource} schließen\",\"confirm_resource\":\"%{resource} bestätigen\",\"copy\":\"Kopieren\",\"copy_resource\":\"%{resource} kopieren\",\"destroy\":\"Löschen\",\"delete\":\"Löschen\",\"delete_resource\":\"%{resource} löschen\",\"deactivate\":\"Deaktivieren\",\"deactivate_resource\":\"%{resource} deaktivieren\",\"edit\":\"Bearbeiten\",\"edit_resource\":\"%{resource} bearbeiten\",\"new\":\"Neu\",\"new_resource\":\"%{resource} anlegen\",\"number_of_resources\":\"Anzahl %{resources}\",\"rate_resource\":\"%{resource} bewerten\",\"rate\":\"Bewerten\",\"save\":\"Speichern\",\"save_resource\":\"%{resource} speichern\",\"show\":\"Anzeigen\",\"show_resource\":\"%{resource} anzeigen\"},\"finalize\":\"Abschließen\",\"index_resource\":\"Übersicht %{resource}\",\"inspection_end\":\"Prüfung abschließen\",\"jump_to_content\":\"Zum Inhalt springen\",\"filter_search\":\"Filtersuche\",\"filter_from\":\"Von\",\"filter_till\":\"Bis\",\"filter_by\":\"Filtern nach:\",\"filter_inactive\":\"Inaktive anzeigen\",\"hide\":\"Ausblenden\",\"languages\":{\"de\":\"Deutsch\",\"en\":\"Englisch\"},\"legend\":\"Legende\",\"login\":\"Login\",\"logout\":\"Abmelden\",\"my_user_account\":\"Mein Benutzerkonto\",\"new_check_in\":\"Neuer Check-In\",\"new_inspection\":\"Neue Prüfung\",\"new_monitoring_sheet\":\"Neue Betriebsdaten\",\"new_notice\":\"Neue Meldung\",\"new_ticket\":\"Neues Ticket\",\"new_time_tracking\":\"Neue Zeiterfassung\",\"new_vehicle\":\"Neues Fahrzeug\",\"next\":\"Weiter\",\"none\":\"–\",\"of\":\"von\",\"ok\":\"OK\",\"page\":\"Seite\",\"print\":\"Drucken\",\"print_item\":\"%{item} drucken\",\"reload\":\"Neu laden\",\"remove\":\"Entfernen\",\"reset\":\"Zurücksetzen\",\"rights_management\":\"Rechteverwaltung\",\"search\":\"Suchen\",\"send\":\"Senden\",\"submit\":\"Absenden\",\"select\":\"Bitte auswählen …\",\"settings\":\"Einstellungen\",\"status\":\"Status\",\"step_x_of_y\":\"Schritt %{x} von %{y}\",\"switch_organization\":\"Organisation wechseln\",\"switched_organization\":\"Gewechselt zu %{organization}.\",\"time_tracking_start\":\"Zeiterfassung starten\",\"time_tracking_end\":\"Zeiterfassung abschließen\",\"time_tracking_settings\":\"Zeiterfassungseinstellungen\",\"toggle_nav\":\"Navigation ein-/ausblenden\",\"top\":\"Nach oben\",\"value_transfer\":\"Werte übernehmen und …\",\"update\":\"Aktualiseren\",\"view\":\"Ansicht\"},\"pages\":{\"administration\":\"Administration\",\"analysis\":\"Auswertungen\",\"dashboard\":\"Übersicht\",\"home\":\"Home\",\"help\":\"Hilfe\",\"imprint\":\"Impressum\",\"news\":\"Neuigkeiten\",\"privacy_policy\":\"Datenschutz\",\"privacy_policy_statement\":\"Datenschutzerklärung\",\"report_problem\":\"Problem melden\",\"rights_management\":\"Rechteverwaltung\",\"safety_of_processing\":\"Sicherheit der Verarbeitung\",\"user_profile_edit\":\"Benutzerprofil bearbeite\"},\"sms\":{\"time_tracking_started\":\"Hallo %{contact_name}, um %{time} Uhr wurde eine neue Zeiterfassung von %{membership_name} bei %{organization_name} im Objekt %{estate_name} gestartet.\",\"time_tracking_ended\":\"Hallo %{contact_name}, um %{time} Uhr wurde eine Zeiterfassung von %{membership_name} bei %{organization_name} im Objekt %{estate_name} beendet.\"},\"snippets\":{\"account\":\"Account\",\"activity_pending\":\"%{activity} ausstehend\",\"already_registerd\":\"Schon registriert?\",\"all\":\"Alle\",\"answer\":\"Antwort\",\"at_time\":\"um\",\"by_percent\":\"in Prozent\",\"choose_all\":\"Alle aus-/abwählen\",\"consumption\":\"Verbrauch\",\"contact\":\"Kontakt\",\"count_finished\":\"%{count} erledigt\",\"count\":\"Anzahl\",\"created_at\":\"Angelegt am\",\"data\":\"Daten\",\"data_acquisition\":\"Datenerfassung\",\"data_acquisitions\":\"Datenerfassungen\",\"date\":\"Datum\",\"deactivate_resource\":\"%{resource} aktiv/inaktiv setzten\",\"deactivate_contact_person_hint_html\":\"\\u003cp\\u003eAlle verknüpften \\u003cb\\u003eMeldungen bleiben erhalten\\u003c/b\\u003e.\\u003c/p\\u003e \\u003cp\\u003eVerknüpfungen zu Objekten und die Einstellungen zum Berichtsversand für diesen Ansprechpartner werden gelöscht.\\u003c/p\\u003e \\u003cp\\u003eInaktive Kontaktpersonen werden mit einen Namenszusatz kenntlich gemacht, z.B. „Max Mustermann (inaktiv)“ und werden in der Übersicht standardmäßig ausgeblendet.\\u003c/p\\u003e \\u003cp\\u003eDer Vorgang \\u003cb\\u003ekann wieder rückgängig gemacht werden\\u003c/b\\u003e.\\u003c/p\\u003e\",\"deactivate_membership_hint_html\":\"\\u003cp\\u003eAlle mit dem Benutzer verknüpften \\u003cb\\u003eDatensätze bleiben bestehen\\u003c/b\\u003e, der Benutzer kann sich aber nicht mehr in die aktuell ausgewählte Organisation einwählen.\\u003c/p\\u003e \\u003cp\\u003eInaktive Benutzer werden mit einen Namenszusatz kenntlich gemacht z. B. „Max Mustermann (inaktiv)“ und werden in der Übersicht standardmäßig ausgeblendet.\\u003c/p\\u003e \\u003cp\\u003eDer Vorgang \\u003cb\\u003ekann wieder rückgängig gemacht werden\\u003c/b\\u003e.\\u003c/p\\u003e\",\"deactivate_user_hint_html\":\"\\u003cp\\u003eAlle mit dem Benutzer verknüpften \\u003cb\\u003eDatensätze bleiben bestehen\\u003c/b\\u003e, der Benutzer kann sich aber nicht mehr in das System einloggen.\\u003c/p\\u003e \\u003cp\\u003eInaktive Benutzer werden mit einen Namenszusatz kenntlich gemacht z. B. „Max Mustermann (inaktiv)“ und werden in der Übersicht standardmäßig ausgeblendet.\\u003c/p\\u003e \\u003cp\\u003eDer Vorgang \\u003cb\\u003ekann wieder rückgängig gemacht werden\\u003c/b\\u003e.\\u003c/p\\u003e\",\"deactivate_user_with_contact_person_hint_html\":\"\\u003cp\\u003eIst der Nutzer als \\u003cb\\u003eAnsprechpartner\\u003c/b\\u003e für Meldungen angelegt, wird dies ebenfalls (de)aktiviert.\\u003c/p\\u003e\",\"deactivate_ticket_trade_hint_html\":\"\\u003cp\\u003eAlle verknüpften Tickets bleiben bestehen, das Gewerk kann aber nicht mehr für neue Tickets ausgewählt werden.\\u003c/p\\u003e \\u003cp\\u003eVerknüpfungen zu Objekten werden gelöscht. Inaktive Gewerke werden mit einen Namenszusatz kenntlich gemacht z. B. „Musterfirma (inaktiv)“.\\u003c/p\\u003e \\u003cp\\u003eDer Vorgang \\u003cb\\u003ekann wieder rückgängig gemacht werden\\u003c/b\\u003e.\\u003c/p\\u003e\",\"download\":\"Herunterladen\",\"export\":\"Exportieren\",\"export_resource\":\"%{resource} exportieren\",\"for\":\"für\",\"free_text\":\"Freitext\",\"from\":\"vom\",\"general\":\"Allgemein\",\"goodbye\":\"Mit besten Grüßen\",\"greetings\":\"Hallo\",\"inspection_template\":\"Vorlage\",\"inactive_email\":\"nicht@aktiv.de\",\"latest\":\"Neueste\",\"more_than\":\"Mehr als\",\"no_content\":\"Kein Inhalt\",\"new_here\":\"Neu hier?\",\"only\":\"nur\",\"overall\":\"Gesamt\",\"overview\":\"Übersicht\",\"quota\":\"Speicher\",\"rating\":\"Bewertung\",\"running_since\":\"%{resource}\",\"set_x\":\"%{resource} einstellen\",\"type\":\"Art\",\"unconfirmed\":\"Unbestätigt\",\"up_to\":\"Bis\",\"view\":\"Ansicht\",\"was\":\"war\",\"welcome\":\"Willkommen\"},\"devise\":{\"confirmations\":{\"didn_t_receive_confirmation_instructions\":\"Keine E-Mail mit Anweisungen zur Anmeldung erhalten?\",\"confirmation_pending\":\"Bestätigung für %{resource} steht noch aus.\",\"conformation_pending_custom\":\"Dieser Benutzeraccount ist noch nicht freigeschalten. Bitte den Benutzeraccount zuerst via E-Mail bestätigen, welche am %{date_sent} an %{email} gesendet wurde.\",\"confirmed\":\"Ihre E-Mail-Adresse wurde erfolgreich bestätigt.\",\"resend\":\"Erneut senden\",\"resend_instruction\":\"Anleitung zur Bestätigung des Benutzerkontos erneut senden\",\"send_instructions\":\"Sie erhalten in wenigen Minuten eine E-Mail mit einem Bestätigungslink.\",\"send_paranoid_instructions\":\"Falls ihre E-Mail-Adresse in unserer Datenbank existiert, werden Sie in wenigen Minuten eine E-Mail mit dem Bestätigungslink erhalten.\"},\"failure\":{\"already_authenticated\":\"Sie sind bereits angemeldet.\",\"inactive\":\"Ihr Benutzerkonto wurde noch nicht aktiviert.\",\"invalid\":\"Ungültige E-Mail oder ungültiges Passwort.\",\"locked\":\"Ihr Benutzerkonto ist gesperrt.\",\"last_attempt\":\"Bei der nächsten fehlgeschlagenen Anmeldung wird ihr Benutzerkonto gesperrt.\",\"not_found_in_database\":\"E-Mail oder Passwort ungültig.\",\"timeout\":\"Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an, um fortzufahren.\",\"unauthenticated\":\"Sie müssen sich anmelden oder ein Benutzerkonto erstellen, um fortzufahren.\",\"unconfirmed\":\"Sie müssen ihre E-Mail-Adresse bestätigen, bevor Sie fortfahren können.\"},\"mailer\":{\"confirmation_instructions\":{\"subject\":\"Bestätigung ihrer Anmeldung\",\"confirm_through_link\":\"Sie können ihre E-Mail-Adresse bestätigen, indem Sie dem unten stehenden Link folgen:\",\"confirm_link\":\"Mein Benutzerkonto bestätigen\"},\"password_change\":{\"subject\":\"Passwortänderung\"},\"reset_password_instructions\":{\"subject\":\"Anleitung zum Zurücksetzen ihres Passworts\"},\"unlock_instructions\":{\"subject\":\"Anleitung zur Entsperrung ihres Benutzerkontos\"}},\"omniauth_callbacks\":{\"failure\":\"Sie konnten von %{kind} nicht authentifiziert werden, weil \\\"%{reason}\\\".\",\"success\":\"Erfolgreich vom %{kind} Benutzerkonto bestätigt..\"},\"passwords\":{\"change_password\":\"Mein Passwort ändern\",\"changed_explanation\":\"Das Passwort zu ihrem Zugang (%{email}) wurde erfolgreich geändert.\",\"change_password_ignore\":\"Falls Sie keine Änderung ihres Passworts wünschen, ignorieren Sie bitte diese E-Mail.\",\"change_password_only_if_linkaccess\":\"Ihr Passwort wird sich nur ändern, wenn Sie dem oben stehenden Link folgen.\",\"change_password_requested\":\"Es wurde eine Änderung ihres Passworts angefordert. Diese kann über unten stehenden Link ausgeführt werden.\",\"create_password\":\"Passwort erstellen\",\"create_password_first\":\"Willkommen! Bitte legen Sie zunächst ein Passwort für ihr Benutzerkonto fest.\",\"mail_instructions\":\"Infos zur Passwortänderung senden\",\"no_token\":\"Sie können auf diese Seite ohne E-Mail mit einem Link zum Zurücksetzen des Passworts nicht zugreifen. Bitte benutzen Sie den gesamten Link aus ihrer Bestätigungs-E-Mail.\",\"send\":\"Senden\",\"send_instructions\":\"Sie erhalten in wenigen Minuten eine E-Mail mit einer Anleitung zum Zurücksetzen ihres Passworts.\",\"send_paranoid_instructions\":\"Wenn ihre E-Mail-Adresse in unserer Datenbank existiert, erhalten Sie einen Link zum Zurücksetzen ihres Passworts innerhalb weniger Minuten.\",\"updated\":\"Ihr Passwort wurde erfolgreich geändert. Sie sind jetzt eingeloggt.\",\"updated_not_active\":\"Ihr Passwort wurde erfolgreich geändert.\"},\"registrations\":{\"destroyed\":\"Bye! Your account has been successfully cancelled. We hope to see you again soon.\",\"sign_up\":\"Anmelden\",\"register\":\"Neue Organisation registrieren\",\"help\":\"Wenn Sie Mitglied einer existierenden Organisation/Firma sind, folgend Sie bitte dem Aktivierungslink, den Sie vom Verwalter des Accounts ihrer Organisation erhalten haben. Sie sollten sich nicht für einen neuen Organisations-Account anmelden.\",\"need_current_password\":\"Wir benötigen ihr aktuelles Passwort, um ihre Änderungen zu verifizieren\",\"signed_up\":\"Willkommen! Sie haben sich erfolgreich angemeldet.\",\"signed_up_but_inactive\":\"Sie wurden erfolgreich angemeldet. Sie können sich jedoch erst einloggen, wenn ihr Benutzerkonto aktiviert wurde.\",\"signed_up_but_locked\":\"Sie haben sich erfolgreich angemeldet. Sie können sich jedoch nicht einloggen, da ihr Benutzerkonto gesperrt ist.\",\"signed_up_but_unconfirmed\":\"Eine Nachricht mit einem Bestätigungslink wurde an ihre E-Mail-Adresse gesendet. Bitte benutzen Sie den Link, um ihr Benutzerkonto zu aktivieren.\",\"update_needs_confirmation\":\"Sie haben ihr Benutzerkonto erfolgreich aktualisiert, wir müssen jedoch ihre neue E-Mail-Adresse verifizieren. Bitte rufen Sie ihre E-Mails ab und folgen Sie dem Bestätigungslink um ihre E-Mail-Adresse zu bestätigen.\",\"updated\":\"Benutzerkonto wurde erfolgreich aktualisiert.\"},\"sessions\":{\"forgot_your_password\":\"Passwort vergessen?\",\"remember_me\":\"Eingeloggt bleiben\",\"sign_in\":\"Login\",\"sign_in_to_account\":\"Melden Sie sich mit ihrem Benutzerkonto an\",\"signed_in\":\"Anmeldung erfolgreich.\",\"signed_out\":\"Abmeldung erfolgreich.\",\"already_signed_out\":\"Abmeldung erfolgreich.\"},\"unlocks\":{\"account_was_locked\":\"Ihr Benutzerkonto wurde auf Grund einer sehr hohen Zahl fehlgeschlagener Loginversuche gesperrt.\",\"click_link_to_unlock\":\"Folgen Sie dem unten stehenden Link, um ihr Benutzerkonto wieder zu entsperren:\",\"didn_t_receive_unlock_instructions\":\"Keine E-Mail mit Anweisungen zur Entsperrung erhalten?\",\"send_instructions\":\"Sie erhalten in wenigen Minuten eine E-Mail, mit Anweisungen wie Sie ihre Benutzerkonto entsprren können.\",\"send_paranoid_instructions\":\"Wenn ihr Benutzerkonto existiert, werden Sie in wenigen Minuten eine E-Mail mit Anweisungen für die Freischaltung ihres Accounts erhalten. Bitte loggen Sie sich ein um fortzufahren.\",\"unlocked\":\"Ihr Benutzerkonto wurde erfolgreich entsperrt. Bitte loggen Sie sich ein, um fortzufahren.\",\"unlock_my_account\":\"Mein Benutzerkonto entsperren\"}},\"monitoring_mailer\":{\"template_notification\":{\"subject\":\"Erfassung Betriebsdaten steht an\",\"greeting\":\"folgende Betriebsdaten sollen um %{time} Uhr erfasst werden:\",\"create_monitoring_sheet\":\"Sie können die Betriebsdaten über folgenden Link erstellen:\"}},\"mailer\":{\"links\":\"Einige ältere E-Mail-Clients haben Probleme mit eingebetteten Links. Bitte kopieren Sie den folgenden Link manuell in ihren Webbrowser, falls derartige Probleme auftreten\",\"texts\":{\"and_number_of_other_attachments\":\"… und %{number} weitere(r).\"},\"user_mailer\":{\"subjects\":{\"new_membership\":\"Zugang %{sender}\"},\"headings\":{\"new_membership\":\"Sie haben Zugriff auf eine weitere Organisation erhalten\"},\"texts\":{\"confirm_my_membership\":\"Meinen Benutzeraccount (%{user}) der Organisation %{organization} hinzufügen\",\"new_membership_details\":\"Sie haben eine Freigabe für den Zugriff auf die Organisation %{organization} erhalten. Ab sofort können Sie über die Hauptnavigation auch in den diesen Account wechseln und dort, je nach den Benutzerrechten die ihnen eingeräumt wurden, Daten einsehen und bearbeiten.\",\"access_organization\":\"Um ihre Mitgliedschaft in dieser Organisation zu bestätigen, öffnen Sie bitte nachfolgenden Link in einem Webbrowser\"}},\"notice_mailer\":{\"headings\":{\"begin_work\":\"Arbeit beginnen\",\"close\":\"Erledigen/Schließen\",\"contact_details\":\"Kontktdaten\",\"content\":\"Inhalt\",\"overview\":\"Übersicht\"},\"subjects\":{\"notice_created\":\"Neue Meldung %{id} von %{sender}\",\"notice_updated\":\"Meldung %{id} wurde aktualisiert\"},\"texts\":{\"number_of_attachments\":\"%{number} Datei(en) insgesamt.\",\"following_notice_was_sent\":\"die folgende Nachricht wurde ihnen von %{messenger_name} zugesandt.\",\"see_below\":\"Unten stehend finden Sie Informationen, wie Sie die Meldung ansehen und/oder bearbeiten können.\",\"view_notice_in_browser\":\"Sie können die Meldung mit einem Klick auf diesen Link in ihrem Webbrowser ansehen\"}},\"ticket_mailer\":{\"headings\":{\"approve\":\"Freigeben\",\"comment_approve_reject\":\"Freigeben/Ablehnen\",\"kind\":\"Art\",\"close\":\"Schließen\",\"categorization\":\"Kategorisierung\",\"comment_close_reject\":\"Rückmelden/Ablehnen\",\"content\":\"Inhalt\",\"edit\":\"Bearbeiten\",\"message\":\"Nachricht\",\"ticket_from\":\"Ticket %{id} von %{sender}\",\"overview\":\"Übersicht\"},\"subjects\":{\"ticket_created\":\"Neues Ticket %{id} von %{sender}\",\"ticket_has_new_cost_estimate\":\"Kostenvoranschlag für Ticket %{id} liegt vor\",\"ticket_has_new_completion\":\"Auftrag zu Ticket %{id} ist fertiggestellt\",\"ticket_order_has_new_comment\":\"Neuer Kommentar zum Auftrag\",\"ticket_has_new_workflow_step\":\"Ticket %{id}\",\"ticket_has_new_order\":\"Neuer Auftrag von %{sender}\",\"ticket_closed\":\"Ticket %{id} geschlossen\",\"ticket_workflow_step_reminder\":\"Ticket %{id} wartet auf Bearbeitung\"},\"texts\":{\"number_of_attachments\":\"%{number} Datei(en) insgesamt.\",\"following_ticket_was_sent\":\"das folgende Ticket wurde von %{messenger_name} erstellt.\",\"order_completed\":\"der Auftrag für Ticket %{id} ist vom Gewerk als fertiggestellt gemeldet worden.\",\"new_comment\":\"es liegt ein neuer Kommentar zum Auftrag für das Ticket %{id} vor.\",\"new_cost_estimate\":\"Es liegt ein Kostenvoranschlag für Ticket %{id} vor.\",\"please_submit_cost_estimate\":\"bitte geben Sie einen Kostenvoranschlag zur Prüfung für dieses Ticket ab.\",\"see_below\":\"Unten stehend finden Sie Informationen, wie Sie das Ticket ansehen und/oder bearbeiten können.\",\"thanks_for_creating_this_ticket\":\"danke für das erstellen eines neuen Tickets.\",\"ticket_closed\":\"das von Ihnen erstellte Ticket wurde soeben geschlossen.\",\"view_ticket_in_browser\":\"Sie können das Ticket mit einem Klick auf diesen Link in ihrem Webbrowser ansehen\",\"ticket_workflow_step_reminder\":\"das Ticket %{id} wartet seit %{days} Tagen auf Bearbeitung durch Sie.\"}},\"time_tracking_mailer\":{\"subjects\":{\"time_tracking_started\":\"Neue Zeiterfassung %{id} bei %{organization} gestartet\",\"time_tracking_ended\":\"Zeiterfassung %{id} bei %{organization} beendet\"},\"texts\":{\"time_tracking_started\":\"%{membership_name} hat eine Zeiterfassung gestartet:\",\"time_tracking_ended\":\"%{membership_name} hat eine Zeiterfassung beendet:\"}},\"reports_mailer\":{\"subjects\":{\"new_report_name\":\"Neuer %{report_name}\"},\"texts\":{\"please_find_attachment_kind\":\"im Anhang finden Sie ihren gewünschten „%{report_name}“ im PDF-Format.\"}}},\"recurring_select\":{\"not_recurring\":\"Nicht wiederkehrend\",\"set_schedule\":\"Zeitplan einstellen …\",\"change_schedule\":\"Zeitplan ändern …\",\"new_custom_schedule\":\"Neuer benutzerdefinierter Zeitplan\",\"custom_schedule\":\"Benutzerdefinierter Zeitplan …\",\"or\":\"oder\"},\"reports\":{\"report\":\"Bericht\",\"reports\":\"Berichte\",\"inspections\":{\"achieved_points\":\"Erreichte\",\"achievable_points\":\"Erreichbare Punkte\",\"before_correct_services_short\":\"vor Mängelbeh.\",\"grouped_by_administered_by\":\"Nach Ersteller\",\"grouped_by_service_group_category\":\"Nach Leistungsgruppe\",\"grade\":\"Note\",\"of_which_are_red\":\"Davon rot bewertet\",\"of_which_are_yellow\":\"Davon gelb bewertet\",\"of_which_are_green\":\"Davon grün bewertet\",\"rating_scale\":\"Bewertungsskala\",\"result\":\"Ergebnis\",\"status\":\"Status\",\"service_group_category_service_group\":\"Kategorie / Leistungsgruppe\",\"toplist\":\"Häufigste mangelhafte Leistungen\",\"toplist_short\":\"Mangelhafte Leistungen\",\"toplist_empty\":\"Keine mangelhaften Leistungen in diesem Zeitraum\",\"weight\":\"Gewichtung\",\"with_100_percent\":\"Prüfungen bestanden (100%)\",\"with_less_than_100_percent\":\"Prüfungen nicht bestanden (\\u003c 100%)\",\"inspections_with_100_percent_quota\":\"Quote bestandener Prüfungen\"},\"monitoring_sheets\":{\"grouped_by_template\":\"Nach Betriebsdatenblatt\"},\"charts\":{\"count_per\":{\"daily\":\"Anzahl der %{acquisition} pro Stunde\",\"monthly\":\"Anzahl der %{acquisition} pro Tag\",\"yearly\":\"Anzahl der %{acquisition} pro Monat\"},\"result_per\":{\"daily\":\"Ergebnis der %{acquisition} nach Stunde\",\"monthly\":\"Ergebnis der %{acquisition} nach Tag\",\"yearly\":\"Ergebnis der %{acquisition} nach Monat\"},\"grouped_by_priority\":\"Nach Priorität\",\"grouped_by_state\":\"Nach Status\",\"accumulated_time\":\"Akkumulierte Dauer in Tagen\"},\"not_enough_data_yet\":\"Keine Datensätze für die Erstellung eines Berichts (im angegebenen Zeitraum) vorhanden.\",\"number_short\":\"Anz.\",\"preparation_in_progress\":\"Bericht wird erzeugt\",\"rank\":\"Rang\",\"reports_daily\":{\"title\":{\"one\":\"Tagesbericht\",\"other\":\"Tagesberichte\"}},\"reports_defect_inspections\":{\"title\":\"Prüfungen/Mängel\"},\"reports_monthly\":{\"notices\":{\"grouped_by_notice_kind\":\"Nach Meldungsart\",\"of_which_are_open\":\"Davon offen\",\"of_which_are_accept\":\"Davon abgenommen\",\"of_which_are_approve\":\"Davon freigegeben\",\"of_which_are_begin_work\":\"Davon in Arbeit\",\"of_which_are_close\":\"Davon geschlossen\",\"of_which_are_deny\":\"Davon abgelehnt\",\"title\":\"Monatsbericht Meldungen\"},\"tickets\":{\"of_which_are_open\":\"Davon offen\",\"of_which_are_closed\":\"Davon geschlossen\",\"title\":\"Monatsbericht Tickets\"},\"time_trackings\":{\"title\":\"Monatsbericht Zeiterfassungen\"},\"title\":{\"one\":\"Monatsbericht\",\"other\":\"Monatsberichte\"}},\"reports_yearly\":{\"title\":{\"one\":\"Jahresbericht\",\"other\":\"Jahresberichte\"}},\"select_time_period\":\"Zeitraum\",\"check_ins\":{\"grouped_by_location\":\"Nach Standort\",\"no_room_name\":\"k. A.\"},\"time_trackings\":{\"locations\":\"Häufigste Standorte\",\"hint_locations\":\"Aus Performanzgründen werden max. 100 Standorte gleichzeitig dargestellt.\",\"grouped_by_time_tracking_type\":\"Nach Zeiterfassungsart\",\"grouped_by_duration\":\"Nach Dauer\",\"hint_time_tracking_types_count\":\"Da je Zeiterfassung mehrere Zeiterfassungsarten vergeben werden können, stimmt die hier dargestellte Anzahl nicht zwangsläufig mit der Gesamtanzahl der Zeiterfassungen für den gewählten Zeitraum überein.\"},\"title\":{\"one\":\"Bericht\",\"other\":\"Berichte\"}},\"simple_calendar\":{\"next\":\"›\",\"previous\":\"‹\",\"week\":\"Woche\",\"today\":\"Heute\"}}}\nconst i18n = new I18n(translations)\n\ni18n.defaultLocale = \"de\"\ni18n.locale = locale\n\nexport default i18n\n","import { CustomUploader } from './custom_uploader'\nimport I18n from './i18n-settings.js.erb'\nconst reduce = require('image-blob-reduce')()\n\n// We have a file upload field in a div called .custom-file\n// 1. When a file gets attached to it, we hide .custom-file and show a\n// progress bar\n// 2. When the upload finishes, we\n// - hide the progress bar\n// - add a div .finished-upload, which is a modified copy of .custom-\n// file that shows the file and contains a hidden field with the\n// file params\n// - remove the hidden field from .custom-file\n// - show a link to add another file (if multipe uploads are enabled\n// and there are less than 10 uploads already in this .form-group)\n// 3. When the link to add another file is clicked,\n// - we show the original file input again, which was hidden until now\n// - we hide that very same link again\n// 4. Repeat from step one, to add more uploads\n// 5. When the trash bin icon on the .finished-upload is clicked, we\n// remove the respective .finished-upload div\n// 6. When the last .finished-upload div gets removed, we show the file\n// upload field again\n//\n// If the form redisplays, for example because of validation errors, the\n// state after step 2 should be displayed (without invoking any JS)\n\ndocument.addEventListener('turbolinks:load', () => {\n // Handle change, e.g. User attaches a file\n const inputs = Array.from(document.querySelectorAll('.custom-file-input')) // Array.from needed as a Tribute to IE11\n\n // Bind to file selection\n if (inputs.length > 0) {\n inputs.forEach(input => {\n addUploadEventListener(input)\n })\n }\n\n // Handle reset\n const customFileGroupsFinished = Array.from(document.querySelectorAll('.custom-file.finished-upload'))\n if (customFileGroupsFinished.length > 0) {\n customFileGroupsFinished.forEach(customFileGroup => {\n customFileGroup.addEventListener('click', resetUploadField)\n })\n }\n\n // Handle \"Add another upload\" link\n const customFileGroups = Array.from(document.querySelectorAll('.custom-file'))\n if (customFileGroups.length > 0) {\n customFileGroups.forEach(customFileGroup => {\n const formGroup = customFileGroup.parentNode\n const addUploadLink = formGroup.querySelector('.add-upload-link a')\n if (addUploadLink) {\n // Event listener\n addUploadLink.addEventListener('click', event => {\n event.preventDefault()\n // Just show original upload field\n formGroup.querySelector('.custom-file.original').classList.remove('d-none')\n event.target.parentNode.classList.add('invisible')\n })\n }\n })\n }\n})\n\naddEventListener('direct-upload:initialize', event => {\n const { target, detail } = event\n const { id, file } = detail\n\n const customFileGroup = target.parentNode\n\n customFileGroup.classList.add('d-none')\n\n customFileGroup.insertAdjacentHTML('beforebegin', `\n
\n \n ${file.name}\n
\n `)\n})\n\naddEventListener('direct-upload:start', event => {\n const { id, file } = event.detail\n const element = document.getElementById(`direct-upload-${id}`)\n element.classList.remove('direct-upload--pending')\n\n // Disable submit button\n document.querySelector('button.crud_action_create').disabled = true\n // Add preview image\n element.insertAdjacentHTML('afterbegin', '')\n previewImage(file, element)\n})\n\naddEventListener('direct-upload:progress', event => {\n const { id, progress } = event.detail\n const progressElement = document.getElementById(`direct-upload-progress-${id}`)\n progressElement.style.width = `${progress}%`\n})\n\naddEventListener('direct-upload:error', event => {\n event.preventDefault()\n const { id, error } = event.detail\n const element = document.getElementById(`direct-upload-${id}`)\n element.classList.add('direct-upload--error')\n element.setAttribute('title', error)\n})\n\naddEventListener('direct-upload:end', event => {\n const { target, detail } = event\n const { id, file } = detail\n const progress = document.getElementById(`direct-upload-${id}`)\n const uploadFileGroup = target.parentNode\n const formGroup = uploadFileGroup.parentNode\n const addUploadLink = formGroup.querySelector('.add-upload-link')\n\n // Enable submit button\n document.querySelector('button.crud_action_create').disabled = false\n\n // Hide progress bar\n progress.parentNode.removeChild(progress)\n\n // Show finished-upload\n const finishedUploadGroup = uploadFileGroup.cloneNode(true)\n finishedUploadGroup.classList.add('finished-upload')\n // Add preview image\n finishedUploadGroup.querySelector('.custom-file-label').insertAdjacentHTML('afterbegin', '')\n previewImage(file, finishedUploadGroup)\n // Display and insert that shit\n finishedUploadGroup.classList.remove('d-none')\n finishedUploadGroup.classList.remove('original')\n uploadFileGroup.parentNode.insertBefore(finishedUploadGroup, uploadFileGroup)\n\n // Remove hidden field from uploadFileGroup\n const hiddenInput = uploadFileGroup.querySelector('.cache')\n hiddenInput.parentNode.removeChild(hiddenInput)\n\n // Show \"Add another upload\" link if there are not more then 10 uploads\n // already attached\n if (addUploadLink && formGroup.querySelectorAll('.custom-file').length <= 11) {\n addUploadLink.classList.remove('invisible')\n }\n\n // Reset file field label\n const placeholderText = uploadFileGroup.querySelector('.custom-file-input').dataset.fallbackPlaceholder\n uploadFileGroup.querySelector('.custom-file-label').innerHTML = placeholderText\n\n // Handle file field reset\n finishedUploadGroup.addEventListener('click', resetUploadField, { once: true })\n})\n\nfunction resetUploadField(event) {\n const { target } = event\n event.preventDefault()\n const customFileGroup = target.parentNode\n const formGroup = customFileGroup.parentNode\n\n // Remove hidden input\n const hiddenInput = customFileGroup.querySelector('.cache')\n hiddenInput.parentNode.removeChild(hiddenInput)\n\n // Remove input if clone or reset, if original\n if (customFileGroup.classList.contains('finished-upload')) {\n customFileGroup.parentNode.removeChild(customFileGroup)\n }\n\n if (formGroup.querySelectorAll('.custom-file').length <= 1) {\n // Display hidden original .custom-file\n const originalCustomFileGroup = formGroup.querySelector('.custom-file.original')\n originalCustomFileGroup.classList.remove('d-none')\n // Restore label text\n const placeholderText = originalCustomFileGroup.querySelector('.custom-file-input').dataset.fallbackPlaceholder\n originalCustomFileGroup.querySelector('.custom-file-label').innerHTML = placeholderText\n // Hide \"Add another upload\" link\n const addUploadLink = formGroup.querySelector('.add-upload-link')\n if (addUploadLink) {\n addUploadLink.classList.add('invisible')\n }\n }\n}\n\nfunction addUploadEventListener(input) {\n input.addEventListener('change', event => {\n const { target } = event\n\n // Set filename on label\n const fileName = target.value.split('\\\\').pop()\n target.nextSibling.classList.add('selected')\n target.nextSibling.innerHTML = fileName\n\n const passToUpload = (input, file) => {\n const uploader = new CustomUploader(input, file)\n uploader.start(file)\n }\n\n Array.from(input.files).forEach(file => {\n if (isInFileNameBlackList(file.name)) {\n alert(I18n.t('errors.file_invalid'))\n } else if (file.type.match(/image.*/)) {\n // Check if the file is an image, attempt to validate it and then compress it.\n const validateImage = (file) => {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve(true) // Image is valid\n img.onerror = () => reject(new Error('Image is corrupted or invalid')) // Image is corrupted or invalid\n\n const url = URL.createObjectURL(file)\n img.src = url\n })\n }\n\n validateImage(file)\n .then(isValid => {\n if (isValid && input.dataset.compression) {\n // Image is valid, proceed with resizing and compression\n const config = {\n max: 1500,\n unsharpAmount: 80,\n unsharpRadius: 0.6,\n unsharpThreshold: 2\n }\n\n try {\n reduce\n .toBlob(file, config)\n .then(imageBlob => {\n imageBlob.lastModifiedDate = new Date()\n imageBlob.name = file.name\n\n passToUpload(input, imageBlob)\n })\n } catch {\n passToUpload(input, file)\n }\n } else {\n // If image validation failed or compression is disabled, upload the original file\n passToUpload(input, file)\n }\n })\n .catch(() => {\n alert(I18n.t('errors.file_corrupted'))\n })\n } else {\n passToUpload(input, file)\n }\n })\n // you might clear the selected files from the input\n input.value = null\n target.nextSibling.innerHTML = fileName // IE11 wil end up with empty label otherwise …\n })\n}\n\nfunction previewImage(file, container) {\n const imageType = /^^image\\/|application\\/pdf/\n\n if (imageType.test(file.type)) {\n const img = document.createElement('img')\n img.classList.add('obj')\n img.file = file\n container.querySelector('.upload-preview').appendChild(img)\n\n const reader = new FileReader()\n reader.onload = (function(aImg) { return function(e) { aImg.src = e.target.result } })(img)\n reader.readAsDataURL(file)\n }\n}\n\nfunction isInFileNameBlackList(fileName) {\n // Match any file name, that begins with 'MicrosoftTeams-image'\n // if (fileName.match(/^MicrosoftTeams-image/)) {\n // return true\n // }\n // Match any .dng (Adobe Digital Negative) file\n if (fileName.match(/\\.dng$/)) {\n return true\n }\n // Match any .ico file\n if (fileName.match(/\\.ico$/)) {\n return true\n }\n\n return false\n}\n","import 'ekko-lightbox'\n\n// Ekko lightbox\n$(document).on('click', '[data-toggle=\"lightbox\"]', function(event) {\n event.preventDefault()\n $(this).ekkoLightbox({\n alwaysShowClose: true,\n maxWidth: 1024,\n loadingMessage: '
'\n })\n})\n","import I18n from './i18n-settings.js.erb'\nimport select2 from 'select2/dist/js/select2'\nimport 'select2/dist/js/i18n/de'\n\n// Activate select2 dropdowns\n// ---------------------------------------------------------------------\n\n// Custom matcher, that also works with optgroups\nconst matcher = (params, data) => {\n // Always return the object if there is nothing to compare\n if ($.trim(params.term) === '') {\n return data\n }\n const original = data.text.toUpperCase()\n const term = params.term.toUpperCase()\n // Check if the text contains the term\n if (original.indexOf(term) > -1) {\n return data\n }\n // Do a recursive check for options with children\n if (data.children && (data.children.length > 0)) {\n // Clone the data object if there are children\n // This is required as we modify the object to remove any non-matches\n const match = $.extend(true, {}, data)\n // Check each child of the option\n let c = data.children.length - 1\n while (c >= 0) {\n const child = data.children[c]\n const matches = matcher(params, child)\n // If there wasn't a match, remove the object in the array\n if (matches === null) {\n match.children.splice(c, 1)\n }\n c--\n }\n // If any children matched, return the new object\n if (match.children.length > 0) {\n return match\n }\n // If there were no matching children, check just the plain object\n return matcher(params, match)\n }\n // If it doesn't contain the term, don't return anything\n return null\n}\n\n// That ugly hack is necessary to stop select2 from duplicating itself when using the back and next buttons in the browser when Turbolinks is active stackoverflow.com/questions/36497723/select2-with-ajax-gets-initialized-several-times-with-rails-turbolinks-events\ndocument.addEventListener('turbolinks:before-cache', () => {\n $('.select2-hidden-accessible').select2('destroy')\n})\n\n$(document).on('turbolinks:load', () => {\n $('.select2').select2({\n theme: 'bootstrap',\n placeholder: I18n.t('navigation.select'),\n width: '100%',\n matcher\n })\n})\n\n$(document).on('turbolinks:load', () => {\n $('.select2-without-placeholder').select2({\n theme: 'bootstrap',\n width: '100%',\n matcher\n })\n})\n\n$(document).on('turbolinks:load', () => {\n $('.select2-without-search').select2({\n enoughRoomAbove: true,\n theme: 'bootstrap',\n placeholder: I18n.t('navigation.select'),\n width: '100%',\n minimumResultsForSearch: Infinity\n })\n})\n","import 'bootstrap-4-slider'\n\n// Can't use data-attribute, because it won't work with Turbolinks\n$(document).on('turbolinks:load', () => {\n $('input.slider').bootstrapSlider()\n})\n","import I18n from '../i18n-settings.js.erb'\n\n$(document).on('turbolinks:load', () => {\n // Set dropdowns and weight input for first page of new inspections\n // ---------------------------------------------------------------------\n const selectEstate = $('#inspection_estate')\n const selectBuilding = $('#inspection_building')\n const selectFloor = $('#inspection_floor_id')\n const buildings = selectBuilding.html()\n const floors = selectFloor.html()\n\n const selectServiceGroupCategory = $('#inspection_service_group_category')\n const selectServiceGroup = $('#inspection_service_group_id')\n const serviceGroups = selectServiceGroup.html()\n const serviceGroupWeights = $('#service_group_weights').data('id-weights')\n\n const emptyOption = \"\"\n\n // Disable secondary/tertiary selects of cascades\n if (selectEstate.val() === '') { selectBuilding.prop('disabled', true) }\n if (selectBuilding.val() === '') { selectFloor.prop('disabled', true) }\n if (selectServiceGroup.val() === '') { selectServiceGroup.prop('disabled', true) }\n\n // Populate buildings\n const selectedBuilding = selectBuilding.find('option:selected').val()\n selectEstate.change(function() {\n const selectedEstate = selectEstate.find('option:selected').val()\n const options = $(buildings).filter(`optgroup[label='${selectedEstate}']`).html()\n const numberOfBuildings = options ? (options.match(/value/g) || []).length : 0\n if (options) {\n selectBuilding.prop('disabled', false)\n selectBuilding.html(options)\n // If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Building is selectable\n if (!(selectedBuilding > 0) && (numberOfBuildings !== 1)) {\n selectBuilding.prepend(emptyOption)\n }\n if (selectBuilding.val() === '') { selectFloor.prop('disabled', true) }\n } else {\n selectBuilding.empty()\n }\n return populateSelectFloor()\n })\n\n // Populate floors\n selectBuilding.change(function() {\n if (selectBuilding.val() !== '') { selectFloor.prop('disabled', false) }\n return populateSelectFloor()\n })\n\n const populateSelectFloor = () => {\n const building = selectBuilding.find(':selected').val()\n const options = $(floors).filter(`optgroup[label='${building}']`).html()\n const floor = selectFloor.find('option:selected').val()\n const numberOfFloors = options ? (options.match(/value/g) || []).length : 0\n if (options) {\n selectFloor.prop('disabled', false)\n selectFloor.html(options)\n // If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Floor is selectable\n if (!(floor > 0) && (numberOfFloors !== 1)) {\n return selectFloor.prepend(emptyOption)\n }\n } else {\n return selectFloor.empty()\n }\n }\n\n // Populate service groups\n const selectedServiceGroup = selectServiceGroup.find('option:selected').val()\n selectServiceGroupCategory.change(function() {\n const selectedServiceGroupCategory = selectServiceGroupCategory.find('option:selected').val()\n const options = $(serviceGroups).filter(`optgroup[label='${selectedServiceGroupCategory}']`).html()\n const numberOfServiceGroups = options ? (options.match(/value/g) || []).length : 0\n if (options) {\n selectServiceGroup.prop('disabled', false)\n selectServiceGroup.html(options)\n // If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one ServiceGroup is selectable\n if (!(selectedServiceGroup > 0) && (numberOfServiceGroups !== 1)) {\n selectServiceGroup.prepend(emptyOption)\n }\n if (selectServiceGroupCategory.val() === '') { return selectServiceGroup.prop('disabled', true) }\n } else {\n return selectServiceGroup.empty()\n }\n })\n\n // Populate service group weight\n selectServiceGroupCategory.change(() => setInspectionServiceGroupWeight())\n selectServiceGroup.change(() => setInspectionServiceGroupWeight())\n\n const setInspectionServiceGroupWeight = () => {\n let inspectionServiceGroupWeight\n const serviceGroupId = selectServiceGroup.find(':selected').val()\n for (let id in serviceGroupWeights) {\n const weight = serviceGroupWeights[id]\n if (id === serviceGroupId) {\n inspectionServiceGroupWeight = weight\n }\n }\n if (inspectionServiceGroupWeight) {\n // Set disabled text field\n $('#service_group_weight_showonly').val(inspectionServiceGroupWeight)\n // Set hidden field\n return $('#inspection_service_group_weight').val(inspectionServiceGroupWeight)\n } else {\n // Reset that stuff\n $('#service_group_weight_showonly').val('')\n return $('#inspection_service_group_weight').val('')\n }\n }\n\n // Also trigger everything after page (re)load, e.g. validation fail\n if (selectEstate) {\n selectEstate.trigger('change')\n }\n if (selectServiceGroupCategory) {\n selectServiceGroupCategory.trigger('change')\n }\n\n // Set points_actual for evaluation page of new Inspections\n // ---------------------------------------------------------------------\n\n // Global\n const selectPercentGlobal = $('a.is_global_percent')\n const selectPercent = $('#inspected_services input.slider')\n\n // Global\n selectPercentGlobal.click((event) => {\n event.preventDefault()\n const percent = event.target.dataset.percent\n selectPercent.each(function() {\n $(this).bootstrapSlider('setValue', percent)\n $(this).change()\n // Adapt input size for points_actual\n $(this).attr('size', $(this).val().length)\n })\n })\n\n // Single\n $('#inspected_services .points_actual input').each(function() {\n $(this).prop('readonly', 'readonly')\n // Adapt input size for points_actual\n return $(this).attr('size', $(this).val().length)\n })\n\n selectPercent.change(function() {\n const percent = $(this).val()\n const pointsTarget = $(this).closest('.body').find('.points_target input').val()\n const inputPointsActual = $(this).closest('.body').find('.points_actual input')\n\n // Calculate points_actual\n let pointsActual = ((pointsTarget * percent) / 100)\n // Try to localize\n pointsActual = pointsActual.toLocaleString(I18n.locale)\n // pointsActual = pointsActual.toFixed(1)\n inputPointsActual.val(pointsActual)\n if (percent === '100') {\n inputPointsActual.closest('.service').removeClass('not_inspected defective')\n $(this).closest('.body').find('input[name*=\"not_inspected\"]').val('')\n } else {\n inputPointsActual.closest('.service').addClass('defective')\n inputPointsActual.closest('.service').removeClass('not_inspected')\n $(this).closest('.body').find('input[name*=\"not_inspected\"]').val('')\n }\n // Adapt input size for pointsActual\n return inputPointsActual.attr('size', inputPointsActual.val().length)\n })\n\n // Handle toggle not inspected\n const disableServiceButton = $('#inspected_services .toggle-disabled button.disable_service')\n const enableServiceButton = $('#inspected_services .toggle-disabled button.enable_service')\n disableServiceButton.click(function() {\n const inputNotInspected = $(this).closest('.body').find('input[name*=\"not_inspected\"]')\n const pointsTarget = $(this).closest('.body').find('.points_target input').val()\n const inputPointsActual = $(this).closest('.body').find('.points_actual input')\n inputNotInspected.val(true)\n inputPointsActual.val(pointsTarget)\n inputPointsActual.closest('.service').addClass('not_inspected')\n $(this).hide()\n return $(this).closest('.body').find('button.enable_service').show()\n })\n enableServiceButton.click(function() {\n const inputNotInspected = $(this).closest('.body').find('input[name*=\"not_inspected\"]')\n const pointsTarget = $(this).closest('.body').find('.points_target input').val()\n const inputPointsActual = $(this).closest('.body').find('.points_actual input')\n inputNotInspected.val(false)\n inputPointsActual.val(pointsTarget)\n inputPointsActual.closest('.service').removeClass('not_inspected')\n $(this).closest('.body').find('button.disable_service').show()\n return $(this).hide()\n })\n\n // Set clockpicker for Inspection corrections\n // ---------------------------------------------------------------------\n\n $('.clockpicker').clockpicker({\n autoclose: 'true',\n placement: 'top',\n default: 'now',\n align: 'left',\n donetext: '✔'\n })\n})\n","import I18n from '../i18n-settings.js.erb'\n\n// Calculation * 100 and then / 100 is needed because of JavaScript idosyncracy regarding floats\nconst round = (value, decimals) => Number(Math.round(value + 'e' + decimals) + 'e-' + decimals)\n\nconst calculateUpper = function(startValue) {\n if (startValue.includes(',')) {\n startValue = startValue.replace(',', '.')\n }\n let upperValue = round((parseFloat(startValue) + 0.1), 1)\n upperValue = upperValue.toLocaleString(I18n.locale)\n return upperValue\n}\n\n// Lights\n$(document).on('turbolinks:load', () => {\n $('#inspection_settings_inspection_evaluation_lights_attributes_red_to').on('input', function() {\n $('#inspection_settings_inspection_evaluation_lights_attributes_yellow_from').val(calculateUpper($(this).val()))\n })\n})\n\n$(document).on('turbolinks:load', () => {\n $('#inspection_settings_inspection_evaluation_lights_attributes_yellow_to').on('input', function() {\n $('#inspection_settings_inspection_evaluation_lights_attributes_green_from').val(calculateUpper($(this).val()))\n })\n})\n\n// Grades\n$(document).on('turbolinks:load', () => {\n $('#inspection_settings_inspection_evaluation_grades_attributes_five_to').on('input', function() {\n $('#inspection_settings_inspection_evaluation_grades_attributes_four_from').val(calculateUpper($(this).val()))\n })\n})\n\n$(document).on('turbolinks:load', () => {\n $('#inspection_settings_inspection_evaluation_grades_attributes_four_to').on('input', function() {\n $('#inspection_settings_inspection_evaluation_grades_attributes_three_from').val(calculateUpper($(this).val()))\n })\n})\n\n$(document).on('turbolinks:load', () => {\n $('#inspection_settings_inspection_evaluation_grades_attributes_three_to').on('input', function() {\n $('#inspection_settings_inspection_evaluation_grades_attributes_two_from').val(calculateUpper($(this).val()))\n })\n})\n\n$(document).on('turbolinks:load', () => {\n $('#inspection_settings_inspection_evaluation_grades_attributes_two_to').on('input', function() {\n $('#inspection_settings_inspection_evaluation_grades_attributes_one_from').val(calculateUpper($(this).val()))\n })\n})\n\n// Show/Hide RatingSystem based on radio button\n$(document).on('turbolinks:load', () => {\n $('input[name=\\'inspection_settings[evaluation_system]\\']').click(function() {\n if ($('#inspection_settings_evaluation_system_evaluation_lights').is(':checked')) {\n $('.lights_partial').removeClass('d-none')\n $('.lights_partial').addClass('d-block')\n $('.grades_partial').removeClass('d-block')\n $('.grades_partial').addClass('d-none')\n } else {\n $('.grades_partial').removeClass('d-none')\n $('.grades_partial').addClass('d-block')\n $('.lights_partial').removeClass('d-block')\n $('.lights_partial').addClass('d-none')\n }\n })\n})\n","import geolocator from 'geolocator'\n\n// Get and show location\n// ---------------------------------------------------------------------\n\ngeolocator.config({\n language: 'de',\n google: {\n version: '3',\n // key: 'AIzaSyAOSPRPpInF_vAD1JDC80yPIJ-Td2oEekA' # DEV only!\n key: 'AIzaSyA90IoPWk5Ov0fySmENwMTMAVfXLmMwwKU'\n }\n}) // production\n\n// Function to get accurate current position\n// github.com/onury/geolocator\nconst getLocation = function() {\n // geolocator.locate( successCallback, [errorCallback], [fallbackToIP], [html5Options], [mapCanvasId] )\n const geolocatorOptions = {\n enableHighAccuracy: true,\n timeout: 15000,\n maximumWait: 10000, // max wait time for desired accuracy\n maximumAge: 0, // disable cache\n desiredAccuracy: 10, // meters\n fallbackToIP: false,\n addressLookup: true,\n timezone: false\n }\n // map: 'map'\n // Show loader\n onGeoTracking()\n // Locate\n geolocator.locate(geolocatorOptions, function(err, location) {\n if (err) {\n // return console.log(err)\n onGeoError()\n }\n onGeoSuccess(location)\n // console.log location\n })\n}\n\n// Function that gets run when position was found\nvar onGeoSuccess = function(location) {\n var latitude = location && location.coords.latitude || 0\n var longitude = location && location.coords.longitude || 0\n // console.log(location)\n // Populate form values\n $('#time_tracking_latitude').val(latitude)\n $('#time_tracking_longitude').val(longitude)\n // Show confirmation\n $('#time_tracking_location_false').hide()\n $('#time_tracking_location_progress').hide()\n // Update static map\n const map_source = `https://api.mapbox.com/styles/v1/mapbox/light-v10/static/pin-s+27b6af(${longitude},${latitude}/${longitude},${latitude},15/430x270@2x?access_token=pk.eyJ1IjoidzN3ZXJrZSIsImEiOiIwM0s5MkRjIn0.VMPxOOW9BwuFMHilUc7sSg`\n $(\"#map img\").attr(\"src\", map_source)\n // Show tracked address\n $('#time_tracking_current_location').show()\n $('#map').show()\n $('#time_tracking_current_location .output').text(location?.formattedAddress)\n}\n\n// Function that gets run when position was not found\nvar onGeoError = function(error) {\n $('#time_tracking_location_progress').hide()\n return $('#time_tracking_location_false').css('display', 'block')\n}\n\n// Function that gets run while position finding is in progress\nvar onGeoTracking = function() {\n $('#time_tracking_location_false').hide()\n return $('#time_tracking_location_progress').css('display', 'block')\n}\n\n// Location finder gets activated on last TimeTracking creation form step\n$(function() {\n if ($('body.timetrackings.build .end').length > 0) {\n getLocation()\n // window.location.reload()\n return false\n }\n})\n\n// Button/link to re-run location tracking\n$(() =>\n $('.rerun_get_location').click(function(event) {\n event.preventDefault()\n window.location.reload(false)\n })\n)\n\n// Button/link to remove location\n$(() =>\n $('.destroy_location').click(function(event) {\n event.preventDefault()\n $('#time_tracking_location').hide()\n $('#time_tracking_latitude').val('')\n $('#time_tracking_longitude').val('')\n $('#time_tracking_current_location').hide()\n $('#time_tracking_no_location_submitted').show()\n $('#map').hide()\n })\n)\n\n\n// Elapsed time counter\n// ---------------------------------------------------------------------\n\n// Calls the counter (each 1000ms/1s)\nconst startCount = (function() {\n let executed = false\n return function() {\n if (!executed) { // Make sure this is only called once at all\n let timer\n executed = true\n return timer = setInterval(count, 1000)\n }\n }\n})()\n\n// Parse the current time and count up (+ 1000ms/1s)\nvar count = function() {\n const time_shown = $('#time_tracking_timer').text()\n const time_chunks = time_shown.split(':')\n let hour = undefined\n let mins = undefined\n let secs = undefined\n hour = Number(time_chunks[0])\n mins = Number(time_chunks[1])\n secs = Number(time_chunks[2])\n secs++\n if (secs === 60) {\n secs = 0\n mins = mins + 1\n }\n if (mins === 60) {\n mins = 0\n hour = hour + 1\n }\n if (hour === 25) {\n hour = 1\n }\n $('#time_tracking_timer').text(zeroPad(hour) + ':' + zeroPad(mins) + ':' + zeroPad(secs))\n}\n\n// Accepts interval in milliseconds and returns it in format HH:MM:SS\nconst timeFormatted = function(interval) {\n const elapsed = new Date(interval)\n const hour = elapsed.getHours()\n const mins = elapsed.getMinutes()\n const secs = elapsed.getSeconds()\n return zeroPad(hour) + \":\" + zeroPad(mins) + \":\" + zeroPad(secs)\n}\n\n// Zero pads the time chunks (HH:MM:SS)\nvar zeroPad = function(digit) {\n let zpad = digit + ''\n if (digit < 10) {\n zpad = `0${zpad}`\n }\n return zpad\n}\n\n// Live counter for elapsed time of current TimeTracking\n// Needs an HTML element #time_tracking_timer which contains a time (format HH:MM:SS) that will be counted up each second\nwindow.onload = function() {\n if ($('#time_tracking_timer').length > 0) {\n startCount()\n return\n }\n}\n\n// Recalculates elapsed time when the App regains focus in the browser, e.g. User unlocks his Phone or switches back to a tab where CGX is open by adding the difference of the current time and the time when the current page loaded to the original time embedded in the page's HTML\n$(function() {\n const original_time_formatted = $('#time_tracking_timer').text()\n const page_loaded_time = Date.now()\n\n $(window).focus(function() {\n if ($('#time_tracking_timer').length > 0) {\n const current_time = Date.now()\n const elapsed_time_on_current_page = current_time - page_loaded_time\n\n const time_chunks = original_time_formatted.split(':')\n const original_time = new Date(0, 0, 0, time_chunks[0], time_chunks[1], time_chunks[2]).getTime()\n\n const elapsed_time = original_time + elapsed_time_on_current_page\n\n $('#time_tracking_timer').text(timeFormatted(elapsed_time))\n return\n }\n })\n\n // Set dropdowns for first page of new TimeTracking\n // ---------------------------------------------------------------------\n\n const select_estate = $('#time_tracking_estate_id')\n\n // Preselect primary fields, if they contain only one option and nothing is selected already\n if ((select_estate.find('option').length <= 2) && (select_estate.find('option:selected').val() === '')) {\n const first_value = select_estate.find('option:nth-child(2)').val()\n select_estate.val(first_value)\n return select_estate.trigger('change')\n }\n})\n","/* eslint no-console:0 */\n// This file is automatically compiled by Webpack, along with any other\n// files present in this directory. You're encouraged to place your\n// actual application logic in a relevant structure within\n// app/javascript and only use these pack files to reference\n// that code so it'll be compiled.\n//\n// To reference this file, add <%= javascript_pack_tag 'application' %>\n// to the appropriate layout file, like\n// app/views/layouts/application.html.erb\n\nimport 'bootstrap'\nimport 'clockpicker/dist/bootstrap-clockpicker'\nimport 'bootstrap-datepicker'\nimport 'bootstrap-datepicker/dist/locales/bootstrap-datepicker.de.min'\nimport '../vendor/javascripts/jasny-bootstrap'\nimport 'jquery-ujs'\nimport 'jquery-ui/ui/widgets/sortable'\nimport '../vendor/javascripts/modernizr_cssfilters'\nimport '@nathanvda/cocoon'\nimport '../vendor/javascripts/recurring-select.js.erb'\n\nimport '../javascripts/turbolinks-settings' // needs to be first\nimport '../javascripts/direct_uploads'\nimport '../javascripts/lightbox'\nimport '../javascripts/pagination.js.erb'\nimport '../javascripts/select2'\nimport '../javascripts/select_location'\nimport '../javascripts/slider'\nimport '../javascripts/static_document'\n// import '../javascripts/select_estate_building_floor'\nimport '../javascripts/select_sgc_sg'\n\nimport '../javascripts/common'\n\nimport '../javascripts/controllers/check_ins'\nimport '../javascripts/controllers/contact_persons'\nimport '../javascripts/controllers/floors'\nimport '../javascripts/controllers/inspections'\nimport '../javascripts/controllers/inspection_settings'\nimport '../javascripts/controllers/notices'\nimport '../javascripts/controllers/monitoring_templates'\nimport '../javascripts/controllers/monitoring_sheets'\nimport '../javascripts/controllers/qr_codes'\nimport '../javascripts/controllers/reports'\nimport '../javascripts/controllers/reports_schedules'\nimport '../javascripts/controllers/roles'\nimport '../javascripts/controllers/rooms'\nimport '../javascripts/controllers/services'\nimport '../javascripts/controllers/tickets'\nimport '../javascripts/controllers/ticket_workflow'\nimport '../javascripts/controllers/time_trackings.js.erb'\n\nglobal.jQuery = $\nglobal.$ = $\n","$(document).on 'turbolinks:load', ->\n\n # Set datepicker according to selected time_period\n # ---------------------------------------------------------------------\n\n select_time_period = $('.output #search_time_period')\n\n datepicker_daily = $('.output .datepickers .datepicker_daily')\n datepicker_monthly = $('.output .datepickers .datepicker_monthly')\n datepicker_yearly = $('.output .datepickers .datepicker_yearly')\n\n select_time_period.change ->\n time_period = select_time_period.find(':selected').val()\n switch time_period\n when 'daily'\n datepicker_daily.show().find('*').attr('disabled', false)\n datepicker_monthly.hide().find('*').attr('disabled', true)\n datepicker_yearly.hide().find('*').attr('disabled', true)\n when 'monthly'\n datepicker_monthly.show().find('*').attr('disabled', false)\n datepicker_daily.hide().find('*').attr('disabled', true)\n datepicker_yearly.hide().find('*').attr('disabled', true)\n when 'yearly'\n datepicker_yearly.show().find('*').attr('disabled', false)\n datepicker_daily.hide().find('*').attr('disabled', true)\n datepicker_monthly.hide().find('*').attr('disabled', true)\n # else datepicker_daily.show()\n\n # Also trigger everything after page (re)load, e.g. validation fail\n select_time_period.trigger 'change'\n","# Location_type\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n\n select_location_type = $('.select_location_type')\n select_estate_group = $('.form-group.select_estate')\n select_estate = $('.select_location_estate')\n select_building_group = $('.form-group.select_building')\n select_building = $('.select_location_building')\n select_floor_group = $('.form-group.select_floor')\n select_floor = $('.select_location_floor')\n select_room_group = $('.form-group.select_room')\n select_room = $('.select_location_room')\n input_room_name_group = $('.form-group.input_room_name')\n input_room_name = $('.select_location_room_name')\n select_vehicle_group = $('.form-group.select_vehicle')\n select_vehicle = $('.select_location_vehicle')\n\n # The select tag last in a certain cascade, for example when we set 'Floor' as location_type, needs a certain name the be valid and get recoginized within the params hash. As this script is used for in different places, QrCode form, Monitoring sheet form, etc., we extract it from a hidden field within select_location.html\n active_select_location_id_name = $('#active_select_location_id_name').attr('name')\n\n select_location_type.change ->\n # First disable everything and show only select_estate_group\n select_estate_group.removeClass('d-none')\n select_estate.attr('name', 'disabled')\n select_building_group.addClass('d-none')\n select_building.attr('name', 'disabled')\n select_floor_group.addClass('d-none')\n select_floor.attr('name', 'disabled')\n select_room_group.addClass('d-none')\n select_room.attr('name', 'disabled')\n input_room_name_group.addClass('d-none')\n input_room_name.attr('disabled', true)\n select_vehicle_group.addClass('d-none')\n select_vehicle.attr('name', 'disabled')\n # … then enable conditionally\n switch select_location_type.val()\n when 'Estate'\n select_estate.attr('name', active_select_location_id_name)\n when 'Building'\n select_building_group.removeClass('d-none')\n select_building.attr('name', active_select_location_id_name)\n when 'Floor'\n select_building_group.removeClass('d-none')\n select_floor_group.removeClass('d-none')\n select_floor.attr('name', active_select_location_id_name)\n input_room_name_group.removeClass('d-none')\n input_room_name.attr('disabled', false)\n when 'Room'\n select_building_group.removeClass('d-none')\n select_floor_group.removeClass('d-none')\n select_room_group.removeClass('d-none')\n select_room.attr('name', active_select_location_id_name)\n when 'Vehicle'\n select_estate_group.addClass('d-none')\n select_vehicle_group.removeClass('d-none')\n select_vehicle.attr('name', active_select_location_id_name)\n\n # IMPORTANT\n # Also trigger everything after page (re)load, e.g. validation fail\n select_location_type.trigger 'change'\n\n\n # Location id\n # -------------------------------------------------------------------\n\n buildings = select_building.html()\n floors = select_floor.html()\n rooms = select_room.html()\n\n empty_option = \"\"\n\n # Disable secondary/tertiary selects of cascades\n select_building.prop('disabled', true) if select_estate.val() == ''\n select_floor.prop('disabled', true) if select_building.val() == ''\n select_room.prop('disabled', true) if select_floor.val() == ''\n\n # Populate buildings\n selected_building = select_building.find('option:selected').val()\n select_estate.change ->\n selected_estate = select_estate.find('option:selected').val()\n\n options = $(buildings).filter(\"optgroup[label='#{selected_estate}']\").html()\n if options\n select_building.prop('disabled', false)\n select_building.html(options)\n select_floor.prop('disabled', true) if select_building.val() == ''\n select_room.prop('disabled', true) if select_floor.val() == ''\n # Auto-select if there is only one building\n select_building[0].selectedIndex = 1 if select_building.children('option').length == 2\n else\n select_building.prop('disabled', true)\n select_building.prepend(empty_option) if select_building.find('option:first-child').val() != ''\n select_building[0].selectedIndex = 0 unless selected_building > 0 || select_building.children('option').length == 2\n populate_select_floors()\n select_building.change()\n\n # Populate floors\n selected_floor = select_floor.find('option:selected').val()\n select_building.change ->\n selected_building = select_building.find('option:selected').val()\n populate_select_floors()\n\n populate_select_floors = ->\n options = $(floors).filter(\"optgroup[label='#{selected_building}']\").html()\n if options\n select_floor.prop('disabled', false)\n select_floor.html(options)\n select_room.prop('disabled', true) if select_floor.val() == ''\n # Auto-select if there is only one floor\n select_floor[0].selectedIndex = 1 if select_floor.children('option').length == 2\n else\n select_floor.prop('disabled', true)\n select_floor.prepend(empty_option) if select_floor.find('option:first-child').val() != ''\n select_floor[0].selectedIndex = 0 unless selected_floor > 0 || select_floor.children('option').length == 2\n populate_select_rooms()\n setTimeout((-> select_floor.change()), 100)\n\n # Populate rooms\n selected_room = select_room.find('option:selected').val()\n select_floor.change ->\n selected_floor = select_floor.find('option:selected').val()\n populate_select_rooms()\n\n populate_select_rooms = ->\n options = $(rooms).filter(\"optgroup[label='#{selected_floor}']\").html()\n if options\n select_room.prop('disabled', false)\n select_room.html(options)\n # Add the empty option in the else branch when the select is disabled\n else\n select_room.prop('disabled', true)\n select_room.html(empty_option) # Add this line\n select_room.prepend(empty_option) if select_room.find('option:first-child').val() != ''\n select_room[0].selectedIndex = 0 unless selected_room > 0\n setTimeout( ->\n if select_room.children('option').length == 2\n select_room[0].selectedIndex = 1\n select_room.trigger('change')\n , 100)\n\n # IMPORTANT\n # Also trigger everything after page (re)load, e.g. validation fail\n # select_estate.trigger 'change'\n","# Set dropdowns and weight input for new Notice view\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n\n select_estate = $('#notice_estate')\n select_building = $('#notice_building')\n select_floor = $('#notice_floor_id')\n select_contact_person = $('#notice_contact_person_id')\n select_notice_kind = $('#notice_notice_kind_id')\n buildings = select_building.html()\n floors = select_floor.html()\n contact_persons = select_contact_person.html()\n\n cost_center_names = $('#notice_notice_kind_cost_center').data('idcostcenters')\n\n empty_option = \"\"\n\n # Disable secondary/tertiary selects of cascades\n select_building.prop('disabled', true) if select_building.val() == \"\"\n select_floor.prop('disabled', true) if select_building.val() == ''\n select_contact_person.prop('disabled', true) if select_contact_person.val() == ''\n\n # Populate buildings\n selected_building = select_building.find('option:selected').val()\n select_estate.change ->\n selected_estate = select_estate.find('option:selected').val()\n options = $(buildings).filter(\"optgroup[label='#{selected_estate}']\").html()\n number_of_buildings = if options then (options.match(/value/g) || []).length else 0\n if options\n select_building.prop('disabled', false)\n select_building.html(options)\n # If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Building is selectable\n unless selected_building > 0 || number_of_buildings == 1\n select_building.prepend(empty_option)\n select_floor.prop('disabled', true) if select_building.val() == ''\n if select_floor.val() != null && select_floor.val() != ''\n select_contact_person.prop('disabled', true)\n select_contact_person.prepend(empty_option)\n else\n select_building.empty()\n populate_select_floors()\n\n # Populate floors\n select_building.change ->\n select_floor.prop('disabled', false) if select_building.val() != ''\n populate_select_floors()\n\n selected_floor = select_floor.find('option:selected').val()\n populate_select_floors = ->\n building = select_building.find(':selected').val()\n options = $(floors).filter(\"optgroup[label='#{building}']\").html()\n number_of_floors = if options then (options.match(/value/g) || []).length else 0\n if options\n select_floor.prop('disabled', false)\n select_floor.html(options)\n # If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Floor is selectable\n unless selected_floor > 0 || number_of_floors == 1\n select_floor.prepend(empty_option)\n else\n select_floor.empty()\n if (select_floor.val() != null && select_floor.val() != '')\n select_floor.trigger 'change'\n\n select_floor.change ->\n select_contact_person.prop('disabled', false) if select_estate.val() != ''\n populate_select_contact_persons()\n\n selected_contact_person = select_contact_person.find('option:selected').val() # only works here, don't know why\n # Populate contact_persons\n populate_select_contact_persons = ->\n estate = select_estate.find(':selected').val()\n options = $(contact_persons).filter(\"optgroup[label='#{estate}']\").html()\n number_of_contact_persons = if options then (options.match(/value/g) || []).length else 0\n if options\n select_contact_person.html(options)\n # If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one ContactPerson is selectable\n unless selected_contact_person > 0 || number_of_contact_persons == 1\n select_contact_person.prepend(empty_option)\n else\n select_contact_person.empty()\n\n # Populate cost_center\n select_notice_kind.change ->\n set_notice_notice_kind_cost_center()\n\n # Change value of disabled cost_center_showonly text input or enable cost_center input field, if selected Notice::Kind has no cost_center set\n set_notice_notice_kind_cost_center = ->\n notice_kind_id = select_notice_kind.find(\":selected\").val()\n for id, name of cost_center_names\n if id == notice_kind_id\n notice_notice_kind_cost_center_name = name\n if notice_notice_kind_cost_center_name\n $('#cost_center_showonly').show()\n $('#notice_cost_center').hide()\n # Set disabled text field\n $('#cost_center_showonly').val(notice_notice_kind_cost_center_name)\n # Set hidden field\n $('#notice_cost_center').val(notice_notice_kind_cost_center_name)\n else\n if select_notice_kind.val() == '' # Nothing selected yet\n $('#cost_center_showonly').show()\n $('#notice_cost_center').hide()\n else\n $('#cost_center_showonly').hide()\n $('#notice_cost_center').show()\n # Clear that stuff\n $('#cost_center_showonly').val('')\n form_resubmit_value = $('#notice_cost_center').data('form-resubmit-cost-center') # Get user selected value after form validation has failed\n $('#notice_cost_center').val(form_resubmit_value)\n\n\n # Also trigger everything after page (re)load, e.g. validation fail\n set_notice_notice_kind_cost_center()\n select_estate.trigger 'change'\n\n\n# Disable save button on Notice rating form until all ratings are selected\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n $('form.rate_notice button[type=\"submit\"]').prop('disabled', true)\n $('form.rate_notice input[type=\"radio\"]').change ->\n if $('form.rate_notice input[type=\"radio\"]:checked').length == $('form.rate_notice .rating.form').length\n $('form.rate_notice button[type=\"submit\"]').prop('disabled', false)\n else\n $('form.rate_notice button[type=\"submit\"]').prop('disabled', true)\n\n\n# Show rating when state_change accept is selected\n# ------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n $('#notice_message_state_change').change ->\n if $(this).val() == 'accept'\n $('.rate_notice_fields').show()\n # disable_submit_button_on_rating_form()\n else\n $('.rate_notice_fields').hide()\n","$(document).on 'turbolinks:load', ->\n\n select_estate = $('#ticket_estate')\n select_building = $('#ticket_building')\n select_floor = $('#ticket_floor_id')\n select_ticket_kind = $('#ticket_ticket_kind_id')\n buildings = select_building.html()\n floors = select_floor.html()\n\n cost_center_names = $('#ticket_cost_center').data('idcostcenters')\n\n empty_option = \"\"\n\n # Disable secondary/tertiary selects of cascades\n select_building.prop('disabled', true) if select_building.val() == \"\"\n select_floor.prop('disabled', true) if select_building.val() == ''\n\n # Populate buildings\n selected_building = select_building.find('option:selected').val()\n select_estate.change ->\n selected_estate = select_estate.find('option:selected').val()\n options = $(buildings).filter(\"optgroup[label='#{selected_estate}']\").html()\n number_of_buildings = if options then (options.match(/value/g) || []).length else 0\n if options\n select_building.prop('disabled', false)\n select_building.html(options)\n # If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Building is selectable\n unless selected_building > 0 || number_of_buildings == 1\n select_building.prepend(empty_option)\n select_floor.prop('disabled', true) if select_building.val() == ''\n else\n select_building.empty()\n populate_select_floors()\n\n # Populate floors\n select_building.change ->\n select_floor.prop('disabled', false) if select_building.val() != ''\n populate_select_floors()\n\n selected_floor = select_floor.find('option:selected').val()\n populate_select_floors = ->\n building = select_building.find(':selected').val()\n options = $(floors).filter(\"optgroup[label='#{building}']\").html()\n number_of_floors = if options then (options.match(/value/g) || []).length else 0\n if options\n select_floor.prop('disabled', false)\n select_floor.html(options)\n # If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Floor is selectable\n unless selected_floor > 0 || number_of_floors == 1\n select_floor.prepend(empty_option)\n else\n select_floor.empty()\n if (select_floor.val() != null && select_floor.val() != '')\n select_floor.trigger 'change'\n\n # Populate cost_center\n select_ticket_kind.change ->\n set_ticket_ticket_kind_cost_center()\n\n set_ticket_ticket_kind_cost_center = ->\n ticket_kind_id = select_ticket_kind.find(\":selected\").val()\n for id, name of cost_center_names\n if id == ticket_kind_id\n ticket_ticket_kind_cost_center_name = name\n if ticket_ticket_kind_cost_center_name\n # Set disabled text field\n $('#cost_center_showonly').val(ticket_ticket_kind_cost_center_name)\n # Set hidden field\n $('#ticket_cost_center').val(ticket_ticket_kind_cost_center_name)\n else\n # Clear that stuff\n $('#cost_center_showonly').val('')\n $('#ticket_cost_center').val('')\n\n\n # Also trigger everything after page (re)load, e.g. validation fail\n set_ticket_ticket_kind_cost_center()\n select_estate.trigger 'change'\n","# Add closed/open class to .measuring-point on evaluate\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n $('#monitoring_sheet_entries').on 'show.bs.collapse', (event) ->\n event.target.closest('.monitoring_sheet').classList.add('open')\n event.target.closest('.monitoring_sheet').classList.remove('closed')\n $('#monitoring_sheet_entries').on 'hide.bs.collapse', (event) ->\n event.target.closest('.monitoring_sheet').classList.remove('open')\n event.target.closest('.monitoring_sheet').classList.add('closed')\n\n\n# Click the 'next' key by pressing enter\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n if $('#monitoring_sheet_entries').length > 0\n $(document).on 'keydown', (event) ->\n # Check if the Enter key (keyCode 13) is pressed without other modifier keys\n if event.keyCode == 13 && !event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey\n # Prevent the default Enter behavior if needed\n event.preventDefault()\n\n # Find the first visible `a.next` inside the accordion\n next_link = $('#monitoring_sheet_entries a.next:visible').first()\n\n # If a visible `a.next` exists, trigger a click\n if next_link.length > 0\n next_link.click()\n\n\n# Focus on the first input, textarea, or select within a .form-group\n# inside the visible collapse\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n if $('#monitoring_sheet_entries').length > 0\n # Listen for the 'shown.bs.collapse' event on all collapsible elements within the accordion\n $('#monitoring_sheet_entries .collapse').on 'shown.bs.collapse', (event) ->\n # The collapse element that has just been shown\n visible_collapse = $(event.target)\n\n # Find the first input, textarea, or select within a .form-group inside the visible collapse\n first_input = visible_collapse.find('.form-group').find('input, textarea, select').first()\n\n # Focus on the found element if it exists\n first_input.focus() if first_input.length > 0\n\n\n# Show recurring details in (disabled) text input on start\n# ---------------------------------------------------------------------\n\n$(document).on 'turbolinks:load', ->\n select_ods = $('#monitoring_sheet_template_id')\n ods_recurring_details = $('.monitoring_template_recurring_details')\n\n select_ods.change ->\n selected_sheet_id = select_ods.find('option:selected').val()\n ods_recurring_single = ods_recurring_details.find(\"#monitoring_template_recurring_details_#{selected_sheet_id}\")\n ods_recurring_details.find('div').css('display', 'none')\n if ods_recurring_single.length > 0\n ods_recurring_single.css('display', 'block')\n\n # IMPORTANT\n # Also trigger everything after page (re)load, e.g. validation fail\n select_ods.trigger 'change'\n\n # Enable clockpicker for value_time\n $('.clockpicker-monitoring-sheet-entry').clockpicker\n autoclose: 'true'\n placement: 'bottom'\n default: 'now'\n align: 'right'\n donetext: '✔'\n return\n","$(document).on 'turbolinks:load', ->\n\n select_service_group_category = $('#service_service_group_category')\n select_service_group = $('#service_service_group_id')\n service_groups = $('#service_service_group_id').html()\n\n\n # Disable secondary select of cascade\n select_service_group.prop('disabled', true) if select_service_group_category.val() == '' && select_service_group.val() == ''\n\n select_service_group_category.change ->\n service_group_category = select_service_group_category.find(':selected').text()\n options = $(service_groups).filter(\"optgroup[label='#{service_group_category}']\").html()\n if options\n select_service_group.prop('disabled', false)\n select_service_group.html(options)\n else\n select_service_group.empty()\n\n # Trigger change when SGC is preselected, so optgroups get filtered\n select_service_group_category.trigger 'change' if select_service_group_category.val() != ''\n","$(document).on('turbolinks:load', () => {\n // Set dropdowns for new check_ins\n // -------------------------------\n const selectEstate = $('#check_in_estate')\n const selectBuilding = $('#check_in_building')\n const selectFloor = $('#check_in_floor_id')\n const buildings = selectBuilding.html()\n const floors = selectFloor.html()\n\n const emptyOption = \"\"\n\n // Disable secondary/tertiary selects of cascades\n if (selectEstate.val() === '') { selectBuilding.prop('disabled', true) }\n if (selectBuilding.val() === '') { selectFloor.prop('disabled', true) }\n\n // Populate buildings\n const selectedBuilding = selectBuilding.find('option:selected').val()\n selectEstate.on('change', function() {\n const selectedEstate = selectEstate.find('option:selected').val()\n const options = $(buildings).filter(`optgroup[label='${selectedEstate}']`).html()\n const numberOfBuildings = options ? (options.match(/value/g) || []).length : 0\n if (options) {\n selectBuilding.prop('disabled', false)\n selectBuilding.html(options)\n // If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Building is selectable\n if (!(selectedBuilding > 0) && (numberOfBuildings !== 1)) {\n selectBuilding.prepend(emptyOption)\n }\n if (selectBuilding.val() === '') { selectFloor.prop('disabled', true) }\n } else {\n selectBuilding.empty()\n }\n return populateSelectFloor()\n })\n\n // Populate floors\n selectBuilding.on('change', function() {\n if (selectBuilding.val() !== '') { selectFloor.prop('disabled', false) }\n return populateSelectFloor()\n })\n\n const populateSelectFloor = () => {\n const building = selectBuilding.find(':selected').val()\n const options = $(floors).filter(`optgroup[label='${building}']`).html()\n const floor = selectFloor.find('option:selected').val()\n const numberOfFloors = options ? (options.match(/value/g) || []).length : 0\n if (options) {\n selectFloor.prop('disabled', false)\n selectFloor.html(options)\n // If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Floor is selectable\n if (!(floor > 0) && (numberOfFloors !== 1)) {\n return selectFloor.prepend(emptyOption)\n }\n } else {\n return selectFloor.empty()\n }\n }\n\n // Also trigger everything after page (re)load, e.g. validation fail\n if (selectEstate) {\n selectEstate.trigger('change')\n }\n})\n","/*! modernizr 3.5.0 (Custom Build) | MIT *\n * https://modernizr.com/download/?-cssfilters-setclasses !*/\n!function(e,n,t){function r(e,n){return typeof e===n}function s(){var e,n,t,s,o,i,l;for(var a in S)if(S.hasOwnProperty(a)){if(e=[],n=S[a],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;tc;c++)if(m=e[c],v=k.style[m],l(m,\"-\")&&(m=a(m)),k.style[m]!==t){if(o||r(s,\"undefined\"))return u(),\"pfx\"==n?m:!0;try{k.style[m]=s}catch(h){}if(k.style[m]!=v)return u(),\"pfx\"==n?m:!0}return u(),!1}function g(e,n,t,s,o){var i=e.charAt(0).toUpperCase()+e.slice(1),l=(e+\" \"+T.join(i+\" \")+i).split(\" \");return r(n,\"string\")||r(n,\"undefined\")?v(l,n,s,o):(l=(e+\" \"+N.join(i+\" \")+i).split(\" \"),f(l,n,t))}function h(e,n,r){return g(e,t,t,n,r)}var C=[],S=[],w={_version:\"3.5.0\",_config:{classPrefix:\"\",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,n){var t=this;setTimeout(function(){n(t[e])},0)},addTest:function(e,n,t){S.push({name:e,fn:n,options:t})},addAsyncTest:function(e){S.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=w,Modernizr=new Modernizr;var _=n.documentElement,x=\"svg\"===_.nodeName.toLowerCase(),b=w._config.usePrefixes?\" -webkit- -moz- -o- -ms- \".split(\" \"):[\"\",\"\"];w._prefixes=b;var P=\"CSS\"in e&&\"supports\"in e.CSS,z=\"supportsCSS\"in e;Modernizr.addTest(\"supports\",P||z);var E=\"Moz O ms Webkit\",T=w._config.usePrefixes?E.split(\" \"):[];w._cssomPrefixes=T;var N=w._config.usePrefixes?E.toLowerCase().split(\" \"):[];w._domPrefixes=N;var j={elem:i(\"modernizr\")};Modernizr._q.push(function(){delete j.elem});var k={style:j.elem.style};Modernizr._q.unshift(function(){delete k.style}),w.testAllProps=g,w.testAllProps=h,Modernizr.addTest(\"cssfilters\",function(){if(Modernizr.supports)return h(\"filter\",\"blur(2px)\");var e=i(\"a\");return e.style.cssText=b.join(\"filter:blur(2px); \"),!!e.style.length&&(n.documentMode===t||n.documentMode>9)}),s(),o(C),delete w.addTest,delete w.addAsyncTest;for(var A=0;A{const j=new ResizeObserver((B)=>B.forEach((D)=>D.target.querySelectorAll(\".pagy-rjs\").forEach((E)=>E.pagyRender()))),x=(B,[D,E,z,G])=>{const F=B.parentElement??B,K=Object.keys(E).map((H)=>parseInt(H)).sort((H,M)=>M-H);let L=-1;const T=(H,M,R)=>H.replace(/__pagy_page__/g,M).replace(/__pagy_label__/g,R);if((B.pagyRender=function(){const H=K.find((Q)=>QQ.toString());R.forEach((Q,J)=>{const $=X[J];let U;if(typeof Q===\"number\")U=T(D.a,Q.toString(),$);else if(Q===\"gap\")U=D.gap;else U=T(D.current,Q,$);M+=typeof G===\"string\"&&Q==1?Z(U,G):U}),M+=D.after,B.innerHTML=\"\",B.insertAdjacentHTML(\"afterbegin\",M),L=H})(),B.classList.contains(\"pagy-rjs\"))j.observe(F)},A=(B,[D,E])=>Y(B,(z)=>[z,D.replace(/__pagy_page__/,z)],E),C=(B,[D,E,z])=>{Y(B,(G)=>{const F=Math.max(Math.ceil(D/parseInt(G)),1).toString(),K=E.replace(/__pagy_page__/,F).replace(/__pagy_limit__/,G);return[F,K]},z)},Y=(B,D,E)=>{const z=B.querySelector(\"input\"),G=B.querySelector(\"a\"),F=z.value,K=function(){if(z.value===F)return;const[L,T,H]=[z.min,z.value,z.max].map((X)=>parseInt(X)||0);if(TH){z.value=F,z.select();return}let[M,R]=D(z.value);if(typeof E===\"string\"&&M===\"1\")R=Z(R,E);G.href=R,G.click()};[\"change\",\"focus\"].forEach((L)=>z.addEventListener(L,()=>z.select())),z.addEventListener(\"focusout\",K),z.addEventListener(\"keypress\",(L)=>{if(L.key===\"Enter\")K()})},Z=(B,D)=>B.replace(new RegExp(`[?&]${D}=1\\\\b(?!&)|\\\\b${D}=1&`),\"\");return{version:\"9.3.4\",init(B){const E=(B instanceof Element?B:document).querySelectorAll(\"[data-pagy]\");for(let z of E)try{const G=Uint8Array.from(atob(z.getAttribute(\"data-pagy\")),(L)=>L.charCodeAt(0)),[F,...K]=JSON.parse(new TextDecoder().decode(G));if(F===\"nav\")x(z,K);else if(F===\"combo\")A(z,K);else if(F===\"selector\")C(z,K);else console.warn(\"Skipped Pagy.init() for: %o\\nUnknown keyword '%s'\",z,F)}catch(G){console.warn(\"Skipped Pagy.init() for: %o\\n%s\",z,G)}}}})();\n\n//# debugId=645A69572EDFDB9764756E2164756E21\n//# sourceMappingURL=pagy.min.js.map\n\nwindow.pagy = Pagy\n\n// https://ddnexus.github.io/pagy/extras#javascript\nwindow.addEventListener('turbolinks:load', Pagy.init)\n\n// Keyboard shortcuts for browsing pages of lists\n// ---------------------------------------------------------------------\n\n$(document).on('turbolinks:load', () => {\n Pagy.init()\n\n var handleKey, nextPage, prevPage\n handleKey = function(e) {\n var code, leftArrow, rightArrow\n leftArrow = 37\n rightArrow = 39\n if (e.target.nodeName === 'BODY' || e.target.nodeName === 'HTML') {\n if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {\n code = e.which\n if (code === leftArrow) {\n prevPage()\n } else if (code === rightArrow) {\n nextPage()\n }\n }\n }\n }\n prevPage = function() {\n var href\n href = $('.pagination .prev a').attr('href')\n goToPage(href)\n }\n nextPage = function() {\n var href\n href = $('.pagination .next a').attr('href')\n goToPage(href)\n }\n\n function goToPage(link) {\n if (link && link !== document.location) {\n document.location = link\n }\n }\n\n $(document).keydown(handleKey)\n})\n","$(document).on 'turbolinks:load', ->\n\n select_estate = $('#floor_estate')\n select_building = $('#floor_building_id')\n buildings = $('#floor_building_id').html()\n\n # Disable secondary select of cascade\n select_building.prop('disabled', true) if select_estate.val() == '' && select_building.val() == ''\n\n select_estate.change ->\n estate = select_estate.find(':selected').text()\n options = $(buildings).filter(\"optgroup[label='#{estate}']\").html()\n if options\n select_building.prop('disabled', false)\n select_building.html(options)\n else\n select_building.empty()\n\n # Trigger change when Estate is preselected, so optgroups get filtered\n select_estate.trigger 'change' if select_estate.val() != ''\n","$(document).on 'turbolinks:load', ->\n\n select_sgc = $('.select_sg_sgc')\n select_sg = $('.select_sg_sg')\n service_groups = select_sg.html()\n sg_weights = $('#service_group_weights').data('id-weights')\n\n empty_option = select_sgc.find('option:first-child').clone().wrap('\"\n\n # Disable secondary/tertiary selects of cascades\n select_building.prop('disabled', true) if select_estate.val() == ''\n select_floor.prop('disabled', true) if select_building.val() == ''\n\n # Populate buildings\n selected_building = select_building.find('option:selected').val()\n select_estate.change ->\n selected_estate = select_estate.find('option:selected').val()\n options = $(buildings).filter(\"optgroup[label='#{selected_estate}']\").html()\n number_of_buildings = if options then (options.match(/value/g) || []).length else 0\n if options\n select_building.prop('disabled', false)\n select_building.html(options)\n # If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Building is selectable\n unless selected_building > 0 || number_of_buildings == 1\n select_building.prepend(empty_option)\n select_floor.prop('disabled', true) if select_building.val() == ''\n else\n select_building.empty()\n populate_select_floors()\n\n # Populate floors\n select_building.change ->\n select_floor.prop('disabled', false) if select_building.val() != ''\n populate_select_floors()\n\n populate_select_floors = ->\n building = select_building.find(':selected').val()\n options = $(floors).filter(\"optgroup[label='#{building}']\").html()\n floor = select_floor.find('option:selected').val()\n number_of_floors = if options then (options.match(/value/g) || []).length else 0\n if options\n select_floor.prop('disabled', false)\n select_floor.html(options)\n # If nothing is selected yet, add empty option, so User has to select right value first, but only when more than one Floor is selectable\n unless floor > 0 || number_of_floors == 1\n select_floor.prepend(empty_option)\n else\n select_floor.empty()\n\n # IMPORTANT\n # Also trigger everything after page (re)load, e.g. validation fail\n select_estate.trigger 'change'\n"],"names":["$","document","on","fieldsExternal","fieldsInternal","contactType","showContactType","val","append","children","detach","addButton","check_to_hide_or_show_add_link","length","hide","show","check_to_hide_or_show_delete_button","_e","_insertedItem","_originalEvent","inspection_administered_by_form_group","select_data_acquisition_type","select_reports_kind","service_group_category_form_group","parent","change","RecurringSelectDialog","window","recurring_selector","_classCallCheck","this","positionDialogVert","bind","cancel","outerCancel","save","summaryUpdate","summaryFetchSuccess","init_calendar_days","init_calendar_weeks","toggle_month_view","freqChanged","intervalChanged","daysChanged","dateOfMonthChanged","weekOfMonthChanged","current_rule","recurring_select","initDialogBox","hash","rule_type","setTimeout","key","value","remove","open_in","template","outer_holder","inner_holder","find","content","mainEventInit","freqInit","summaryInit","trigger","toggleClass","freq_select","focus","initial_positioning","_this","window_height","height","dialog_height","width","outerHeight","margin_top","new_style_hash","css","addClass","animate","removeClass","event","target","hasClass","str","save_button","search","prop","initWeeklyOptions","initMonthlyOptions","initYearlyOptions","initDailyOptions","section","interval_input","interval","each","index","element","validations","day","concat","off","day_of_month","day_of_week","in_week_mode","Object","keys","summary","new_string","rule_str","replace","fn","texts","html","summaryFetch","ajax","url","type","data","success","end_of_month_link","monthly_calendar","num","day_link","createElement","text","inArray","row_labels","show_row","options","cell_str","iterable","asc","end","i","attr","instance","week_mode","toggle","isPlainObject","until","count","parseInt","currentTarget","isNaN","raw_days","map","get","_this2","elm","push","jQuery","methods","set_initial_values","changed","open_custom","apply","blur","new_rule","new_json_val","JSON","stringify","insert_option","parseJSON","new_rule_str","new_rule_json","separator","last","new_option","substr","insertBefore","method","Array","prototype","slice","call","arguments","error","monthly","show_week","locale_iso_code","repeat","last_day","frequency","daily","weekly","yearly","every","days","weeks_on","months","years","ok","first_day_of_week","days_first_letter","order","openSidebarDropdown","click","Turbolinks","visit","location","scroll","scroll_pos","scrollTop","target_id","offset","top","closest","e","offcanvas","link","navigator","standalone","addEventListener","nodeName","parentNode","href","indexOf","host","constructor","name","preventDefault","tooltip","rails","allowAction","$link","$modal_html","cancel_text","hint_text","message","modal_html","ok_text","clone","removeAttr","modal","body","button","relatedTarget","load","response","status","xhr","focusing","fadeIn","siblings","split","tab","history","replaceState","newUrl","searchField","keyCode","is","searchTerm","toUpperCase","organizationName","includes","rating_form_id","rating_star_selector","hover","prevAll","nextAll","Error","undefined","support","transition","emulateTransitionEnding","duration","called","$el","one","el","transEndEventNames","WebkitTransition","MozTransition","OTransition","style","transitionEnd","OffCanvas","$element","extend","DEFAULTS","state","placement","recalc","calcClone","proxy","autohide","disablescrolling","disableScrolling","outerWidth","calcPlacement","horizontal","vertical","ab","a","b","opposite","getCanvasElements","canvas","fixed_elements","filter","not","exclude","add","slide","elements","callback","anim","bodyWidth","padding","startEvent","Event","isDefaultPrevented","complete","fast","removeData","$calcClone","appendTo","old","option","$this","Constructor","noConflict","$canvas","stopPropagation","select_monitoring_template","select_monitoring_template_group","select_notice_kind","select_notice_kind_group","select_service_group","select_sgc_sg_group","select_ticket_kind","select_ticket_kind_group","select_time_tracking_types","select_time_tracking_types_group","input_room_name","input_room_name_group","select_building","select_building_group","select_estate","select_estate_group","select_floor","select_floor_group","select_location_type","buildings","empty_option","floors","populate_select_floors","selected_building","number_of_buildings","selected_estate","match","prepend","empty","building","floor","number_of_floors","select_service_group_category","selected_service_group","service_groups","number_of_service_groups","selected_service_group_category","CustomUploader","input","file","directUpload","DirectUpload","dispatch","hiddenInput","classList","insertAdjacentElement","create","attributes","removeChild","dispatchError","signed_id","progress","loaded","total","getAttribute","detail","id","eventInit","disabled","bubbles","cancelable","createEvent","initEvent","dispatchEvent","defaultPrevented","alert","upload","uploadRequestDidProgress","locale","I18n","i18n","defaultLocale","reduce","require","resetUploadField","customFileGroup","formGroup","querySelector","contains","querySelectorAll","originalCustomFileGroup","placeholderText","dataset","fallbackPlaceholder","innerHTML","addUploadLink","previewImage","container","aImg","test","img","appendChild","reader","FileReader","onload","src","result","readAsDataURL","inputs","from","forEach","fileName","pop","nextSibling","passToUpload","start","files","isInFileNameBlackList","t","validateImage","Promise","resolve","reject","Image","onerror","URL","createObjectURL","then","isValid","compression","config","max","unsharpAmount","unsharpRadius","unsharpThreshold","toBlob","imageBlob","lastModifiedDate","Date","_unused","catch","addUploadEventListener","customFileGroupsFinished","customFileGroups","insertAdjacentHTML","_event$detail","getElementById","_event$detail2","_event$detail3","setAttribute","uploadFileGroup","finishedUploadGroup","cloneNode","once","ekkoLightbox","alwaysShowClose","maxWidth","loadingMessage","matcher","params","trim","term","original","c","child","splice","select2","theme","placeholder","enoughRoomAbove","minimumResultsForSearch","Infinity","bootstrapSlider","selectEstate","selectBuilding","selectFloor","selectServiceGroupCategory","selectServiceGroup","serviceGroups","serviceGroupWeights","emptyOption","selectedBuilding","selectedEstate","numberOfBuildings","populateSelectFloor","numberOfFloors","selectedServiceGroup","selectedServiceGroupCategory","numberOfServiceGroups","setInspectionServiceGroupWeight","inspectionServiceGroupWeight","serviceGroupId","weight","selectPercentGlobal","selectPercent","percent","pointsTarget","inputPointsActual","pointsActual","toLocaleString","disableServiceButton","enableServiceButton","inputNotInspected","clockpicker","autoclose","default","align","donetext","calculateUpper","startValue","decimals","upperValue","parseFloat","Number","Math","round","geolocator","language","google","version","onGeoSuccess","latitude","coords","longitude","map_source","formattedAddress","onGeoError","onGeoTracking","enableHighAccuracy","timeout","maximumWait","maximumAge","desiredAccuracy","fallbackToIP","addressLookup","timezone","err","reload","executed","startCount","setInterval","time_chunks","hour","mins","secs","zeroPad","digit","zpad","original_time_formatted","page_loaded_time","now","elapsed_time_on_current_page","elapsed_time","getTime","elapsed","getHours","getMinutes","getSeconds","first_value","global","datepicker_daily","datepicker_monthly","datepicker_yearly","select_time_period","active_select_location_id_name","populate_select_rooms","rooms","select_room","select_room_group","select_vehicle","select_vehicle_group","selected_floor","selected_room","selectedIndex","contact_persons","cost_center_names","populate_select_contact_persons","select_contact_person","selected_contact_person","set_notice_notice_kind_cost_center","estate","number_of_contact_persons","form_resubmit_value","notice_kind_id","notice_notice_kind_cost_center_name","set_ticket_ticket_kind_cost_center","ticket_kind_id","ticket_ticket_kind_cost_center_name","next_link","shiftKey","ctrlKey","altKey","metaKey","first","first_input","ods_recurring_details","select_ods","ods_recurring_single","selected_sheet_id","service_group_category","n","r","x","createElementNS","l","u","p","toLowerCase","s","getComputedStyle","o","console","getPropertyValue","currentStyle","m","f","fake","d","styleSheet","cssText","createTextNode","background","overflow","_","offsetHeight","y","CSS","supports","join","v","k","modElem","g","shift","h","charAt","T","N","C","S","w","_version","_config","classPrefix","enableClasses","enableJSClass","usePrefixes","_q","addTest","addAsyncTest","Modernizr","documentElement","_prefixes","P","z","E","_cssomPrefixes","_domPrefixes","j","elem","unshift","testAllProps","documentMode","hasOwnProperty","aliases","Boolean","className","baseVal","RegExp","A","completionCheckboxes","Y","Z","Pagy","ResizeObserver","B","D","pagyRender","_ref","_B$parentElement","_ref2","_slicedToArray","G","F","parentElement","K","H","sort","M","L","R","_z$H$toString","Q","clientWidth","before","toString","X","J","U","gap","current","after","observe","_ref3","_ref4","_ref5","_ref6","ceil","_map2","min","select","_D2","init","_step","_iterator","_createForOfIteratorHelper","Element","done","Uint8Array","atob","charCodeAt","_JSON$parse2","_toArray","parse","TextDecoder","decode","warn","pagy","handleKey","nextPage","prevPage","goToPage","code","which","keydown","select_sg","select_sgc","wrap","selected_sgc","hideAndShowPositionLinks","moveItem","template_recurring","template_start_time_recurring","fields","countOfFields","visibleFields","direction","fieldItem","fieldItemSibling","insertedItem","originalEvent","field","sortable","cursor","handle","update","ui"],"sourceRoot":""}