PageSourceSearch

https://app.rabbiit.com/assets/build/rabbiit-templates-b67d93b5.min.js

js rabbiit.com collected 2026-09-27 09:49:55 UTC 904,228 bytes, 24 lines download raw bytes

1angular.module("timerApp").run(["$templateCache",function($templateCache){$templateCache.put("views/confirm.html",'<div class="default-confirm-modal"> <div class="modal-header"> <p class="title">{{title}}</p> </div> <div class="modal-body" data-on-click-enter="save()"> <div data-ng-if="contentTemplateUrl"> <ng-include src="contentTemplateUrl"></ng-include> </div> <div data-ng-if="!contentTemplateUrl"> <div class="default-confirm-modal__content" data-ng-bind-html="content"></div> <div data-ng-if="notice" class="default-confirm-modal__notice" data-ng-bind-html="notice"></div> </div> </div> <div class="modal-footer"> <!--        <div class="row">--> <div> <button data-ng-click="cancel()" class="button clean"> {{cancelMessage}} </button> </div> <div> <button data-ng-click="confirm()" class="button {{confirmClass}}"> <span>{{ confirmMessage }}</span> </button> </div> <!--        </div>--> </div> </div> '),$templateCache.put("views/template-admin.html",'<div class="view-content-account"> <nav id="account-left" class="account-left" auto-height data-top="48"> <div class="account-left__section"> <h3 class="account-left__section-title">{{ \'admin_menu.section_you\' | translate }}</h3> <ul class="account-left__list"> <li> <a app-href="#/profile" data-ng-class="{ active : $pageService.isCurrentPath(\'/profile\', true) }"> <span class="icon-person_outline"></span> <span>{{ \'profile.title\' | translate }}</span> </a> </li> <li> <a app-href="#/my-permissions" data-ng-class="{ active : $pageService.isCurrentPath(\'/my-permissions\') }"> <span class="icon-lock_open"></span> <span>{{ \'my_permissions.title\' | translate }}</span> </a> </li> <li data-ng-if="$permissionService.hasPrivilegesToCreatePersonalTokens()" data-if-has-feature="API_ADMIN_PANEL"> <a app-href="#/personal-tokens" data-ng-class="{ active : $pageService.isCurrentPath(\'/personal-tokens\') }"> <span class="icon-settings_ethernet"></span> <span>{{ \'personal_tokens.title\' | translate }}</span> </a> </li> </ul> </div> <div class="account-left__section" data-ng-if="$permissionService.hasPrivilegesToEditAccountSettings()"> <h3 class="account-left__section-title">{{ \'admin_menu.section_account\' | translate }}</h3> <ul class="account-left__list"> <li> <a app-href="#/account" data-ng-class="{ active : $pageService.isCurrentPath(\'/account\', true) }"> <span class="icon-credit" style="font-size: 0.95em"></span> <span>{{ \'account.title\' | translate }}</span> </a> </li> <li> <a app-href="#/account-settings" data-ng-class="{ active : $pageService.isCurrentPath(\'/account-settings\') }"> <span class="icon-cog4"></span> <span>{{ \'general_account_settings.title\' | translate }}</span> </a> </li> <li data-if-has-feature="TIMESHEET_REMINDERS"> <a app-href="#/account-reminder-settings" data-ng-class="{ active : $pageService.isCurrentPath(\'/account-reminder-settings\') }"> <span class="icon-alarm"></span> <span>{{ \'admin_menu.account_reminders\' | translate }}</span> </a> </li> <li> <a app-href="#/date-lock" data-ng-class="{ active : $pageService.isCurrentPath(\'/date-lock\') }"> <span class="icon-alarm_off"></span> <span>{{ \'permissions.date_lock.title\' | translate }}</span> </a> </li> <li data-if-has-feature="TIMESHEET_APPROVAL"> <a app-href="#/timesheet-approval-settings" data-ng-class="{ active : $pageService.isCurrentPath(\'/timesheet-approval-settings\') }"> <span class="icon-flag2"></span> <span>{{ \'admin_menu.timesheet_approval\' | translate }}</span> </a> </li> <li> <a app-href="#/custom-fields" data-ng-class="{ active : $pageService.isCurrentPath(\'/custom-fields\') }"> <span class="icon-label_outline" style="font-size: 1.2em"></span> <span>{{ \'custom_fields.title\' | translate }}</span> </a> </li> <li> <a app-href="#/holiday-calendars" data-ng-class="{ active : $pageService.isCurrentPath(\'/holiday-calendars\') }"> <span class="icon-calendar2"></span> <span>{{ \'holiday_calendars.title\' | translate }}</span> </a> </li> <li data-if-has-feature="API_ADMIN_PANEL"> <a app-href="#/api-access" data-ng-class="{ active : $pageService.isCurrentPath(\'/api-access\') }"> <span class="icon-cloud-upload2"></span> <span>{{ \'api_access.title\' | translate }}</span> </a> </li> </ul> </div> <div class="account-left__section" data-ng-if="$permissionService.hasPrivilegesToViewTeams()\r\n                 || $permissionService.hasPrivilegesToEditTasks()\r\n                 || $permissionService.hasPrivilegesToEditCustomers()"> <h3 class="account-left__section-title">{{ \'admin_menu.section_catalog\' | translate }}</h3> <ul class="account-left__list"> <li data-ng-if="$permissionService.hasPrivilegesToViewTeams()"> <a app-href="#/teams" data-ng-class="{ active : $pageService.isCurrentPath(\'/teams\') }"> <span class="icon-people_outline"></span> <span>{{ \'teams.title\' | translate }}</span> </a> </li> <li data-ng-if="$permissionService.hasPrivilegesToEditTasks()"> <a app-href="#/tasks" data-ng-class="{ active : $pageService.isCurrentPath(\'/tasks\') }"> <span class="icon-ribbon"></span> <span>{{ \'tasks.title\' | translate }}</span> </a> </li> <li data-ng-if="$permissionService.hasPrivilegesToEditCustomers()"> <a app-href="#/customers" data-ng-class="{ active : $pageService.isCurrentPath(\'/customers\') }"> <span class="icon-work_outline"></span> <span>{{ \'customers.title\' | translate }}</span> </a> </li> </ul> </div> </nav> <div class="account-right" auto-height data-top="48"> <div sub-view="content"></div> </div> </div> '),$templateCache.put("views/template-management.html",'<style> .layout-content .view-content-account {\r\n        margin: 10px auto auto;\r\n        max-width: 1150px;\r\n    }\r\n\t.layout-content .view-content-account .view.content-register-edit {\r\n        width: auto;\r\n    }\r\n\t.view-content-account .content-register-edit h3 + p,\r\n\t.description-pos-title {\r\n        line-height: 1.8em;\r\n        font-size: 14px;\r\n        margin-bottom: 20px;\r\n    }\r\n    .account-left {\r\n        margin-top: 40px;\r\n        max-width: 300px;\r\n    }\r\n    .account-right {\r\n        margin-bottom: 30px;\r\n    }\r\n    .account-left h3 {\r\n        color: #AFAFAF;\r\n        margin-bottom: 15px;\r\n        margin-top: 70px;\r\n        font-weight: bolder;\r\n        font-size: 13px;\r\n        text-transform: uppercase;\r\n    }\r\n\r\n    .account-left hr {\r\n        border-color: #dadada;\r\n        margin-bottom: 30px;\r\n        margin-top: 30px;\r\n    }\r\n\r\n\t.account-left ul {\r\n        margin-left: 2px;\r\n    }\r\n\t.account-left ul li {\r\n        margin-bottom: 2px;\r\n        font-size: 15px;\r\n    }\r\n\r\n    .account-left ul li a {\r\n        color: #656565;\r\n    }\r\n\r\n\t.account-left ul li a [class^="icon-"] {\r\n        display: inline-block;\r\n        width: 28px;\r\n    }\r\n\r\n    .account-left ul li a {\r\n        padding: 4px 10px 4px 20px;\r\n        font-size: 15px;\r\n        color: #5a5a5a;\r\n        border-bottom: solid 1px #f3f3f5;\r\n        position: relative;\r\n        display: block;\r\n    }\r\n\r\n    .account-left ul li a:hover {\r\n        background-color: #fff;\r\n    }\r\n\r\n    .account-left ul li a.active {\r\n        font-weight: bolder;\r\n        background-color: #fff;\r\n        color: #3a9cff;\r\n    } </style> <div class="row view-content-account"> <div class="column-30"> <div class="account-left"> <ul> <li data-ng-if="$permissionService.hasPrivilegesToViewOthersUsers()"> <a app-href="#/users" data-ng-class="{ active : $pageService.isCurrentPath(\'/users\') }"> <span class="icon-person_outline"></span><span>Usuários</span> </a> </li> <li data-ng-if="$permissionService.hasPrivilegesToViewTeams()"> <a app-href="#/teams" data-ng-class="{ active : $pageService.isCurrentPath(\'/teams\') }"> <span class="icon-people_outline" style="opacity: 0.9;"></span><span>Equipes</span> </a> </li> <li data-ng-if="$permissionService.hasPrivilegesToEditTasks()"> <!--                    data-ng-if="$permissionService.hasPermissionToEditTasks">--> <a app-href="#/tasks" data-ng-class="{ active : $pageService.isCurrentPath(\'/tasks\') }"> <span class="icon-ribbon" style="opacity: 0.9; font-size: 14px;"></span><span>Tarefas</span> </a> </li> <li data-ng-if="$permissionService.hasPrivilegesToEditCustomers()"> <a app-href="#/customers" data-ng-class="{ active : $pageService.isCurrentPath(\'/customers\') }"> <span class="icon-work_outline"></span><span>Clientes</span> </a> </li> </ul> </div> </div> <div class="column-70 account-right"> <div sub-view="content"></div> </div> </div> '),$templateCache.put("views/time-entry-filters.html",'<div data-ng-controller="EntriesFilterController"> <div class="filters-column element-todo-checkbox" data-ng-class="{\'hide-checked-filter\': filter.formParams.hide_checked_filter }"> <div class="filters-header"> <p class="title" id="filters"> <span>{{ \'time_entries.filter.search_filters\' | translate }}</span> </p> <a data-ng-click="reload()" class="icon-loop right" title="{{ \'common.reload\' | translate }}"></a> </div> <div ng-if="filter.formParams.name_visible" class="filters-column--item-container"> <label style="margin-top: 20px;"> <span>{{ \'time_entries.filter.name\' | translate }}</span> </label> <div> <div> <input type="text" ng-model="filter.apiParams.name" placeholder="{{ \'t
1ime_entries.filter.filter_by_name\' | translate }}" class="input-text"> </div> </div> </div> <div ng-if="filter.formParams.email_visible" class="filters-column--item-container"> <label style="margin-top: 20px;"> <span>{{ \'time_entries.filter.email\' | translate }}</span> </label> <div> <div> <input type="text" ng-model="filter.apiParams.email" placeholder="{{ \'time_entries.filter.filter_by_email\' | translate }}" class="input-text"> </div> </div> </div> <!-- Filtrar por data de execução --> <div data-ng-if="filter.formParams.date_execution_filters_visible" class="filters-column--item-container" style="margin-bottom: 10px"> <label style="margin-top: 30px;" data-training="report-filter-date-execution"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.date_execution_checked" data-ng-if="!filter.formParams.date_execution_disabled"> <span>{{ \'time_entries.filter.date_execution\' | translate }}</span> </label> <div ng-show="filter.formParams.date_execution_checked" class="filters-subgroup"> <div entries-date-filter prefix="date_execution" form-params="filter.formParams" api-params="filter.apiParams" interval-options="interval_options" frequent-interval-options="frequent_interval_options" on-move-previous="move_previous_date(\'date_execution\')" on-move-next="move_next_date(\'date_execution\')" on-apply="update_filter()"> </div> </div> </div> <!-- Filtrar por data de publicação --> <div ng-if="filter.formParams.date_created_visible" class="filters-column--item-container"> <label style="margin-top: 30px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.date_created_checked"> <span>{{ \'time_entries.filter.date_created\' | translate }}</span> </label> <div ng-show="filter.formParams.date_created_checked" class="filters-subgroup"> <div entries-date-filter prefix="date_created" form-params="filter.formParams" api-params="filter.apiParams" interval-options="interval_options" frequent-interval-options="frequent_interval_options" on-move-previous="move_previous_date(\'date_created\')" on-move-next="move_next_date(\'date_created\')" on-apply="update_filter()"> </div> </div> </div> <!-- Filtrar por data de vingencia --> <div ng-if="filter.formParams.date_filters_visible" class="filters-column--item-container"> <label style="margin-top: 30px;" ng-class="{disabled:filter.formParams.date_filters_disabled}"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.date_checked" ng-disabled="filter.formParams.date_period_disabled"> <span>{{ \'time_entries.filter.date_validity\' | translate }}</span> </label> <div ng-show="filter.formParams.date_checked" class="filters-subgroup"> <div> <div class="row collapse" style="margin-bottom: 5px"> <div class="column-50"> <label> <input type="checkbox" ng-model="filter.formParams.date_start_checked" style="margin-top: 0;"> <span>{{ \'time_entries.filter.date_start\' | translate }}</span> </label> <div data-ng-if="filter.formParams.date_start_checked"> <input type="text" data-ng-model="filter.formParams.date_start_object" datetime="dd/MM/yyyy" style="margin: 0; margin-top: 3px;" class="input-text"> </div> </div> <div class="column-50"> </div> </div> <div class="row collapse" style="margin-bottom: 5px" data-ng-if="!filter.apiParams.date_end_opened"> <div class="column-50"> <label> <input type="checkbox" ng-model="filter.formParams.date_end_checked"> <span>{{ \'time_entries.filter.date_end\' | translate }}</span> </label> <div data-ng-if="filter.formParams.date_end_checked"> <input type="text" data-ng-model="filter.formParams.date_end_object" datetime="dd/MM/yyyy" style="margin: 0; margin-top: 3px;" class="input-text"> </div> </div> <div class="column-50"> </div> </div> <div class="row collapse" style="margin-bottom: 5px"> <label> <input type="checkbox" ng-model="filter.apiParams.date_end_opened"> <span>{{ \'time_entries.filter.date_end_open\' | translate }}</span> </label> </div> </div> </div> </div> <!-- Filtrar por data de vingencia --> <div ng-if="filter.formParams.date_reference_visible" class="filters-column--item-container"> <label style="margin-top: 30px;" ng-class="{disabled:filter.formParams.date_reference_disabled}"> <input type="checkbox" ng-model="filter.formParams.date_reference_checked" ng-disabled="filter.formParams.date_reference_disabled"> <span>{{ \'time_entries.filter.date_reference\' | translate }}</span> </label> <div ng-show="filter.formParams.date_reference_checked" class="filters-subgroup"> <div class="row collapse" style="margin-bottom: 5px"> <div class="column-50"> <input type="text" data-ng-model="filter.formParams.date_reference_object" datetime="dd/MM/yyyy" style="margin: 0; margin-top: 3px;" class="input-text"> </div> </div> </div> </div> <!-- Status do projeto : Início --> <div ng-if="filter.formParams.project_status_visible" class="filters-column--item-container"> <label style="margin-top: 30px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.project_status_checked" data-ng-click="onChangeProjectActiveStatus()"> <span>{{ \'time_entries.filter.project_status\' | translate }}</span> </label> <div data-ng-if="filter.formParams.project_status_checked"> <div button-toggle-inline data-ng-model="filter.apiParams.active" on-change="onChangeProjectActiveStatus" data-options="[\r\n                        { name: (\'time_entries.filter.projects_active\' | translate), value: 1 },\r\n                        { name: (\'time_entries.filter.projects_inactive\' | translate), value: 0 },\r\n                        { name: (\'time_entries.filter.projects_all\' | translate), value: null }\r\n                     ]\r\n                "></div> </div> </div> <!-- Status do projeto : Fim --> <!-- Filtrar por projetos --> <div ng-if="filter.formParams.project_id_visible" class="filters-column--item-container"> <label style="margin-top: 30px;" data-training="report-filter-project"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.project_checked"> <span>{{ \'time_entries.filter.projects\' | translate }}</span> </label> <div ng-show="filter.formParams.project_checked" class="filters-subgroup"> <div data-training="report-filter-project-select"> <input ng-model="filter.apiParams.project_id" data-options-load="loadProjects" data-options-load-trigger="focus" data-options-load-params="filter.formParams.project__options_load_params" data-options-filters="filter.formParams.project__options_filters" data-selectize-key="filter-projects" data-selectize="{\r\n                                dropdownParent: \'body\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                valueField: \'id\',\r\n                                optgroups: [\r\n                                    { customer_id: \'\', customer_name: (\'time_entries.filter.no_customer\' | translate)}\r\n                                ],\r\n                                optgroupField: \'customer_id\',\r\n                                optgroupLabelField: \'customer_name\',\r\n                                optgroupValueField: \'customer_id\',\r\n                                plugins: [\'remove_button\'],\r\n                                placeholder: (\'time_entries.filter.filter_by_project\' | translate),\r\n                                render: projectFilterSelectizeRender\r\n                           }"> <div class="sub-filters"> <!--                        <div ng-if="filter.formParams.only_active_projects_visible"--> <!--                             class="filters-column&#45;&#45;checkbox-container">--> <!--                            <label style="margin-top: 30px;">--> <!--                                <input type="checkbox"--> <!--                                       data-ng-check--> <!--                                       class="slim-check-width-12"--> <!--                                       data-ng-model="filter.apiParams.only_active_projects"--> <!--                                       data-ng-click="filter_project_options()">-->
1 <!--                                <span>Somente projetos ativos</span>--> <!--                            </label>--> <!--                        </div>--> <!--                        <div ng-if="filter.formParams.include_archived_projects_visible"--> <!--                             class="filters-column&#45;&#45;checkbox-container">--> <!--                            <label style="margin-top: 30px;">--> <!--                                <input type="checkbox"--> <!--                                       data-ng-check--> <!--                                       class="slim-check-width-12"--> <!--                                       data-ng-model="filter.apiParams.include_archived_projects"--> <!--                                       data-ng-click="filter_project_options()">--> <!--                                <span>Incluir projetos arquivados</span>--> <!--                            </label>--> <!--                        </div>--> <div data-ng-if="filter.formParams.only_projects_member_of_visible" class="filters-column--checkbox-container"> <div data-ng-if="!$profileService.isRegularUser()"> <label style="margin-top: 30px;"> <input type="checkbox" data-ng-check class="slim-check-width-12" data-ng-model="filter.apiParams.only_projects_member_of"> <span>{{ \'time_entries.filter.only_my_projects\' | translate }}</span> </label> </div> </div> <div ng-if="filter.formParams.project_privacy_visible"> <label style="margin-top: 30px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.project_privacy_checked"> <span class="has-filters-below">{{ \'time_entries.filter.privacy\' | translate }}</span> </label> <div class="sub-filters sub-filters-offset" data-ng-if="filter.formParams.project_privacy_checked"> <label> <input type="radio" ng-model="filter.apiParams.project_privacy"> <span>{{ \'time_entries.filter.privacy_any\' | translate }}</span> </label> <label> <input type="radio" ng-model="filter.apiParams.project_privacy" value="public"> <span>{{ \'time_entries.filter.privacy_public\' | translate }}</span> </label> <label> <input type="radio" ng-model="filter.apiParams.project_privacy" value="private"> <span>{{ \'time_entries.filter.privacy_private\' | translate }}</span> </label> </div> </div> </div> </div> </div> </div> <!-- Filtrar por tarefas --> <div ng-if="filter.formParams.task_id_visible" class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.task_checked"> <span>{{ \'time_entries.filter.tasks\' | translate }}</span> </label> <div ng-show="filter.formParams.task_checked" class="filters-subgroup"> <div> <input ng-model="filter.apiParams.task_id" data-options-load="$taskService.getTaskOptionsForFilter" data-options-load-trigger="focus" data-options-load-params="filter.formParams.task__options_load_params" data-options-filters="filter.formParams.task__options_filters" data-selectize-key="filter-tasks" data-selectize="{\r\n                                dropdownParent: \'body\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                valueField: \'id\',\r\n                                sortField: \'name\',\r\n                                optgroups: [\r\n                                    {id: true, name: (\'time_entries.filter.active_tasks\' | translate)},\r\n                                    {id: false, name: (\'time_entries.filter.archived_tasks\' | translate)}\r\n                                ],\r\n                                lockOptgroupOrder: true,\r\n                                optgroupField: \'active\',\r\n                                optgroupLabelField: \'name\',\r\n                                optgroupValueField: \'id\',\r\n                                plugins: [\'remove_button\'],\r\n                                placeholder: (\'time_entries.filter.filter_by_task\' | translate),\r\n                                render: taskFilterSelectizeRender\r\n                            }"> </div> <div ng-if="filter.formParams.task_empty_visible" class="sub-filters"> <div class="filters-column--checkbox-container"> <label style="margin-top: 30px;"> <input type="checkbox" data-ng-check class="slim-check-width-12" ng-model="filter.apiParams.task_empty"> <span>{{ \'time_entries.filter.entries_without_task\' | translate }}</span> </label> </div> </div> </div> </div> <!-- Filtrar por clientes --> <div ng-if="filter.formParams.customer_filters_visible" class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.customer_checked"> <span>{{ \'time_entries.filter.customers\' | translate }}</span> </label> <div ng-show="filter.formParams.customer_checked" class="filters-subgroup"> <div> <input ng-model="filter.apiParams.customer_id" data-options-load="$customerService.getCustomerOptionsForFilter" data-options-load-trigger="focus" data-options-load-params="filter.formParams.customer__options_load_params" data-options-filters="filter.formParams.customer__options_filters" data-selectize-key="filter-customers" data-selectize="{\r\n                                dropdownParent: \'body\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                valueField: \'id\',\r\n                                sortField: \'name\',\r\n                                plugins: [\'remove_button\'],\r\n                                optgroups: [\r\n                                    {id: true, name: (\'time_entries.filter.active_customers\' | translate)},\r\n                                    {id: false, name: (\'time_entries.filter.archived_customers\' | translate)}\r\n                                ],\r\n                                lockOptgroupOrder: true,\r\n                                optgroupField: \'active\',\r\n                                optgroupLabelField: \'name\',\r\n                                optgroupValueField: \'id\',\r\n                                placeholder: (\'time_entries.filter.filter_by_customer\' | translate)\r\n                           }"> </div> <div ng-if="filter.formParams.customer_empty_visible" class="sub-filters"> <div class="filters-column--checkbox-container"> <label style="margin-top: 30px;"> <input type="checkbox" data-ng-check class="slim-check-width-12" ng-model="filter.apiParams.customer_empty"> <span>{{ \'time_entries.filter.projects_without_customer\' | translate }}</span> </label> </div> </div> </div> </div> <div ng-if="filter.formParams.user_id_visible" class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.user_checked"> <span>{{ \'time_entries.filter.users\' | translate }}</span> </label> <div ng-show="filter.formParams.user_checked" class="filters-subgroup"> <div> <input ng-model="filter.apiParams.user_id" data-options-load="loadUsers" data-options-load-trigger="focus" data-options-load-params="filter.formParams.user__options_load_params" data-options-filters="filter.formParams.user__options_filters" data-selectize-key="filter-users" data-selectize="{\r\n                                dropdownParent: \'body\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                valueField: \'id\',\r\n                                sortField: \'name\',\r\n                                optgroups: [\r\n                                    {id: true, name: (\'time_entries.filter.active_users\' | translate)},\r\n                                    {id: false, name: (\'time_entries.filter.archived_users\' | translate)}\r\n                                ],\r\n                                lockOptgroupOrder: true,\r\n                                optgroupField: \'active\',\r\n                                optgroupLabelField: \'name\',\r\n                                optgroupValueField: \'id\',\r\n                                plugins: [\'remove_button\'],\r\n                                placeholder: (\'time_entries.filter.filter_by_user\' | translate)\r\n                            }"> </div> <div class="sub-filters"> <!--                    <div ng-if="filter.formParams.only_active_users_visible"--> <!--                         class="filters-column&#45;&#45;checkbox-container">--> <!--                        <label style="margin-top: 30px;">--> <!--                            <input type="checkbox"--> <!--                                   data-ng-check--> <!--                                   class="slim-check-width-12"--> <!--                                   data-ng-model="filter.apiParams.only_active_users"--> <!--                                   data-ng-click="filter_user_options()">-->
1 <!--                            <span>Somente usuários ativos</span>--> <!--                        </label>--> <!--                    </div>--> <div ng-if="filter.formParams.include_archived_users_visible" class="filters-column--checkbox-container"> <label style="margin-top: 30px;"> <input type="checkbox" data-ng-check class="slim-check-width-12" data-ng-model="filter.apiParams.include_archived_users" data-ng-click="onChangeIncludeArchivedUsers()"> <span>{{ \'time_entries.filter.include_archived_users\' | translate }}</span> <span class="icon-info light-grey-color" data-tooltip-append-to-body="true" data-tooltip-placement="top-right" data-tooltip-html="\'{{ \'time_entries.filter.include_archived_users_info\' | translate }}\'"></span> </label> <sub>{{ \'time_entries.filter.include_archived_users_sub\' | translate }}</sub> </div> </div> </div> <div data-ng-if="$permissionService.canDisplayUserManagerField()"> <div class="filters-column--item-container"> <label style="margin-top: 30px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.manager_checked"> <span class="has-filters-below">{{ \'time_entries.filter.manager\' | translate }}</span> </label> </div> <div ng-show="filter.formParams.manager_checked"> <div> <input ng-model="filter.apiParams.manager_id" data-options-load="$userService.getUserManagerOptions" data-options-load-trigger="focus" data-options-filters="filter.formParams.manager__options_filters" data-selectize-key="filter-managers" data-selectize="{\r\n                                dropdownParent: \'body\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                valueField: \'id\',\r\n                                sortField: \'name\',\r\n                                plugins: [\'remove_button\'],\r\n                                placeholder: (\'time_entries.filter.filter_by_manager\' | translate)\r\n                        }"> </div> <div ng-if="filter.formParams.manager_empty_visible" class="sub-filters"> <div class="filters-column--checkbox-container"> <label style="margin-top: 30px;"> <input type="checkbox" data-ng-check class="slim-check-width-12" ng-model="filter.apiParams.manager_empty"> <span>{{ \'time_entries.filter.users_without_manager\' | translate }}</span> </label> </div> </div> </div> </div> </div> <div if-has-feature="ROLE_PERMISSIONS"> <div ng-if="filter.formParams.user_role_visible" class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.user_role_checked"> <span>{{ \'time_entries.filter.permissions\' | translate }}</span> </label> <div ng-show="filter.formParams.user_role_checked" class="filters-subgroup"> <input ng-model="filter.apiParams.user_role" data-options="::$permissionService.getRoles()" data-selectize="{\r\n                            dropdownParent: \'body\',\r\n                            labelField: \'name\',\r\n                            valueField: \'id\',\r\n                            sortField: \'name\',\r\n                            searchField: \'name\',\r\n                            placeholder: (\'time_entries.filter.filter_by_permission\' | translate),\r\n                            plugins: [\'remove_button\']\r\n                        }"> </div> </div> </div> <div if-has-feature="TEAMS"> <div ng-if="filter.formParams.team_filters_visible" class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.team_checked"> <span>{{ \'time_entries.filter.teams\' | translate }}</span> </label> <div ng-show="filter.formParams.team_checked" class="filters-subgroup"> <input ng-model="filter.apiParams.team_id" data-options-load="$teamService.getTeamOptions" data-options-load-params="filter.formParams.team__options_load_params" data-options-filters="filter.formParams.team__options_filters" data-options-load-trigger="focus" data-selectize="{\r\n                                dropdownParent: \'body\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                valueField: \'id\',\r\n                                sortField: \'name\',\r\n                                plugins: [\'remove_button\'],\r\n                                placeholder: (\'time_entries.filter.filter_by_team\' | translate)\r\n                           }"> </div> </div> </div> <!-- Filtrar por descrição --> <div ng-if="filter.formParams.description_visible" class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.description_checked"> <span>{{ \'time_entries.filter.description\' | translate }}</span> </label> <div ng-show="filter.formParams.description_checked" class="filters-subgroup"> <div> <input type="text" ng-model="filter.apiParams.description" placeholder="{{ \'t
1ime_entries.filter.filter_by_description\' | translate }}" class="input-text"> </div> <div class="sub-filters"> <div class="filters-column--checkbox-container"> <label> <input type="checkbox" data-ng-check class="slim-check-width-12" ng-model="filter.apiParams.description_all_match"> <span>{{ \'time_entries.filter.match_all_words\' | translate }}</span> </label> </div> <div class="filters-column--checkbox-container"> <label> <input type="checkbox" data-ng-check class="slim-check-width-12" ng-model="filter.apiParams.description_exact_match"> <span>{{ \'time_entries.filter.match_exact_description\' | translate }}</span> </label> </div> <div class="filters-column--checkbox-container" ng-if="filter.formParams.description_empty_visible"> <label style="margin-top: 30px;"> <input type="checkbox" data-ng-check class="slim-check-width-12" ng-model="filter.apiParams.description_empty"> <span>{{ \'time_entries.filter.entries_without_description\' | translate }}</span> </label> </div> </div> </div> </div> <div if-has-feature="INVOICED_FLAG"> <div ng-if="filter.formParams.is_invoiced_visible" class="filters-column--item-container"> <label style="margin-top: 30px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.is_invoiced_checked"> <span class="has-filters-below">{{ \'time_entries.filter.invoiced\' | translate }}</span> </label> <div class="sub-filters sub-filters-offset" data-ng-if="filter.formParams.is_invoiced_checked"> <label> <input type="radio" ng-model="filter.apiParams.is_invoiced"> <span>{{ \'time_entries.filter.invoiced_both\' | translate }}</span> </label> <label> <input type="radio" ng-model="filter.apiParams.is_invoiced" value="1"> <span>{{ \'time_entries.filter.invoiced_yes\' | translate }}</span> </label> <label> <input type="radio" ng-model="filter.apiParams.is_invoiced" value="0"> <span>{{ \'time_entries.filter.invoiced_no\' | translate }}</span> </label> </div> </div> </div> <div data-ng-if="filter.formParams.user_capacity_filter_visible\r\n            && [\'week\', \'2-weeks\', \'month\'].indexOf(filter.formParams.date_execution_interval) !== -1" class="filters-column--item-container filters-column--user-capacity-filters"> <label style="margin-top: 30px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check data-ng-change="onChangeUserCapacidadeFilterCheck()" data-disabled-required-feature="\'USER_CAPACITY\'" ng-model="filter.formParams.user_capacity_filter_checked"> <span>{{ \'time_entries.filter.audit_hours_day\' | translate }}</span> </label> <div data-ng-show="filter.formParams.user_capacity_filter_checked" class="filters-subgroup"> <div class="row"> <div class="column-100"> <select data-ng-model="filter.apiParams[\'capacity_filter_type\']" data-options="capacity_filter_types" class="selectize-keep-default-width" data-selectize="{ dropdownParent: \'body\', labelField: \'name\', valueField: \'type\' }"> </select> </div> </div> <div class="row collapse" data-ng-if="filter.apiParams.capacity_filter_type !== \'logged_without_capacity\'"> <div class="column-30"> <div class="input-suffix-inside--container"> <input type="text" id="capacity_filter_value" data-ng-mask="numberFormatted" data-ng-model="filter.apiParams[\'capacity_filter_value\']" data-ng-model-options="{ debounce: 500 }" data-disabled-required-feature="\'USER_CAPACITY\'" placeholder="{{0}}" class="center"> <label class="input-suffix-inside--label-suffix" for="capacity_filter_value">%</label> </div> </div> <div class="column-70"> <select data-ng-model="filter.apiParams[\'capacity_filter_scope\']" class="selectize-keep-default-width" data-options="capacity_filter_scopes" data-selectize="{ dropdownParent: \'body\', labelField: \'name\', valueField: \'type\' }"> </select> </div> </div> </div> </div> <!-- Filtrar por descrição --> <div if-has-feature="CUSTOM_FIELDS_LEGACY"> <div ng-if="filter.formParams.custom_fields_visible" class="filters-column--item-container"> <!--        <div ng-if="$subscriptionService.isPaid() && filter.formParams.custom_fields_visible">--> <div data-ng-repeat="field in $fieldService.getTimeEntryFields() | orderBy: sequence "> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter[field.name+\'_checked\']"> <span>{{field.label}}</span> </label> <div ng-show="filter[field.name+\'_checked\']" class="filters-subgroup"> <div> <input type="text" ng-model="filter.apiParams[field.name]" placeholder="{{ \'t
1ime_entries.filter.filter_by\' | translate: {name: (field.label | lowercase)} }}" class="input-text"> </div> <div class="filters-column--checkbox-container"> <label> <input type="checkbox" data-ng-check class="slim-check-width-12" ng-model="filter.apiParams[field.name+\'_all_match\']"> <span>{{ \'time_entries.filter.match_all_words\' | translate }}</span> </label> </div> <div class="filters-column--checkbox-container"> <label> <input type="checkbox" data-ng-check class="slim-check-width-12" ng-model="filter.apiParams[field.name+\'_exact_match\']"> <span>{{ \'time_entries.filter.match_exact_description\' | translate }}</span> </label> </div> <div class="filters-column--checkbox-container" ng-if="filter.formParams.custom_filed_description_empty_visible"> <label style="margin-top: 30px;"> <input type="checkbox" data-ng-check class="slim-check-width-12" ng-model="filter.apiParams[field.name+\'_empty\']"> <span>{{ \'time_entries.filter.no_entries_with\' | translate: {name: (field.label | lowercase)} }}</span> </label> </div> </div> </div> </div> </div> <div if-has-feature="CUSTOM_FIELDS"> <div ng-if="filter.formParams.custom_fields_visible"> <div data-ng-repeat="custom_field in customFieldList | orderBy: name" class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check data-ng-model="filter.formParams[\'custom_field_\'+custom_field.id+\'_checked\']"> <span>{{custom_field.name}}</span> <span class="icon-info light-grey-color" data-tooltip-append-to-body="true" data-tooltip-placement="top-right" data-tooltip-html="\'\r\n                                <div><strong>{{custom_field.name}}</strong></div>\r\n                                <div>{{custom_field.description}}</div>\r\n                                <div>Campo de {{$customFieldService.getEntityName(custom_field.entity)}}</div>\'\r\n                            "></span> </label> <div ng-show="filter.formParams[\'custom_field_\'+custom_field.id+\'_checked\']" class="filters-subgroup"> <div data-ng-switch="custom_field.type"> <div data-ng-switch-when="enum"> <input data-options="$enumOptionService.getByCustomField(custom_field.id)" data-ng-model="filter.apiParams[\'custom_field_\'+custom_field.id]" data-selectize="{\r\n                                                dropdownParent: \'body\',\r\n                                                labelField: \'name\',\r\n                                                valueField: \'id\',\r\n                                                sortField: \'name\',\r\n                                                searchField: \'name\',\r\n                                                plugins: [\'remove_button\'],\r\n                                                optgroups: [\r\n                                                    {id: true, name: (\'time_entries.filter.active_users\' | translate)},\r\n                                                    {id: false, name: (\'time_entries.filter.archived_users\' | translate)}\r\n                                                ],\r\n                                                lockOptgroupOrder: true,\r\n                                                optgroupField: \'active\',\r\n                                                optgroupLabelField: \'name\',\r\n                                                optgroupValueField: \'id\',\r\n                                                placeholder: (\'time_entries.filter.filter_by_options\' | translate)\r\n                                        }"> </div> <div data-ng-switch-when="numeric"> <div> <input type="text" data-ng-mask="numeric" ng-model="filter.apiParams[\'custom_field_\'+custom_field.id]" placeholder="{{ \'time_entries.filter.filter_by_number\' | translate }}" class="input-text"> </div> </div> </div> <div class="sub-filters"> <div class="filters-column--checkbox-container"> <label style="margin-top: 30px;"> <input type="checkbox" data-ng-check class="slim-check-width-12" ng-model="filter.apiParams[\'custom_field_\'+custom_field.id+\'_empty\']"> <span>{{ \'time_entries.filter.empty\' | translate: {name: custom_field.name} }}</span> </label> </div> </div> </div> </div> </div> </div> <div ng-if="filter.formParams.timesheet_approval_status_visible" class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.timesheet_approval_status_checked"> <span>{{ \'timesheet.column_status\' | translate }}</span> </label> <div ng-show="filter.formParams.timesheet_approval_status_checked" class="filters-subgroup"> <select ng-model="filter.apiParams.status" data-options="timesheet_approval_status_options" class="selectize-keep-default-width" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'type\',\r\n                            placeholder: (\'timesheet.column_status\' | translate)\r\n                        }"> </select> </div> </div> <div ng-if="filter.formParams.timesheet_approval_approver_visible" class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.timesheet_approval_approver_checked"> <span>{{ \'timesheet.column_approver\' | translate }}</span> </label> <div ng-show="filter.formParams.timesheet_approval_approver_checked" class="filters-subgroup"> <input ng-model="filter.apiParams.approver_user_id" data-options-load="loadUsers" data-options-load-trigger="focus" data-options-load-params="filter.formParams.user__options_load_params" data-options-filters="filter.formParams.user__options_filters" data-selectize-key="filter-approvers" data-selectize="{\r\n                            labelField: \'name\',\r\n                            searchField: \'name\',\r\n                            valueField: \'id\',\r\n                            sortField: \'name\',\r\n                            optgroups: [\r\n                                {id: true, name: (\'time_entries.filter.active_users\' | translate)},\r\n                                {id: false, name: (\'time_entries.filter.archived_users\' | translate)}\r\n                            ],\r\n                            lockOptgroupOrder: true,\r\n                            optgroupField: \'active\',\r\n                            optgroupLabelField: \'name\',\r\n                            optgroupValueField: \'id\',\r\n                            plugins: [\'remove_button\'],\r\n                            placeholder: (\'timesheet.column_approver\' | translate)\r\n                       }"> </div> </div> </div> </div> '),
2$templateCache.put("views/top-toolbar-help.html",'<div> <div id="dropdown-toolbar-menu-help" data-dropdown-content class="f-dropdown dropdown-option-list dropdown-toolbar-menu" data-dropdown-close-on-click> <!--        <div class="dropdown-title">--> <!--            Artigos em destaque--> <!--        </div>--> <div class="dropdown-option option-button"> <a app-href="#/training"> <span class="icon-video"></span> <span>{{ \'training.library_link\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a href="https://www.rabbiit.com/help" target="_blank"> <span class="icon-help_outline"></span> <span>{{ \'navbar.help.center\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a href="{{$constants.links.changelog}}" class="toolbar-button" target="_blank"> <span class="icon-campaign"></span> <span>{{ \'navbar.help.whats_new\' | translate }}</span> </a> </div> <hr> <div class="dropdown-title"> {{ \'navbar.help.contact\' | translate }} </div> <div class="dropdown-option option-button"> <a data-ng-click="$supportChannelService.openChat()"> <span class="icon-speech-bubble"></span> <span>{{ \'navbar.help.chat\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="$supportChannelService.openWhatsapp()"> <span class="icon-whatsapp"></span> <span>{{ \'navbar.help.whatsapp\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="openScheduleDemo()"> <span class="icon-calendar4"></span> <span>{{ \'navbar.help.demo\' | translate }}</span> </a> </div> </div> </div> '),$templateCache.put("views/top-toolbar-menu-manager.html",'<!--<div>--> <!--    <div id="dropdown-toolbar-menu-manager"--> <!--         data-dropdown-content--> <!--         class="f-dropdown dropdown-option-list dropdown-toolbar-menu"--> <!--         dropdown-close-on-click>--> <div class="dropdown-title"> <span>{{ \'navbar.manage\' | translate }}</span> </div> <div data-ng-if="::$permissionService.canDisplayProjectMenu()"> <div class="dropdown-option option-button"> <a app-href="#/projects-overview"> <span class="icon-book4"></span> <span>{{ \'navbar.projects\' | translate }}</span> </a> </div> </div> <div data-ng-if="::$permissionService.hasPrivilegesToEditTasks()"> <div class="dropdown-option option-button"> <a app-href="#/tasks"> <span class="icon-ribbon"></span> <span>{{ \'navbar.manager_menu.tasks\' | translate }}</span> </a> </div> </div> <div data-ng-if="::$permissionService.hasPrivilegesToEditCustomers()"> <div class="dropdown-option option-button"> <a app-href="#/customers"> <span class="icon-work_outline"></span> <span>{{ \'navbar.manager_menu.customers\' | translate }}</span> </a> </div> </div> <div data-ng-if="$permissionService.canDisplayUserMenu()"> <div class="dropdown-option option-button"> <a app-href="#/users"> <span class="icon-person_outline"></span> <span>{{ \'navbar.users\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="$settingsService.get(\'integration_time_clock_active\')"> <a app-href="#/users/report"> <span class="icon-person_outline"></span> <span>{{ \'navbar.manager_menu.users_report\' | translate }}</span>
2 <!--                    <span class="flag light-blue-color" style="margin-left: 10px;">{{ \'common.new\' | translate }}</span>--> </a> </div> <div class="dropdown-option option-button"> <a app-href="#/teams"> <span class="icon-people_outline"></span> <span>{{ \'navbar.manager_menu.teams\' | translate }}</span> </a> </div> </div> <!--        <div if-has-feature="TIME_CLOCK_INTEGRATION">--> <div data-ng-if="$permissionService.hasPermission(\'super\')"> <hr> <div class="dropdown-option dropdown-sub-menu option-button"> <a style="cursor: default;"> <span class="icon-shuffle2"></span> <span>{{ \'navbar.manager_menu.time_clock_integration\' | translate }}</span> </a> <div data-ng-include="\'views/top-toolbar-sub-menu-time-clock.html\'" data-include-replace></div> </div> </div> <!--        </div>--> <!--    </div>--> <!--</div>--> '),$templateCache.put("views/top-toolbar-menu-profile.html",'<div data-ng-controller="ToolbarMenuProfileController"> <div id="dropdown-toolbar-menu-profile" data-dropdown-content class="f-dropdown dropdown-option-list dropdown-toolbar-menu" data-dropdown-close-on-click-link> <div class="dropdown-title dropdown-toolbar-menu-profile--header"> <span class="dropdown-toolbar-menu-profile--header__account-name">{{$accountService.getAccountName()}}</span> <span>{{$profileService.getEmail()}}</span> <span data-flag-permission="{{$profileService.getUserRole()}}"></span> </div> <div class="dropdown-toolbar-menu-profile--preferences"> <div data-if-has-feature="BILLABLE_PROJECT"> <div data-ng-if="::$permissionService.canDisplayAnyProtectedMonetaryData()"> <div class="dropdown-title"> {{ \'navbar.profile.privacy\' | translate }} </div> <div class="dropdown-toolbar-menu-profile--money-visibility"> <div> <span data-ng-class="moneyVisibilityService.isVisible ? \'icon-eye22\' : \'icon-eye-blocked\'"></span> <label class="label-dashed" data-tooltip-placement="bottom" data-tooltip-html="\'{{ \'common.money_visibility_tooltip\' | translate }}\'"> {{ \'navbar.profile.currency_visibility\' | translate }} </label> </div> <label> <input type="radio" data-ng-model="moneyVisibilityService.status" data-ng-change="moneyVisibilityService.update()" value="visible"> <span>{{ \'navbar.profile.currency_visible\' | translate }}</span> </label> <label> <input type="radio" data-ng-model="moneyVisibilityService.status" data-ng-change="moneyVisibilityService.update()" value="hidden"> <span>{{ \'navbar.profile.currency_hidden\' | translate }}</span> </label> </div> </div> </div> </div> <div class="dropdown-toolbar-menu-profile--left"> <div class="dropdown-title"> {{ \'navbar.profile.account\' | translate }} </div> <div class="dropdown-option option-button"> <a data-app-href="#/profile"> <span class="icon-user"></span> {{ \'navbar.profile.profile_preferences\' | translate }} </a> </div> <div data-ng-show="$permissionService.hasPrivilegesToEditAccountSettings()"> <div class="dropdown-option option-button"> <a data-app-href="#/project-settings"> <span class="icon-cog4"></span> <span>{{ \'navbar.profile.general_settings\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-app-href="#/account"> <span class="icon-credit"></span> {{ \'navbar.profile.account_subscription\' | translate }} </a> </div> <div class="dropdown-option option-button"> <a data-app-href="#/custom-fields"> <span class="icon-toggle"></span> <span>{{ \'navbar.profile.custom_fields\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-app-href="#/date-lock"> <span class="icon-lock_outline"></span> <span>{{ \'navbar.profile.date_lock\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-show="$settingsService.settings.module_timesheet_automation_active"> <a data-app-href="#/time-automation-rules/user-report"> <span class="icon-auto_fix_high"></span> <span>{{ \'navbar.profile.timesheet_automation\' | translate }}</span> <span class="flag flag-new-feature">{{ \'common.new\' | translate }}</span> </a> </div> </div> <hr> <div class="dropdown-option option-button"> <a href="./login" target="_blank"> <span class="icon-shuffle2"></span> <span>{{ \'navbar.profile.switch_account\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="logoff()"> <span class="icon-power_settings_new"></span> <span>{{ \'navbar.profile.logout\' | translate }}</span> </a> </div> </div> <div class="dropdown-toolbar-menu-profile--right"> <div> <div class="dropdown-title">{{ \'navbar.profile.links\' | translate }}</div> <div class="dropdown-option option-button"> <a href="https://www.rabbiit.com/afiliados" target="_blank"> <span class="icon-gift"></span> <span>{{ \'navbar.profile.refer_earn\' | translate }}</span>
2 <span class="flag flag-new-feature">{{ \'common.new\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a href="https://www.rabbiit.com/help" target="_blank"> <span class="icon-help_outline"></span> <span>{{ \'navbar.help.center\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a href="{{$constants.links.changelog}}" class="toolbar-button radius" target="_blank"> <span class="icon-campaign"></span> <span>{{ \'navbar.help.whats_new\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a href="https://blog.rabbiit.com/" class="toolbar-button radius" target="_blank"> <span class="icon-box3"></span> <span>{{ \'navbar.profile.blog\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a href="http://status.rabbiit.com" class="toolbar-button radius" target="_blank"> <span class="icon-signal"></span> <span>{{ \'navbar.profile.status_page\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a href="https://www.rabbiit.com/seguranca" class="toolbar-button radius" target="_blank"> <span class="icon-paper"></span> <span>{{ \'navbar.profile.security_policy\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a href="https://api-docs.rabbiit.com" class="toolbar-button radius" target="_blank"> <span class="icon-settings_ethernet"></span> <span>{{ \'navbar.profile.api_docs\' | translate }}</span> </a> </div> </div> <!--            <div style="margin-top: 20px;">--> <!--                <div class="dropdown-option option-button"--> <!--                     data-ng-show="is_free_plan_active()">--> <!--                    <a data-ng-click="$subscriptionService.showUpgradeModal()"--> <!--                       class="button button-upgrade">--> <!--                        <span class="icon-auto_awesome"></span>--> <!--                        <span>{{ \'navbar.profile.upgrade_plan\' | translate }}</span>--> <!--                    </a>--> <!--                </div>--> <!--                <div class="dropdown-option option-button"--> <!--                     data-ng-show="is_trial_active()">--> <!--                    <a data-ng-click="$subscriptionService.showUpgradeModal()"--> <!--                       class="button button-upgrade">--> <!--                        <span class="icon-auto_awesome"></span>--> <!--                        <span>{{ \'navbar.profile.choose_plan\' | translate }}</span>--> <!--                    </a>--> <!--                    <span class="trial-counter-description"--> <!--                          data-ng-bind-html="$subscriptionService.trialCounterDescription()">--> <!--                </span>--> <!--                </div>--> <!--            </div>--> </div> <!--        <div class="dropdown-toolbar-menu-profile&#45;&#45;footer">--> <!--            <div class="dropdown-toolbar-menu-profile&#45;&#45;footer__buttons">--> <!--                <a data-ng-click="$supportChannelService.openWhatsapp()"--> <!--                   class="button clean radius">--> <!--                    <span class="icon-whatsapp"></span>--> <!--                    <span>Conversar via WhatsApp</span>--> <!--                </a>--> <!--                <a data-ng-click="$supportChannelService.openChat()"--> <!--                   class="button clean radius">--> <!--                    <span class="icon-speech-bubble"></span>--> <!--                    <span>Conversar via Chat</span>--> <!--                </a>--> <!--            </div>--> <!--        </div>--> </div> </div> '),$templateCache.put("views/top-toolbar-menu-reports.html",'<!--<div id="dropdown-menu-reports"--> <!--     data-dropdown-content--> <!--     class="f-dropdown dropdown-option-list dropdown-toolbar-menu"--> <!--     dropdown-close-on-click>--> <div class="dropdown-title"> <span>{{ \'navbar.reports_menu.featured\' | translate }}</span> </div> <div class="dropdown-option option-button"> <a app-href="#/reports/detailed" title="{{ \'navbar.reports_menu.detailed_title\' | translate }}"> <span class="icon-menu2" style="margin-right: 5px;"></span> <span>{{ \'navbar.reports_menu.detailed\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a app-href="#/reports/summary-groups"> <span class="icon-pie-graph" style="margin-right: 5px;"></span> <span> <span>{{ \'navbar.reports_menu.custom_summary\' | translate }}</span> </span> </a> </div> <div class="dropdown-option option-button"> <a app-href="#/reports/daily" title="{{ \'navbar.reports_menu.daily_title\' | translate }}"> <span class="icon-calendar4" style="margin-right: 5px;"></span> <span>{{ \'navbar.reports_menu.daily\' | translate }}</span> </a> </div> <!--    <div class="dropdown-option option-button" if-has-permission="super">--> <!--        <a app-href="#/users-capacity" title="Usuários e Capacidade">-->
2 <!--            <span class="icon-user" style="margin-right: 5px;"></span>--> <!--            <div>--> <!--                <span>Usuários e Capacidade</span>--> <!--                <span class="flag flag-new-feature">Novo</span>--> <!--                <sub>Antigo Relatório Semanal</sub>--> <!--            </div>--> <!--        </a>--> <!--    </div>--> <hr> <div class="dropdown-title"> <span>{{ \'navbar.reports_menu.more_reports\' | translate }}</span> </div> <div class="dropdown-option option-button"> <a app-href="#/reports/projects" title="{{ \'navbar.reports_menu.summary_projects_title\' | translate }}"> <span class="icon-layout" style="margin-right: 5px;"></span> <span>{{ \'navbar.reports_menu.summary_projects\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" if-has-permission="super"> <a app-href="#/reports/users" title="{{ \'navbar.reports_menu.summary_users_title\' | translate }}"> <span class="icon-layout" style="margin-right: 5px;"></span> <span>{{ \'navbar.reports_menu.summary_users\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" if-has-permission="super"> <a app-href="#/reports/users-grid" title="{{ \'navbar.reports_menu.users_x_projects_title\' | translate }}"> <span class="icon-layout" style="margin-right: 5px;"></span> <span>{{ \'navbar.reports_menu.users_x_projects\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" if-has-permission="super"> <a app-href="#/reports/teams" title="{{ \'navbar.reports_menu.summary_teams_title\' | translate }}"> <span class="icon-layout" style="margin-right: 5px;"></span> <span>{{ \'navbar.reports_menu.summary_teams\' | translate }}</span> </a> </div> <!--</div>--> '),$templateCache.put("views/top-toolbar-sub-menu-time-clock.html",'<div data-dropdown-content class="f-dropdown dropdown-option-list"> <div> <div class="dropdown-title"> <span>{{ \'navbar.manager_menu.time_clock_integration\' | translate }}</span> </div> <div class="dropdown-option option-button"> <a data-app-href="#/time-clock/configuration"> <span>{{ \'navbar.manager_menu.time_clock_sub.config\' | translate }}</span> <span class="flag yellow-color" if-has-not-feature="TIME_CLOCK_INTEGRATION">UPGRADE</span> </a> </div> <div class="dropdown-option option-button"> <a data-app-href="#/time-clock/sync" data-disabled="!$settingsService.get(\'integration_time_clock_active\')"> <span>{{ \'navbar.manager_menu.time_clock_sub.sync\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-app-href="#/time-clock/divergences-summary" data-disabled="!$settingsService.get(\'integration_time_clock_active\')"> <span>{{ \'navbar.manager_menu.time_clock_sub.divergences_report\' | translate }}</span> </a> </div> </div> <hr> <div class="dropdown-title"> <span>{{ \'navbar.manager_menu.time_clock_sub.automation_rules\' | translate }}</span> </div> <div class="dropdown-option option-button"> <a data-app-href="#/time-automation-rules" data-disabled="$settingsService.get(\'time_clock_automation_rules_active\') != true"> <span>{{ \'navbar.manager_menu.time_clock_sub.rules_list\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-app-href="#/time-automation-rules/user-report" data-disabled="$settingsService.get(\'time_clock_automation_rules_active\') != true"> <span>{{ \'navbar.manager_menu.time_clock_sub.user_rules_report\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-app-href="#/time-automation-rules/change-date-report" data-disabled="$settingsService.get(\'time_clock_automation_rules_active\') != true"> <span>{{ \'navbar.manager_menu.time_clock_sub.change_date_report\' | translate }}</span> </a> </div> </div> '),$templateCache.put("views/top-toolbar.html",'<div data-ng-controller="ToolbarController" id="top-toolbar"> <div class="top-toolbar--container"> <div class="top-toolbar--left-container"> <div> <a class="toolbar-button" data-ng-click="toggleLeftColumn()" data-tooltip="{{ \'navbar.home_tooltip\' | translate }}" data-tooltip-placement="right" data-tooltip-popup-delay="500" data-tooltip-append-to-body="true" data-tooltip-enable="isEnabledTooltipToggleLeftColumn">
2 <img src="assets/img/icons/burger-menu-left.svg"> </a> </div> <div> <a class="top-toolbar--logo" data-app-href="#/"> <!--                <img class="top-toolbar&#45;&#45;logo-icon" src="assets/img/logo-app-icone.png" data-ng-if="!$pageService.isCurrentPath(\'/billing\')">--> <!--                <img class="top-toolbar&#45;&#45;logo" src="assets/img/logo-app.png" data-ng-if="$pageService.isCurrentPath(\'/billing\')">--> <!--                    <img class="top-toolbar&#45;&#45;logo-icon" src="assets/img/logo-app-icone.png"/>--> <img class="top-toolbar--logo__long-size" src="assets/img/logo-app.png"> <img class="top-toolbar--logo__short-size" src="assets/img/logo-app-icone.png"> </a> </div> <!--        </div>--> <!--        <div id="top-toolbar-middle" class="top-toolbar-child">--> <!--            <ul>--> <div> <a data-app-href="#/time-tracking" data-ng-class="{ active: $pageService.isCurrentPath(\'/projects\')\r\n                   || $pageService.isCurrentPath(\'/time-tracking\')\r\n                   || $pageService.isCurrentPath(\'/timesheet\') }" class="toolbar-button toolbar-button--button-home"> <div> <div>{{ \'navbar.home\' | translate }}</div> <span data-ng-if="isStopwatchActive" stopwatch-display></span> <!--                        <span stopwatch-display></span>--> <!--                        <a class="toolbar-button&#45;&#45;button-stopwatch__pause"--> <!--                           data-ng-click="pauseCurrentStopwatch()"--> <!--                           title="Pausar cronômetro">--> <!--                            <span class="icon-pause"></span>--> <!--                        </a>--> <!--                        </span>--> </div> </a> </div> <!--            <div data-ng-if="isStopwatchActive">--> <!--                <a class="toolbar-button toolbar-button&#45;&#45;button-stopwatch"--> <!--                   data-ng-click="pauseCurrentStopwatch()"--> <!--                   title="Pausar cronômetro">--> <!--                    <span class="icon-pause"></span>--> <!--                </a>--> <!--            </div>--> <div data-ng-if="::$permissionService.canDisplayProjectMenu()"> <a data-app-href="#/projects-overview" data-ng-class="{ active: $pageService.isCurrentPath(\'/projects-overview\') }" class="toolbar-button toolbar-button--button-projects"> <span>{{ \'navbar.projects\' | translate }}</span> </a> </div> <div data-ng-if="::$permissionService.canDisplayUserMenu()"> <a data-app-href="#/users-capacity" data-ng-class="{ active: $pageService.isCurrentPath(\'/users-capacity\') }" class="toolbar-button toolbar-button--button-users"> <span>{{ \'navbar.users\' | translate }}</span> </a> </div> <!--                <li>--> <!--                    <a data-app-href="#/users"--> <!--                       data-ng-class="{ active: $pageService.isCurrentPath(\'/users\') }"--> <!--                       data-ng-if="should_see_menu_manager()"--> <!--                       class="toolbar-button radius">--> <!--                        <span>Gerenciar</span>--> <!--                    </a>--> <!--                </li>--> <div> <div class="toolbar-button toolbar-button--button-reports has-dropdown" data-dropdown="dropdown-menu-reports" data-ng-class="{ active: $pageService.isCurrentPath(\'/reports\') }"> <span>{{ \'navbar.reports\' | translate }}</span> </div> </div> <div data-ng-if="::should_see_menu_manager()"> <div class="toolbar-button toolbar-button--button-manager has-dropdown" data-dropdown="dropdown-toolbar-menu-manager" data-ng-class="{ active: $pageService.isCurrentPath([\'/customers\', \'/tasks\', \'/teams\'], true) }"> <span>{{ \'navbar.manage\' | translate }}</span> </div> </div> <div> <div class="toolbar-button toolbar-button--button-compact-more has-dropdown" data-dropdown="dropdown-toolbar-menu-compact-more" data-ng-class="{ active: $pageService.isCurrentPath([\'/customers\', \'/tasks\', \'/teams\'], true) }"> <span>{{ \'navbar.more\' | translate }}</span> </div> </div> </div> <div class="top-toolbar--right-container"> <!--            <ul data-ng-if="$pageService.isCurrentPath(\'/billing\')" style="margin-right: 10px;">--> <!--                <li>--> <!--                    <button data-ng-click="$supportChannelService.openWhatsapp()"--> <!--                       class="toolbar-button radius active upgrade">-->
2 <!--                        <span class="icon-whatsapp"></span>--> <!--                        <span>Conversar no WhatsApp</span>--> <!--                    </button>--> <!--                </li>--> <!--                <li>--> <!--                    <button data-ng-click="$supportChannelService.openChat()"--> <!--                       class="toolbar-button radius active upgrade">--> <!--                        <span class="icon-speech-bubble"></span>--> <!--                        <span>Conversar no Chat</span>--> <!--                    </button>--> <!--                </li>--> <!--                <li>--> <!--                    <p style="margin: 11px 16px 0 0; font-size: 13px;">Dúvidas sobre os planos, funcionalidades ou cobranças?</p>--> <!--                </li>--> <!--            </ul>--> <!--            <ul data-ng-if="!$pageService.isCurrentPath(\'/billing\')">--> <!--        <ul>--> <!--            <li>--> <!--            </li>--> <div data-ng-if="is_free_plan_active() || is_trial_active()"> <!--            <div>--> <a data-ng-click="$subscriptionService.showUpgradeModal()" class="button button-upgrade toolbar-button toolbar-button--button-upgrade"> <div> <span class="icon-auto_awesome"></span> <span>{{is_free_plan_active() ? (\'navbar.upgrade.new_plans\' | translate) : (\'navbar.upgrade.upgrade_now\' | translate)}}</span> </div> </a> </div> <!--            <div data-ng-if="is_trial_active()">--> <!--                <a data-ng-click="$subscriptionService.showUpgradeModal()"--> <!--                   class="toolbar-button radius active upgrade">--> <!--                    <span class="icon-auto_awesome"></span>--> <!--                    <span>Upgrade</span>--> <!--                </a>--> <!--            </div>--> <div data-ng-if="::$authService.isSessionOverrideActive()"> <a class="toolbar-button toolbar-button--button-session-override" data-ng-click="$authService.removeSessionOverride()"> <div> <sup>
2{{ \'navbar.session_override\' | translate }}</sup> <div> <span>{{::$authService.getSessionOverrideUser().name}}</span> <span>({{::$permissionService.getRoleName($authService.getSessionOverrideUser().role)}})</span> </div> </div> </a> </div> <div> <a data-dropdown="dropdown-toolbar-menu-help" class="toolbar-button toolbar-button--button-help top-toolbar-changelog-badge"> <span>?</span> </a> </div> <div> <a class="toolbar-button menu-profile has-dropdown" data-dropdown="dropdown-toolbar-menu-profile" title="{{$profileService.getUserName()}}"> <div class="menu-profile--long-size"> <div class="menu-profile--email">{{$profileService.getEmail() | truncate: 30 : \'...\'}}</div> <div class="menu-profile--account-name">{{$accountService.getAccountName() | truncate: 40 : \'...\'}}</div> </div> <div class="menu-profile--short-size"> <span>{{$profileService.getUserName() | profileShortening}}</span> </div> </a> </div> </div> </div> <div data-ng-include="\'views/top-toolbar-menu-profile.html\'"></div> <div data-ng-include="\'views/top-toolbar-help.html\'"></div> <div id="dropdown-menu-reports" data-dropdown-content class="f-dropdown dropdown-option-list dropdown-toolbar-menu" dropdown-close-on-click> <div data-ng-include="\'views/top-toolbar-menu-reports.html\'"></div> </div> <div id="dropdown-toolbar-menu-manager" data-dropdown-content class="f-dropdown dropdown-option-list dropdown-toolbar-menu" dropdown-close-on-click> <div data-ng-include="\'views/top-toolbar-menu-manager.html\'"></div> </div> <div id="dropdown-toolbar-menu-compact-more" data-dropdown-content class="f-dropdown dropdown-option-list dropdown-toolbar-menu" dropdown-close-on-click> <div data-ng-if="::should_see_menu_manager()"> <div data-ng-include="\'views/top-toolbar-menu-manager.html\'"></div> <hr> </div> <div data-ng-include="\'views/top-toolbar-menu-reports.html\'"></div> </div> <training-tour-trigger></training-tour-trigger> </div> '),$templateCache.put("views/account/account-onboarding.html",'<div class="view account-onboarding-view"> <div class="modal-header"> <div> <h1 data-ng-if="headerTitleKey">{{ headerTitleKey | translate }}</h1> <sub data-ng-if="headerSubtitleKey">{{ headerSubtitleKey | translate }}</sub> </div> <!--        <a class="icon-cross"--> <!--           data-ng-click="close()"--> <!--           data-tooltip="{{ \'users.invite-bulk.close_modal\' | translate }}"--> <!--           data-tooltip-append-to-body="true"></a>--> </div> <div class="modal-body"> <div data-ng-if="stepName === \'goals\'"> <div> <div class="account-onboarding-view--options-container"> <div button-checkbox-multi options="options.goals" ng-model="form.onboarding.goals" on-change="onboardingOnChange" value-property="value" name-property="label"> </div> </div> <div class="ignore-onboarding-button"> <a data-ng-click="confirmIgnore()"> {{ \'account.onboarding.goals.ignore\' | translate }} </a> </div> </div> </div> <div data-ng-if="stepName === \'industry\'"> <div> <div class="account-onboarding-view--options-container"> <div button-checkbox-multi options="options.industry" ng-model="form.onboarding.industry" on-change="onboardingOnChange" value-property="value" name-property="label"> </div> </div> </div> </div> <div data-ng-if="stepName === \'teamSize\'"> <div> <div class="account-onboarding-view--options-container"> <div button-toggle-inline options="options.teamSize" ng-model="form.onboarding.teamSize" on-change="onboardingOnChange" value-property="value" name-property="label"> </div> <div class="account-onboarding-view--invite-users" data-ng-if="shouldShowInviteUsers()"> <div users-invite-bulk-directive type="onboarding" on-inviting="onSavingUsers" on-finish="onSavedUsers"></div> </div> <!--                    <div class="account-onboarding-view&#45;&#45;invite-users"--> <!--                        data-ng-if="shouldShowInviteUsers()">--> <!--                        <label>Convide sua equipe para testarem mais rápido juntos</label>--> <!--                        <sub>Separe os e-emails por linha ou ponto e vírgula (;)</sub>--> <!--                        <textarea placeholder="{{placeholderEmail}}"--> <!--                                  data-ng-model="formInvite.emails"--> <!--                                  data-ng-blur="parseEmails()"--> <!--                                  data-ng-disabled="saving"--> <!--                                  title="Adicione e-mails"></textarea>-->
2 <!--                        <sub data-ng-if="invalidEmails.length > 0" class="has-error">--> <!--                            E-mails inválidos: {{ invalidEmails.join(\', \') }}--> <!--                        </sub>--> <!--                        <div data-ng-if="inviteUsers.length > 0"--> <!--                             class="account-onboarding-view&#45;&#45;invite-users__processed-container">--> <!--                            <sup>E-mails processados:</sup>--> <!--                            <ul>--> <!--                                <li data-ng-repeat="user in inviteUsers">--> <!--                                    <span>{{user.email}}</span> –--> <!--                                    <strong class="account-onboarding-view&#45;&#45;invite-users__status"--> <!--                                    data-ng-class="{--> <!--                                    \'green-color\': user.status === \'saved\',--> <!--                                    \'has-error\': user.status === \'failed\' }">{{ \'user.invite-bulk.status.\' + user.status | translate}}</strong>--> <!--                                </li>--> <!--                            </ul>--> <!--                        </div>--> <!--                    </div>--> </div> </div> </div> <div data-ng-if="stepName === \'marketing\'"> <div> <div class="account-onboarding-view--options-container"> <div button-toggle-inline options="options.marketing" ng-model="form.onboarding.marketing" on-change="onboardingOnChange" value-property="value" name-property="label"> </div> </div> </div> </div> </div> <div class="modal-footer"> <div> <a class="button prev-button" data-ng-if="form.onboarding.step > 1" data-ng-click="prev()"> {{ \'account.onboarding.buttons.prev\' | translate }} </a> </div> <div> <a class="button" data-ng-click="next()" data-ng-disabled="waitSaving"> {{waitSaving ? (submitLabelSaving | translate) : (submitLabelDefault | translate) }} </a> </div> </div> </div> '),$templateCache.put("views/account/account-password.html",'<div class="modal-header"> <h1>{{ $authService.isAuthenticatedByInviteToken() ? (\'account.password.title_create\' | translate) : (\'account.password.title_change\' | translate) }}</h1> <a class="icon-cross" data-ng-click="close()" data-ng-if="required_current_password()"></a> </div> <div class="modal-body" data-on-click-enter="save()"> <div class="row" data-ng-if="required_current_password()"> <div class="column-100"> <label>{{ \'account.password.current_password\' | translate }}</label> <input type="password" data-ng-model="password.current_password" autofocus="autofocus"> </div> </div> <div data-ng-if="$authService.isAuthenticatedByForgotToken()"> <div class="details" style="font-size: 15px; padding-left: 10px; position: relative; top: -21px; border-left: 3px solid #ddd;" data-ng-bind-html="\'account.password.forgot_token_notice\' | translate"> </div> </div> <div class="row"> <div class="column-100"> <label>{{ \'account.password.new_password\' | translate }}</label> <input type="password" data-ng-model="password.new_password"> </div> </div> <div class="row"> <div class="column-100"> <label>{{ \'account.password.confirm_password\' | translate }}</label> <input type="password" data-ng-model="password.confirm_password"> </div> </div> </div> <div class="modal-footer" data-ng-if="required_current_password()"> <button data-ng-click="close()" class="button clean" style="margin-right: 5px;" data-ng-hide="saving"> {{ \'account.password.cancel\' | translate }} </button> <button data-ng-click="save()" data-ng-disabled="!password.new_password || !password.confirm_password || !password.current_password || saving " class="button button--blue-brand"> {{ saving ? (\'account.password.button_changing\' | translate) : (\'account.password.button_change\' | translate) }} </button> </div> <div class="modal-footer" data-ng-if="!required_current_password()"> <button data-ng-click="save()" data-ng-disabled="!password.new_password || !password.confirm_password || saving" class="button button--blue-brand"> <span data-ng-if="$authService.isAuthenticatedByForgotToken()"> {{ saving ? (\'account.password.button_resetting\' | translate) : (\'account.password.button_reset\' | translate) }}
2 </span> <span data-ng-if="$authService.isAuthenticatedByInviteToken()"> {{ saving ? (\'account.password.button_saving\' | translate) : (\'account.password.button_create\' | translate) }} </span> </button> </div> '),
3$templateCache.put("views/account/account-profile-edit.html",'<div class="modal-header"> <h1>{{ \'account.profile_edit.title\' | translate }}</h1> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body" data-on-click-enter="save()"> <div class="row"> <div class="column-100"> <div> <label>{{ \'account.profile_edit.name\' | translate }}</label> <span class="right" style="font-size: 12px; margin-top: 7px; color: #999;">{{ \'account.profile_edit.required\' | translate }}</span> </div> <input type="text" data-ng-model="profile.name" autofocus> </div> </div> <div class="row"> <div class="column-100"> <label>{{ \'account.profile_edit.last_name\' | translate }}</label> <input type="text" data-ng-model="profile.last_name"> </div> </div> </div> <div class="modal-footer"> <button data-ng-click="close()" class="button clean" style="margin-right: 5px;" data-ng-hide="saving"> {{ \'account.profile_edit.cancel\' | translate }} </button> <button data-ng-click="save()" data-ng-disabled="!profile.name || saving" class="button button--blue-brand"> {{ saving ? (\'account.profile_edit.saving\' | translate) : (\'account.profile_edit.save\' | translate) }} </button> </div> '),$templateCache.put("views/account/account-reminder-settings.html",'<div class="view radius content-register-edit view-account-reminder-settings"> <div class="view-content-account--header-container"> <h1> <span>{{ \'general_account_settings.reminders.title\' | translate }}</span> </h1> <p class="title-description"> {{ \'general_account_settings.reminders.description\' | translate }} </p> <p class="title-description permission-note"> <span class="icon-lock_outline"></span> <span>{{ \'general_account_settings.admin_note\' | translate }}</span> </p> </div> <div class="row" style="margin-top: 30px"> <div class="column-100"> <!-- Lembretes --> <section id="account-reminder-settings" class="settings-section view-account-reminder-settings--reminders"> <span data-flag-upgrade-required="TIMESHEET_REMINDERS" data-show-long-description="true" data-custom-description="{{ \'general_account_settings.reminders.upgrade_description\' | translate }}"></span> <div data-if-has-feature="TIMESHEET_REMINDERS"> <div class="view-account-reminder-settings--reminders-content"> <div class="settings-panel view-account-reminder-settings--reminder-card" data-ng-class="{ \'is-unavailable\': !hasFeature.USER_CAPACITY }"> <div class="view-account-reminder-settings--reminder-card-header"> <div> <h4>{{ \'general_account_settings.reminders.daily_title\' | translate }}</h4> <p data-ng-if="reminderSettings.daily.active && hasFeature.USER_CAPACITY"> {{ getDailyReminderSummary() }} </p> </div> <span data-button-toggle data-ng-model="reminderSettings.daily.active" data-disabled="!hasFeature.USER_CAPACITY" data-title="{{ \'general_account_settings.reminders.daily_active\' | translate }}" data-aria-label="{{ \'general_account_settings.reminders.daily_active\' | translate }}"></span> </div> <p class="view-account-reminder-settings--reminder-requirement" data-ng-if="!hasFeature.USER_CAPACITY"> {{ \'general_account_settings.reminders.requires_capacity\' | translate }} </p> <div class="view-account-reminder-settings--reminder-card-body" data-ng-if="reminderSettings.daily.active && hasFeature.USER_CAPACITY"> <p class="view-account-reminder-settings--reminder-section-label"> {{ \'general_account_settings.reminders.section_when\' | translate }} </p> <div class="view-account-reminder-settings--reminder-fields"> <div class="view-account-reminder-settings--reminder-field view-account-reminder-settings--reminder-field--time"> <label for="reminder-daily-time"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_time\' | translate }}</span> </label> <select id="reminder-daily-time" data-ng-model="reminderSettings.daily.time" data-selectize="{\r\n                                                    valueField: \'id\',\r\n                                                    labelField: \'name\',\r\n                                                    searchField: \'name\',\r\n                                                    dropdownParent: \'body\'\r\n                                                }" data-options="submissionDeadlineTimeOptions"> </select> </div> </div> <p class="view-account-reminder-settings--reminder-section-label"> {{ \'general_account_settings.reminders.section_criteria\' | translate }} </p> <div class="view-account-reminder-settings--reminder-fields"> <div class="view-account-reminder-settings--reminder-field view-account-reminder-settings--reminder-field--target"> <label for="reminder-daily-target"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_target\' | translate }}</span> </label> <div class="input-suffix-inside--container"> <input id="reminder-daily-target" type="text" data-ng-mask="number" maxlength="3" data-ng-model="reminderSettings.daily[targetFields.daily]"> <label class="input-suffix-inside--label-suffix" for="reminder-daily-target">{{ reminderSettings.daily.target_type === \'hours\' ? \'h\' : \'%\' }}</label> </div> </div> <div class="view-account-reminder-settings--reminder-field view-account-reminder-settings--reminder-field--target-type"> <label for="reminder-daily-target-type"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_target_type\' | translate }}</span> </label> <select id="reminder-daily-target-type" data-ng-model="reminderSettings.daily.target_type" data-selectize="{\r\n                                                    valueField: \'id\',\r\n                                                    labelField: \'name\',\r\n                                                    searchField: \'name\',\r\n                                                    dropdownParent: \'body\',\r\n                                                    onChange: syncDailyTargetField\r\n                                                }" data-options="reminderTargetOptions"> </select> </div> <div class="view-account-reminder-settings--reminder-field"> <label for="reminder-daily-period-reference"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_period\' | translate }}</span> </label> <select id="reminder-daily-period-reference" data-ng-model="reminderSettings.daily.period_reference" data-selectize="{\r\n                                                    valueField: \'id\',\r\n                                                    labelField: \'name\',\r\n                                                    searchField: \'name\',\r\n                                                    dropdownParent: \'body\'\r\n                                                }" data-options="reminderDailyPeriodOptions"> </select> </div> </div> </div> <div data-reminder-email-custom-message data-reminder-key="daily" data-custom-message="reminderSettings.daily.email_custom_message"></div> </div> <div class="settings-panel view-account-reminder-settings--reminder-card" data-ng-class="{ \'is-unavailable\': !hasFeature.USER_CAPACITY }"> <div class="view-account-reminder-settings--reminder-card-header"> <div> <h4>{{ \'general_account_settings.reminders.weekly_title\' | translate }}</h4> <p data-ng-if="reminderSettings.weekly.active && hasFeature.USER_CAPACITY"> {{ getWeeklyReminderSummary() }} </p> </div> <span data-button-toggle data-ng-model="reminderSettings.weekly.active" data-disabled="!hasFeature.USER_CAPACITY" data-title="{{ \'general_account_settings.reminders.weekly_active\' | translate }}" data-aria-label="{{ \'general_account_settings.reminders.weekly_active\' | translate }}"></span> </div> <p class="view-account-reminder-settings--reminder-requirement" data-ng-if="!hasFeature.USER_CAPACITY"> {{ \'general_account_settings.reminders.requires_capacity\' | translate }} </p> <div class="view-account-reminder-settings--reminder-card-body" data-ng-if="reminderSettings.weekly.active && hasFeature.USER_CAPACITY"> <p class="view-account-reminder-settings--reminder-section-label"> {{ \'general_account_settings.reminders.section_when\' | translate }} </p> <div class="view-account-reminder-settings--reminder-fields"> <div class="view-account-reminder-settings--reminder-field"> <label for="reminder-weekly-weekday"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_weekday\' | translate }}</span> </label> <select id="reminder-weekly-weekday" data-ng-model="reminderSettings.weekly.weekday" data-selectize="{\r\n                                                valueField: \'id\',\r\n                                                labelField: \'name\',\r\n                                                searchField: \'name\',\r\n                                                dropdownParent: \'body\'\r\n                                            }" data-options="reminderWeekdayOptions"> </select> </div> <div class="view-account-reminder-settings--reminder-field"> <label for="reminder-weekly-time"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_time\' | translate }}</span> </label> <select id="reminder-weekly-time" data-ng-model="reminderSettings.weekly.time" data-selectize="{\r\n                                                valueField: \'id\',\r\n                                                labelField: \'name\',\r\n                                                searchField: \'name\',\r\n                                                dropdownParent: \'body\'\r\n                                            }" data-options="submissionDeadlineTimeOptions"> </select> </div> </div> <p class="view-account-reminder-settings--reminder-section-label"> {{ \'general_account_settings.reminders.section_criteria\' | translate }} </p> <div class="view-account-reminder-settings--reminder-fields"> <div class="view-account-reminder-settings--reminder-field view-account-reminder-settings--reminder-field--target"> <label for="reminder-weekly-target"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_target\' | translate }}</span> </label> <div class="input-suffix-inside--container"> <input id="reminder-weekly-target" type="text" data-ng-mask="number" maxlength="3" data-ng-model="reminderSettings.weekly[targetFields.weekly]"> <label class="input-suffix-inside--label-suffix" for="reminder-weekly-target">{{ reminderSettings.weekly.target_type === \'hours\' ? \'h\' : \'%\' }}</label> </div> </div> <div class="view-account-reminder-settings--reminder-field view-account-reminder-settings--reminder-field--target-type"> <label for="reminder-weekly-target-type"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_target_type\' | translate }}</span> </label> <select id="reminder-weekly-target-type" data-ng-model="reminderSettings.weekly.target_type" data-selectize="{\r\n                                                valueField: \'id\',\r\n                                                labelField: \'name\',\r\n                                                searchField: \'name\',\r\n                                                dropdownParent: \'body\',\r\n                                                onChange: syncWeeklyTargetField\r\n                                            }" data-options="reminderTargetOptions"> </select> </div> <div class="view-account-reminder-settings--reminder-field"> <label for="reminder-weekly-period-reference"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_period\' | translate }}</span> </label> <select id="reminder-weekly-period-reference" data-ng-model="reminderSettings.weekly.period_reference" data-selectize="{\r\n                                                valueField: \'id\',\r\n                                                labelField: \'name\',\r\n                                                searchField: \'name\',\r\n                                                dropdownParent: \'body\'\r\n                                            }" data-options="reminderWeeklyPeriodOptions"> </select> </div> </div> </div> <div data-reminder-email-custom-message data-reminder-key="weekly" data-custom-message="reminderSettings.weekly.email_custom_message"></div> </div> <div class="settings-panel view-account-reminder-settings--reminder-card" data-ng-class="{ \'is-unavailable\': !hasFeature.USER_CAPACITY }"> <div class="view-account-reminder-settings--reminder-card-header"> <div> <h4>{{ \'general_account_settings.reminders.monthly_title\' | translate }}</h4> <p data-ng-if="reminderSettings.monthly.active && hasFeature.USER_CAPACITY"> {{ getMonthlyReminderSummary() }} </p> </div> <span data-button-toggle data-ng-model="reminderSettings.monthly.active" data-disabled="!hasFeature.USER_CAPACITY" data-title="{{ \'general_account_settings.reminders.monthly_active\' | translate }}" data-aria-label="{{ \'general_account_settings.reminders.monthly_active\' | translate }}"></span> </div> <p class="view-account-reminder-settings--reminder-requirement" data-ng-if="!hasFeature.USER_CAPACITY"> {{ \'general_account_settings.reminders.requires_capacity\' | translate }} </p> <div class="view-account-reminder-settings--reminder-card-body" data-ng-if="reminderSettings.monthly.active && hasFeature.USER_CAPACITY"> <p class="view-account-reminder-settings--reminder-section-label"> {{ \'general_account_settings.reminders.section_when\' | translate }} </p> <div class="view-account-reminder-settings--reminder-fields"> <div class="view-account-reminder-settings--reminder-field"> <label for="reminder-monthly-day"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_month_day\' | translate }}</span> </label> <select id="reminder-monthly-day" data-ng-model="reminderSettings.monthly.day_of_month" data-selectize="{\r\n                                                valueField: \'id\',\r\n                                                labelField: \'name\',\r\n                                                searchField: \'name\',\r\n                                                dropdownParent: \'body\'\r\n                                            }" data-options="reminderMonthDayOptions"> </select> </div> <div class="view-account-reminder-settings--reminder-field"> <label for="reminder-monthly-time"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_time\' | translate }}</span> </label> <select id="reminder-monthly-time" data-ng-model="reminderSettings.monthly.time" data-selectize="{\r\n                                                valueField: \'id\',\r\n                                                labelField: \'name\',\r\n                                                searchField: \'name\',\r\n                                                dropdownParent: \'body\'\r\n                                            }" data-options="submissionDeadlineTimeOptions"> </select> </div> </div> <p class="view-account-reminder-settings--reminder-section-label"> {{ \'general_account_settings.reminders.section_criteria\' | translate }} </p> <div class="view-account-reminder-settings--reminder-fields"> <div class="view-account-reminder-settings--reminder-field view-account-reminder-settings--reminder-field--target"> <label for="reminder-monthly-target"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_target\' | translate }}</span> </label> <div class="input-suffix-inside--container"> <input id="reminder-monthly-target" type="text" data-ng-mask="number" maxlength="3" data-ng-model="reminderSettings.monthly[targetFields.monthly]"> <label class="input-suffix-inside--label-suffix" for="reminder-monthly-target">{{ reminderSettings.monthly.target_type === \'hours\' ? \'h\' : \'%\' }}</label> </div> </div> <div class="view-account-reminder-settings--reminder-field view-account-reminder-settings--reminder-field--target-type"> <label for="reminder-monthly-target-type"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_target_type\' | translate }}</span> </label> <select id="reminder-monthly-target-type" data-ng-model="remin
3derSettings.monthly.target_type" data-selectize="{\r\n                                                valueField: \'id\',\r\n                                                labelField: \'name\',\r\n                                                searchField: \'name\',\r\n                                                dropdownParent: \'body\',\r\n                                                onChange: syncMonthlyTargetField\r\n                                            }" data-options="reminderTargetOptions"> </select> </div> <div class="view-account-reminder-settings--reminder-field"> <label for="reminder-monthly-period-reference"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_period\' | translate }}</span> </label> <select id="reminder-monthly-period-reference" data-ng-model="reminderSettings.monthly.period_reference" data-selectize="{\r\n                                                valueField: \'id\',\r\n                                                labelField: \'name\',\r\n                                                searchField: \'name\',\r\n                                                dropdownParent: \'body\'\r\n                                            }" data-options="reminderMonthlyPeriodOptions"> </select> </div> </div> </div> <div data-reminder-email-custom-message data-reminder-key="monthly" data-custom-message="reminderSettings.monthly.email_custom_message"></div> </div> <div class="settings-panel view-account-reminder-settings--reminder-collaborators"> <label>{{ \'general_account_settings.reminders.recipients_label\' | translate }}</label> <p class="title-description"> {{ \'general_account_settings.reminders.recipients_description\' | translate }} </p> <div data-users-teams-assignee-picker data-assignments="reminderCollaboratorAssignments" data-available="reminderCollaboratorAvailable" data-instance-id="account-reminder-collaborators" data-list-layout="chips" data-can-manage="true" data-show-search="false" data-show-bulk-actions="true" data-empty-list-label="general_account_settings.reminders.empty_recipients" data-is-loading-available="reminderCollaboratorPickerLoading.available" data-on-load-available="loadReminderCollaboratorAvailable()" data-on-add="addReminderCollaborator(assignee, schema)" data-on-remove="removeReminderCollaborator(assignee, schema)" data-on-remove-all="removeAllReminderCollaborators()"> </div> </div> </div> <div class="view-account-reminder-settings--section-actions"> <button class="button button--blue-brand" data-ng-click="saveReminders()" data-ng-disabled="isSaving.reminders"> {{ isSaving.reminders ? (\'general_account_settings.saving\' | translate) : (\'general_account_settings.reminders.save\' | translate) }} </button> </div> </div> </section> </div> </div> </div> '),$templateCache.put("views/account/account-setting-edit.html",'<div class="modal-header"> <h1>{{ \'account.settings_edit.title\' | translate }}</h1> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body"> <div class="row"> <div class="column-100"> <div> <label>{{ \'account.settings_edit.account_name\' | translate }}</label> <span class="right" style="font-size: 12px; margin-top: 7px; color: #999;">{{ \'account.settings_edit.required\' | translate }}</span> </div> <input type="text" data-ng-model="account.name" autofocus on-click-enter="save()"> </div> </div> </div> <div class="modal-footer"> <button class="button clean" data-ng-click="close()">{{ \'account.settings_edit.cancel\' | translate }}</button> <button class="button button--blue-brand" data-ng-click="save()" data-ng-disabled="!account.name || saving"> {{ saving ? (\'account.settings_edit.saving\' | translate) : (\'account.settings_edit.save\' | translate) }} </button> </div> '),$templateCache.put("views/account/account-settings.html",'<div class="view radius content-register-edit"> <div class="row" style="margin-bottom: 20px;"> <h1> <span class="icon-settings"></span> Configurações da conta</h1> </div> <div data-ng-if="$settingsService.settings.integration_time_clock_active"> <h3 style="margin-bottom: 10px;">Notificações de ponto eletrônico</h3> <div> <label style="display: inline-block; margin-bottom: 10px;"> <input type="checkbox" data-ng-model="$settingsService.settings.account_settings_notification_time_clock_diff_to_employee" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'" data-ng-change="update_option(\'account_settings_notification_time_clock_diff_to_employee\')"> Notificar os subordinados, diariamente, quando suas horas no Rabbiit forem diferentes do ponto eletrônico. (mantenha marcado para os subordinados receberem este e-mail) </label> </div> <div> <label style="display: inline-block; margin-bottom: 10px;"> <input type="checkbox" data-ng-model="$settingsService.settings.account_settings_notification_time_clock_diff_to_manager" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'" data-ng-change="update_option(\'account_settings_notification_time_clock_diff_to_manager\')"> Notificar os gestores, diariamente, quando as horas de seus subordinados forem diferente do ponto eletrônico. (mantenha marcado para os gestores receberem este e-mail) </label> </div> </div> </div>'),$templateCache.put("views/account/account.html",'<div class="view-account-resume view radiu
3s content-register-edit"> <div> <div class="view-content-account--header-container"> <h1>{{ \'account.title\' | translate }}</h1> <p class="title-description permission-note"> <span class="icon-lock_outline"></span> <span data-ng-bind-html="\'account.owner_note\' | translate"></span> </p> </div> <div class="list-minimal"> <table> <tr> <td>{{ \'account.name\' | translate }}</td> <td> <div class="view-account-resume--grid"> <span>{{$accountService.getAccountName()}}</span> <div data-ng-if="$permissionService.hasPrivilegesToEditAccountSettings()"> <a data-ng-click="$accountService.showEditAccountModal()" class="link-dashed light-blue-color">{{ \'account.change_name\' | translate }}</a> </div> </div> </td> </tr> <tr> <td>{{ \'account.id\' | translate }}</td> <td> <div>{{$subscriptionService.subscription.account.guid}}</div> </td> </tr> <tr> <td>{{ \'account.owner\' | translate }}</td> <td> <div> <span>{{$subscriptionService.subscription.account.owner.name}} </span> <span>({{$subscriptionService.subscription.account.owner.email}})</span> </div> </td> </tr> <tr> <td>{{ \'account.plan\' | translate }}</td> <td> <div class="view-account-resume--grid"> <span>{{$subscriptionService.getPlanName()}}</span> <div> <a class="link-dashed light-blue-color" data-ng-click="$subscriptionService.showUpgradeModal()"> {{ \'account.view_plans\' | translate }}</a> </div> </div> </td> </tr> <tr> <td>{{ \'account.status\' | translate }}</td> <td> <div data-ng-switch="consolidatedStatus" class="view-account-resume--consolidated-status status-{{consolidatedStatus}}"> <div data-ng-switch-when="plan_active"> <span>{{ \'subscription.status.plan_active\' | translate }}</span> </div> <div data-ng-switch-when="trial_active" class="view-account-resume--grid"> <span data-ng-bind-html="\'subscription.status.trial_active\' | translate:{days: $subscriptionService.getRemainingTrialDays()}"></span> <div> <a class="link-dashed light-blue-color" data-ng-click="$subscriptionService.showUpgradeModal()"> {{ \'account.choose_plan\' | translate }}</a> </div> </div> <div data-ng-switch-when="trial_expired" class="view-account-resume--grid"> <span>{{ \'subscription.status.trial_expired\' | translate }}</span> <div> <a class="link-dashed light-blue-color" data-ng-click="$subscriptionService.showUpgradeModal()"> {{ \'account.choose_plan\' | translate }}</a> </div> </div> <div data-ng-switch-when="scheduled_cancel" class="view-account-resume--grid"> <span>{{ \'subscription.status.scheduled_cancel\' | translate:{date: ($subscriptionService.getScheduledCancelAt() | dateLong:true)} }}</span> <div> <a class="link-dashed light-blue-color" data-ng-if="shouldShowPortalLink()" data-ng-click="openCustomerPortal()"> {{ \'account.renew\' | translate }} </a> </div> </div> <div data-ng-switch-when="cancelled" class="view-account-resume--grid"> <span>{{ \'subscription.status.cancelled\' | translate }}</span> </div> <div data-ng-switch-when="unpaid" class="view-account-resume--grid"> <span>{{ \'subscription.status.unpaid\' | translate }}</span> <div> <a class="link-dashed light-blue-color" data-ng-if="shouldShowPortalLink()" data-ng-click="openCustomerPortal()"> {{ \'account.regularize_pendencies\' | translate }} </a> </div> </div> <div data-ng-switch-when="past_due" class="view-account-resume--grid"> <span>{{ \'subscription.status.past_due\' | translate }}</span> <div> <a class="link-dashed light-blue-color" data-ng-if="shouldShowPortalLink()" data-ng-click="openCustomerPortal()"> {{ \'account.regularize_pendencies\' | translate }} </a> </div> </div> <div data-ng-switch-when="unsufficient_licenses" class="view-account-resume--grid"> <span>{{ \'subscription.status.unsufficient_licenses\' | translate }}</span> </div> <div data-ng-switch-default> <div>{{consolidatedStatus || \'—\'}}</div> </div> </div> </td> </tr> <tr> <td>{{ \'account.subscriptions\' | translate }}</td> <td class="view-account-resume--stripe-subscriptions"> <div spinner-loading="loadingSubscription" class="spinner-size-mini"></div> <div data-ng-if="!loadingSubscription"> <div data-ng-if="$subscriptionService.subscription.stripe_subscriptions.length === 0" class="view-account-resume--grid"> <div class="steel-color">{{ \'account.no_active_subscription\' | translate }}</div> <div> <a class="link-dashed green-color" data-ng-click="$subscriptionService.showU
3pgradeModal()"> {{ \'account.upgrade\' | translate }}</a> </div> </div> <div data-ng-repeat="sub in $subscriptionService.subscription.stripe_subscriptions" class="view-account-resume--grid"> <div> <span>{{sub.product_name}}</span> <span>{{ \'subscription.interval.\' + sub.interval | translate}}</span> <span class="steel-color" data-ng-if="sub.product_type === \'seats\'"> {{ \'account.licenses_label\' | translate:{count: sub.quantity_seats} }} </span> </div> <div> <a class="link-dashed light-blue-color" data-ng-if="sub.can_edit_quantity && shouldShowEditQuantity()" data-ng-click="$subscriptionService.openEditSubscriptionModal(sub)"> {{ \'account.edit_quantity\' | translate }} </a> </div> </div> </div> </td> </tr> </table> </div> <div class="view-account-resume--usage" data-ng-if="!loadingSubscription"> <div class="view-account-resume--usage-card" data-ng-if="licensesUsage.limit > 0" data-ng-class="{ \'view-account-resume--usage-card--at-limit\': licensesUsage.remaining === 0 }"> <div class="usage-limit-card__header"> <div class="usage-limit-card__label"> {{ \'account.usage.licenses_label\' | translate }} </div> <div class="usage-limit-card__remaining"> {{ \'account.usage.licenses_remaining\' | translate:{count: licensesUsage.remaining} }} </div> </div> <div class="usage-limit-card__value"> {{ licensesUsage.current }} / {{ licensesUsage.limit }} </div> <div class="usage-limit-card__progress" data-ng-if="licensesUsage.limit"> <span data-progress-bar data-progress-bar-style="usage-limit" data-progress-completed="licensesUsage.progress"> </span> </div> </div> <div class="view-account-resume--usage-card" data-ng-if="storageUsage.limit_bytes" data-ng-class="{ \'view-account-resume--usage-card--at-limit\': storageUsage.remaining_bytes === 0 }"> <div class="usage-limit-card__header"> <div class="usage-limit-card__label"> {{ \'account.usage.storage_label\' | translate }} </div> <div class="usage-limit-card__remaining"> {{ \'account.usage.storage_remaining\' | translate:{size: formatStorageBytes(storageUsage.remaining_bytes)} }} </div> </div> <div class="usage-limit-card__value"> {{ formatStorageBytes(storageUsage.current_bytes) }} / {{ formatStorageBytes(storageUsage.limit_bytes) }} </div> <div class="usage-limit-card__progress"> <span data-progress-bar data-progress-bar-style="usage-limit" data-progress-completed="storageUsage.progress"> </span> </div> <div class="usage-limit-card__meta usage-limit-card__limit-hint" data-ng-if="storageUsage.remaining_bytes === 0"> {{ \'account.usage.storage_limit_hint\' | translate }} </div> </div> </div> <ul class="view-account-resume--links"> <li> <a class="link-dashed light-blue-color" data-ng-click="$subscriptionService.showUpgradeModal()"> {{ \'account.links.plans_and_features\' | translate }}</a> </li> <li data-ng-if="shouldShowPortalLink()"> <a class="link-dashed light-blue-color" data-ng-click="openCustomerPortal()"> {{ \'account.links.manage_portal\' | translate }} </a> </li> <!--            <li data-ng-if="shouldShowEditQuantity()">--> <!--                <a class="link-dashed light-blue-color"--> <!--                   data-ng-click="$subscriptionService.openEditSubscriptionModal()">--> <!--                    Alterar quantidade de licenças--> <!--                </a>--> <!--            </li>--> <li data-ng-if="shouldShowPaymentMethodLink()"> <a class="link-dashed light-blue-color" data-ng-click="openCustomerPortal(\'payment_method_update\')"> {{ \'account.links.change_payment_method\' | translate }} </a> </li> <li data-ng-if="shouldShowCancelSubscriptionLink()"> <a class="link-dashed light-blue-color" data-ng-click="$subscriptionService.showDowngradeModal()"> {{ \'account.links.cancel_subscription\' | translate }} </a> </li> </ul> </div> <!--    <span data-ng-click="consolidatedStatus=\'plan_active\'">--> <!--        Ativo--> <!--    </span>--> <!--    <span data-ng-click="consolidatedStatus=\'trial_active\'">--> <!--        Restam X de teste grátis--> <!--    </span>--> <!--    <span data-ng-click="consolidatedStatus=\'trial_expired\'">--> <!--        Teste grátis expirado--> <!--    </span>--> <!--    <span data-ng-click="consolidatedStatus=\'scheduled_cancel\'">--> <!--        Cancelamento programado para X.--> <!--    </span>--> <!--    <span data-ng-click="consolidatedStatus=\'cancelled\'">--> <!--        Cancelado--> <!--    </span>--> <!--    <span data-ng-click="consolidatedStatus=\'unpaid\'">--> <!--        Bloqueado--> <!--    </span>--> <!--    <span data-ng-click="consolidatedStatus=\'past_due\'">--> <!--        Pagamento em atraso--> <!--    </span>--> </div> '),$templateCache.put("views/account/auth-recovery.html",'<div class="modal-header"> <h3 class="center">Seu login expirou</h3> </div> <div class="modal-body"> <div class="row" style="padding-bottom: 14px;" ng-if="error"> <div class="alert-box has-error radius" data-ng-bind="error"></div> </div> <div class="row"> <div class="column-100"> <label>Informe sua senha</label> <input type="password" placeholder="******" ng-model="form.password" autofocus="autofocus" on-click-enter="auth_recovery()"> </div> </div> </div> <div class="modal-footer" style="text-align: center; padding-bottom: 20px; padding-top: 0; border: none;"> <button ng-click="auth_recovery()" ng-disabled="loading" class="button button--blue-brand" style="width: 100%"> {{ loading ? \'Autenticando...\' : \'Autenticar\' }} </button> <div style="padding-top: 20px;"> <a href="./login" class="underline details">Sair desta conta</a> </div> </div> '),$templateCache.put("views/account/checkout-stripe.html",'<div class="view upgrade-checkout-resume-view"> <div class="modal-header"> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body"> <div class="upgrade-checkout-resume-view--checkout-container"> <div data-spinner-loading="isLoadingCheckout" data-message="Carregando formulário de pagamento ..." style="margin: 70px 0 40px;"></div> <div id="stripe-checkout"></div> </div> </div> </div> '),$templateCache.put("views/account/date-lock.html",'<div class="view radiu
3s content-register-edit date-lock-view" style="padding-bottom: 40px;"> <div class="view-content-account--header-container"> <h1>{{ \'permissions.date_lock.title\' | translate }}</h1> <p class="title-description">{{ \'permissions.date_lock.upgrade_description\' | translate }}</p> </div> <span data-flag-upgrade-required="LOCK_DATE" data-show-long-description="true" data-custom-description="{{ \'permissions.date_lock.upgrade_description\' | translate }}" style="margin-top: 10px; margin-bottom: 40px"></span> <div class="date-lock-view--content"> <div> <div class="settings-section date-lock-view--form-container"> <div> <label> {{ \'permissions.date_lock.date_allowed_label\' | translate }} </label> <select data-ng-model="lock_settings.date_allowed_in_date_lock" data-ng-disabled="!hasFeature.LOCK_DATE" data-options="optionsDateAllowedInDateLock" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'value\'\r\n                        }"> </select> </div> <div data-ng-if="lock_settings.date_allowed_in_date_lock === \'fixed-date\'"> <div> <label> {{ \'permissions.date_lock.fixed_date_label\' | translate }} </label> </div> <div data-button-date="lock_settings.date_lock_fixed_date" data-button-disabled="!hasFeature.LOCK_DATE"></div> </div> <div> <label> {{ \'permissions.date_lock.apply_to_label\' | translate }} </label> <select data-ng-model="lock_settings.to_whom_date_lock_applies" data-ng-disabled="!hasFeature.LOCK_DATE" data-options="optionsToWhomDateLockApplies" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'value\'\r\n                        }"> </select> </div> <div> <label> {{ \'permissions.date_lock.future_date_label\' | translate }} </label> <select data-ng-model="lock_settings.who_can_save_future_date" data-ng-disabled="!hasFeature.LOCK_DATE" data-options="optionsWhoCanSaveFutureDate" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'value\'\r\n                        }"> </select> </div> <div> <button class="button button--blue-brand" data-ng-click="save()" data-ng-disabled="lock_settings_saving || !hasFeature.LOCK_DATE"> {{lock_settings_saving ? (\'permissions.saving\' | translate) : (\'permissions.save\' | translate)}} </button> <span style="margin-left: 15px;" saved-signal="lock_settings"></span> </div> </div> </div> <div data-ng-if="showDateLockPreview()"> <div class="settings-section date-lock-view--preview"> <label>{{ \'permissions.date_lock.preview_title\' | translate }}</label> <div class="date-lock-view--preview-description"> {{ \'permissions.date_lock.preview_description\' | translate }} </div> <div class="date-lock-view--preview-role"> <label> {{ \'permissions.date_lock.preview_as_label\' | translate }} </label> <select data-ng-model="dateLockPreviewAsRole" data-ng-disabled="!hasFeature.LOCK_DATE" data-options="optionsDateLockPreviewAsRole" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'value\'\r\n                        }"> </select> </div> <div class="date-lock-view--preview-datepicker-wrap rabbiit-datepicker"> <div datepicker ng-model="dateLockPreviewDateObject" show-weeks="false" max-mode="day" min-mode="day" min-date="dateLockPreviewMin" max-date="dateLockPreviewMax" on-datepicker-view-change="onDateLockPreviewViewChange(activeDate, startingDay)" datepicker-view-change-debounce="500" datepicker-refresh-when="dateLockPreviewRevision" date-disabled="isDateLockPreviewDisabled({ date: date, mode: mode })"> </div> </div> <p class="date-lock-view--preview-anytime-hint" data-ng-if="isDateLockPreviewAnytime()"> {{ \'permissions.date_lock.preview_anytime_hint\' | translate }} </p> <p class="date-lock-view--preview-legend"> {{ \'permissions.date_lock.preview_legend_blocked\' | translate }} </p> </div> </div> </div> </div> '),
4$templateCache.put("views/account/feature-ads-modal.html",'<div class="modal-body view-feature-ads-modal"> <a class="icon-cross" data-ng-click="close()"></a> <!--    <div>--> <div data-feature-ads="{{featureName}}" callback="close()"></div>
4 <!--        <span class="view-upgrade-required&#45;&#45;tag">Lançamento</span>--> <!--        <h1>{{context.title}}</h1>--> <!--        <ul class="element-todo-checkbox">--> <!--            <li data-ng-repeat="feature in context.features">--> <!--                <span class="icon-check"></span>--> <!--                <span>{{feature}}</span>--> <!--            </li>--> <!--        </ul>--> <!--        <div data-if-has-feature="{{featureName}}">--> <!--            <a class="button button&#45;&#45;blue-brand" app-href="buttonHasFeature.redirectTo">--> <!--&lt;!&ndash;                Acesse sua lista de atividades&ndash;&gt;--> <!--                {{buttonHasFeature.label}}--> <!--            </a>--> <!--            <span class="view-upgrade-required&#45;&#45;has-feature">--> <!--                Incluso no seu plano {{currentPlanName}}--> <!--            </span>--> <!--        </div>--> <!--        <div data-if-has-not-feature="{{featureName}}">--> <!--            <a class="button button&#45;&#45;blue-brand"--> <!--               data-if-has-permission="admin"--> <!--               data-ng-click="upgrade()">--> <!--                Faça upgrade do seu plano--> <!--            </a>--> <!--            <span data-if-has-not-permission="admin"--> <!--                  class="view-upgrade-required&#45;&#45;request-to-admin">--> <!--                Quer desbloquear essa funcionalidade?<br>--> <!--                Solicite ao administrador da conta para fazer upgrade de plano.--> <!--            </span>--> <!--        </div>--> <!--        <img src="./assets/img/features/{{context.img}}">--> <!--    </div>--> </div> '),$templateCache.put("views/account/general-account-settings.html",'<div class="view radius content-register-edit view-general-account-settings"> <div class="view-content-account--header-container"> <h1> <span>{{ \'general_account_settings.title\' | translate }}</span> </h1> <p class="title-description permission-note"> <span class="icon-lock_outline"></span> <span>{{ \'general_account_settings.admin_note\' | translate }}</span> </p> </div> <div class="row" style="margin-top: 30px"> <div class="column-100"> <!-- Relatórios --> <section class="settings-section"> <span data-flag-upgrade-required="CUSTOM_REPORTS" data-show-long-description="true" data-custom-description="{{ \'general_account_settings.reports.upgrade_description\' | translate }}" style="margin-top: 0"></span> <h3>{{ \'general_account_settings.reports.title\' | translate }}</h3> <div style="margin-top: 30px;"> <div> <label>{{ \'general_account_settings.reports.logo_label\' | translate }}</label> </div> <div class="view-report-settings--logo-edit"> <div class="view-report-settings--logo-edit-row"> <div class="view-report-settings--logo-page-preview-wrap"> <div data-ng-if="reportLogoPage.logoLoading" class="view-report-settings--logo-page-loading"> {{ \'general_account_settings.reports.logo_preview_loading\' | translate }} </div> <div data-ng-if="!reportLogoPage.logoLoading"> <div data-ng-if="!reportLogoPage.logoUrl"> <p data-ng-if="reportLogoPage.hasLogo" class="view-report-settings--logo-page-unavailable"> {{ \'general_account_settings.reports.logo_preview_unavailable\' | translate }} </p> <div data-ng-if="!reportLogoPage.hasLogo" class="view-report-settings--logo-page-empty" data-disabled-required-feature="\'CUSTOM_REPORTS\'" role="button" tabindex="0" data-ng-click="openReportLogoModal()" data-ng-keydown="onReportLogoEmptyKeydown($event)"> {{ \'general_account_settings.reports.logo_modal_empty\' | translate }} </div> </div> <img data-ng-if="reportLogoPage.logoUrl" data-ng-src="{{ reportLogoPage.logoUrl }}" alt="{{ \'general_account_settings.reports.logo_label\' | translate }}"> </div> </div> <button type="button" data-disabled-required-feature="\'CUSTOM_REPORTS\'" class="button clean view-report-settings--logo-edit-button" data-ng-click="openReportLogoModal()"> {{ \'general_account_settings.reports.logo_edit_button\' | translate }} </button> </div> </div> </div> <div style="margin-top: 30px;"> <label>{{ \'general_account_settings.reports.header_label\' | translate }}</label>
4 <textarea class="view-report-settings--field-business-details" data-ng-model="$settingsService.settings.print_report_settings_business_details" data-disabled-required-feature="\'CUSTOM_REPORTS\'" placeholder="{{ \'general_account_settings.reports.header_placeholder\' | translate }}">\r\n                    </textarea> </div> <div class="view-general-account-settings--section-actions" data-if-has-feature="CUSTOM_REPORTS"> <button class="button button--blue-brand" data-ng-click="saveReport()" data-ng-disabled="isSaving.report"> {{isSaving.report ? (\'general_account_settings.saving\' | translate) : (\'general_account_settings.reports.save\' | translate)}} </button> </div> </section> <!-- Moeda e fuso horário --> <section class="settings-section"> <h3>{{ \'general_account_settings.currency.title\' | translate }}</h3> <p class="title-description">{{ \'general_account_settings.currency.description\' | translate }}</p> <div style="max-width: 500px"> <div class="row"> <div class="column-50"> <label>{{ \'general_account_settings.currency.label\' | translate }}</label> <select data-ng-model="$settingsService.settings.general_settings_currency" data-selectize="{\r\n                                        valueField: \'id\',\r\n                                        labelField: \'name\',\r\n                                        searchField: \'name\',\r\n                                        dropdownParent: \'body\',\r\n                                        onChange: onChangeCurrency\r\n                                    }" data-options="currencies"> </select> </div> <div class="column-50"> <label>{{ \'general_account_settings.currency.display_format\' | translate }}</label> <select data-ng-model="$settingsService.settings.general_settings_currency_display_format" data-selectize="{\r\n                                        valueField: \'id\',\r\n                                        labelField: \'name\',\r\n                                        searchField: \'name\',\r\n                                        dropdownParent: \'body\'\r\n                                    }" data-options="currencyDisplayFormats"> </select> </div> </div> <div class="row"> <!--                        <div class="column-50">--> <label>{{ \'general_account_settings.timezone.label\' | translate }}</label> <select data-ng-model="$settingsService.settings.general_settings_timezone" data-selectize="{\r\n                                        valueField: \'id\',\r\n                                        labelField: \'name\',\r\n                                        searchField: [\'name\', \'id\'],\r\n                                        dropdownParent: \'body\'\r\n                                    }" data-options="timezones"> </select> <!--                        </div>--> <!--                        <div class="column-50"></div>--> </div> </div> <div class="view-general-account-settings--section-actions"> <button class="button button--blue-brand" data-ng-click="saveGeneral()" data-ng-disabled="isSaving.general"> <i class="icon-save"></i> {{isSaving.general ? (\'general_account_settings.saving\' | translate) : (\'general_account_settings.currency.save\' | translate)}} </button> </div> </section> <!-- Projetos --> <section class="settings-section"> <span data-flag-upgrade-required="PROJECT_GLOBAL_SETTINGS" data-show-long-description="true" data-custom-description="{{ \'general_account_settings.projects.upgrade_description\' | translate }}" style="margin-top: 5px"></span> <h3>{{ \'general_account_settings.projects.title\' | translate }}</h3> <p class="title-description"> {{ \'general_account_settings.projects.description\' | translate }} </p> <div class="element-todo-checkbox"> <label data-ng-disabled="!hasFeature.PROJECT_GLOBAL_SETTINGS"> <input type="checkbox" data-ng-check data-ng-model="$settingsService.settings.project_settings_required_task" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'" data-disabled-required-feature="\'PROJECT_GLOBAL_SETTINGS\'"> {{ \'general_account_settings.projects.required_task\' | translate }} </label> </div> <div class="view-general-account-settings--section-actions" data-if-has-feature="PROJECT_GLOBAL_SETTINGS"> <button class="button button--blue-brand" data-ng-click="saveProject()" data-ng-disabled="isSaving.project"> {{isSaving.project ? (\'general_account_settings.saving\' | translate) : (\'general_account_settings.projects.save\' | translate)}} </button> </div> </section> <!-- Atividades --> <section class="settings-section"> <span data-flag-upgrade-required="PROJECT_GLOBAL_SETTINGS" data-show-long-description="true" data-custom-description="{{ \'general_account_settings.activities.upgrade_description\' | translate }}" style="margin-top: 5px"></span> <h3>{{ \'general_account_settings.activities.title\' | translate }}</h3> <p class="title-description"> {{ \'general_account_settings.activities.description\' | translate }} </p> <div data-if-has-feature="PROJECT_GLOBAL_SETTINGS"> <div data-todo-project-permissions-form data-permissions="accountTodoPermissions" data-can-edit="hasFeature.PROJECT_GLOBAL_SETTINGS" data-show-intro="false"></div> </div> <div class="view-general-account-settings--section-actions" data-if-has-feature="PROJECT_GLOBAL_SETTINGS"> <button class="button button--blue-brand" data-ng-click="saveActivities()" data-ng-disabled="isSaving.activities"> {{isSaving.activities ? (\'general_account_settings.saving\' | translate) : (\'general_account_settings.activities.save\' | translate)}} </button> </div> </section> <!-- Capacidade --> <section class="settings-section"> <span data-flag-upgrade-required="USER_CAPACITY" data-show-long-description="true" data-custom-description="{{ \'general_account_settings.capacity.upgrade_description\' | translate }}" style="margin-top: 5px"></span> <h3>{{ \'general_account_settings.capacity.title\' | translate }}</h3> <p class="title-description"> {{ \'general_account_settings.capacity.description\' | translate }} </p> <div class="row view-report-settings--work-days-content element-todo-checkbox"> <div class="column-100"> <label>{{ \'general_account_settings.capacity.work_days\' | translate }}</label> <div> <label><input type="checkbox" data-ng-check data-ng-model="checkbox_work_days[1]" data-disabled-required-feature="\'USER_CAPACITY\'"> <span>{{ \'general_account_settings.capacity.days.mon\' | translate }}</span></label> <label><input type="checkbox" data-ng-check data-ng-model="checkbox_work_days[2]" data-disabled-required-feature="\'USER_CAPACITY\'"> <span>{{ \'general_account_settings.capacity.days.tue\' | translate }}</span></label> <label><input type="checkbox" data-ng-check data-ng-model="checkbox_work_days[3]" data-disabled-required-feature="\'USER_CAPACITY\'"> <span>{{ \'general_account_settings.capacity.days.wed\' | translate }}</span></label> <label><input type="checkbox" data-ng-check data-ng-model="checkbox_work_days[4]" data-disabled-required-feature="\'USER_CAPACITY\'"> <span>{{ \'general_account_settings.capacity.days.thu\' | translate }}</span></label> <label><input type="checkbox" data-ng-check data-ng-model="checkbox_work_days[5]" data-disabled-required-feature="\'USER_CAPACITY\'"> <span>{{ \'general_account_settings.capacity.days.fri\' | translate }}</span></label> <label><input type="checkbox" data-ng-check data-ng-model="checkbox_work_days[6]" data-disabled-required-feature="\'USER_CAPACITY\'"><span class="weekend">{{ \'general_account_settings.capacity.days.sat\' | translate }}</span></label> <label><input type="checkbox" data-ng-check data-ng-model="checkbox_work_days[0]" data-disabled-required-feature="\'USER_CAPACITY\'"><span class="weekend">{{ \'general_account_settings.capacity.days.sun\' | translate }}</span></label> </div> </div> </div> <div class="row"> <div class="column-50"> <label>{{ \'general_account_settings.capacity.per_day\' | translate }}</label> <div class="input-suffix-inside--container"> <input type="text" id="capacity_per_day" data-ng-mask="numberFormatted" data-ng-model="form.capacity_per_day_formatted" maxlength="5" data-disabled-required-feature="\'USER_CAPACITY\'" placeholder="0" class="center"> <label class="input-suffix-inside--label-suffix" for="capacity_per_day"> {{ \'general_account_settings.capacity.hours_per_day\' | translate }}</label> </div> </div> <div class="column-50"> <label>{{ \'general_account_settings.capacity.calendar_label\' | translate }}</label> <select data-ng-model="$settingsService.settings.capacity_settings_calendar_id" data-options-load="loadCalendars" data-ng-disabled="!hasFeature.USER_CAPACITY" data-selectize="{\r\n                                        labelField: \'name\',\r\n                                        valueField: \'id\',\r\n                                        sortField: \'name\',\r\n                                        searchField: \'name\',\r\n                                        dropdownParent: \'body\',\r\n                                        placeholder: (\'general_account_settings.capacity.calendar_placeholder\' | translate)\r\n                        }"></select> </div> </div> <div class="view-general-account-settings--section-actions" data-if-has-feature="USER_CAPACITY"> <button class="button button--blue-brand" data-ng-click="saveCapacity()" data-ng-disabled="isSaving.capacity"> {{isSaving.capacity ? (\'general_account_settings.saving\' | translate) : (\'general_account_settings.capacity.save\' | translate)}} </button> </div> </section> <!-- Financeiro --> <section class="settings-section"> <span data-flag-upgrade-required="USER_COST" data-show-long-description="true" data-custom-description="{{ \'general_account_settings.financial.upgrade_description\' | translate }}" style="margin-top: 5px"></span> <h3>{{ \'general_account_settings.financial.title\' | translate }}</h3> <p class="title-description"> {{ \'general_account_settings.financial.description\' | translate }} </p> <div class="row"> <div class="column-50"> <label>{{ \'general_account_settings.financial.tax_percent\' | translate }}</label> <div class="input-suffix-inside--container"> <input type="text" id="tax_rate" data-ng-mask="money" data-ng-model="tax.rate_formatted" data-disabled-required-feature="\'USER_COST\'" placeholder="{{0|moneyOnlyAmount}}" class="center"> <label class="input-suffix-inside--label-suffix" for="tax_rate">%</label> </div> </div> </div> <div style="margin-top: 20px; max-width: 500px;"> <div data-historical-rate-save-form data-type="tax" data-model="tax" data-append-to-body="false"> </div> <div data-ng-if="tax.start_at" data-historical-rate-list="{ type: \'tax\' }" data-model="tax" data-dropdown-append-to-body="false"> </div> </div> <div class="view-general-account-settings--section-actions" data-if-has-feature="HISTORICAL_RATES"> <button class="button button--blue-brand" data-ng-click="saveTax()" data-ng-disabled="isSaving.tax"> {{isSaving.tax ? (\'general_account_settings.saving\' | translate) : (\'general_account_settings.financial.save\' | translate)}} </button> </div> </section> <!-- Módulos --> <section class="settings-section" style="display: none"> <h3>{{ \'general_account_settings.modules.title\' | translate }}</h3> <p class="title-description">{{ \'general_account_settings.modules.description\' | translate }}</p> <div class="element-todo-checkbox"> <label data-ng-disabled="!$subscriptionService.hasFeatureAccess(\'TIMESHEET_AUTOMATION\')"> <input type="checkbox" data-ng-model="$settingsService.settings.module_timesheet_automation_active" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'" data-disabled-required-feature="\'TIMESHEET_AUTOMATION\'"> {{ \'general_account_settings.modules.timesheet_automation\' | translate }} </label> </div> <div class="element-todo-checkbox"> <label data-ng-disabled="!$subscriptionService.hasFeatureAccess(\'TIMESHEET_AUTOMATION\')"> <input type="checkbox" data-ng-model="$settingsService.settings.integration_time_clock_active" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'" data-disabled-required-feature="\'TIMESHEET_AUTOMATION\'"> {{ \'general_account_settings.modules.timeclock_temporary\' | translate }} </label> </div> <div class="view-general-account-settings--section-actions"> <button class="button button--blue-brand" data-ng-click="saveModules()" data-ng-disabled="isSaving.modules"> {{isSaving.modules ? (\'general_account_settings.saving\' | translate) : (\'general_account_settings.modules.save\' | translate)}} </button> </div> </section> </div> </div> </div> '),$templateCache.put("views/account/my-permissions.html",'<div class="view radiu
4s content-register-edit view-profile-settings view-my-permissions"> <div class="view-content-account--header-container"> <h1>{{ \'my_permissions.title\' | translate }}</h1> <p class="title-description description-pos-title"> {{ \'my_permissions.description\' | translate }} </p> </div> <div data-spinner-loading="isLoading" style="margin-top: 60px; margin-bottom: 60px" data-message="{{ \'my_permissions.loading\' | translate }}"></div> <div data-ng-if="!isLoading"> <section class="view-profile-settings--settings-section view-profile-settings--permission-section"> <div class="view-profile-settings--permission-section__header"> <h3>{{ \'my_permissions.role_title\' | translate }}</h3> <span class="view-general-account-settings--role-name" data-ng-if="myRole"> {{ myRole.name }} <span data-ng-if="isOwner">{{ \'profile.owner_label\' | translate }}</span> </span> </div> <div class="view-my-permissions--role-details" data-ng-if="myRole"> <p> <b>{{ myRole.name }}</b> <span data-ng-if="myRole.description"> — {{ myRole.description }}</span> </p> <div data-ng-if="myRole.keypoints && myRole.keypoints.length"> <b data-ng-switch="myRole.id"> <span data-ng-switch-when="super">{{ \'users.permissions.super_default_can\' | translate }}</span> <span data-ng-switch-default>{{ \'users.permissions.role_can\' | translate:{role: myRole.name} }}</span> </b> <ul class="view-my-permissions--check-list"> <li data-ng-repeat="point in myRole.keypoints track by $index"> <span class="icon-check"></span> <span>{{ point }}</span> </li> </ul> </div> <div data-ng-if="myRole.exclusive && myRole.exclusive.length"> <b>{{ \'users.permissions.only_role_can\' | translate:{role: myRole.name} }}</b> <ul class="view-my-permissions--check-list"> <li data-ng-repeat="point in myRole.exclusive track by $index"> <span class="icon-check"></span> <span>{{ point }}</span> </li> </ul> </div> <div data-ng-if="isOwner"> <b>{{ \'users.permissions.only_owner_can\' | translate }}</b> <ul class="view-my-permissions--check-list"> <li> <span class="icon-check"></span> <span>{{ \'users.permissions.manage_subscription\' | translate }}</span> </li> <li> <span class="icon-check"></span> <span>{{ \'users.permissions.delete_account\' | translate }}</span> </li> </ul> </div> <div data-ng-if="isSuper && grantedExtraPermissionGroups.length"> <b>{{ \'my_permissions.additional_permissions\' | translate }}</b> <div class="view-my-permissions--additional-permissions"> <div data-ng-repeat="group in grantedExtraPermissionGroups"> <p>{{ group.name }}</p> <ul> <li data-ng-repeat="permission in group.permissions"> <span class="icon-check"></span> <span>{{ permission.label }}</span> </li> </ul> </div> </div> </div> <p class="steel-color" data-ng-if="isSuper && !grantedExtraPermissionGroups.length"> {{ \'my_permissions.additional_permissions_empty\' | translate }} </p> </div> </section> <section class="view-profile-settings--settings-section view-my-permissions--section"> <h3>{{ \'my_permissions.manager_title\' | translate }}</h3> <p class="view-my-permissions--section-body" data-ng-if="manager"> {{ manager.name }} </p> <p class="view-my-permissions--section-body steel-color" data-ng-if="!manager"> {{ \'my_permissions.manager_none\' | translate }} </p> </section> <section class="view-profile-settings--settings-section view-my-permissions--section" data-ng-if="isSuper"> <h3>{{ \'my_permissions.assignments_title\' | translate }}</h3> <div class="view-my-permissions--subsection"> <h4>{{ \'my_permissions.assigned_teams\' | translate }}</h4> <ul class="view-my-permissions--name-list" data-ng-if="assignments.teams.length"> <li data-ng-repeat="team in assignments.teams | orderBy:\'name\'"> {{ team.name }} </li> </ul> <p class="steel-color" data-ng-if="!assignments.teams.length"> {{ \'my_permissions.assigned_teams_empty\' | translate }} </p> </div> <div class="view-my-permissions--subsection"> <h4>{{ \'my_permissions.assigned_users\' | translate }}</h4> <ul class="view-my-permissions--name-list" data-ng-if="assignments.users.length"> <li data-ng-repeat="user in assignments.users | orderBy:\'name\'"> {{ user.name }} </li> </ul> <p class="steel-color" data-ng-if="!assignments.users.length"> {{ \'my_permissions.assigned_users_empty\' | translate }} </p> </div> </section> <section class="view-profile-settings--settings-section view-my-permissions--section" data-ng-if="isSuper"> <h3>{{ \'my_permissions.managed_projects_title\' | translate }}</h3> <ul class="view-my-permissions--name-list" data-ng-if="managedProjects.length"> <li data-ng-repeat="project in managedProjects | orderBy:\'name\'"> {{ project.name }} </li> </ul> <p class="steel-color" data-ng-if="!managedProjects.length"> {{ \'my_permissions.managed_projects_empty\' | translate }} </p> </section> </div> </div> '),$templateCache.put("views/account/permissions.html",'<style> .permissions-view h1 {\r\n        margin-bottom: 5px;\r\n    }\r\n\r\n    .permissions-view p {\r\n        line-height: 1.5em;\r\n        font-size: 16px;\r\n        margin-bottom: 15px;\r\n        margin-top: 15px;\r\n        color: #6e6e6e;
4\r\n        color: var(--font-color-1-details);\r\n    }\r\n\r\n    .permissions-view h1 > [class^="icon-"] {\r\n        position: relative;\r\n        top: 2px;\r\n        margin-right: 5px;\r\n    }\r\n\r\n    .permissions-view h1 + p.title-description {\r\n        margin-bottom: 20px;\r\n        line-height: 1.5em;\r\n    }\r\n\r\n    .permissions-view hr {\r\n        margin-bottom: 25px;\r\n        margin-top: 25px;\r\n    }\r\n\r\n    .permissions-view h3 {\r\n        margin-bottom: 0px;\r\n        font-size: 18px;\r\n        /*color: #5a5a5a;*/\r\n    }\r\n\r\n    .permissions-view h3 + p {\r\n        line-height: 1.5em;\r\n        font-size: 14px;\r\n        margin-bottom: 20px;\r\n        margin-top: 5px;\r\n    }\r\n\r\n    .permissions-view label {\r\n        display: inline-block;\r\n        font-weight: bolder;\r\n        /*color: #4a4a4a;*/\r\n        font-size: 14px !important;\r\n    }\r\n\r\n    .permissions-view label > input[type="checkbox"] {\r\n        position: relative;\r\n        top: 1px;\r\n        margin-right: 3px;\r\n    }\r\n\r\n    .permissions-view .selectize-dropdown,\r\n    .permissions-view .selectize-input,\r\n    .permissions-view .selectize-input input {\r\n        font-size: 15px;\r\n    }\r\n\r\n    .permissions-view .selectize-control {\r\n        margin-bottom: 20px;\r\n    }\r\n\r\n    .list p.title { margin: 10px 0px 5px; display: inline-block; }\r\n    .options-list { margin: 5px 0 0px; }\r\n    .options-list .flag { margin-bottom: 8px; margin-right: 8px; background-color: #fff; border: solid 1px #ddd; color: #333; font-size: 14px; }\r\n    .options-list .icon-close { font-size: 10px; color: #aaa; margin-left: 2px; }\r\n    .add-members { margin-bottom: 10px; margin-top: 5px; }\r\n\r\n    .permissions-view .saved-signal {\r\n        display: inline;\r\n    }\r\n    .permissions-view .saved-signal span:last-child {\r\n        font-style: normal;\r\n        font-size: 14px;\r\n        padding-left: 3px;\r\n    }\r\n    .permissions-view .saved-signal span:first-child:before {\r\n        font-size: 19px;\r\n        position: relative;\r\n        top: 2px;\r\n    } </style> <div class="view radius content-register-edit permissions-view" style="padding-bottom: 40px;"> <h1 data-training="permissions-title"> <span>{{ \'permissions.title\' | translate }}</span> <!--        <span class="flag yellow-color"--> <!--              style="font-size: 16px; margin-left: 10px; position: relative; top: -3px;"--> <!--              if-has-not-feature="ROLE_PERMISSIONS"--> <!--        >UPGRADE</span>--> </h1> <!--    <div class="explanation premium radius"--> <!--         style="margin-top: 0; margin-bottom: 40px;"--> <!--         data-if-has-not-feature="ROLE_PERMISSIONS">--> <!--        <div>--> <!--            <strong>Configuração de permissões de usuários não está disponível no seu plano.</strong>--> <!--        </div>--> <!--        <div>--> <!--            <a class="link underline" app-href="#/upgrade">Faça upgrade do seu plano aqui</a> para liberar este recurso.--> <!--        </div>--> <!--    </div>--> <div> <span data-flag-upgrade-required="ROLE_PERMISSIONS" data-show-long-description="true" data-custom-description="{{ \'permissions.upgrade_description\' | translate }}" style="margin-bottom: 5px"></span> </div> <div class="explanation premium radius" style="margin-top: 20px; margin-bottom: 10px;"> <span> {{ \'permissions.moved_notice\' | translate }}<br> <a app-href="#/users" class="link underline" data-training="permissions-users-link">{{ \'permissions.moved_link\' | translate }}</a> </span> </div> <!--    <div style="max-width: 90%; margin-top: 25px">--> <!--        <h3>{{ \'permissions.general_system_resources\' | translate }}</h3>--> <!--        <p class="title-description">{{ \'permissions.general_system_resources_description\' | translate }}</p>--> <!--        <div style="margin-bottom: 30px;">--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_create_projects\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-options="permissionOptions.admin_super_regular"--> <!--                        data-ng-model="general_settings.who_can_create_projects"--> <!--                        data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_edit_tasks\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-options="permissionOptions.admin_super_regular"--> <!--                        data-ng-model="general_settings.who_can_edit_tasks"--> <!--                        data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_edit_users\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-options="permissionOptions.admin_super_regular"--> <!--                        data-ng-model="general_settings.who_can_edit_users"--> <!--                        data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_edit_customers\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-options="permissionOptions.admin_super_regular"--> <!--                        data-ng-model="general_settings.who_can_edit_customers"--> <!--                        data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_edit_contractors\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-options="permissionOptions.admin_super_regular"--> <!--                        data-ng-model="general_settings.who_can_edit_contractors"--> <!--                        data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_edit_project_contractor\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-options="permissionOptions.admin_super_regular"--> <!--                        data-ng-model="general_settings.who_can_edit_project_contractor"--> <!--                        data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_edit_other_users_entries\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-options="permissionOptions.admin_super_manager"--> <!--                        data-ng-model="general_settings.who_can_edit_other_users_entries"--> <!--                        data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_edit_custom_fields\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-options="permissionOptions.only_admin"--> <!--                        data-ng-model="general_settings.who_can_edit_custom_fields"--> <!--                        data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div style="margin-top: 30px;">--> <!--                <button class="button button--blue-brand"--> <!--                        data-ng-click="save(\'general_settings\')"--> <!--                        data-ng-disabled="general_settings_saving || !hasFeature.ROLE_PERMISSIONS">--> <!--                    {{general_settings_saving ? (\'permissions.saving\' | translate) : (\'permissions.save\' | translate)}}--> <!--                </button>-->
4 <!--                <span style="margin-left: 15px;" saved-signal="general_settings"></span>--> <!--            </div>--> <!--        </div>--> <!--        <hr>--> <!--        <div>--> <!--            <h3>{{ \'permissions.billing_and_costs_title\' | translate }}</h3>--> <!--            <p>{{ \'permissions.billing_and_costs_description\' | translate }}</p>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_view_charge_rate\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-options="permissionOptions.admin_super_regular"--> <!--                        data-ng-model="charge_settings.who_can_view_charge_rate"--> <!--                        data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_edit_charge_rate\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-options="permissionOptions.admin_super_regular"--> <!--                        data-ng-model="charge_settings.who_can_edit_charge_rate"--> <!--                        data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_mark_as_invoiced\' | translate }}</label>--> <!--                <select--> <!--                    data-selectize--> <!--                    data-options="permissionOptions.admin_super_regular"--> <!--                    data-ng-model="charge_settings.who_can_mark_as_invoiced"--> <!--                    data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.who_can_edit_user_cost\' | translate }}</label>--> <!--                <select--> <!--                    data-selectize--> <!--                    data-options="permissionOptions.admin_super_regular"--> <!--                    data-ng-model="charge_settings.who_can_edit_user_cost"--> <!--                    data-ng-disabled="!hasFeature.ROLE_PERMISSIONS">--> <!--                </select>--> <!--            </div>--> <!--            <div style="margin-top: 30px;">--> <!--                <button class="button button--blue-brand"--> <!--                        data-ng-click="save(\'charge_settings\')"--> <!--                        data-ng-disabled="charge_settings_saving || !hasFeature.ROLE_PERMISSIONS">--> <!--                    {{charge_settings_saving ? (\'permissions.saving\' | translate) : (\'permissions.save\' | translate)}}--> <!--                </button>--> <!--                <span style="margin-left: 15px;" saved-signal="charge_settings"></span>--> <!--            </div>--> <!--            <hr>--> <!--        </div>--> <!--        <div>--> <!--            <span data-flag-upgrade-required="LOCK_DATE"--> <!--                  data-show-long-description="true"--> <!--                  data-custom-description="{{ \'permissions.date_lock.upgrade_description\' | translate }}"--> <!--                  style="margin-top: 10px; margin-bottom: 40px"></span>--> <!--            <h3>{{ \'permissions.date_lock.title\' | translate }}</h3>--> <!--            <div class="explanation premium radius"--> <!--                 style="margin-top: 20px; margin-bottom: 10px;">--> <!--                <span>--> <!--                    {{ \'permissions.date_lock.moved_notice\' | translate }}<br>--> <!--                    <a app-href="#/date-lock" class="link underline">{{ \'permissions.date_lock.moved_link\' | translate }}</a>--> <!--                </span>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.date_lock.date_allowed_label\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-ng-model="lock_settings.date_allowed_in_date_lock"--> <!--                        data-ng-disabled="!hasFeature.LOCK_DATE">--> <!--                </select>--> <!--            </div>--> <!--            <div data-ng-if="lock_settings.date_allowed_in_date_lock === \'fixed-date\'">--> <!--                <div>--> <!--                    <label>{{ \'permissions.date_lock.fixed_date_label\' | translate }}</label>--> <!--                </div>--> <!--                <button title="{{ \'permissions.date_lock.fixed_date_label\' | translate }}"--> <!--                        data-dropdown="dropdown-date-lock-fixed-date"--> <!--                        class="button clean"--> <!--                        data-ng-class="{\'has-error\' : errors.date_lock_fixed_date}"--> <!--                        tooltip="{{errors.date_lock_fixed_date}}"--> <!--                        tooltip-enable="errors.date_lock_fixed_date"--> <!--                        tooltip-class="tooltip-alert"--> <!--                        style="margin-bottom: 2px;">-->
4 <!--                    <span  class="icon-calendar4" style="color: #bbb"></span>--> <!--                    <span>--> <!--                        {{ lock_settings.date_lock_fixed_date_object ? (lock_settings.date_lock_fixed_date_object | dateLong) : (\'permissions.date_lock.fixed_date_placeholder\' | translate) }}--> <!--                    </span>--> <!--                </button>--> <!--                <div id="dropdown-date-lock-fixed-date" data-dropdown-content class="f-dropdown content">--> <!--                    <div datepicker--> <!--                         ng-model="lock_settings.date_lock_fixed_date_object"--> <!--                         show-weeks="false"--> <!--                         max-mode="day"--> <!--                         min-mode="day">--> <!--                    </div>--> <!--                </div>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.date_lock.apply_to_label\' | translate }}</label>--> <!--                <select data-selectize--> <!--                        data-ng-model="lock_settings.to_whom_date_lock_applies"--> <!--                        data-ng-disabled="!hasFeature.LOCK_DATE">--> <!--                </select>--> <!--            </div>--> <!--            <div>--> <!--                <label>{{ \'permissions.date_lock.future_date_label\' | translate }}</label>--> <!--                <select--> <!--                        data-selectize--> <!--                        data-ng-model="lock_settings.who_can_save_future_date"--> <!--                        data-ng-disabled="!hasFeature.LOCK_DATE">--> <!--                </select>--> <!--            </div>--> <!--            <div style="margin-top: 30px;">--> <!--                <button class="button button--blue-brand"--> <!--                        data-ng-click="save(\'lock_settings\')"--> <!--                        data-ng-disabled="lock_settings_saving || !hasFeature.LOCK_DATE">--> <!--                    {{lock_settings_saving ? (\'permissions.saving\' | translate) : (\'permissions.save\' | translate)}}--> <!--                </button>--> <!--                <span style="margin-left: 15px;" saved-signal="lock_settings"></span>--> <!--            </div>--> <!--        </div>--> <!--    </div>--> </div> '),
5$templateCache.put("views/account/profile.html",'<div class="view radius content-register-edit view-profile-settings"> <div class="view-profile-settings--header"> <div class="view-content-account--header-container"> <h1>{{ \'profile.title\' | translate }}</h1> </div> <div class="view-profile-settings--identity"> <div class="view-profile-settings--profile-photo-edit"> <div class="view-profile-settings--profile-photo-preview-wrap"> <div data-spinner-loading="profilePhotoPage.photoLoading" class="spinner-size-mini view-profile-settings--profile-photo-spinner"></div> <div data-ng-if="!profilePhotoPage.photoLoading" data-user-avatar data-name="{{ $profileService.getUserName() }}" data-photo-url="profilePhotoPage.photoUrl" data-size="lg"> </div> </div> </div> <div class="view-profile-settings--identity-info"> <div class="view-profile-settings--greeting"> {{ \'profile.greeting\' | translate:{name: ($profileService.getUserName()|firstname)} }} </div> <div class="view-profile-settings--email">{{ $profileService.getEmail() }}</div> <div class="view-profile-settings--identity-actions"> <button type="button" class="button clean" data-ng-click="openProfilePhotoModal()"> <span class="icon-camera"></span> {{ \'profile.profile_photo_edit_button\' | translate }} </button> <button type="button" class="button clean" data-ng-click="change_password()"> <span class="icon-key3"></span> {{ \'profile.change_password\' | translate }} </button> </div> </div> </div> </div> <section class="view-profile-settings--settings-section"> <h3>{{ \'profile.preferences_title\' | translate }}</h3> <p class="title-description">{{ \'profile.preferences_description\' | translate }}</p> <div class="row"> <div class="column-50"> <label>{{ \'profile.language\' | translate }}</label> <select data-ng-model="$prefsService.preferences.profile_language" data-selectize="{\r\n                            valueField: \'id\',\r\n                            labelField: \'name\',\r\n                            searchField: \'name\',\r\n                            dropdownParent: \'body\'\r\n                        }" data-options="languages"> </select> </div> <div class="column-50"> <label>{{ \'profile.time_clock_format\' | translate }}</label> <select data-ng-model="$prefsService.preferences.profile_time_clock_format" data-selectize="{\r\n                                valueField: \'id\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                dropdownParent: \'body\'\r\n                            }" data-options="timeClockFormats"> </select> </div> </div> <div class="row"> <div class="column-50"> <label>{{ \'profile.number_format\' | translate }}</label> <select data-ng-model="$prefsService.preferences.profile_number_format" data-selectize="{\r\n                            valueField: \'id\',\r\n                            labelField: \'name\',\r\n                            searchField: \'name\',\r\n                            dropdownParent: \'body\'\r\n                        }" data-options="numberFormats"> </select> </div> <div class="column-50"> <label>{{ \'profile.date_format\' | translate }}</label> <select data-ng-model="$prefsService.preferences.profile_date_format" data-selectize="{\r\n                                valueField: \'id\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                dropdownParent: \'body\'\r\n                            }" data-options="dateFormats"> </select> </div> </div> <div class="row"> <div class="column-50"> <label>{{ \'profile.default_time_format\' | translate }}</label> <select data-ng-model="$prefsService.preferences.profile_default_time_format" data-selectize="{\r\n                                valueField: \'id\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                dropdownParent: \'body\'\r\n                            }" data-options="timeDurationFormats"> </select> </div> <div class="column-50"> <label>{{ \'profile.report_time_format\' | translate }}</label> <select data-ng-model="$prefsService.preferences.profile_report_time_format" data-selectize="{\r\n                                valueField: \'id\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                dropdownParent: \'body\'\r\n                            }" data-options="timeDurationFormats"> </select> </div> </div> <!--        <div class="row">--> <!--            <div class="column-50">--> <!--                <label>{{ \'profile.timer_idle_limit_hours\' | translate }}</label>--> <!--                <p class="title-description">{{ \'profile.timer_idle_limit_hours_description\' | translate }}</p>--> <!--                <select data-ng-model="$prefsService.preferences.profile_timer_idle_limit_hours"--> <!--                        data-selectize="{--> <!--                            valueField: \'id\',--> <!--                            labelField: \'name\',--> <!--                            searchField: \'name\',--> <!--                            dropdownParent: \'body\'--> <!--                        }"--> <!--                        data-options="timerIdleLimitHours">--> <!--                </select>--> <!--            </div>--> <!--            <div class="column-50"></div>--> <!--        </div>--> <div class="row"> <div class="column-50"> <label>{{ \'profile.csv_time_format\' | translate }}</label> <select data-ng-model="$prefsService.preferences.profile_csv_time_format" data-selectize="{\r\n                                valueField: \'id\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                dropdownParent: \'body\'\r\n                            }" data-options="timeDurationFormats"> </select> </div> <div class="column-50"> <label>{{ \'profile.csv_separator\' | translate }}</label> <select data-ng-model="$prefsService.preferences.profile_csv_delimiter" data-selectize="{\r\n                                valueField: \'id\',\r\n                                labelField: \'name\',\r\n                                searchField: \'name\',\r\n                                dropdownParent: \'body\'\r\n                            }" data-options="csvDelimiters"> </select> </div> </div> <div> <button class="button button--blue-brand" data-ng-click="savePreferences()" data-ng-disabled="isSaving.preferences"> <i class="icon-save"></i> {{ isSaving.preferences ? (\'profile.saving_preferences\' | translate) : (\'profile.save_preferences\' | translate) }} </button> </div> </section> </div> '),$templateCache.put("views/account/project-settings.html",'<style> .settings-view h1 {\r\n        margin-bottom: 30px;\r\n    }\r\n\r\n    .settings-view p {\r\n        line-height: 1.5em;\r\n        font-size: 16px;\r\n        margin-bottom: 15px;\r\n        margin-top: 15px;\r\n        color: #6e6e6e;\r\n    }\r\n\r\n    .settings-view h1 > [class^="icon-"] {\r\n        position: relative;\r\n        top: 2px;\r\n        margin-right: 5px;\r\n    }\r\n\r\n    .settings-view h1 + p.title-description {\r\n        margin-bottom: 20px;\r\n        line-height: 1.5em;\r\n    }\r\n\r\n    .settings-view hr {\r\n        margin-bottom: 25px;\r\n        margin-top: 25px;\r\n    }\r\n\r\n    .settings-view h3 {\r\n        margin-bottom: 0;\r\n        font-size: 18px;\r\n    }\r\n\r\n    .settings-view h3 + p.title-description {\r\n        line-height: 1.5em;\r\n        font-size: 14px;\r\n        margin-bottom: 15px;\r\n        /*margin-top: 10px;*/\r\n        margin-top: 0;\r\n        color: var(--color-steel);\r\n    }\r\n\r\n    .settings-view label {\r\n        display: inline-block;\r\n        font-weight: bolder;\r\n        font-size: 15px !important;\r\n    }\r\n\r\n    .settings-view label > input[type="checkbox"] {\r\n        position: relative;\r\n        top: 1px;\r\n        margin-right: 3px;\r\n    }\r\n\r\n    .settings-view .selectize-dropdown,\r\n    .settings-view .selectize-input,\r\n    .settings-view .selectize-input input {\r\n        font-size: 15px;\r\n    }\r\n\r\n    .list p.title { margin: 10px 0px 5px; display: inline-block; }\r\n    .options-list { margin: 5px 0 0px; }\r\n    .options-list .flag { margin-bottom: 8px; margin-right: 8px; background-color: #fff; border: solid 1px #ddd; color: #333; font-size: 14px; }\r\n    .options-list .icon-close { font-size: 10px; color: #aaa; margin-left: 2px; }\r\n    .add-members { margin-bottom: 10px; margin-top: 5px; }\r\n\r\n    .settings-view .saved-signal {\r\n        display: inline;\r\n    }\r\n    .settings-view .saved-signal span:last-child {\r\n        font-style: normal;\r\n        font-size: 14px;\r\n        padding-left: 3px;\r\n    }\r\n    .settings-view .saved-signal span:first-child:before {\r\n        font-size: 19px;\r\n        position: relative;\r\n        top: 2px;\r\n    } </style>
5 <div class="view radius content-register-edit settings-view" style="padding-bottom: 40px;"> <h1> <span>Configurações gerais da conta</span> </h1> <div class="explanation premium radius" style="margin-top: 0; margin-bottom: 40px;" data-ng-if="!hasFeature.PROJECT_GLOBAL_SETTINGS"> <div> <strong>Configurações globais de projetos não está disponível no seu plano.</strong> </div> <div> <a class="link underline" data-ng-click="$subscriptionService.showUpgradeModal()">Faça upgrade do seu plano aqui</a> para liberar este recurso. </div> </div> <h3>Padrão de novos projetos</h3> <p class="title-description"> Você pode definir valor padrão para alguns campos de novos projeto. </p> <div> <label style="display: inline-block; margin-bottom: 15px;" data-ng-disabled="!hasFeature.PROJECT_GLOBAL_SETTINGS"> <input type="checkbox" data-ng-model="$settingsService.settings.project_settings_required_task" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'" data-ng-change="update_setting(\'project_settings_required_task\')" data-ng-disabled="!hasFeature.PROJECT_GLOBAL_SETTINGS"> Campo tarefa obrigatório <span saved-signal="project_settings_required_task"></span> </label> </div> <div> <label style="display: inline-block; margin-bottom: 15px;" data-ng-disabled="!hasFeature.PROJECT_GLOBAL_SETTINGS"> <input type="checkbox" data-ng-model="$settingsService.settings.project_settings_privacy" data-ng-true-value="\'2\'" data-ng-false-value="\'1\'" data-ng-change="update_setting(\'project_settings_privacy\')" data-ng-disabled="!hasFeature.PROJECT_GLOBAL_SETTINGS"> <span>Privacidade selecionado como privado</span> <!--<span class="config-saved" ng-show="show_saved.project_settings_privacy">Salvo</span>--> <span saved-signal="project_settings_privacy"></span> </label> </div> <hr> <h3>Campos no projeto</h3> <p class="title-description"> Você pode controlar a visibilidade de alguns campos no cadastro de projetos. </p> <div> <label style="display: inline-block; margin-bottom: 15px;" data-ng-disabled="!hasFeature.PROJECT_GLOBAL_SETTINGS"> <input type="checkbox" ng-model="$settingsService.settings.project_settings_contractor_visibility" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'" data-ng-change="update_setting(\'project_settings_contractor_visibility\')" data-ng-disabled="!hasFeature.PROJECT_GLOBAL_SETTINGS"> <span>Mostrar campo contratante no projeto</span> <span saved-signal="project_settings_contractor_visibility"></span> </label> </div> <hr> <button data-ng-click="save()" data-ng-disabled="saving" class="button button--blue-brand"> <span>{{ saving ? \'Salvando configurações...\' : \'Salvar configurações\' }}</span> </button> </div> '),$templateCache.put("views/account/reminder-email-preview-modal.html",'<div class="modal-header"> <h1>{{ \'general_account_settings.reminders.email_preview_title\' | translate }}</h1> </div> <div class="modal-body reminder-email-preview-modal--body"> <div class="reminder-email-preview-modal--preview" data-spinner-loading-modal="isPreviewLoading"> <div data-ng-if="!isPreviewLoading" class="reminder-email-preview-modal--letter"> <p class="reminder-email-preview-modal--subject" data-ng-if="previewSubject"> <strong>[{{ \'general_account_settings.reminders.email_preview_subject\' | translate }}]</strong> {{ previewSubject }} </p> <iframe class="reminder-email-preview-modal--frame" data-ng-if="previewHtml" data-reminder-email-preview-frame data-preview-html="previewHtml" title="{{ \'general_account_settings.reminders.email_preview_title\' | translate }}"></iframe> </div> </div> <div class="reminder-email-preview-modal--optional"> <button type="button" class="reminder-email-preview-modal--optional-toggle button clean" data-ng-click="toggleCustomMessageEditor()" data-ng-attr-aria-expanded="{{ isCustomMessageExpanded }}"> <span class="reminder-email-preview-modal--optional-toggle-content"> <span class="reminder-email-preview-modal--optional-toggle-label"> {{ \'general_account_settings.reminders.email_custom_message_toggle\' | translate }} </span><span class="reminder-email-preview-modal--optional-badge"> {{ \'general_account_settings.reminders.email_custom_message_optional\' | translate }} </span> </span> <span class="icon-chevron-down reminder-email-preview-modal--optional-chevron" data-ng-class="{ \'is-expanded\': isCustomMessageExpanded }" aria-hidden="true"></span> </button> <div class="reminder-email-preview-modal--optional-panel" data-ng-show="isCustomMessageExpanded"> <label class="reminder-email-preview-modal--optional-label" for="reminder-email-preview-custom-message"> {{ \'general_account_settings.reminders.email_custom_message_label\' | translate }} </label> <textarea id="reminder-email-preview-custom-message" class="reminder-email-preview-modal--optional-textarea" rows="3" maxlength="2000" data-ng-model="customMessage" placeholder="{{ \'general_account_settings.reminders.email_custom_message_placeholder\' | translate }}"></textarea> <div class="reminder-email-preview-modal--optional-actions"> <p class="reminder-email-preview-modal--optional-hint"> {{ \'general_account_settings.reminders.email_custom_message_help\' | translate }} </p> <button type="button" class="button button--blue-brand reminder-email-preview-modal--apply-button" data-ng-click="applyPreview()" data-ng-disabled="isApplyPreviewDisabled"> {{ \'general_account_settings.reminders.email_preview_apply\' | translate }} </button> </div> </div> </div> </div> <div class="modal-footer"> <button type="button" class="button clean reminder-email-preview-modal--close-button" data-ng-click="close()"> {{ \'general_account_settings.reminders.email_preview_close\' | translate }} </button> </div> '),$templateCache.put("views/account/report-logo-modal.html",'<div class="report-logo-modal"> <div class="modal-header report-logo-modal--header"> <h4 class="report-logo-modal--title">{{ \'general_account_settings.reports.logo_modal_title\' | translate }}</h4> <a class="icon-cross" data-ng-click="closeModal()" href=""></a> </div> <div class="modal-body report-logo-modal--body"> <p class="title-description report-logo-modal--formats"> {{ \'general_account_settings.reports.logo_formats_hint\' | translate }} </p> <div class="report-logo-modal--preview-wrap"> <div data-ng-if="serverPreviewLoading" class="report-logo-modal--loading"> {{ \'general_account_settings.reports.logo_preview_loading\' | translate }} </div> <p data-ng-if="!serverPreviewLoading && hasServerLogo && !serverPreviewUrl && !localPreviewDataUrl" class="report-logo-modal--u
5navailable title-description"> {{ \'general_account_settings.reports.logo_preview_unavailable\' | translate }} </p> <div data-ng-if="!serverPreviewLoading && showEmptyPlaceholder()" class="report-logo-modal--empty"> {{ \'general_account_settings.reports.logo_modal_empty\' | translate }} </div> <img data-ng-if="!serverPreviewLoading && displayPreviewUrl()" data-ng-src="{{ displayPreviewUrl() }}" alt="{{ \'general_account_settings.reports.logo_label\' | translate }}"> </div> <div class="report-logo-modal--remove-link-wrap" data-ng-show="hasServerLogo"> <a href="" class="report-logo-modal--remove-link" data-ng-class="{\'is-disabled\': uploading}" data-ng-click="$event.preventDefault(); !uploading && openRemoveConfirm()"> {{ \'general_account_settings.reports.logo_remove\' | translate }} </a> </div> </div> <div class="modal-footer report-logo-modal--footer"> <div> <div> <input type="file" class="report-logo-modal-file-input" accept="image/png,image/jpeg,image/jpg,.png,.jpg,.jpeg" onchange="angular.element(this).scope().onModalFileInputChange(this);"> <button type="button" class="button clean" data-ng-click="openFilePicker()" data-ng-disabled="uploading"> {{ \'general_account_settings.reports.logo_modal_choose_file\' | translate }} </button> </div> </div> <div class="report-logo-modal--footer-right"> <button type="button" class="button button--blue-brand" data-ng-click="saveLogo()" data-ng-disabled="!pendingFile || uploading"> {{ uploading ? (\'general_account_settings.reports.logo_modal_saving\' | translate) : (\'general_account_settings.reports.logo_modal_save\' | translate) }} </button> </div> </div> </div> '),$templateCache.put("views/account/subscription-edit-quantity.html",'<div class="view upgrade-checkout-resume-view"> <div class="modal-header"> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body"> <div class="upgrade-checkout-resume-view--config-container flow-type-subscription_edit"> <div class="upgrade-checkout-resume-view--left-content"> <div data-ng-if="errors.loading_subscription" class="error-loading-subscription"> <p class="steel-color">{{ \'subscription.upgrade.errors.loading_subscription\' | translate }}</p> <a class="link-dotted steel-color" data-ng-click="loadSubscription()">{{ \'subscription.upgrade.errors.retry\' | translate }}</a> </div> <div data-ng-if="!errors.loading_subscription"> <div data-spinner-loading="is_loading_subscription" data-message="{{ \'subscription.upgrade.errors.loading_subscription_info\' | translate }}" style="margin: 70px 0 40px;"></div> <div data-ng-if="!is_loading_subscription"> <h1>{{title}}</h1> <div> <div class="upgrade-checkout-resume-view--quantity-container"> <div> <div data-ng-if="plan.price.charge_type === \'fixed\'"> <label>{{ \'subscription.upgrade.labels.plan_limit\' | translate }}</label> <input type="text" readonly="readonly" disabled="disabled" style="width: auto" value="{{plan.price.fixed_units | numericHuman}}"> </div> <div data-ng-if="plan.price.charge_type === \'per_user\'" data-ng-class="{\'has-error\' : errors.quantity}"> <label>{{ \'subscription.upgrade.labels.new_quantity\' | translate }}</label> <input type="number" min="1" step="1" data-ng-model="newPlan.quantity" data-ng-change="onChangeUsersQuantity()" placeholder="1"> <sub>{{ errors.quantity }}</sub> </div> </div> <div> <label>{{ \'subscription.upgrade.labels.current_quantity\' | translate }}</label> <input type="number" readonly="readonly" disabled="disabled" min="1" step="1" data-ng-model="currentPlan.quantity"> </div> </div> <div class="upgrade-checkout-resume-view--interval-container"> <!--                                <div class="upgrade-checkout-resume-view&#45;&#45;interval-container__header">--> <!--                                    <strong>Período de pagamento</strong>--> <!--                                    <span data-ng-if="!plan.is_legacy"--> <!--                                          button-toggle-inline--> <!--                                          data-ng-model="newPlan.interval"--> <!--                                          data-options="intervalOptions">--> <!--                                    </span>--> <!--                                </div>--> <div upgrade-plan-price plan-object="plan" interval="newPlan.interval" show-interval="true" show-total="true" show-total-per-month="false" quantity="newPlan.quantity" currency="currency"> </div> </div> <div class="upgrade-checkout-resume-view--resume-container"> <label>{{ \'subscription.upgrade.labels.resume_changes\' | translate }}</label> <div data-ng-if="!hasSubscriptionChanges()"> {{ \'subscription.upgrade.labels.no_changes\' | translate }} </div> <div data-ng-if="hasQuantityChanges()"> <span>{{ \'subscription.upgrade.labels.quantity\' | translate }}</span> <span>{{currentPlan.quantity}}</span> <span class="icon-arrow-right"></span> <strong>{{newPlan.quantity}}</strong> </div> <!--                                <div data-ng-if="hasIntervalChanges()">-->
5 <!--                                    <span>Período de pagamento:</span>--> <!--                                    <span>{{ \'subscription.interval.\' + currentPlan.interval | translate}}</span>--> <!--                                    <span class="icon-arrow-right"></span>--> <!--                                    <strong>{{ \'subscription.interval.\' + newPlan.interval | translate}}</strong>--> <!--                                </div>--> </div> </div> <div class="upgrade-checkout-resume-view--button-next"> <a class="button" data-ng-disabled="!isEnabledGotoPaymentButton()" data-ng-click="update()"> {{ \'subscription.upgrade.buttons.update_subscription\' | translate }} <!--                                <span data-ng-if="!isSaving" class="icon-arrow-right"></span>--> <div spinner-loading="isSaving"></div> </a> </div> </div> </div> </div> </div> </div> </div> '),$templateCache.put("views/account/timesheet-approval-settings.html",'<div class="view radius content-register-edit view-timesheet-approval-settings"> <div class="view-content-account--header-container"> <h1> <span>{{ \'general_account_settings.timesheet_approval.title\' | translate }}</span> </h1> <p class="title-description"> {{ \'general_account_settings.timesheet_approval.description\' | translate }} </p> <p class="title-description permission-note"> <span class="icon-lock_outline"></span> <span>{{ \'general_account_settings.admin_note\' | translate }}</span> </p> </div> <div class="row" style="margin-top: 30px"> <div class="column-100"> <section class="settings-section"> <span data-flag-upgrade-required="TIMESHEET_APPROVAL" data-show-long-description="true" data-custom-description="{{ \'general_account_settings.timesheet_approval.upgrade_description\' | translate }}"></span> <div data-if-has-feature="TIMESHEET_APPROVAL"> <div class="view-timesheet-approval-settings--header"> <div> <h3>{{ \'general_account_settings.timesheet_approval.enable_workflow\' | translate }}</h3> </div> <span data-button-toggle data-ng-model="timesheetApprovalWorkflowActive" data-on-change="syncTimesheetApprovalWorkflowActive(value)" data-title="{{ \'general_account_settings.timesheet_approval.enable_workflow\' | translate }}" data-aria-label="{{ \'general_account_settings.timesheet_approval.enable_workflow\' | translate }}"></span> </div> <p class="view-timesheet-approval-settings--workflow-disabled-hint" data-ng-if="!timesheetApprovalWorkflowActive"> {{ \'general_account_settings.timesheet_approval.workflow_disabled_hint\' | translate }} </p> <div data-ng-if="timesheetApprovalWorkflowActive" class="settings-panel view-timesheet-approval-settings--deadline-card"> <div class="view-timesheet-approval-settings--deadline-card-header"> <div> <h4>{{ \'general_account_settings.timesheet_approval.submission_deadline_label\' | translate }}</h4> <p data-ng-if="timesheetApprovalSettingsReady"> {{ getSubmissionDeadlineSummary() }} </p> </div> </div> <div class="view-timesheet-approval-settings--deadline-card-body" data-ng-if="timesheetApprovalSettingsReady"> <div class="view-timesheet-approval-settings--deadline-fields"> <div class="view-timesheet-approval-settings--deadline-field"> <label for="timesheet-submission-deadline-weekday"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_weekday\' | translate }}</span> </label> <select id="timesheet-submission-deadline-weekday" data-ng-model="timesheetSubmissionDeadline.weekday" data-selectize="{\r\n                                            valueField: \'id\',\r\n                                            labelField: \'name\',\r\n                                            searchField: \'name\',\r\n                                            dropdownParent: \'body\'\r\n                                        }" data-options="reminderWeekdayOptions"> </select> </div> <div class="view-timesheet-approval-settings--deadline-field view-timesheet-approval-settings--deadline-field--time"> <label for="timesheet-submission-deadline-time"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_time\' | translate }}</span> </label> <select id="timesheet-submission-deadline-time" data-ng-model="timesheetSubmissionDeadline.time" data-selectize="{\r\n                                            valueField: \'id\',\r\n                                            labelField: \'name\',\r\n                                            searchField: \'name\',\r\n                                            dropdownParent: \'body\'\r\n                                        }" data-options="submissionDeadlineTimeOptions"> </select> </div>
5 <div class="view-timesheet-approval-settings--deadline-field"> <label for="timesheet-submission-deadline-period-reference"> <span class="overflow-ellipsis">{{ \'general_account_settings.reminders.field_period\' | translate }}</span> </label> <select id="timesheet-submission-deadline-period-reference" data-ng-model="timesheetSubmissionDeadline.period_reference" data-selectize="{\r\n                                            valueField: \'id\',\r\n                                            labelField: \'name\',\r\n                                            searchField: \'name\',\r\n                                            dropdownParent: \'body\'\r\n                                        }" data-options="submissionPeriodReferenceOptions"> </select> </div> </div> </div> </div> <div data-ng-if="timesheetApprovalWorkflowActive && timesheetApprovalSettingsReady" class="settings-panel view-timesheet-approval-settings--automatic-card"> <div class="view-timesheet-approval-settings--deadline-card-header"> <div> <h4>{{ \'general_account_settings.timesheet_approval.submission_automatic_title\' | translate }}</h4> <p>{{ getSubmissionAutomaticSummary() }}</p> </div> <span data-button-toggle data-ng-model="timesheetSubmissionAutomatic" data-on-change="syncTimesheetSubmissionAutomatic(value)" data-title="{{ \'general_account_settings.timesheet_approval.submission_automatic_active\' | translate }}" data-aria-label="{{ \'general_account_settings.timesheet_approval.submission_automatic_active\' | translate }}"></span> </div> </div> <div data-ng-if="timesheetApprovalWorkflowActive && hasFeature.TIMESHEET_REMINDERS"> <div class="settings-panel view-timesheet-approval-settings--reminder-inline-setting"> <div class="view-timesheet-approval-settings--deadline-card-header"> <div> <h4>{{ \'general_account_settings.reminders.submit_before_title\' | translate }}</h4> </div> <span data-button-toggle data-ng-model="reminderSettings.submit_before.active" data-title="{{ \'general_account_settings.reminders.submit_before_active\' | translate }}" data-aria-label="{{ \'general_account_settings.reminders.submit_before_active\' | translate }}"></span> </div> <div class="view-timesheet-approval-settings--reminder-inline-sentence" data-ng-if="reminderSettings.submit_before.active"> <span>{{ \'general_account_settings.reminders.submit_before_inline_prefix\' | translate }}</span> <input id="reminder-submit-before-hours" class="view-timesheet-approval-settings--reminder-inline-number" type="text" data-ng-mask="number" maxlength="3" data-ng-model="reminderSettings.submit_before.hours"> <span>{{ \'general_account_settings.reminders.submit_before_inline_suffix\' | translate }}</span> </div> <div data-reminder-email-custom-message data-reminder-key="submit_before" data-custom-message="reminderSettings.submit_before.email_custom_message"></div> </div> <div class="settings-panel view-timesheet-approval-settings--reminder-inline-setting"> <div class="view-timesheet-approval-settings--deadline-card-header"> <div> <h4>{{ \'general_account_settings.reminders.submit_after_title\' | translate }}</h4> <p data-ng-if="timesheetSubmissionAutomatic"> {{ \'general_account_settings.timesheet_approval.submission_automatic_submit_after_disabled\' | translate }} </p> </div> <span data-ng-if="!timesheetSubmissionAutomatic" data-button-toggle data-ng-model="reminderSettings.submit_after.active" data-title="{{ \'general_account_settings.reminders.submit_after_active\' | translate }}" data-aria-label="{{ \'general_account_settings.reminders.submit_after_active\' | translate }}"></span> </div> <div class="view-timesheet-approval-settings--reminder-inline-sentence" data-ng-if="reminderSettings.submit_after.active && !timesheetSubmissionAutomatic"> <span>{{ \'general_account_settings.reminders.submit_after_inline_prefix\' | translate }}</span> <input id="reminder-submit-after-hours" class="view-timesheet-approval-settings--reminder-inline-number" type="text" data-ng-mask="number" maxlength="3" data-ng-model="reminderSettings.submit_after.hours"> <span>{{ \'general_account_settings.reminders.submit_after_inline_suffix\' | translate }}</span> </div>
5 <div class="element-todo-checkbox view-timesheet-approval-settings--reminder-checkbox" data-ng-if="reminderSettings.submit_after.active && !timesheetSubmissionAutomatic"> <label> <input type="checkbox" data-ng-check data-ng-model="reminderSettings.submit_after.notify_manager"> {{ \'general_account_settings.reminders.notify_manager\' | translate }} </label> </div> <div data-reminder-email-custom-message data-reminder-key="submit_after" data-custom-message="reminderSettings.submit_after.email_custom_message"></div> </div> <div class="settings-panel view-timesheet-approval-settings--reminder-inline-setting"> <div class="view-timesheet-approval-settings--deadline-card-header"> <div> <h4>{{ \'general_account_settings.reminders.pending_approval_title\' | translate }}</h4> </div> <span data-button-toggle data-ng-model="reminderSettings.pending_approval.active" data-title="{{ \'general_account_settings.reminders.pending_approval_active\' | translate }}" data-aria-label="{{ \'general_account_settings.reminders.pending_approval_active\' | translate }}"></span> </div> <div class="view-timesheet-approval-settings--reminder-inline-sentence" data-ng-if="reminderSettings.pending_approval.active"> <span>{{ \'general_account_settings.reminders.pending_approval_inline_prefix\' | translate }}</span> <input id="reminder-pending-hours" class="view-timesheet-approval-settings--reminder-inline-number" type="text" data-ng-mask="number" maxlength="3" data-ng-model="reminderSettings.pending_approval.stale_hours"> <span>{{ \'general_account_settings.reminders.pending_approval_inline_suffix\' | translate }}</span> </div> <div data-reminder-email-custom-message data-reminder-key="pending_approval" data-custom-message="reminderSettings.pending_approval.email_custom_message"></div> </div> </div> <div data-ng-if="timesheetApprovalWorkflowActive" class="settings-panel view-timesheet-approval-settings--submitters"> <div class="view-timesheet-approval-settings--deadline-card-header view-timesheet-approval-settings--submitters-header"> <div> <h4>{{ \'general_account_settings.timesheet_approval.submitters_label\' | translate }}</h4> </div> </div> <div data-users-teams-assignee-picker data-assignments="timesheetSubmitterAssignments" data-available="timesheetSubmitterAvailable" data-instance-id="timesheet-approval-submitters" data-list-layout="chips" data-can-manage="true" data-show-search="false" data-show-bulk-actions="true" data-empty-list-label="general_account_settings.timesheet_approval.empty_submitters" data-is-loading-available="timesheetSubmitterPickerLoading.available" data-on-load-available="loadTimesheetSubmitterAvailable()" data-on-add="addTimesheetSubmitter(assignee, schema)" data-on-remove="removeTimesheetSubmitter(assignee, schema)"> </div> </div> <div class="view-timesheet-approval-settings--section-actions"> <button class="button button--blue-brand" data-ng-click="saveTimesheetApproval()" data-ng-disabled="isSaving.timesheetApproval"> {{ isSaving.timesheetApproval ? (\'general_account_settings.saving\' | translate) : (\'general_account_settings.timesheet_approval.save\' | translate) }} </button> </div> </div> </section> </div> </div> </div> '),
6$templateCache.put("views/account/upgrade-checkout-resume.html",'<div class="view upgrade-checkout-resume-view"> <div class="modal-header"> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body"> <div class="upgrade-checkout-resume-view--config-container flow-type-{{flowType}}"> <div class="upgrade-checkout-resume-view--left-content"> <div data-ng-if="errors.loading_subscription" class="error-loading-subscription"> <p class="steel-color">{{ \'subscription.upgrade.errors.loading_subscription\' | translate }}</p> <a class="link-dotted steel-color" data-ng-click="loadSubscription()">{{ \'subscription.upgrade.errors.retry\' | translate }}</a> </div> <div data-ng-if="!errors.loading_subscription"> <div data-spinner-loading="is_loading_subscription" data-message="{{ \'subscription.upgrade.errors.loading_info\' | translate }}" style="margin: 70px 0 40px;"></div> <div data-ng-if="!is_loading_subscription"> <h1>{{title}}</h1> <div data-ng-if="showLicensesSection"> <div class="upgrade-checkout-resume-view--quantity-container"> <div> <div data-ng-if="plan.price.charge_type === \'fixed\'" data-ng-class="{\'has-error\' : errors.quantity}"> <label>{{ \'subscription.upgrade.labels.plan_limit\' | translate }}</label> <input type="text" readonly="readonly" disabled="disabled" style="width: auto" value="{{plan.price.fixed_units | numericHuman}}"> <sub>{{ errors.quantity }}</sub> </div> <div data-ng-if="plan.price.charge_type === \'per_user\'" data-ng-class="{\'has-error\' : errors.quantity}"> <label>{{flowType === \'upgrade\'? (\'subscription.upgrade.labels.team_size\' | translate) : (\'subscription.upgrade.labels.edit_team_size\' | translate)}}</label> <div> <div data-input-number-stepper="planForm.quantity" data-min="quantityMin" data-max="quantityMax" data-on-change="onChangeUsersQuantity" data-step="1" data-placeholder="1" data-aria-label-decrease="{{ \'subscription.upgrade.labels.quantity_decrease\' | translate }}" data-aria-label-increase="{{ \'subscription.upgrade.labels.quantity_increase\' | translate }}"></div> </div> <sub data-ng-if="errors.quantity">{{ errors.quantity }}</sub>
6 <sub style="color: var(--font-color-1-details)" data-ng-if="!errors.quantity && plan.minimun_users > 1">{{ \'directives.input_number_stepper.minimum_users\' | translate:{ min: plan.minimun_users } }}</sub> </div> </div> <div data-ng-if="flowType === \'subscription_edit\' || flowType === \'subscription_renew\'"> <label>{{ \'subscription.upgrade.labels.current_team_size\' | translate }}</label> <input type="number" readonly="readonly" disabled="disabled" min="1" step="1" data-ng-model="currentPlan.quantity"> </div> </div> <div class="upgrade-checkout-resume-view--interval-container" data-ng-if="!plan.is_legacy && flowType !== \'subscription_edit\'"> <label class="upgrade-checkout-resume-view--interval-container__label"> {{ \'subscription.upgrade.labels.payment_period\' | translate }} </label> <div class="upgrade-checkout-resume-view--interval-options"> <div class="upgrade-checkout-resume-view--interval-option" data-ng-repeat="option in intervalOptions" data-ng-class="{\r\n                                             \'upgrade-checkout-resume-view--interval-option_is-selected\': planForm.interval === option.value\r\n                                         }" data-ng-click="setInterval(option.value)"> <div class="upgrade-checkout-resume-view--interval-option__name" data-ng-bind-html="option.name"></div> <div class="upgrade-checkout-resume-view--interval-option__price" data-ng-if="pricesByInterval[option.value].total !== null && pricesByInterval[option.value].total !== undefined"> <span class="upgrade-checkout-resume-view--interval-option__currency"> {{currency | currencySymbol}} </span> <span data-ng-if="plan.price.charge_type === \'per_user\'"> {{ pricesByInterval[option.value].perUnit | moneyOnlyAmount: false }} <span class="upgrade-checkout-resume-view--interval-option__unit"> / {{ \'directives.upgrade_plan_price.user\' | translate }} / {{ \'directives.upgrade_plan_price.monthly\' | translate }} </span> </span> <span data-ng-if="plan.price.charge_type === \'fixed\'"> {{ pricesByInterval[option.value].total | moneyOnlyAmount: false }} <span class="upgrade-checkout-resume-view--interval-option__unit"> / {{ option.value === \'month\' ? (\'directives.upgrade_plan_price.monthly\' | translate) : (\'directives.upgrade_plan_price.yearly\' | translate) }} </span> </span> </div> <div class="upgrade-checkout-resume-view--interval-option__price upgrade-checkout-resume-view--interval-option__price_unavailable" data-ng-if="pricesByInterval[option.value].total === null || pricesByInterval[option.value].total === undefined"> {{ \'directives.upgrade_plan_price.unavailable\' | translate }} </div> </div> </div> </div> <div class="upgrade-checkout-resume-view--resume-container upgrade-checkout-resume-view--resume-container_changes" data-ng-if="showResumeChangesSection"> <label class="upgrade-checkout-resume-view--resume-container__label">{{ \'subscription.upgrade.labels.resume_changes\' | translate }}</label> <div data-ng-if="showResumeChangesSection && !hasSubscriptionChanges()"> {{ \'subscription.upgrade.labels.no_changes\' | translate }} <div class="upgrade-checkout-resume-view--resume-container__note-renew" data-ng-if="flowType === \'subscription_renew\'"> <span data-ng-bind-html="\'subscription.upgrade.labels.renew_note\' | translate"></span> </div> </div> <div data-ng-if="showResumeChangesSection && hasPlanChanges()"> <span>{{ \'subscription.upgrade.labels.plan\' | translate }}</span> <span>{{currentPlan.plan_name}}</span> <span class="icon-arrow-right"></span> <strong style="text-transform: uppercase">{{plan.name}}</strong> </div> <div data-ng-if="showResumeChangesSection && hasQuantityChanges()"> <span>{{ \'subscription.upgrade.labels.quantity\' | translate }}</span> <span>{{currentPlan.quantity}}</span> <span class="icon-arrow-right"></span> <strong>{{planForm.quantity}}</strong> </div> <div data-ng-if="showResumeChangesSection && hasIntervalChanges()"> <span>{{ \'subscription.upgrade.labels.payment_period\' | translate }}</span> <span>{{ \'subscription.interval.\' + currentPlan.interval | translate}}</span> <span class="icon-arrow-right"></span> <strong>{{ \'subscription.interval.\' + planForm.interval | translate}}</strong> </div> </div> <div class="upgrade-checkout-resume-view--resume-container upgrade-checkout-resume-view--resume-container_billing" data-ng-if="showResumeChangesSection || flowType === \'upgrade\'"> <label class="upgrade-checkout-resume-view--resume-container__label"> {{ \'subscription.upgrade.labels.resume_billing\' | translate }} </label> <div class="upgrade-checkout-resume-view--resume-summary" data-ng-if="plan && plan.price\r\n                                         && (flowType === \'upgrade\' || showResumeChangesSection)\r\n                                         && resumePrice.total !== null"> <div class="upgrade-checkout-resume-view--resume-summary__plan"> <strong>{{ \'subscription.upgrade.labels.resume_plan\' | translate }} {{plan.name}}</strong> </div> <div class="upgrade-checkout-resume-view--resume-summary__quantity-price"> <span data-ng-if="plan.price.charge_type === \'per_user\'"> {{currency | currencySymbol}}{{ resumePrice.perUnit | moneyOnlyAmount: false }} x {{ planForm.quantity }} {{ (planForm.quantity === 1 ? \'directives.upgrade_plan_price.user\' : \'directives.upgrade_plan_price.users\') | translate }} <span data-ng-if="planForm.interval === \'year\'">{{ \'subscription.upgrade.labels.resume_x_12_months\' | translate }}</span> </span> <span data-ng-if="plan.price.charge_type === \'fixed\'"> {{currency | currencySymbol}}{{ resumePrice.total | moneyOnlyAmount: false }} x {{ planForm.quantity }} {{ (planForm.quantity === 1 ? \'directives.upgrade_plan_price.user\' : \'directives.upgrade_plan_price.users\') | translate }} <span data-ng-if="planForm.interval === \'year\'">{{ \'subscription.upgrade.labels.resume_x_12_months\' | translate }}</span> </span> </div> <div class="upgrade-checkout-resume-view--resume-summary__total"> <span data-ng-if="planForm.interval === \'month\'"> {{ \'subscription.upgrade.labels.resume_total_prefix\' | translate }} <span class="upgrade-checkout-resume-view--resume-summary__total-value"> {{currency | currencySymbol}}{{ resumePrice.total | moneyOnlyAmount: false }} </span> {{ \'subscription.upgrade.labels.resume_total_per_month_suffix\' | translate }} </span> <span data-ng-if="planForm.interval === \'year\'"> {{ \'subscription.upgrade.labels.resume_total_prefix\' | translate }} <span class="upgrade-checkout-resume-view--resume-summary__total-value"> {{currency | currencySymbol}}{{ resumePrice.total | moneyOnlyAmount: false }} </span> {{ \'subscription.upgrade.labels.resume_total_per_year_suffix\' | translate }} <span data-ng-if="resumeAnnualSavings" class="upgrade-checkout-resume-view--resume-summary__annual-savings"> {{ \'subscription.upgrade.labels.resume_annual_savings\' | translate:{ symbol: (currency | currencySymbol), amount: (resumeAnnualSavings | moneyOnlyAmount: false) } }}
6 </span> </span> </div> </div> </div> </div> <!-- Feedback downgrade : inicio --> <div data-ng-if="showFeedbackSection"> <label style="margin: 20px 0 15px;"> <span>{{ \'subscription.upgrade.labels.feedback_title\' | translate }}</span> </label> <div class="feedback-answers" data-ng-repeat="feedback in feedback_answers"> <label> <input type="radio" value="{{feedback.reason}}" data-ng-model="planForm.downgrade_feedback"> {{feedback.reason}} </label> <div class="feedback-details" data-ng-if="feedback.details && planForm.downgrade_feedback === feedback.reason"> <label>{{feedback.details}}</label> <textarea data-ng-model="planForm.downgrade_feedback_details"></textarea> <sub class="details">{{ \'subscription.upgrade.labels.feedback_importance\' | translate }}</sub> </div> </div> </div> <div data-ng-if="showGotoPaymentButton" class="upgrade-checkout-resume-view--button-next"> <a class="button" data-ng-disabled="!isEnabledGotoPaymentButton()" data-ng-click="gotoPayment()"> {{ \'subscription.upgrade.buttons.goto_payment\' | translate }} <span data-ng-if="!isLoadingCheckout" class="icon-arrow-right"></span> <div spinner-loading="isLoadingCheckout"></div> </a> </div> <div data-ng-if="showCancelButton" class="upgrade-checkout-resume-view--button-next"> <a class="button" data-ng-disabled="!isEnableDowngradeButton()" data-ng-click="redirectToStripeCancelSubscription()"> {{ \'subscription.upgrade.buttons.cancel_subscription\' | translate }} <span data-ng-if="!isDowngrading" class="icon-arrow-right"></span> <div spinner-loading="isDowngrading"></div> </a> </div> <div data-ng-if="showActivateFreeButton" class="upgrade-checkout-resume-view--button-next"> <a class="button" data-ng-disabled="!isEnableDowngradeButton()" data-ng-click="downgrade()"> {{ \'subscription.upgrade.buttons.use_free_plan\' | translate }} <span data-ng-if="!isDowngrading" class="icon-arrow-right"></span> <div spinner-loading="isDowngrading"></div> </a> </div> </div> </div> </div> <div class="upgrade-checkout-resume-view--right-content" data-ng-if="showBenefitsGainSection || showBenefitsLossSection"> <div data-ng-if="showBenefitsGainSection"> <h1>{{ \'subscription.upgrade.labels.gain_features\' | translate }}</h1> <div class="checkout-resume"> <ul class="resume-topics"> <li data-ng-if="plan.predecessor"> <span class="icon-check green-color"></span> <span data-ng-bind-html="\'subscription.upgrade.labels.all_features_from\' | translate:{ name: plan.predecessor }"></span> </li> <li data-ng-repeat="(featureName, featureDesc) in plan.features"> <span class="icon-check green-color"></span> <div> <span class="has-feature-description" data-ng-bind-html="featureName | translate" data-tooltip-html="featureDesc | translate" data-tooltip-class="tooltip-upgrade-features"></span> </div> </li> </ul> </div> </div> <div data-ng-if="showBenefitsLossSection"> <h1>{{ \'subscription.upgrade.labels.loss_features\' | translate }}</h1> <div class="checkout-resume"> <ul class="resume-topics" data-ng-if="planBeforeDowngrade"> <!--                            <li data-ng-repeat="feature in planBeforeDowngrade.features">--> <!--                                <span class="icon-cross red-color"></span>--> <!--                                <span data-ng-bind-html="feature"></span>--> <!--                            </li>--> <li data-ng-repeat="(featureName, featureDesc) in planBeforeDowngrade.features"> <span class="icon-check red-color"></span> <div> <span class="has-feature-description" data-ng-bind-html="featureName | translate" data-tooltip-html="featureDesc | translate" data-tooltip-class="tooltip-upgrade-features"></span> </div> </li> </ul> </div> </div> <!-- Resumo do upgrade : fim --> </div> </div> </div> </div> '),$templateCache.put("views/account/upgrade-required-modal.html",'<div class="modal-upgrade-required"> <div class="modal-header"> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body modal-upgrade-required"> <div data-ng-controller="UpgradeController" data-ng-init="previousModalInstance = $modalInstance;"> <div data-ng-include="\'views/account/upgrade.html\'"></div> </div> </div> </div> '),$templateCache.put("views/account/upgrade.html",'<div class="view radiu
6s upgrade-view" data-ng-class="{ \'is-authenticated\': isAuthenticated }"> <div data-ng-if="isAuthenticated"> <div class="upgrade-view--main-message"> <div class="upgrade-view--main-message__title" data-ng-bind-html="message.title"> </div> <!--            <div class="upgrade-view&#45;&#45;main-message__details"--> <!--                 data-ng-bind-html="message.subtitle">--> <!--            </div>--> </div> <div data-spinner-loading="loading_subscription" data-message="{{ \'subscription.view.main_message.loading_plans\' | translate }}" style="margin-bottom: 30px; margin-top: 100px;" class="bolder"></div> <div data-ng-if="errors.loading_subscription" class="error-loading-subscription"> <p class="steel-color">{{ \'subscription.view.main_message.loading_error\' | translate }}</p> <a class="link-dotted steel-color" data-ng-click="get_subscription()">{{ \'subscription.view.main_message.retry\' | translate }}</a> </div> </div> <div data-ng-if="!loading_subscription && !errors.loading_subscription"> <div class="current-plan--container" data-ng-if="subscription.is_paid_plan_active"> <p>{{ \'subscription.view.current_plan.active_title\' | translate }}</p> <div> <strong>Plano {{subscription.plan.name}}</strong> <span data-ng-bind-html="\'subscription.view.current_plan.licenses_label\' | translate:{ count: subscription.users_limit }"></span> </div> <div> <!--                <a data-ng-if="$subscriptionService.shouldShowEditQuantity()"--> <!--                   class="link-dashed"--> <!--                   data-ng-click="$subscriptionService.openEditSubscriptionModal()">--> <!--                    <span class="icon-person_add_alt"></span>--> <!--                    <span>Aumentar ou reduzir quantidade de licenças</span>--> <!--                </a>--> <a class="link-dashed" data-ng-click="gotoBillingDetails()"> <span class="icon-launch"></span> <span data-if-owner>{{ \'subscription.view.current_plan.manage_subscription\' | translate }}</span> <span data-if-not-owner>{{ \'subscription.view.current_plan.subscription_details\' | translate }}</span> </a> </div> </div> <div class="current-plan--container" data-ng-if="subscription.is_trial_active"> <p>{{ \'subscription.view.current_plan.trial_active_title\' | translate }}</p> <div> <strong>Plano {{subscription.plan.name}}</strong> {{ \'subscription.view.current_plan.trial_active_details\' | translate:{ count: subscription.users_limit } }} <span data-ng-if="subscription.projects_limit"> {{ \'subscription.view.current_plan.projects_limit\' | translate:{ count: subscription.projects_limit } }}</span> </div> <div><span data-ng-bind-html="\'subscription.view.current_plan.trial_remaining\' | translate:{ count: subscription.remaining_trial_days }"></span></div> <div> <span>{{ \'subscription.view.current_plan.trial_continue_note\' | translate }}</span> </div> </div> <div class="current-plan--container" data-ng-if="subscription.is_free_plan"> <p>{{ \'subscription.view.current_plan.free_plan_title\' | translate }}</p> <div> <strong>Plano {{subscription.plan.name}}</strong> {{ \'subscription.view.current_plan.trial_active_details\' | translate:{ count: subscription.users_limit } }} <span data-ng-if="subscription.projects_limit"> {{ \'subscription.view.current_plan.projects_limit\' | translate:{ count: subscription.projects_limit } }}</span> </div> <div> {{ \'subscription.view.current_plan.free_plan_details\' | translate }} </div> </div> <div class="plan-comparative--header"> <div class="plan-comparative--header__controls-grid"> <div class="plan-comparative--header__control-frame plan-comparative--header__control-frame--guarantee plan-comparative--header__controls-grid__guarantee"> <div class="plan-comparative--header__money-back-guarantee" data-tooltip-html="\'subscription.view.comparative.money_back_guarantee_tooltip\' | translate"> <span class="icon-check_circle_outline"></span> <span>{{ \'subscription.view.comparative.money_back_guarantee\' | translate }}</span> </div> </div> <div class="plan-comparative--header__quantity plan-comparative--header__controls-grid__quantity" data-ng-if="planForm.planSize === \'small\'"> <span class="plan-comparative--header__quantity-label"> {{ \'subscription.view.comparative.users_label\' | translate }} </span> <div data-input-number-stepper="planForm.quantity" data-min="quantityMin" data-min-tooltip="{{ quantityMinTooltip }}" data-step="1" data-placeholder="{{ quantityMin }}"></div> </div> <div class="plan-comparative--header__plan-interval plan-comparative--header__controls-grid__interval"> <span button-toggle-inline data-ng-model="planForm.interval" data-options="intervalOptions"> </span> </div> </div> </div> <div class="comparative-plans-wrapper"> <div class="comparative-plans-container"> <section data-ng-repeat="plan in plans | filter: { is_visible: true, planSize: planForm.planSize } | orderBy:\'order\' track by plan.id" data-ng-class="{\'fade\': true, \'recommended-selected\': isRecommended(plan)}"> <div class="comparative-plans-container--recommended"> <span class="icon-auto_awesome"></span> {{ plan.recommendedLabel | translate }} </div> <div class="comparative-plans-container--section-top"> <div upgrade-plan-price plan-object="plan" show-description="true" show-total="true" show-total-per-month="true" interval="planForm.interval" quantity="planForm.quantity" currency="currency"> </div> <div data-ng-if="plan.planSize === \'large\'"> <button data-ng-click="$supportChannelService.openWhatsapp(\'Estou interessado no plano \' + plan.name + \'.\')" class="button green radius bolder"> <span class="icon-whatsapp"></span> <span>{{ \'subscription.view.comparative.whatsapp_button\' | translate }}</span> </button> </div> <div data-ng-if="plan.planSize === \'small\'"> <div data-ng-if="!isAuthenticated"> <div> <button data-ng-click="create_account(plan)" class="button button--blue-brand radius bolder"> <span data-ng-if="plan.is_free">{{ \'subscription.view.comparative.use_free\' | translate }}</span> <span data-ng-if="!plan.is_free">{{ \'subscription.view.comparative.try_free\' | translate }}</span> </button> </div> </div> <div data-ng-if="isAuthenticated"> <div data-if-not-owner class="steel-color" style="font-style: italic; margin-top: 10px; font-size: 12px"> {{ \'subscription.view.comparative.only_owner_can_edit\' | translate }} </div> <div data-if-owner> <div data-ng-if="plan.is_free"> <div data-ng-if="!is_current_plan(plan)"> <div data-ng-if="subscription.is_paid_plan_active"> <button class="button button--blue-brand__white radius bolder disabled" tooltip="{{ \'subscription.view.comparative.unavailable_active_subscription\' | translate }}"> {{ \'subscription.view.comparative.unavailable\' | translate }} </button> </div> <div data-ng-if="!subscription.is_paid_plan_active"> <button data-ng-click="$subscriptionService.openChangeToFreePlanModal(plan)" class="button button--blue-brand radius bolder"> {{ \'subscription.view.comparative.use_free_plan\' | translate }} </button> </div> </div> <div data-ng-if="is_current_plan(plan)"> <div style="margin-top: 15px"> <a class="link-dashed light-blue-color" data-ng-click="gotoBillingDetails()">{{ \'subscription.view.comparative.your_current_plan\' | translate }}</a> </div> </div> </div> <div data-ng-if="!plan.is_free"> <div data-ng-if="is_current_plan(plan)"> <div data-ng-if="!subscription.is_paid_plan_active"> <button data-ng-click="openCheckoutModal(plan)" class="button button--blue-brand radius bolder"> {{ \'subscription.view.comparative.subscribe_now\' | translate }} </button> </div> <div data-ng-if="subscription.is_paid_plan_active"> <div> <button class="button button--blue-brand__white radius bolder" data-ng-click="gotoBillingDetails()"> <!--                                                Gerencie sua assinatura--> {{ \'subscription.view.comparative.manage\' | translate }} </button> </div> </div> </div> <div data-ng-if="!is_current_plan(plan)"> <div data-ng-if="subscription.is_paid_plan_active"> <button class="button button--blue-brand__white radius bolder disabled" data-ng-if="!$subscriptionService.isEnabledSubscriptionEdit()" tooltip="{{ \'subscription.view.comparative.unavailable_custom_subscription\' | translate }}"> {{ \'subscription.view.comparative.unavailable\' | translate }} </button> <button data-ng-click="$subscriptionService.openChangePlanModal(plan)" data-ng-if="$subscriptionService.isEnabledSubscriptionEdit()" class="button button--blue-brand__white radius bolder"> {{ \'subscription.view.comparative.migrate_plan\' | translate }} </button> </div> <div data-ng-if="!subscription.is_paid_plan_active"> <button data-ng-click="openCheckoutModal(plan)" class="button button--blue-brand radius bolder"> {{ \'subscription.view.comparative.subscribe_now\' | translate }} </button> </div> </div> </div> </div> </div> </div> </div> <div class="comparative-plans-container--section-features"> <ul> <li> <strong data-ng-if="plan.features_heading" data-ng-bind-html="plan.features_heading | translate"></strong> <strong data-ng-if="!plan.features_heading && !plan.predecessor && plan.show_features_heading !== false"> {{ \'subscription.view.comparative.features_title\' | translate }} </strong> <strong data-ng-if="!plan.features_heading && plan.predecessor"> {{ \'subscription.view.comparative.all_features_from\' | translate:{ name: plan.predecessor } }} </strong> </li> <li data-ng-if="plan.priceDetails[planForm.interval]" data-ng-repeat="(featureName, featureDesc) in plan.priceDetails[planForm.interval]"> <span class="icon-check"></span> <div> <span data-ng-bind-html="featureName | translate" data-tooltip-html="featureDesc | translate" data-tooltip-class="tooltip-upgrade-features"></span> </div> </li> <li data-ng-repeat="(featureName, featureDesc) in plan.features"> <span class="icon-check"></span> <div> <span class="has-feature-description" data-ng-bind-html="featureName | translate" data-tooltip-html="featureDesc | translate" data-tooltip-class="tooltip-upgrade-features"></span> </div> </li> </ul> </div> </section> </div> </div> <div class="comparative-features-container report-list-sticky" data-ng-class="{ \'comparative-features-container--expanded\': showFullComparative }"> <h3>{{ \'subscription.view.comparative.compare_title\' | translate }}</h3> <div class="comparative-features-container__table-wrapper" data-ng-class="{ \'comparative-features-container__table-wrapper--expanded\': showFullComparative }"> <table class="report-round-table-corners-20"> <tbody data-ng-repeat="group in featuresGroups"> <tr class="plan-comparative-section"> <td>{{group.name | translate}}</td> <td data-ng-repeat="plan in plans | filter: { is_visible: true, planSize: \'small\' } | orderBy:\'order\'" data-ng-class="{ \'plan-starred\': plan.starred }"> <span class="plan-comparative-section--plan-name">{{plan.name}}</span> </td> </tr> <tr data-ng-repeat="feature in group.features"> <td data-ng-click="feature.expanded = !feature.expanded" class="comparative-features-container--feature-description" ng-class="{\'expanded\': feature.expanded, \'is-expandable\': feature.description || feature.link }"> <div> <span class="comparative-features-container--feature-description__toggle-expand"></span> <span>{{feature.name | translate}}</span> <span data-ng-if="feature.soon" class="flag light-blue-bgcolor">{{ \'subscription.view.comparative.soon\' | translate }}</span>
6 <span data-ng-if="feature.new" class="flag flag-new-feature">{{ \'subscription.view.comparative.new\' | translate }}</span> <div class="comparative-features-container--feature-description__collapsed"> <div data-ng-bind-html="feature.description | translate"></div> <a data-ng-if="feature.link" class="link link-dashed" href="{{feature.link}}" target="_blank"> {{ \'subscription.view.comparative.learn_more\' | translate }} </a> </div> </div> </td> <td data-ng-repeat="plan in plans | filter: { is_visible: true, planSize: \'small\' } | orderBy:\'order\'" data-ng-class="{ \'plan-starred\': plan.starred }"> <span data-ng-if="planHasComments(plan, feature)"> <span data-ng-bind-html="(feature.comments[plan.name] || feature.comments[\'*\']) | translate"></span> </span> <span data-ng-if="!planHasComments(plan, feature)"> <span data-ng-if="planHasFeature(plan, feature)" class="icon-check"></span> </span> </td> </tr> </tbody> </table> </div> <div class="comparative-features-container__toggle"> <button type="button" class="link link-dashed comparative-features-container__toggle-btn" data-ng-click="toggleFullComparative()"> <span data-ng-if="!showFullComparative">{{ \'subscription.view.comparative.show_full_comparison\' | translate }}</span> <span data-ng-if="showFullComparative">{{ \'subscription.view.comparative.hide_comparison\' | translate }}</span> </button> </div> </div> <div data-ng-if="errors.from_server" class="alert-box red-color radius" style="margin-top: 20px;"> <span class="icon-notification" style="margin-right: 8px; margin-left: 5px;"></span> <span>{{errors.from_server}}</span> </div> </div> </div> '),$templateCache.put("views/api-access/api-access-management.html",'<div class="view-api-access--container"> <div class="view-api-access--section-header"> <h2>{{ \'api_access.management.title\' | translate }}</h2> <p>{{ \'api_access.management.description\' | translate }}</p> </div> <div class="view-api-access--usage"> <div class="view-api-access--usage-card"> <div class="view-api-access--usage-loading" data-spinner-loading="isLoadingManagement" data-message="{{ \'api_access.management.loading\' | translate }}"></div> <div class="view-api-access--usage-header"> <div class="view-api-access--usage-label"> {{ \'api_access.management.daily_usage\' | translate }} </div> <div class="view-api-access--usage-remaining"> {{ \'api_access.management.remaining\' | translate:{count: management.usage.remaining} }} </div> </div> <div class="view-api-access--usage-value"> {{ management.usage.current }} / {{ management.usage.limit }} </div> <div class="view-api-access--usage-progress" data-ng-if="management.usage.limit"> <span data-progress-bar data-progress-bar-style="usage-limit" data-progress-completed="management.usage.progress"> </span> </div> <div class="view-api-access--usage-meta" data-ng-if="management.usage.reset_at"> {{ \'api_access.management.reset_at\' | translate:{date: (management.usage.reset_at | datetimeShort)} }} </div> <div class="view-api-access--usage-meta view-api-access--usage-shared-hint"> {{ \'api_access.management.daily_usage_shared\' | translate }} </div> </div> </div> <div class="view-api-access--setting settings-section"> <label>{{ \'api_access.management.token_creation.label\' | translate }}</label> <p class="view-api-access--setting-hint"> {{ \'api_access.management.token_creation.hint\' | translate }} </p> <select data-ng-model="management.tokenCreationRole" data-options="tokenCreationRoleOptions" data-selectize="tokenCreationSelectizeConfig" data-ng-disabled="isSavingManagement || !$permissionService.hasPrivilegesToEditAccountSettings"> </select> <div class="view-api-access--setting-actions"> <button type="button" class="button button--blue-brand" data-ng-click="saveTokenCreationRole()" data-ng-disabled="isSavingManagement\r\n                        || management.tokenCreationRole === management.savedTokenCreationRole\r\n                        || !$permissionService.hasPrivilegesToEditAccountSettings()"> {{ isSavingManagement ? (\'api_access.management.token_creation.saving\' | translate) : (\'api_access.management.token_creation.save\' | translate) }} </button> </div> </div> </div> '),$templateCache.put("views/api-access/api-access.html",'<div class="view radiu
6s content-register-edit view-api-access"> <div class="row view-api-access--header view-content-account--header-container"> <div class="column-80"> <h1>{{ \'api_access.title\' | translate }}</h1> <p class="title-description view-api-access--description"> {{ \'api_access.description\' | translate }} <a href="https://api-docs.rabbiit.com" target="_blank" rel="noopener noreferrer" class="link">{{ \'api_access.docs_link\' | translate }}</a> </p> </div> </div> <nav app-tabs class="view-api-access__tabs" data-tabs="tabs" data-selected="activeTab" data-nav-padding-left="0px" data-tab-margin-left="0px" data-tab-margin-right="26px" data-on-change="onTabChange(tabId)"> </nav> <div data-ng-if="activeTab === \'management\'" data-ng-include="\'views/api-access/api-access-management.html\'"></div> <div data-ng-if="activeTab === \'team-tokens\'" data-ng-include="\'views/api-access/api-team-tokens.html\'"></div> <div data-ng-if="activeTab === \'subscriptions\'" data-ng-include="\'views/api-access/api-webhooks-subscriptions.html\'"></div> <div data-ng-if="activeTab === \'deliveries\'" data-ng-include="\'views/api-access/api-webhooks-deliveries.html\'"></div> </div> '),$templateCache.put("views/api-access/api-create-token-modal.html",'<style> .api-access-create-modal .modal-header {\r\n        padding-top: 30px;\r\n    }\r\n    .api-access-create-modal .modal-header .title {\r\n        font-size: 20px;\r\n        font-weight: bolder;\r\n        line-height: 25px;\r\n    }\r\n    .api-access-create-modal .token-reveal {\r\n        margin-top: 16px;\r\n        padding: 14px;\r\n        border-radius: 8px;\r\n        background-color: var(--color-grey-disabled);\r\n        border: 1px solid var(--border-color-1-50-opacity);\r\n        word-break: break-all;\r\n        font-family: monospace;\r\n        font-size: 13px;\r\n        line-height: 1.5;\r\n    }\r\n    .api-access-create-modal .token-reveal-warning {\r\n        margin-top: 12px;\r\n        font-size: 13px;\r\n        line-height: 1.5;\r\n        color: var(--font-color-1-details--90-opacity);\r\n    }\r\n    .api-access-create-modal .token-reveal-actions {\r\n        margin-top: 12px;\r\n    }\r\n    .api-access-create-modal .token-reveal-actions .directive-copy-to-clipboard-button .copy-button {\r\n        display: inline-block;\r\n        margin-left: 0;\r\n        padding: 4px 10px;\r\n        font-size: 13px;\r\n    } </style> <div class="api-access-create-modal"> <div class="modal-header"> <p class="title" data-ng-if="!createdToken">{{ \'api_access.create_title\' | translate }}</p> <p class="title" data-ng-if="createdToken">{{ \'api_access.token_created_title\' | translate }}</p> </div> <div class="modal-body" data-on-click-enter="!createdToken && create()"> <div data-ng-if="!createdToken"> <label>{{ \'api_access.name_label\' | translate }}</label> <input type="text" data-ng-model="form.app_name" maxlength="100" placeholder="{{ \'api_access.name_placeholder\' | translate }}" autofocus> <p class="steel-color" style="margin-top: 10px; font-size: 13px;"> {{ \'api_access.name_hint\' | translate }} </p> </div> <div data-ng-if="createdToken"> <p style="line-height: 1.4">{{ \'api_access.token_created_description\' | translate }}</p> <div id="api-access-created-token" class="token-reveal">{{ createdToken.token }}</div> <div class="token-reveal-actions"> <span data-copy-to-clipboard-button="api-access-created-token"></span> </div> <p class="token-reveal-warning">{{ \'api_access.token_created_warning\' | translate }}</p> </div> </div> <div class="modal-footer"> <div data-ng-if="!createdToken"> <button type="button" data-ng-click="close()" class="button clean"> {{ \'api_access.cancel\' | translate }} </button> <button type="button" data-ng-click="create()" data-ng-disabled="isSaving || !form.app_name" class="button button--blue-brand"> {{ isSaving ? (\'api_access.creating\' | translate) : (\'api_access.create\' | translate) }} </button> </div> <div data-ng-if="createdToken"> <button type="button" data-ng-click="close()" class="button button--blue-brand"> {{ \'api_access.done\' | translate }} </button> </div> </div> </div> '),
7$templateCache.put("views/api-access/api-personal-tokens.html",'<div class="view radiu
7s content-register-edit view-api-access"> <div class="row view-api-access--header view-content-account--header-container"> <div class="column-80"> <h1>{{ \'personal_tokens.title\' | translate }}</h1> <p class="title-description view-api-access--description"> {{ \'personal_tokens.description\' | translate }} <a href="https://api-docs.rabbiit.com" target="_blank" rel="noopener noreferrer" class="link">{{ \'api_access.docs_link\' | translate }}</a> </p> </div> <div class="column-20 align-right view-api-access--header-actions"> <button type="button" data-ng-click="openCreateModal()" class="button button--blue-brand"> <span class="icon-plus4"></span> {{ \'personal_tokens.new\' | translate }} </button> </div> </div> <div class="view-api-access--container"> <div data-spinner-loading="isLoading && tokens.length === 0" data-message="{{ \'personal_tokens.loading\' | translate }}"></div> <div class="explanation empty-state view-api-access--empty" data-ng-if="!isLoading && tokens.length === 0"> <h3>{{ \'personal_tokens.no_tokens\' | translate }}</h3> <p>{{ \'personal_tokens.no_tokens_hint\' | translate }}</p> </div> <div class="list-minimal" data-ng-if="tokens.length > 0"> <table> <thead> <tr> <th>{{ \'api_access.table.name\' | translate }}</th> <th>{{ \'api_access.table.token\' | translate }}</th> <th>{{ \'api_access.table.created\' | translate }}</th> <th>{{ \'api_access.table.last_access\' | translate }}</th> <th></th> </tr> </thead> <tbody> <tr data-ng-repeat="token in tokens"> <td><div class="view-api-access--title">{{ token.app_name }}</div></td> <td> <span class="view-api-access--token-id" title="{{ \'api_access.token_ending_hint\' | translate }}"> ••••-{{ token.id }} </span> </td> <td class="view-api-access--meta"> <span data-ng-if="token.date_created">{{ token.date_created | dateShort }}</span> <span data-ng-if="!token.date_created">—</span> </td> <td class="view-api-access--meta"> <span data-ng-if="!token.date_last_access"> {{ \'api_access.last_access.never\' | translate }} </span> <span data-ng-if="token.date_last_access"> {{ token.date_last_access | datetimeShort }} </span> </td> <td class="align-right view-api-access--actions"> <a data-ng-click="revoke(token)" class="icon-trash2 red-color" data-ng-disabled="token.is_revoking" title="{{ \'api_access.confirm.revoke_title\' | translate }}"></a> </td> </tr> </tbody> </table> </div> </div> </div> '),$templateCache.put("views/api-access/api-team-tokens.html",'<div class="view-api-access--container"> <div class="view-api-access--section-header"> <h2>{{ \'api_access.team_tokens.title\' | translate }}</h2> <p>{{ \'api_access.team_tokens.description\' | translate }}</p> </div> <div data-spinner-loading="isLoadingTeamTokens && teamTokens.length === 0" data-message="{{ \'api_access.loading\' | translate }}" style="margin-top: 45px"></div> <div class="explanation empty-state view-api-access--empty" data-ng-if="!isLoadingTeamTokens && teamTokens.length === 0"> <h3>{{ \'api_access.team_tokens.empty_title\' | translate }}</h3> <p>{{ \'api_access.team_tokens.empty_hint\' | translate }}</p> </div> <div class="list-minimal" data-ng-if="teamTokens.length > 0"> <table> <thead> <tr> <th>{{ \'api_access.table.name\' | translate }}</th> <th>{{ \'api_access.team_tokens.owner\' | translate }}</th> <th>{{ \'api_access.table.token\' | translate }}</th> <th>{{ \'api_access.table.created\' | translate }}</th> <th>{{ \'api_access.table.last_access\' | translate }}</th> <th></th> </tr> </thead> <tbody> <tr data-ng-repeat="token in teamTokens"> <td><div class="view-api-access--title">{{ token.app_name }}</div></td> <td class="view-api-access--meta"> {{ token.owner_name || token.owner_email || \'—\' }} </td> <td> <span class="view-api-access--token-id"> ••••-{{ token.id }} </span> </td> <td class="view-api-access--meta"> <span data-ng-if="token.date_created"> {{ token.date_created | dateShort }} </span> <span data-ng-if="!token.date_created">—</span> </td> <td class="view-api-access--meta"> <span data-ng-if="!token.date_last_access"> {{ \'api_access.last_access.never\' | translate }} </span> <span data-ng-if="token.date_last_access"> {{ token.date_last_access | datetimeShort }} </span> </td> <td class="align-right view-api-access--actions"> <a data-ng-click="revokeTeamToken(token)" class="icon-trash2 red-color" data-ng-disabled="token.is_revoking" title="{{ \'api_access.team_tokens.revoke_title\' | translate }}"></a> </td> </tr> </tbody> </table> </div> </div> '),$templateCache.put("views/api-access/api-webhooks-deliveries.html",'<div class="view-api-access--container" data-ng-controller="WebhooksDeliveriesController"> <span data-flag-upgrade-required="WEBHOOK" data-show-long-description="true" data-custom-description="{{ \'webhooks.upgrade_description\' | translate }}" style="display: block; margin-bottom: 12px;"></span> <div data-if-has-feature="WEBHOOK"> <div class="view-api-access--section-header"> <h2>{{ \'webhooks.deliveries.title\' | translate }}</h2> <p>{{ \'webhooks.deliveries.description\' | translate }}</p> </div> <div class="view-webhooks--filters row"> <div class="column-40"> <label>{{ \'webhooks.deliveries.filters.status\' | translate }}</label> <input data-ng-model="deliveryFilters.status" data-ng-change="applyDeliveryFilters()" data-options="deliveryStatusOptions" data-selectize="deliveryStatusSelectizeConfig"> </div> <div class="column-60"> <label>{{ \'webhooks.deliveries.filters.event_type\' | translate }}</label> <input data-ng-model="deliveryFilters.event_type" data-ng-change="applyDeliveryFilters()" data-options="deliveryEventTypeOptions" data-selectize="deliveryEventTypeSelectizeConfig"> </div> </div> <div data-spinner-loading="isLoadingDeliveries && deliveries.length === 0" data-message="{{ \'webhooks.deliveries.loading\' | translate }}" style="margin-top: 45px;"></div> <div class="explanation empty-state view-api-access--empty" data-ng-if="!isLoadingDeliveries && deliveries.length === 0"> <h3>{{ \'webhooks.deliveries.empty_title\' | translate }}</h3> <p>{{ \'webhooks.deliveries.empty_hint\' | translate }}</p> </div> <div class="list-minimal view-webhooks--deliveries-list" data-ng-if="deliveries.length > 0"> <table> <thead> <tr> <th>{{ \'webhooks.deliveries.table.status\' | translate }}</th> <th>{{ \'webhooks.deliveries.table.event_type\' | translate }}</th> <th>{{ \'webhooks.deliveries.table.http_status\' | translate }}</th> <th>{{ \'webhooks.deliveries.table.created\' | translate }}</th> <th></th> </tr> </thead> <tbody> <tr data-ng-repeat="delivery in deliveries"> <td> <span class="view-webhooks--status" data-ng-class="\'view-webhooks--status-\' + delivery.status"> {{ statusLabel(delivery.status) }}
7 </span> </td> <td> <a class="view-webhooks--event-link" data-ng-click="openDeliveryModal(delivery)" title="{{ \'webhooks.deliveries.open_details\' | translate }}"> {{ delivery.event_type }} </a> </td> <td class="view-webhooks--meta"> {{ delivery.http_status || \'—\' }} </td> <td class="view-webhooks--meta"> <span data-ng-if="delivery.created_at"> {{ delivery.created_at | datetimeShort }} </span> <span data-ng-if="!delivery.created_at">—</span> </td> <td class="align-right view-webhooks--actions"> <a title="{{ \'webhooks.deliveries.options.title\' | translate }}" data-dropdown="dropdown-api-webhook-deliveries-{{delivery.id}}" class="grey-color light-blue-on-hover"> <span class="icon-angle-down view-webhooks--actions-caret"></span> </a> <div id="dropdown-api-webhook-deliveries-{{delivery.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="openDeliveryModal(delivery)"> <span>{{ \'webhooks.deliveries.options.view_details\' | translate }}</span> </a> </div> </div> </td> </tr> </tbody> </table> </div> <!-- botão de carregar mais - início --> <div style="text-align: center;" data-ng-if="deliveries.length > 0"> <button data-ng-disabled="isLoadingDeliveries || isLoadingMoreDeliveries || noMoreDeliveries" data-ng-click="loadMoreDeliveries()" style="margin-bottom: 50px; margin-top: 20px; padding: 3px 30px" class="button clean"> {{ isLoadingDeliveries || isLoadingMoreDeliveries ? (\'webhooks.deliveries.loading\' | translate) : (noMoreDeliveries ? (\'webhooks.deliveries.pagination.no_more\' | translate) : (\'webhooks.deliveries.pagination.load_more\' | translate)) }} </button> </div> <!-- botão de carregar mais - fim --> </div> </div> '),$templateCache.put("views/api-access/api-webhooks-subscriptions.html",'<div class="view-api-access--container" data-ng-controller="WebhooksSubscriptionsController"> <span data-flag-upgrade-required="WEBHOOK" data-show-long-description="true" data-custom-description="{{ \'webhooks.upgrade_description\' | translate }}" style="display: block; margin-bottom: 12px;"></span> <div data-if-has-feature="WEBHOOK"> <div class="row view-api-access--section-header-row"> <div class="column-80"> <div class="view-api-access--section-header"> <h2>{{ \'webhooks.subscriptions.title\' | translate }}</h2> <p>{{ \'webhooks.subscriptions.description\' | translate }}</p> </div> </div> <div class="column-20 align-right view-api-access--header-actions"> <button type="button" data-ng-click="openCreateModal()" data-ng-disabled="!canCreateWebhook()" class="button button--blue-brand"> <span class="icon-plus4"></span> {{ \'webhooks.new\' | translate }} </button> </div> </div> <div class="view-api-access--usage view-api-access--usage-webhooks" data-ng-if="usage.limit"> <div class="view-api-access--usage-card" data-ng-class="{ \'view-api-access--usage-card--at-limit\': usage.remaining === 0 }"> <div class="view-api-access--usage-loading" data-spinner-loading="isLoadingSubscriptions && !usage.synced" data-message="{{ \'webhooks.subscriptions.loading\' | translate }}"></div> <div class="view-api-access--usage-header"> <div class="view-api-access--usage-label"> {{ \'webhooks.subscriptions.usage_label\' | translate }} </div> <div class="view-api-access--usage-remaining"> {{ \'webhooks.subscriptions.usage_remaining\' | translate:{count: usage.remaining} }} </div> </div> <div class="view-api-access--usage-value"> {{ usage.current }} / {{ usage.limit }} </div> <div class="view-api-access--usage-progress"> <span data-progress-bar data-progress-bar-style="usage-limit" data-progress-completed="usage.progress"> </span> </div> <div class="view-api-access--usage-meta" data-ng-if="registeredCount() > usage.current"> {{ \'webhooks.subscriptions.usage_registered\' | translate:{count: registeredCount()} }} </div> <div class="view-api-access--usage-meta view-api-access--usage-limit-hint" data-ng-if="usage.remaining === 0"> {{ \'webhooks.subscriptions.usage_limit_hint\' | translate }} </div> </div> </div> <div data-spinner-loading="isLoadingSubscriptions && subscriptions.length === 0" style="margin-top: 45px" data-message="{{ \'webhooks.subscriptions.loading\' | translate }}"></div> <div class="explanation empty-state view-api-access--empty" data-ng-if="!isLoadingSubscriptions && subscriptions.length === 0"> <h3>{{ \'webhooks.subscriptions.empty_title\' | translate }}</h3> <p>{{ \'webhooks.subscriptions.empty_hint\' | translate }}</p> </div> <div class="list-minimal" data-ng-if="subscriptions.length > 0"> <table> <thead> <tr> <th>{{ \'webhooks.subscriptions.table.name\' | translate }}</th> <th>{{ \'webhooks.subscriptions.table.events\' | translate }}</th> <th>{{ \'webhooks.subscriptions.table.enabled\' | translate }}</th> <th>{{ \'webhooks.subscriptions.table.created\' | translate }}</th> <th></th> </tr> </thead> <tbody> <tr data-ng-repeat="subscription in subscriptions"> <td> <a class="view-webhooks--name view-webhooks--name-link" data-ng-click="openEditModal(subscription)" title="{{ \'webhooks.subscriptions.edit\' | translate }}"> {{ subscription.name }} </a> </td> <td> <span class="view-webhooks--meta view-webhooks--events-count" data-ng-if="!(subscription.event_types || []).length">—</span> <span class="view-webhooks--meta view-webhooks--events-count" data-ng-if="(sub
7scription.event_types || []).length" data-tooltip="{{ (subscription.event_types || []).join(\', \') }}" data-tooltip-append-to-body="true"> {{ formatEventTypesCount(subscription.event_types) }} </span> </td> <td> <span data-button-toggle data-ng-model="subscription.enabled" data-disabled="subscription.is_toggling" data-on-change="toggleEnabled(subscription, value)" data-title="{{ \'webhooks.subscriptions.toggle_enabled\' | translate }}"></span> </td> <td class="view-webhooks--meta"> <span data-ng-if="subscription.created_at"> {{ subscription.created_at | dateShort }} </span> <span data-ng-if="!subscription.created_at">—</span> </td> <td class="align-right view-webhooks--actions"> <a title="{{ \'webhooks.subscriptions.options.title\' | translate }}" data-dropdown="dropdown-api-webhooks-{{subscription.id}}" class="grey-color light-blue-on-hover"> <span class="icon-angle-down view-webhooks--actions-caret"></span> </a> <div id="dropdown-api-webhooks-{{subscription.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="openEditModal(subscription)"> <span>{{ \'webhooks.subscriptions.options.edit\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="regenerateSecret(subscription)"> <span>{{ \'webhooks.subscriptions.options.regenerate_secret\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="subscription.enabled"> <a data-ng-click="deactivateSubscription(subscription)"> <span>{{ \'webhooks.subscriptions.options.deactivate\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="!subscription.enabled"> <a data-ng-click="activateSubscription(subscription)"> <span>{{ \'webhooks.subscriptions.options.activate\' | translate }}</span> </a> </div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="deleteSubscription(subscription)" class="red-color-on-hover" data-ng-disabled="subscription.is_deleting"> {{ \'webhooks.subscriptions.options.delete\' | translate }} </a> </div> </div> </td> </tr> </tbody> </table> </div> </div> </div> '),$templateCache.put("views/api-access/webhooks-delivery-modal.html",'<div class="webhooks-delivery-modal"> <div class="modal-header"> <p class="title">{{ \'webhooks.delivery_modal.title\' | translate }}</p> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body"> <div class="detail-row"> <div class="detail-label">{{ \'webhooks.delivery_modal.delivery_status\' | translate }}</div> <div class="detail-value"> <span class="status-badge" data-ng-class="\'status-badge-\' + delivery.status"> {{ statusLabel(delivery.status) }} </span> </div> </div> <div class="detail-row"> <div class="detail-label">{{ \'webhooks.deliveries.table.event_type\' | translate }}</div> <div class="detail-value"><b>{{ delivery.event_type }}</b></div> </div> <div class="detail-row"> <div class="detail-label">{{ \'webhooks.delivery_modal.event_id\' | translate }}</div> <div class="detail-value">{{ delivery.event_log_id || delivery.payload.id || \'—\' }}</div> </div> <div class="detail-row"> <div class="detail-label">{{ \'webhooks.deliveries.table.attempts\' | translate }}</div> <div class="detail-value">{{ delivery.attempts }}</div> </div> <div class="detail-row" data-ng-if="delivery.next_retry_at"> <div class="detail-label">{{ \'webhooks.deliveries.table.next_retry\' | translate }}</div> <div class="detail-value">{{ delivery.next_retry_at | datetimeShort }}</div> </div> <div class="detail-row"> <div class="detail-label">{{ \'webhooks.delivery_modal.origin_date\' | translate }}</div> <div class="detail-value"> <span data-ng-if="delivery.created_at"> {{ delivery.created_at | datetimeShort }} </span> <span data-ng-if="!delivery.created_at">—</span> </div> </div> <div class="detail-row"> <div class="detail-label">{{ \'webhooks.delivery_modal.attempt_date\' | translate }}</div> <div class="detail-value"> <span data-ng-if="delivery.updated_at"> {{ delivery.updated_at | datetimeShort }} </span> <span data-ng-if="!delivery.updated_at">—</span> </div> </div> <div class="detail-section"> <p class="detail-section-title">{{ \'webhooks.delivery_modal.response\' | translate }}</p> <div class="detail-row"> <div class="detail-label">{{ \'webhooks.deliveries.table.http_status\' | translate }}</div> <div class="detail-value">{{ delivery.http_status || \'—\' }}</div> </div> <div data-ng-if="delivery.last_error"> <p class="detail-section-subtitle">{{ \'webhooks.delivery_modal.last_error\' | translate }}</p> <pre class="code-block">{{ delivery.last_error }}</pre> </div> <div data-ng-if="delivery.response_body"> <p class="detail-section-subtitle">{{ \'webhooks.delivery_modal.response_body\' | translate }}</p> <pre class="code-block">{{ delivery.response_body }}</pre> </div> </div> <div class="detail-section"> <p class="detail-section-title">{{ \'webhooks.delivery_modal.payload\' | translate }}</p> <div class="json-tree-panel" data-json-tree="delivery.payload"></div> </div> </div> <div class="modal-footer"> <button type="button" data-ng-click="close()" class="button clean"> {{ \'webhooks.delivery_modal.close\' | translate }} </button> </div> </div> '),$templateCache.put("views/api-access/webhooks-regenerate-secret-modal.html",'<div class="webhooks-regenerate-secret-modal"> <div class="modal-header"> <p class="title">{{ \'webhooks.regenerate_secret_modal.title\' | translate }}</p> </div> <div class="modal-body"> <div class="detail-row"> <div class="detail-label">{{ \'webhooks.modal.name_label\' | translate }}</div> <div class="detail-value">{{ subscription.name }}</div> </div> <div class="detail-row"> <div class="detail-label">{{ \'webhooks.modal.url_label\' | translate }}</div> <div class="detail-value">{{ subscription.url }}</div> </div> <div class="detail-section" data-ng-if="!revealedSecret"> <p class="warning-text">{{ \'webhooks.regenerate_secret_modal.warning\' | translate }}</p> </div> <div class="detail-section" data-ng-if="revealedSecret"> <p class="warning-text">{{ \'webhooks.modal.secret_description\' | translate }}</p> <div id="webhooks-regenerated-secret" class="secret-reveal">{{ revealedSecret }}</div> <div class="secret-reveal-actions">
7 <span data-copy-to-clipboard-button="webhooks-regenerated-secret"></span> </div> <p class="secret-reveal-warning">{{ \'webhooks.modal.secret_warning\' | translate }}</p> </div> </div> <div class="modal-footer"> <div data-ng-if="!revealedSecret"> <button type="button" data-ng-click="close()" data-ng-disabled="isGenerating" class="button clean"> {{ \'webhooks.modal.cancel\' | translate }} </button> <button type="button" data-ng-click="generate()" data-ng-disabled="isGenerating" class="button button--blue-brand"> {{ isGenerating ? (\'webhooks.regenerate_secret_modal.generating\' | translate) : (\'webhooks.regenerate_secret_modal.generate\' | translate) }} </button> </div> <div data-ng-if="revealedSecret"> <button type="button" data-ng-click="close()" class="button button--blue-brand"> {{ \'webhooks.modal.done\' | translate }} </button> </div> </div> </div> '),$templateCache.put("views/api-access/webhooks-subscription-modal.html",'<style> .webhooks-subscription-modal .modal-header {\r\n        padding-top: 30px;\r\n    }\r\n    .webhooks-subscription-modal .modal-header .title {\r\n        font-size: 20px;\r\n        font-weight: bolder;\r\n        line-height: 25px;\r\n    }\r\n    .webhooks-subscription-modal .secret-reveal {\r\n        margin-top: 16px;\r\n        padding: 14px;\r\n        border-radius: 8px;\r\n        background-color: var(--color-grey-disabled);\r\n        border: 1px solid var(--border-color-1-50-opacity);\r\n        word-break: break-all;\r\n        font-family: monospace;\r\n        font-size: 13px;\r\n        line-height: 1.5;\r\n    }\r\n    .webhooks-subscription-modal .secret-reveal-warning {\r\n        margin-top: 12px;\r\n        font-size: 13px;\r\n        line-height: 1.5;\r\n        color: var(--font-color-1-details--90-opacity);\r\n    }\r\n    .webhooks-subscription-modal .secret-reveal-actions {\r\n        margin-top: 12px;\r\n    }\r\n    .webhooks-subscription-modal .secret-reveal-actions .directive-copy-to-clipboard-button .copy-button {\r\n        display: inline-block;\r\n        margin-left: 0;\r\n        padding: 4px 10px;\r\n        font-size: 13px;\r\n    }\r\n    .webhooks-subscription-modal .field-hint {\r\n        margin-top: 8px;\r\n        font-size: 13px;\r\n        color: var(--color-steel);\r\n        line-height: 1.4;\r\n    }\r\n    .webhooks-subscription-modal .field-block {\r\n        margin-bottom: 18px;\r\n    }\r\n    .webhooks-event-option {\r\n        padding: 4px 0;\r\n        line-height: 1.35;\r\n    }\r\n    .webhooks-event-option__title {\r\n        display: flex;\r\n        flex-wrap: wrap;\r\n        align-items: baseline;\r\n        gap: 6px;\r\n    }\r\n    .webhooks-event-option__code {\r\n        font-size: 12px;\r\n        color: var(--color-steel);\r\n        font-family: Consolas, Monaco, monospace;\r\n    }\r\n    .webhooks-event-option__description {\r\n        margin-top: 2px;\r\n        font-size: 12px;\r\n        color: var(--color-steel);\r\n    } </style> <div class="webhooks-subscription-modal"> <div class="modal-header"> <p class="title" data-ng-if="!revealedSecret && !isEdit">{{ \'webhooks.modal.create_title\' | translate }}</p> <p class="title" data-ng-if="!revealedSecret && isEdit">{{ \'webhooks.modal.edit_title\' | translate }}</p> <p class="title" data-ng-if="revealedSecret">{{ \'webhooks.modal.secret_title\' | translate }}</p> </div> <div class="modal-body" data-on-click-enter="!revealedSecret && save()"> <div data-ng-if="!revealedSecret"> <div class="field-block"> <label>{{ \'webhooks.modal.name_label\' | translate }}</label> <input type="text" data-ng-model="form.name" placeholder="{{ \'webhooks.modal.name_placeholder\' | translate }}" autofocus> </div> <div class="field-block"> <label>{{ \'webhooks.modal.url_label\' | translate }}</label> <input type="url" data-ng-model="form.url" placeholder="{{ \'webhooks.modal.url_placeholder\' | translate }}"> <!--                <sub class="field-hint">{{ \'webhooks.modal.url_hint\' | translate }}</sub>--> </div> <div class="field-block"> <label>{{ \'webhooks.modal.event_types_label\' | translate }}</label> <input data-ng-model="form.event_types" data-options="eventTypeOptions" data-selectize="eventTypesSelectizeConfig"> <sub class="field-hint">{{ \'webhooks.modal.event_types_hint\' | translate }}</sub> </div> <div class="field-block" data-ng-if="!isEdit"> <label>{{ \'webhooks.modal.secret_label\' | translate }}</label> <input type="text" data-ng-model="form.secret" placeholder="{{ \'webhooks.modal.secret_placeholder\' | translate }}"> <sub class="field-hint">{{ \'webhooks.modal.secret_hint\' | translate }}</sub> </div> </div> <div data-ng-if="revealedSecret"> <p style="line-height: 1.4">{{ \'webhooks.modal.secret_description\' | translate }}</p> <div id="webhooks-revealed-secret" class="secret-reveal">{{ revealedSecret }}</div> <div class="secret-reveal-actions">
7 <span data-copy-to-clipboard-button="webhooks-revealed-secret"></span> </div> <p class="secret-reveal-warning">{{ \'webhooks.modal.secret_warning\' | translate }}</p> </div> </div> <div class="modal-footer"> <div data-ng-if="!revealedSecret"> <button type="button" data-ng-click="close()" class="button clean"> {{ \'webhooks.modal.cancel\' | translate }} </button> <button type="button" data-ng-click="save()" data-ng-disabled="isSaving || !canSave()" class="button button--blue-brand"> {{ isSaving ? (\'webhooks.modal.saving\' | translate) : (isEdit ? (\'webhooks.modal.save\' | translate) : (\'webhooks.modal.create\' | translate)) }} </button> </div> <div data-ng-if="revealedSecret"> <button type="button" data-ng-click="close()" class="button button--blue-brand"> {{ \'webhooks.modal.done\' | translate }} </button> </div> </div> </div> '),$templateCache.put("views/custom-fields/custom-fields-edit.html",'<div class="view-custom-fields-edit modal__with-tabs"> <div class="modal-header"> <div> <h1>{{custom_field.id ? (\'custom_fields.edit.title_edit\' | translate) : (\'custom_fields.edit.title_new\' | translate)}}</h1> <div class="modal-header--details"> {{ \'custom_fields.edit.entity_label\' | translate:{entity: $customFieldService.getEntityName(custom_field.entity)} }} <span>{{getHistoryDescription()}}</span> </div> </div> <div> <a class="icon-cross" data-ng-click="close()"></a> </div> <nav data-app-tabs data-tabs="customFieldEditTabs" data-selected="tabSelected"> </nav> </div> <div class="modal-body" data-on-click-enter="save()"> <div data-ng-if="tabSelected === \'main\'"> <div class="row"> <div class="column-50"> <label>{{ \'custom_fields.edit.name\' | translate }}</label> <input type="text" data-ng-model="custom_field.name" autofocus="autofocus"> </div> <div class="column-50"> <label>{{ \'custom_fields.edit.type\' | translate }}</label> <div class="selectize-custom-field-type-container"> <select data-ng-model="custom_field.type" data-options="$customFieldService.TYPES" data-ng-disabled="custom_field.id" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'id\',\r\n                            searchField: \'name\',\r\n                            dropdownParent: \'body\',\r\n                            placeholder: (\'custom_fields.edit.type_placeholder\' | translate),\r\n                            render: render_types,\r\n                            onChange: onChangeFieldType\r\n                    }"></select> </div> </div> </div> <div data-ng-if="options.description_visible"> <div class="column-100"> <label>{{ \'custom_fields.edit.description\' | translate }}</label> <textarea data-ng-model="custom_field.description" style="max-width: 100%; min-height: 60px;"></textarea> </div> </div> <div class="row" style="margin-top: 5px; margin-bottom: 20px;" data-ng-if="options.description_visible != true"> <a class="link-dashed" data-ng-click="options.description_visible = true"> <span class="icon-plus4" style="margin-right: 5px; font-size: 13px;"></span> <span>{{ \'custom_fields.edit.add_description\' | translate }}</span> </a> </div> <div class="row element-todo-checkbox" style="margin-bottom: 10px; margin-top: 15px;"> <label style="margin-bottom: 5px;"> <input type="checkbox" data-ng-check data-ng-model="custom_field.required" data-ng-true-value="true" data-ng-false-value="false"> <span>{{ \'custom_fields.edit.required\' | translate }}</span> </label> </div> <!--            <div class="row element-todo-checkbox" style="margin-bottom: 10px;">--> <!--                <label style="margin-bottom: 5px;">--> <!--                    <input type="checkbox"--> <!--                           data-ng-check--> <!--                           data-ng-model="custom_field.restricted"--> <!--                           data-ng-true-value="true"--> <!--                           data-ng-false-value="false">--> <!--                    <span data-tooltip-html="\'--> <!--                Use <b>Limitar</b> para controlar quem pode visualizar e preencher esse campo.--> <!--                Por padrão, todos podem visualizar.--> <!--                \'">Limitar visualização do campo</span>--> <!--                </label>--> <!--                <div data-ng-if="custom_field.restricted" style="margin-top: 10px">--> <!--                    <label>Qual perfil pode visualizar e preencher esse campo</label>--> <!--                    <div>--> <!--                        <input data-ng-model="user.role"--> <!--                               data-options="::$permissionService.getRoles()"--> <!--                               data-selectize="{--> <!--                                labelField: \'name\',--> <!--                                valueField: \'id\',--> <!--                                sortField: \'name\',--> <!--                                searchField: \'name\',--> <!--                                dropdownParent: \'body\',--> <!--                                placeholder: \'Selecione um perfil ou mais\',--> <!--                                plugins: [\'remove_button\'],--> <!--                            }">--> <!--                    </div>--> <!--                </div>--> <!--            </div>--> <div data-ng-if="custom_field.type == \'enum\'"> <div class="row" style="padding-top: 15px; padding-bottom: 5px;"> <div class="column-50"> <label>{{ \'custom_fields.edit.enum_options.label\' | translate }}</label> </div> <div class="column-50 align-right"> <a class="link underline" data-ng-click="add_enum_option()" style="font-size: 13px; position: relative; top: 3px;"> <span class="icon-plus4" style="margin-right: 5px; font-size: 10px;"></span> <span>{{ \'custom_fields.edit.enum_options.add_option\' | translate }}</span> </a> </div> </div> <div data-ng-if="(custom_field.enum_options | filter : { deleted: \'!true\', active: true }).length == 0" class="center bolder grey-color" style="padding: 25px 0 20px;"> {{ \'custom_fields.edit.enum_options.no_active_options\' | translate }} </div> <div class="list-enum-options" data-ng-repeat=" enum_option_group in custom_field.enum_options | filter : { deleted: \'!true\' } | orderBy: \'-active\' | groupBy: \'active\'"> <div data-ng-if="enum_option_group.group_name == false" style="padding: 5px 2px 10px;"> <a class="details has-itens-below" data-ng-checked="options.archived_enum_options_visible" data-ng-click="options.archived_enum_options_visible = !options.archived_enum_options_visible"> {{ \'custom_fields.edit.enum_options.archived_options\' | translate:{count: enum_option_group.items.length} }} </a> </div> <table data-ng-if="enum_option_group.group_name == true || options.archived_enum_options_visible"> <tr data-ng-repeat="enum_option in enum_option_group.items"> <td class="name-column"> <input type="text" data-ng-model="enum_option.name" data-autofocus-if-empty data-on-cl
7ick-enter="add_enum_option()" data-ng-paste="onPasteEnumOption($event)" placeholder="{{ \'custom_fields.edit.enum_options.placeholder\' | translate }}"> </td> <td class="actions-column"> <a title="{{ \'custom_fields.edit.enum_options.archive_option\' | translate }}" data-dropdown="dropdown-enum-option-{{enum_option.id}}" class="grey-color light-blue-on-hover"> <span class="icon-angle-down" style="font-size: 18px;"></span> </a> <div data-ng-if="enum_option.warning" class="warning-label flag orange-color">{{ \'custom_fields.edit.enum_options.warning_\' + enum_option.warning_key | translate }} </div> <div id="dropdown-enum-option-{{enum_option.id}}" data-dropdown-content class="f-dropdown dropdown-option-list dropdown-right" dropdown-close-on-click> <div data-ng-if="enum_option.id"> <div class="dropdown-option option-button" data-ng-if="enum_option.active == true"> <a data-ng-click="archive_enum_option(enum_option)"> {{ \'custom_fields.edit.enum_options.archive_option\' | translate }} </a> </div> <div class="dropdown-option option-button" data-ng-if="enum_option.active == false"> <a data-ng-click="active_enum_option(enum_option)"> {{ \'custom_fields.edit.enum_options.reactivate_option\' | translate }} </a> </div> <hr> </div> <div class="dropdown-option option-button" data-ng-if="enum_option.delete_blocked != true"> <a data-ng-click="remove_enum_option(enum_option)" class="red-color-on-hover"> {{ \'custom_fields.edit.enum_options.delete_option\' | translate }} </a> </div> </div> </td> </tr> </table> </div> </div> <div class="modal--bottom-permission-note"> <span class="icon-lock_outline"></span> <span>{{ \'custom_fields.edit.admin_only\' | translate }}</span> </div> </div> <div data-ng-if="tabSelected === \'advanced\'"> <!--            <div class="row element-todo-checkbox" style="margin-bottom: 10px; margin-top: 15px;">--> <!--                <label style="margin-bottom: 5px;">--> <!--                    <input type="checkbox"--> <!--                           data-ng-check--> <!--                           data-ng-model="custom_field.add_to_all_projects"--> <!--                           data-ng-true-value="true"--> <!--                           data-ng-false-value="false">--> <!--                    <span>Adicionar automaticamente em todos os projetos</span>--> <!--                </label>--> <!--                <div class="view-custom-fields-edit&#45;&#45;clarify-message">--> <!--                    Por padrão, campos de registros de horas são adicionados a todos os projetos.--> <!--                    Deixe desmarcado para adicionar manualmente o campo a cada projeto.--> <!--                </div>--> <!--            </div>--> <div class="row element-todo-checkbox" style="margin-bottom: 10px;"> <label style="margin-bottom: 5px;"> <input type="checkbox" data-ng-check data-ng-model="custom_field.is_restricted" data-ng-click="onClickIsRestricted()" data-ng-true-value="true" data-ng-false-value="false"> <span>{{ \'custom_fields.edit.limit_access\' | translate }}</span> </label> <div class="view-custom-fields-edit--clarify-message"> {{ \'custom_fields.edit.limit_access_description\' | translate }} </div> <div data-ng-if="custom_field.is_restricted" style="margin-top: 15px"> <label>{{ \'custom_fields.edit.restricted_roles_label\' | translate }}</label> <input data-ng-model="custom_field.restricted_roles" data-options="::$permissionService.getRoles()" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'id\',\r\n                            sortField: \'name\',\r\n                            searchField: \'name\',\r\n                            dropdownParent: \'body\',\r\n                            placeholder: (\'custom_fields.edit.restricted_roles_placeholder\' | translate),\r\n                            plugins: [\'remove_button\'],\r\n                            onDelete: onDeleteRestrictedRoles\r\n                        }"> </div> </div> </div> </div> <div class="modal-footer"> <button data-ng-click="close()" class="button clean" style="margin-right: 5px;" data-ng-hide="saving">{{ \'custom_fields.edit.cancel\' | translate }} </button> <button data-ng-click="save()" data-ng-disabled="!custom_field.name || saving" class="button button--blue-brand"> <span>{{ saving ? (\'custom_fields.edit.saving\' | translate) : (\'custom_fields.edit.save\' | translate) }}</span> </button> </div> </div> '),
8$templateCache.put("views/custom-fields/custom-fields.html",'<div class="view radiu
8s content-register-edit view-custom-fields"> <div class="view-content-account--header-container"> <h1 style="margin-bottom: 5px;"> <span>{{ \'custom_fields.title\' | translate }}</span> </h1> </div> <div> <span data-flag-upgrade-required="CUSTOM_FIELDS" data-show-long-description="true" data-custom-description="{{ \'custom_fields.create_upgrade_description\' | translate }}" style="margin-top: 0; margin-bottom: 5px"></span> </div> <nav data-app-tabs class="view-custom-fields__tabs" data-tabs="customFieldTabs" data-selected="options.entity_selected" data-nav-padding-left="0px" data-tab-margin-left="0px" data-tab-margin-right="26px" data-on-change="onCustomFieldEntityTabChange()"> </nav> <div class="view-custom-fields--content"> <div class="row" style="margin-bottom: 40px; margin-top: 30px;" data-ng-if="options.entity_selected !== \'all\'"> <button data-ng-click="add(options.entity_selected)" class="button clean"> <span class="icon-plus4"></span> <span style="margin-left: 2px;">{{ \'custom_fields.create_in_entity\' | translate:{entity: $customFieldService.getTranslationEntity(options.entity_selected)} }}</span> </button> </div> <!--    <div data-ng-if="customFieldGroups[options.entity_selected].active.length === 0"--> <!--         class="center bolder steel-color"--> <!--         style="margin: 60px 0 40px;">--> <!--        Não existem campos personalizados ativos--> <!--        <span data-ng-if="options.entity_selected !== \'all\'" style="text-transform: lowercase;">--> <!--            em {{$customFieldService.getTranslationEntity(options.entity_selected)}}--> <!--        </span>--> <!--    </div>--> <div> <div data-ng-repeat="status in [\'active\', \'archived\']"> <!--        <div class="list-minimal"--> <!--             data-ng-repeat="custom_field_group in customFieldGroups[options.entity_selected].active | orderBy: \'-active\' | groupBy: \'active\'">--> <div data-ng-if="status === \'active\' && customFieldGroups[options.entity_selected].active.length === 0" class="center bolder steel-color" style="margin: 60px 0 40px;"> {{ \'custom_fields.no_active_fields\' | translate:{entity: $customFieldService.getTranslationEntity(options.entity_selected)} }} </div> <div data-ng-if="status === \'archived\' && customFieldGroups[options.entity_selected].archived.length > 0" style="padding: 20px 10px;"> <a class="details has-itens-below" data-ng-checked="options.archived_custom_fields_visible" data-ng-click="options.archived_custom_fields_visible = !options.archived_custom_fields_visible"> {{ \'custom_fields.archived_label\' | translate:{count: customFieldGroups[options.entity_selected].archived.length} }} </a> </div> <!--            <div data-ng-if="custom_field_group.group_name == false" style="padding: 20px 10px;">--> <!--                <a class="details has-itens-below"--> <!--                   data-ng-checked="options.archived_custom_fields_visible"--> <!--                   data-ng-click="options.archived_custom_fields_visible = !options.archived_custom_fields_visible">--> <!--                    Arquivados ({{custom_field_group.items.length}})--> <!--                </a>--> <!--            </div>--> <!--            <table data-ng-if="custom_field_group.group_name == true || options.archived_custom_fields_visible">--> <div class="list-minimal" data-ng-if="status === \'active\' || options.archived_custom_fields_visible"> <table> <!--                <tr data-ng-repeat="custom_field in custom_field_group.items | orderBy : \'name\'"--> <!--                    data-ng-class="{ \'archived\' : custom_field.active == false }">--> <tr data-ng-repeat="custom_field in customFieldGroups[options.entity_selected][status] | orderBy : \'name\'" data-ng-class="{ \'archived\' : status === \'archived\' }"> <td> <span class="view-custom-fields--column-large-icon"> <span class="{{$customFieldService.getTypeIcon(custom_field.type)}}"></span> <span>{{ $customFieldService.getTypeName(custom_field.type) }}</span> </span> </td> <td> <div class="bolder"> <a data-ng-click="edit_custom_field(custom_field)" class="light-blue-on-hover">{{ custom_field.name }}</a> <span class="view-custom-fields--archived" data-ng-if="custom_field.active == false">{{ \'custom_fields.archived_status\' | translate }}</span> </div>
8 <div class="view-custom-fields--details"> <span>{{ \'custom_fields.visible_to\' | translate }}</span> <strong>{{getRestrictedRolesDescription(custom_field)}}</strong> <span>{{ \'custom_fields.with_access_to\' | translate }}</span> <strong style="text-transform: lowercase">{{$customFieldService.getTranslationEntity(custom_field.entity)}}</strong> </div> </td> <td class="align-right actions-column"> <a title="{{ \'custom_fields.edit_field\' | translate }}" data-dropdown="dropdown-custom-field-{{custom_field.id}}" class="grey-color light-blue-on-hover"> <span class="icon-angle-down" style="font-size: 18px;"></span> </a> <div id="dropdown-custom-field-{{custom_field.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="edit_custom_field(custom_field)"> <span>{{ \'custom_fields.edit_field\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="custom_field.active == true"> <a data-ng-click="archive_custom_field(custom_field)"> {{ \'custom_fields.archive_field\' | translate }} </a> </div> <div class="dropdown-option option-button" data-ng-if="custom_field.active == false"> <a data-ng-click="active_custom_field(custom_field)"> {{ \'custom_fields.reactivate_field\' | translate }} </a> </div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="remove_custom_field(custom_field)" class="red-color-on-hover"> {{ \'custom_fields.delete_field\' | translate }} </a> </div> </div> </td> </tr> </table> </div> </div> </div> </div> </div> '),$templateCache.put("views/custom-fields/generate-custom-fields-element.html",'<div class="generate-custom-fields-element--container"> <div data-ng-switch="customField.type"> <div data-ng-switch-when="date"> <div data-button-date="entityModel[\'custom_fields\'][customField.id]" data-on-change="revalidate"></div> </div> <div data-ng-switch-when="enum"> <select data-options="$enumOptionService.getActiveByCustomField(customField.id, entityModel[\'custom_fields\'][customField.id])" data-ng-model="entityModel[\'custom_fields\'][customField.id]" data-selectize="{\r\n                    labelField: \'name\',\r\n                    valueField: \'id\',\r\n                    sortField: \'name\',\r\n                    searchField: \'name\',\r\n                    dropdownParent: \'body\',\r\n                    onChange: revalidate,\r\n                    placeholder: placeholder,\r\n                    createFilter: hasEditPermission,\r\n                    create: openEditAtList(),\r\n                    render: selectize_render\r\n            }"></select> </div> <div data-ng-switch-when="money"> <div data-input-money="entityModel[\'custom_fields\'][customField.id]" data-on-change="revalidate"></div> </div> <div data-ng-switch-when="numeric"> <input type="text" data-ng-mask="number" placeholder="{{placeholder | translate}}" data-ng-model="entityModel[\'custom_fields\'][customField.id]" data-ng-change="revalidate()"> </div> <div data-ng-switch-when="time"> <div class="input-suffix-inside--container"> <input type="text" id="generate-custom-fields--custom-field-{{customField.id}}" placeholder="00:00" data-ng-model="entityModel[\'custom_fields\'][customField.id]" data-ng-change="revalidate()" data-ng-mask="time_interval"> <label class="input-suffix-inside--label-suffix" for="generate-custom-fields--custom-field-{{customField.id}}">hh:mm</label> </div> </div> <div data-ng-switch-default> <input type="text" placeholder="{{placeholder | translate}}" data-ng-model="entityModel[\'custom_fields\'][customField.id]" data-ng-change="revalidate()"> </div> </div> </div> '),$templateCache.put("views/custom-fields/generate-custom-fields-form.html",'<div class="generate-custom-fields--container" if-has-feature="CUSTOM_FIELDS"> <div ng-repeat="custom_field in $customFieldService.getActiveByEntity(entityName) | orderBy: \'name\'" class="generate-custom-fields--type-{{custom_field.type}}"> <label data-ng-if="shouldShowLabel" data-ng-class="{\'label-dashed\' : custom_field.description}" data-tooltip-append-to-body="true" data-tooltip-placement="top" data-tooltip-html="\'\r\n                <div><strong>{{custom_field.name}}</strong></div>\r\n                <div>{{custom_field.description | translate}}</div>\'"> <span data-ng-class="{ \'label-required\': custom_field.required }" class="overflow-ellipsis" style="max-width: 100%;">{{custom_field.name}}</span> </label> <div data-ng-class="{\'has-error\': errors[\'custom_field_\' + custom_field.id] }"> <div generate-custom-fields-element="custom_field" data-model="model" data-revalidate="revalidate"></div> <sub>{{ errors[\'custom_field_\' + custom_field.id] | translate }}</sub> </div> </div> </div> '),$templateCache.put("views/customers/contractors-edit.html",'<div class="view-contractor-edit"> <div class="modal-header"> <h1>{{ contractor.id ? \'Editar\' : \'Novo\' }} contrantante</h1> <div>
8CLIENTE {{customer.name}}</div> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body" data-on-click-enter="save()"> <div class="row"> <label>Nome:</label> <input type="text" data-ng-model="contractor.name" autofocus="autofocus"> </div> <div class="row"> <label>CNPJ:</label> <input type="text" data-ng-model="contractor.cnpj" data-ng-mask="cnpj" placeholder="00.000.000/0000-00"> </div> <!-- Inclui campos personalizados --> <div data-generate-custom-fields-form data-entity="contractors" data-model="contractor" data-errors="errors" data-revalidate="revalidate"></div> </div> <div class="modal-footer"> <div data-ng-if="!contractor.id"> <label class="checkbox-to-save-and-new"> <span>Deixe marcado para criar mais um contratante em seguida</span> <input type="checkbox" data-ng-model="options.save_and_new"> </label> </div> <div> <button data-ng-click="close()" class="button clean" style="margin-right: 5px;" data-ng-hide="saving">Cancelar</button> <button data-ng-click="save()" data-ng-disabled="!contractor.name || saving" class="button button--blue-brand"> <span>{{ saving ? \'Salvando contratante...\' : \'Salvar contratante\' }}</span> </button> </div> </div> </div> '),$templateCache.put("views/customers/customers-edit.html",'<div class="view-customer-edit"> <div class="modal-header"> <h1>{{customer.id ? (\'customers.edit.title_edit\' | translate) : (\'customers.edit.title_new\' | translate)}}</h1> <a class="icon-cross" data-ng-click="close()" data-tooltip="{{ \'customers.edit.close_tooltip\' | translate }}" data-tooltip-append-to-body="true"></a> <span custom-fields-menu-modal data-entity="customers" data-close="close"> </span> </div> <div class="modal-body" data-on-click-enter="save()"> <div class="row"> <label>{{ \'customers.edit.name_label\' | translate }}</label> <input type="text" data-ng-model="customer.name" autofocus="autofocus"> </div> <div class="row" data-ng-if="options.observation_visible"> <label>{{ \'customers.edit.observation_label\' | translate }}</label> <textarea data-ng-model="customer.observation" style="max-width: 100%; min-height: 95px;"></textarea> </div> <div class="row" style="margin-top: 5px; margin-bottom: 20px;" data-ng-if="!options.observation_visible"> <a class="link-dashed" data-ng-click="options.observation_visible = true"> <span class="icon-plus4" style="margin-right: 5px; font-size: 10px;"></span> <span>{{ \'customers.edit.add_observation\' | translate }}</span> </a> </div> <div class="row" data-ng-if="contact_fields_visible || customer.email"> <label>{{ \'customers.edit.email_label\' | translate }}</label> <input type="text" data-ng-model="customer.email" placeholder="[email protected]"> </div> <div class="row" data-ng-if="contact_fields_visible || customer.phone || customer.phone2 || customer.phone3"> <label>{{ \'customers.edit.phone_label\' | translate }}</label> <div class="row"> <div class="column-1-of-2"> <input type="text" data-ng-model="customer.phone" data-ng-mask="phone" placeholder="(00) 0000-0000"> </div> <div class="column-1-of-2"> <input type="text" data-ng-model="customer.phone2" data-ng-mask="phone" placeholder="(00) 0000-0000"> </div> </div> </div> <div class="row" style="margin-bottom: 20px;"> <div> <a class="link-dashed" data-ng-click="contact_fields_visible = !contact_fields_visible">{{ contact_fields_visible ? (\'customers.edit.hide_contact\' | translate) : (\'customers.edit.show_contact\' | translate) }}</a> </div> </div> <div class="row" data-ng-if="address_fields_visible || customer.city || customer.state || customer.country"> <label>{{ \'customers.edit.address_label\' | translate }}</label> <div class="row"> <div class="column-1-of-3"> <input type="text" data-ng-model="customer.city" placeholder="{{ \'customers.edit.city_placeholder\' | translate }}" title="{{ \'customers.edit.city_placeholder\' | translate }}"> </div> <div class="column-1-of-3"> <input type="text" data-ng-model="customer.state" placeholder="{{ \'customers.edit.state_placeholder\' | translate }}" title="{{ \'customers.edit.state_placeholder\' | translate }}"> </div> <div class="column-1-of-3"> <input type="text" data-ng-model="customer.country" placeholder="{{ \'customers.edit.country_placeholder\' | translate }}" title="{{ \'customers.edit.country_placeholder\' | translate }}"> </div> </div> </div> <div class="row" data-ng-if="address_fields_visible || customer.address"> <input type="text" data-ng-model="customer.address" placeholder="{{ \'customers.edit.address_placeholder\' | translate }}" title="{{ \'customers.edit.address_placeholder\' | translate }}"> </div> <div class="row" style="margin-bottom: 20px;"> <div> <a class="link-dashed" data-ng-click="address_fields_visible = !address_fields_visible">{{ address_fields_visible ? (\'customers.edit.hide_address\' | translate) : (\'customers.edit.show_address\' | translate) }}</a> </div> </div> <!-- Inclui campos personalizados --> <div data-generate-custom-fields-form data-entity="customers" data-model="customer" data-errors="errors" data-revalidate="revalidate"> </div> </div> <div class="modal-footer"> <div data-ng-if="!customer.id"> <label class="checkbox-to-save-and-new"> <span>{{ \'customers.edit.save_and_new\' | translate }}</span> <input type="checkbox" data-ng-model="options.save_and_new"> </label> </div> <div> <button data-ng-click="close()" class="button clean" style="margin-right: 5px;" data-ng-hide="saving">{{ \'customers.edit.cancel\' | translate }}</button> <button data-ng-click="save()" data-ng-disabled="!customer.name || saving" class="button button--blue-brand"> <span>{{ saving ? (\'customers.edit.saving\' | translate) : (\'customers.edit.save\' | translate) }}</span> </button> </div> </div> </div> '),$templateCache.put("views/customers/customers.html",'<div class="view radiu
8s content-register-edit"> <div class="row view-content-account--header-container"> <h1> <span>{{ \'customers.title\' | translate }}</span> </h1> <ul class="toolbar right"> <li> <button data-ng-click="edit_customer()" class="button button--blue-brand"> <span class="icon-plus4"></span> <span>{{ \'customers.create\' | translate }}</span> </button> </li> </ul> </div> <div data-ng-if="!customers" spinner-loading="loading" data-message="{{ \'customers.loading\' | translate }}" style="margin-top: 25px; margin-bottom: 25px;"></div> <div class="explanation empty-state" data-ng-if="customers.length === 0" style="border-top: solid 1px #eee; padding-top: 50px; margin: 0px;"> <h3>{{ \'customers.empty_state.title\' | translate }}</h3> {{ \'customers.empty_state.description\' | translate }}<br> </div> <div class="list-minimal" data-ng-if="customers.length > 0"> <table> <tbody data-ng-repeat="customer in customers | orderBy : \'name\'" disable-all="customer.deleting"> <tr> <td> <a class="bolder light-blue-on-hover" data-ng-click="edit_customer(customer)">{{customer.name}}</a> </td> <td> <span class="flag" data-ng-if="customer.active==false">{{ \'customers.archived\' | translate }}</span> </td> <td class="align-right"> <a title="{{ \'customers.options.title\' | translate }}" data-dropdown="dropdown-customers-{{customer.id}}" class="grey-color light-blue-on-hover"> <span class="icon-angle-down" style="font-size: 18px;"></span> </a> <div id="dropdown-customers-{{customer.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="edit_customer(customer)"> <span>{{ \'customers.options.edit\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="customer.active == true"> <a data-ng-click="archive_customer(customer)"> <span>{{ \'customers.options.archive\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="customer.active == false"> <a data-ng-click="active_customer(customer)"> <span>{{ \'customers.options.reactivate\' | translate }}</span> </a> </div> <!--                            <div if-has-feature="CONTRACTORS">--> <!--                                <div data-ng-if="$permissionService.hasPermissionToEditContractors()">--> <!--                                    <hr>--> <!--                                    <div class="dropdown-option option-button">--> <!--                                        <a data-ng-click="create_contractor(customer)">--> <!--                                            <span>Criar contratante</span>--> <!--&lt;!&ndash;                                            <span class="flag yellow-color" style="margin-left: 10px;" data-if-free-plan>PRO</span>&ndash;&gt;--> <!--                                        </a>--> <!--                                    </div>--> <!--                                </div>--> <!--                            </div>--> <hr> <div class="dropdown-option option-button"> <a data-ng-click="remove_customer(customer)" class="red-color-on-hover"> {{ \'customers.options.delete\' | translate }} </a> </div> </div> </td> </tr> <!--                <tr class="list-minimal-sublist" data-ng-repeat="contractor in customer.contractors | orderBy : \'name\'">--> <!--                    <td>--> <!--                        <a class="light-blue-on-hover"--> <!--                           data-ng-click="edit_contractor(contractor)">{{contractor.name}}</a>--> <!--                    </td>--> <!--                    <td>--> <!--                        <span class="flag" data-ng-if="contractor.active==false">Arquivado</span>--> <!--                    </td>--> <!--                    <td class="align-right">--> <!--                        <div data-ng-if="$permissionService.hasPermissionToEditContractors()">--> <!--                            <a title="Opções" data-dropdown="dropdown-contractors-{{contractor.id}}"--> <!--                               class="grey-color light-blue-on-hover">--> <!--                                <span class="icon-angle-down"--> <!--                                      style="font-size: 18px;"></span>--> <!--                            </a>-->
8 <!--                            <div id="dropdown-contractors-{{contractor.id}}" data-dropdown-content--> <!--                                 class="f-dropdown dropdown-option-list" dropdown-close-on-click>--> <!--                                <div class="dropdown-option option-button">--> <!--                                    <a data-ng-click="edit_contractor(contractor)">--> <!--                                        <span>Editar contratante</span>--> <!--                                    </a>--> <!--                                </div>--> <!--                                <div class="dropdown-option option-button" data-ng-if="contractor.active == true">--> <!--                                    <a data-ng-click="archive_contractor(contractor)">--> <!--                                        Arquivar contratante--> <!--                                    </a>--> <!--                                </div>--> <!--                                <div class="dropdown-option option-button" data-ng-if="contractor.active == false">--> <!--                                    <a data-ng-click="active_contractor(contractor)">--> <!--                                        Reativar contratante--> <!--                                    </a>--> <!--                                </div>--> <!--                                <hr>--> <!--                                <div class="dropdown-option option-button">--> <!--                                    <a data-ng-click="remove_contractor(contractor)" class="red-color-on-hover">--> <!--                                        Excluir contratante--> <!--                                    </a>--> <!--                                </div>--> <!--                            </div>--> <!--                        </div>--> <!--                    </td>--> <!--                </tr>--> </tbody> </table> </div> </div> '),$templateCache.put("views/design-system/design-system.html",'<div class="design-system view" data-ng-if="isAuthorized"> <nav class="design-system__sidebar"> <h1 class="design-system__sidebar-title">Design System</h1> <p class="design-system__sidebar-subtitle">Catálogo interno Rabbiit</p> <div class="design-system__nav-group" data-ng-repeat="section in sections"> <button type="button" class="design-system__nav-item" data-ng-class="{\'is-active\': activeSection === section.id && !activeNavItem}" data-ng-click="scrollToSection(section.id)"> {{ section.label }} </button> <div class="design-system__nav-submenu" data-ng-if="section.items"> <button type="button" class="design-system__nav-item design-system__nav-item--sub" data-ng-repeat="item in section.items" data-ng-class="{\'is-active\': activeNavItem === item.id}" data-ng-click="scrollToNavItem(item.id, section.id)"> {{ item.label }} </button> </div> </div> </nav> <main class="design-system__content"> <section data-ng-repeat="section in sections" id="ds-{{ section.id }}" class="design-system__section"> <div data-ng-include="section.template"></div> </section> </main> </div> <div class="design-system__unauthorized" data-ng-if="!isAuthorized"> Acesso restrito. </div> '),$templateCache.put("views/design-system/format-preferences-panel.html",'<section class="design-system__format-panel"> <div class="design-system__format-panel-header"> <div> <h2 class="design-system__format-panel-title">Preferências de formato</h2> <p class="design-system__format-panel-desc"> Preview ao vivo — mesmas opções de <a data-app-href="#/profile">Perfil</a> e <a data-app-href="#/account-settings">Conta</a>. Alterações valem na sessão até restaurar. </p> </div> <button type="button" class="button clean" data-ng-click="resetFormatPreferences()"> Restaurar salvas </button> </div> <div class="design-system__format-panel-grid"> <div> <label>Idioma</label> <select data-ng-model="$prefsService.preferences.profile_language" data-options="languages" data-selectize="{\r\n                        valueField: \'id\',\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\',\r\n                        onChange: onDesignSystemLanguageChange\r\n                    }"></select> </div> <div> <label>Moeda (conta)</label> <select data-ng-model="$settingsService.settings.general_settings_currency" data-options="currencies" data-selectize="{\r\n                        valueField: \'id\',\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\',\r\n                        onChange: onDesignSystemCurrencyChange\r\n                    }"></select> </div> <div> <label>Formato da moeda</label> <select data-ng-model="$settingsService.settings.general_settings_currency_display_format" data-options="currencyDisplayFormats" data-selectize="{\r\n                        valueField: \'id\',\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\'\r\n                    }"></select> </div> <div> <label>Formato numérico</label> <select data-ng-model="$prefsService.preferences.profile_number_format" data-options="numberFormats" data-selectize="{\r\n                        valueField: \'id\',\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\',\r\n                        onChange: onDesignSystemNumberFormatChange\r\n                    }"></select> </div> <div> <label>Formato de data</label> <select data-ng-model="$prefsService.preferences.profile_date_format" data-options="dateFormats" data-selectize="{\r\n                        valueField: \'id\',\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\'\r\n                    }"></select> </div> <div> <label>Tempo (padrão)</label> <select data-ng-model="$prefsService.preferences.profile_default_time_format" data-options="timeDurationFormats" data-selectize="{\r\n                        valueField: \'id\',\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\'\r\n                    }"></select> </div> <div> <label>Tempo (relatórios)</label> <select data-ng-model="$prefsService.preferences.profile_report_time_format" data-options="timeDurationFormats" data-selectize="{\r\n                        valueField: \'id\',\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\'\r\n                    }"></select> </div> </div> <div class="design-system__format-preview"> <strong>Preview</strong> <dl class="design-system__format-preview-list"> <div> <dt>Moeda</dt> <dd>{{ formatPreview.money | moneyToReal }}</dd> </div> <div> <dt>Data (dateShort)</dt> <dd>{{ formatPreview.date | dateShort }}</dd> </div> <div> <dt>Data (dateLong)</dt> <dd>{{ formatPreview.date | dateLong }}</dd> </div> <div> <dt>Duração (padrão)</dt> <dd>{{ formatPreview.time | durationFormat }}</dd> </div> <div> <dt>Duração (relatório)</dt> <dd>{{ formatPreview.time | durationFormat:\'report\' }}</dd> </div> <div> <dt>inputMoney</dt> <dd> <div data-input-money="formatPreview.money" style="max-width: 160px; display: inline-block;"></div> </dd> </div> </dl> </div> </section> '),$templateCache.put("views/home/layout.html",'<div class="view-home-layout" left-column-toggle-size data-column-id="home"> <div ng-include="\'views/home/left-column.html\'"></div> <div class="view-home-layout--right-container" auto-height data-top="45"> <div sub-view="header" class="view-home-layout--header"></div>
8 <div data-ng-if="readyShowContent" sub-view="content" class="view-home-layout--content"></div> </div> </div> '),$templateCache.put("views/home/left-column.html",'<div id="home-left" ng-controller="ProjectsLeftColumnController" auto-height data-top="45"> <div class="top-menu"> <ul> <li> <a class="overflow-ellipsis home-left--option-has-icon" data-training="nav-time-tracking" data-app-href="#/time-tracking" data-ng-class="{ active : $pageService.isCurrentPath(\'/time-tracking\')\r\n                   || ($pageService.isCurrentPath(\'/timesheet\') && !$pageService.isCurrentPath(\'/timesheet-approvals\')) }" data-tooltip="{{ \'home_left.time_entries\' | translate }}" data-tooltip-placement="right" data-tooltip-class="home-left--tooltip-show-when-campact"> <div><span class="icon-av_timer"></span></div> <label>{{ \'home_left.time_entries\' | translate }}</label> </a> </li> <li data-if-timesheet-approval-workflow data-ng-if="$permissionService.hasPrivilegesToApproveTimesheets()"> <a class="overflow-ellipsis home-left--option-has-icon" data-app-href="#/timesheet-approvals" data-ng-class="{ active : $pageService.isCurrentPath(\'/timesheet-approvals\') }" data-tooltip="{{ \'timesheet.approvals_title\' | translate }}" data-tooltip-placement="right" data-tooltip-class="home-left--tooltip-show-when-campact"> <div><span class="icon-flag2"></span></div> <label>{{ \'timesheet.approvals_title\' | translate }}</label> </a> </li> <li> <a class="overflow-ellipsis home-left--option-has-icon" data-ng-click="openTodoList()" data-tooltip="{{ \'home_left.todo_list\' | translate }}" data-tooltip-placement="right" data-tooltip-class="home-left--tooltip-show-when-campact"> <div><span class="icon-check_circle_outline"></span></div> <label>{{ \'home_left.todo_list\' | translate }}</label> </a> </li> <li> <ul data-ng-if="$pageService.isCurrentPath(\'/projects/todos\')" class="top-submenu"> <li> <a class="overflow-ellipsis" app-href="#/projects/todos/segment/assignedToMe" data-ng-class="{ active : $pageService.isCurrentPath(\'/projects/todos/segment/assignedToMe\', true) }"> <span>{{ \'home_left.todos.assigned_to_me\' | translate }}</span> </a> </li> <li> <a class="overflow-ellipsis" app-href="#/projects/todos/segment/soon" data-ng-class="{ active : $pageService.isCurrentPath(\'/projects/todos/segment/soon\', true) }"> <span>{{ \'home_left.todos.soon\' | translate }}</span> </a> </li> <li> <a class="overflow-ellipsis" app-href="#/projects/todos/segment/overdue" data-ng-class="{ active : $pageService.isCurrentPath(\'/projects/todos/segment/overdue\', true) }"> <span>{{ \'home_left.todos.overdue\' | translate }}</span> </a> </li> <li> <a class="overflow-ellipsis" app-href="#/projects/todos/segment/all" data-ng-class="{ active : $pageService.isCurrentPath(\'/projects/todos/segment/all\', true) }"> <span>{{ \'home_left.todos.all\' | translate }}</span> </a> </li> <li data-ng-if="toggleShowMoreTodoMenu || $pageService.isCurrentPath(\'/projects/todos/segment/adminOverview\', true)"> <a data-if-has-permission="admin" class="overflow-ellipsis" app-href="#/projects/todos/segment/adminOverview" data-ng-class="{ active : $pageService.isCurrentPath(\'/projects/todos/segment/adminOverview\', true) }"> <span>{{ \'home_left.todos.admin_overview\' | translate }}</span> </a> </li> <li data-ng-if="toggleShowMoreTodoMenu || $pageService.isCurrentPath(\'/projects/todos/segment/trash\', true)"> <a class="overflow-ellipsis" app-href="#/projects/todos/segment/trash" data-ng-class="{ active : $pageService.isCurrentPath(\'/projects/todos/segment/trash\', true) }"> <span>{{ \'home_left.todos.trash\' | translate }}</span> </a> </li> <div class="top-menu--button-show-more-todo-menu"> <span data-ng-click="toggleShowMoreTodoMenu = !toggleShowMoreTodoMenu">{{ (toggleShowMoreTodoMenu ? \'home_left.todos.show_less\' : \'home_left.todos.show_more\') | translate }}</span> </div> </ul> </li> </ul> </div> <div class="left-column--project-list" data-training="project-list" ng-include="\'views/home/project-list.html\'"></div> <div class="home-left--schedule-demo-container" data-ng-if="$subscriptionService.isTrialActive()"> <p> <span data-ng-bind-html="$subscriptionService.trialCounterDescription()"></span> </p> <ul> <li>
8<a data-ng-click="$subscriptionService.showUpgradeModal()">{{ \'home_left.trial.upgrade_link\' | translate }}</a></li> <li><a app-href="#/training">{{ \'training.library_link\' | translate }}</a></li> <li><a href="https://www.rabbiit.com/help" target="_blank">{{ \'home_left.trial.help_center\' | translate }}</a></li> <li>{{ \'home_left.trial.support_via\' | translate }} <a data-ng-click="$supportChannelService.openChat();">{{ \'home_left.trial.chat\' | translate }}</a> {{ \'home_left.trial.or\' | translate }} <a data-ng-click="$supportChannelService.openWhatsapp();">{{ \'home_left.trial.whatsapp\' | translate }}</a> </li> </ul> <!--        <div>--> <!--            <a data-ng-click="$supportChannelService.openWhatsapp();"--> <!--               class="button radius">--> <!--                <span class="icon-whatsapp"></span>--> <!--                <span>Whatsapp</span>--> <!--            </a>--> <!--            <a data-ng-click="$supportChannelService.openChat();"--> <!--               class="button radius">--> <!--                <span class="icon-speech-bubble"></span>--> <!--                <span>Chat</span>--> <!--            </a>--> <!--        </div>--> </div> <div ng-include="\'views/home/resume-daily.html\'"></div> </div> '),
9$templateCache.put("views/home/project-list.html",'<div style="min-height: 250px;"> <!--<div class="row collpase">--> <!--<div style="position: relative;" data-if-has-permission="admin">--> <!--<a class="beacon" style="right: -10px; top: -25px;"--> <!--data-ng-click="open_tip(\'tips_project_guide\')"--> <!--data-ng-show="!$configService.configs.tips_project_guide_done && $configService.configs.tips_welcome_done">--> <!--<div></div>--> <!--</a>--> <!--</div>--> <!--</div>--> <div class="row collpase left-column--project-list__header"> <div> <a data-dropdown="dropdown-menu-left-column-project-list" class="has-dropdown title home-left--option-has-icon"> <span>{{projectListSelected.title | translate}}</span> </a> <div id="dropdown-menu-left-column-project-list" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <span>{{ \'home_left.projects.display_title\' | translate }}</span> </div> <div data-ng-repeat="segment in projectSegments" class="dropdown-option radio"> <label data-ng-class="{ \'active\': projectListSelected.key === segment.key }" data-ng-click="set_project_list_visible(segment)" data-dropdown-close-on-click> <div> <div> <span>{{segment.title | translate}}</span> <span class="counter" data-tooltip="{{ \'home_left.projects.active_count_tooltip\' | translate }}" data-tooltip-placement="top" data-tooltip-popup-delay="600" data-tooltip-append-to-body="true">({{ segment.activeCount }})</span> </div> <div class="description steel-color">{{segment.description | translate}}</div> </div> </label> </div> </div> </div> <!--        <div class="column-30" style="text-align: right;">--> <!--            <a class="icon-open light-blue-on-hover"--> <!--               app-href="#/reports/daily"--> <!--               title="Abrir relatório diário de horas"></a>--> <!--            <a class="icon-open light-blue-on-hover"--> <!--               app-href="#/reports/daily"--> <!--               title="Abrir relatório diário de horas"></a>--> <!--        </div>--> <!--        </div>--> <div class="left-column--project-list__buttons-container"> <a class="button light-blue-on-hover" data-dropdown="dropdown-menu-left-column--project-list-options" data-tooltip="{{ \'home_left.projects.options_tooltip\' | translate }}" data-tooltip-placement="top" data-tooltip-append-to-body="true"> <span class="icon-menu2"></span> </a> <a data-ng-if="$permissionService.hasPrivilegesToCreateProjects()" class="button light-blue-on-hover" data-ng-click="create_project()" data-tooltip="{{ \'home_left.projects.create_tooltip\' | translate }}" data-tooltip-placement="top" data-tooltip-append-to-body="true"> <span class="icon-plus4"></span> </a> <div id="dropdown-menu-left-column--project-list-options" data-dropdown-content data-dropdown-append-to-body="false" data-left="-130" class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <span>{{ \'home_left.projects.group_title\' | translate }}</span> </div> <div data-ng-repeat="(key, label) in project_group_by_options" class="dropdown-option radio"> <label data-ng-model="preference_project_list_group_by" data-btn-radio="\'{{key}}\'" data-ng-click="set_project_list_group_by(key)" data-dropdown-close-on-click> <div> <div> <span>{{label.description | translate}}</span> </div> </div> </label> </div> </div> </div> </div> <!--    <div data-ng-if="count_active_project(project_list_visible) == 0"--> <div data-ng-if="projectListSelected.activeCount === 0" class="project-list-empty steel-color"> <div class="icon-zoom-out"></div> <div>{{ \'home_left.projects.empty\' | translate }}</div> <!--        <a data-ng-if="project_list_visible == \'templates\'"--> <!--           if-has-not-feature="PROJECT_TEMPLATES"--> <!--           data-app-href="#/upgrade"--> <!--           class="link-dotted yellow-color">--> <!--            Upgrade para adicionar modelos--> <!--        </a>-->
9 <span data-ng-if="projectListSelected.key === \'templates\'" data-flag-upgrade-required="PROJECT_TEMPLATES" data-show-long-description="true" data-custom-description="criar modelos de projetos (templates)" style="margin-top: 10px"></span> </div> <!--    {{projectListSelected.projects}}--> <div data-ng-repeat="\r\n            projects_group_by_is_active in projectListSelected.projects\r\n            | orderBy: \'-active\'\r\n            | groupBy: \'active\'\r\n        " data-ng-class="{\r\n            \'left-column--project-list-with-groups\' : preference_project_list_group_by !== \'none\'\r\n        }"> <div class="row title archived" data-ng-if="projects_group_by_is_active.group_name == false"> <span data-ng-checked="is_expanded_archived_projects" data-ng-click="toggle_archived_projects()" class="has-itens-below">{{ \'home_left.projects.archived\' | translate }}</span> </div> <div data-ng-if="projects_group_by_is_active.group_name == true\r\n                || (projects_group_by_is_active.group_name == false && is_expanded_archived_projects)" data-ng-repeat="\r\n            project_list_group_by_customer in projects_group_by_is_active.items\r\n            | orderBy: project_list_order_by_field\r\n            | groupBy: project_list_group_by_field\r\n            " class="project-list-group" data-ng-class="{\r\n                \'project-list-group--archived-list\' : projects_group_by_is_active.group_name == false\r\n            }"> <div class="group-title" data-ng-if="project_list_group_by_field"> <span class="overflow-ellipsis has-itens-below" data-tooltip="{{project_list_group_by_customer.items[0][project_list_order_by_field]}}" data-tooltip-ellipsis data-ng-click="toggle_collapsed_sublist_projects(project_list_group_by_customer.group_name, projects_group_by_is_active.group_name)" data-ng-checked="!is_collapsed_sublist_projects(project_list_group_by_customer.group_name, projects_group_by_is_active.group_name)">{{project_list_group_by_customer.items[0][project_list_order_by_field] || (\'home_left.projects.empty_group\' | translate)}}</span> </div> <ul data-ng-if="!is_collapsed_sublist_projects(project_list_group_by_customer.group_name, projects_group_by_is_active.group_name)"> <li data-ng-repeat="project in project_list_group_by_customer.items | orderBy : \'name\'"> <a class="overflow-ellipsis entity-color-identity-row" data-ng-class="::{ \'left-column--project-list__project-active active\': isActiveProjectAndFocus(project.id) }" data-app-href="{{::getProjectFastLink(project)}}" data-tooltip="{{project.name}}" data-tooltip-ellipsis> <span data-entity-color-swatch data-variant="bar-inline" data-color="project.color" data-reserve-inline-space="true"></span> <span class="entity-color-identity-row__label">{{project.name}}</span> </a> </li> </ul> </div> </div> <!--    <div style="position: relative;">--> <!--        <a class="beacon" style="  top: -30px; left: 180px;"--> <!--           data-ng-click="open_tip(\'tips_project_list\')"--> <!--           data-ng-show="!$prefsService.preferences.tips_project_list_done && $prefsService.preferences.tips_welcome_done">--> <!--            <div></div>--> <!--        </a>--> <!--    </div>--> </div> '),$templateCache.put("views/home/resume-daily.html",' <div data-ng-controller="ResumeDailyController" style="position: relative;"> <section class="home-left--resume-daily"> <!--    <div class="row collapse">--> <!--        <div class="column-70">--> <!--            <span class="title">Meu resumo de horas</span>--> <!--        </div>--> <!--        <div class="column-30" style="text-align: right;">--> <!--            <a class="icon-open light-blue-on-hover"--> <!--               app-href="#/reports/daily"--> <!--               title="Abrir relatório diário de horas"></a>--> <!--        </div>--> <!--    </div>--> <span class="title">{{ \'home_left.resume_daily.title\' | translate }}</span> <div data-ng-if="!resume_daily" style="margin-top: 10px"> <div spinner-loading="loading_resume_daily" class="spinner-size-mini"></div> <div data-ng-if="!loading_resume_daily" class="center"> <div class="grey-color" style="font-size: 13px; padding-top: 10px;"> <span>{{ \'home_left.resume_daily.error\' | translate }}</span> <a class="light-grey-color light-blue-on-hover" data-ng-click="load()" title="{{ \'home_left.resume_daily.retry\' | translate }}">{{ \'home_left.resume_daily.retry\' | translate }}</a> </div> </div> </div> <div class="home-left--resume-daily--table"> <div data-ng-repeat="resume in resume_daily | orderBy : \'date\' : false" class="home-left--resume-daily__day-column"> <div class="home-left--resume-daily__weekday">{{getWeekday(resume.date)}}</div> <div class="home-left--resume-daily__day">{{resume.date | moment: \'D\'}}</div> <div class="home-left--resume-daily__hours" data-ng-class="::{\r\n                        \'has-divergence\' : has_divergence(resume),\r\n                        \'is-weekend\' : is_weekend(resume.date)\r\n                    }" data-tooltip-html="\'\r\n                        \' + (\'home_left.resume_daily.divergence_tooltip\' | translate) + \'<hr/>\r\n                        Rabbiit: {{ resume.time_total | durationFormat: \'default\' }}<br/>\r\n                        {{$settingsService.settings.integration_time_clock_active}}: {{ resume.time_clock | durationFormat: \'default\' }}\r\n                    \'" data-tooltip-enable="::has_divergence(resume)">{{resume.time_total | durationFormat: \'default\' : \'short\'}}</div> </div> </div> </section> </div> '),$templateCache.put("views/projects/projects-add-tasks.html",'<style> .view-projects-add-tasks table {\r\n        margin-bottom: 0;\r\n    }\r\n    .view-projects-add-tasks table td.view-projects-add-tasks--column-billable {\r\n        width: 5px;\r\n        text-align: center;\r\n        padding-right: 15px;\r\n        font-size: 13px;\r\n    }\r\n    .view-projects-add-tasks table .view-projects-add-tasks--task-name {\r\n        line-height: 20px;\r\n        font-weight: bolder;\r\n    }\r\n\r\n    .view-projects-add-tasks .add-status {\r\n        font-weight: bolder;\r\n        font-size: 14px;\r\n        margin-right: 7px;\r\n    }\r\n    .view-projects-add-tasks .modal-body {\r\n        padding-top: 10px;\r\n    }\r\n    .view-projects-add-tasks .modal-footer {\r\n        padding: 20px 30px;\r\n    }\r\n    .view-projects-add-tasks .modal-footer .button-create-task {\r\n        margin-right: 15px;\r\n    }\r\n    .view-projects-add-tasks .modal-footer input[type="checkbox"] {\r\n        margin-top: 8px;\r\n        margin-right: 5px;\r\n    }\r\n    .view-projects-add-tasks .modal-footer input[type="checkbox"] + span {\r\n        font-size: 13px;\r\n        color: var(--color-steel);\r\n    }\r\n    .view-projects-add-tasks .view-projects-add-tasks--recently-created-task {\r\n        color: var(--color-blue-brand);\r\n        font-size: 12px;\r\n        margin-left: 10px;\r\n        font-weight: bolder;\r\n    }\r\n    .view-projects-add-tasks .view-projects-add-tasks--button-add-all {\r\n        font-size: 13px;\r\n        font-weight: bolder;\r\n        text-align: right;\r\n        margin-bottom: 20px;\r\n        display: block;\r\n    }\r\n    .view-projects-add-tasks .view-projects-add-tasks--empty-message {\r\n        text-align: center;\r\n        line-height: 25px;\r\n        margin: 50px 30px 30px;\r\n    } </style> <div class="view-projects-add-tasks" id="modal-view-projects-add-tasks"> <div class="modal-header"> <h1>{{ \'project_tasks.add_modal.title\' | translate }}</h1> <div class="grey-color" style="margin-top: 5px; font-size: 13px; text-transform: uppercase"> {{ \'project_tasks.add_modal.project_label\' | translate:{name: project.name} }} </div> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body"> <div data-spinner-loading="loading" data-message="{{ \'project_tasks.add_modal.loading\' | translate }}" style="margin-top: 40px; margin-bottom: 30px;"></div> <div data-ng-if="!loading"> <div data-ng-if="tasks.length == 0" class="view-projects-add-tasks--empty-message"> {{ \'project_tasks.add_modal.empty_all_added\' | translate }}<br> <div data-ng-if="$permissionService.hasPrivilegesToEditTasks()"> <a class="link underline" data-ng-click="create_task()">{{ \'project_tasks.add_modal.create_new_link\' | translate }}</a> {{ \'project_tasks.add_modal.and_add_after\' | translate }} </div> </div> <div class="list-minimal" data-ng-if="tasks.length > 0"> <a class="link underline view-projects-add-tasks--button-add-all" data-ng-click="addAllTasks()"> {{ (filter.search ? \'project_tasks.add_modal.add_selected\' : \'project_tasks.add_modal.add_all\') | translate:{count: tasksFilteredNotAdded.length} }} </a> <table> <tr class="list-minimal--search__tr"> <td colspan="3"> <input type="search" data-ng-model="filter.search" data-ng-change="filterTasks()" placeholder="{{ \'project_tasks.add_modal.search_placeholder\' | translate }}" autofocus> </td> </tr> <tr data-ng-repeat="task in tasksFiltered" id="view-projects-add-tasks--task-id-{{task.id}}"> <td class="view-projects-add-tasks--column-billable" data-ng-if="project.is_billable"> <span data-ng-class="{\r\n                                    \'green-color\': task.is_billable_default,\r\n                                    \'grey-color \': !task.is_billable_default\r\n                                }" data-tooltip-html="\'\r\n                                  {{ \'project_tasks.add_modal.billable_tooltip\' | translate:{status: ((task.is_billable_default ? \\\'project_tasks.add_modal.billable_status_yes\\\' : \\\'project_tasks.add_modal.billable_status_no\\\') | translate) } }}\r\n                                \'">$</span> </td> <td> <div> <span data-ng-bind-html="task.name | highlight: filter.search" class="view-projects-add-tasks--task-name"></span> <span class="view-projects-add-tasks--recently-created-task" data-ng-if="task.recently_created"> <span class="icon-star-full"></span> <span>{{ \'project_tasks.add_modal.new_task_label\' | translate }}</span> </span> </div> <div class="details" data-ng-bind-html="task.description | highlight: filter.search"></div> </td> <td style="text-align: right; width: 140px;"> <div data-ng-switch="task.add_status"> <div data-ng-switch-when="adding" class="add-status grey-color"> <span>{{ \'project_tasks.add_modal.status_adding\' | translate }}</span> </div> <div data-ng-switch-when="added" class="add-status grey-color"> <span class="green-color">{{ \'project_tasks.add_modal.status_added\' | translate }}</span> </div> <div data-ng-switch-default> <a class="button clean" data-ng-click="add_task(task)"> <span>{{ \'project_tasks.add_modal.button_add\' | translate }}</span> </a> </div> </div> </td> </tr> </table> <div data-ng-if="tasksFiltered.length == 0" class="view-projects-add-tasks--empty-message"> <span data-ng-bind-html="\'project_tasks.add_modal.no_results\' | translate:{search: filter.search}"></span><br> <div data-ng-if="$permissionService.hasPrivilegesToEditTasks()"> <a class="link underline" data-ng-click="create_task()">{{ \'project_tasks.add_modal.create_new_link\' | translate }}</a> {{ \'project_tasks.add_modal.and_add_after\' | translate }} </div> </div> </div> </div> </div> <div class="modal-footer"> <div class="row"> <div class="column-70" style="text-align: left;"> <div data-ng-if="$permissionService.hasPrivilegesToEditTasks()"> <button class="button clean button-create-task" data-ng-click="create_task()"> <span class="icon-plus4" style="font-size: 14px; margin-right: 4px;"></span> <span>{{ \'project_tasks.add_modal.button_create\' | translate }}</span> </button> <label> <input type="checkbox" data-ng-model="$prefsService.preferences.project_add_tasks__add_task_after_created" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'" data-ng-change="$prefsService.save_by_name(\'project_add_tasks__add_task_after_created\')"> <span>{{ \'project_tasks.add_modal.auto_add_checkbox\' | translate }}</span> </label> </div> </div> <div class="column-30"> <button class="button clean" data-ng-click="close()"> <span>{{ \'project_tasks.add_modal.button_finish\' | translate }}</span> </button> </div> </div> </div> </div> '),$templateCache.put("views/projects/projects-add-users.html",'<style> .view-projects-add-users .modal-body {\r\n        padding-top: 5px;\r\n    }\r\n    .view-projects-add-users table {\r\n        margin-bottom: 0;\r\n    }\r\n    .view-projects-add-users .add-status {\r\n        font-weight: bolder;\r\n        font-size: 14px;\r\n        margin-right: 7px;\r\n    }\r\n    .view-projects-add-users .view-projects-add-users--user-details {\r\n        font-size: 12px;
9\r\n        /*color: var(--font-color-1-details);*/\r\n        color: var(--color-steel);\r\n        margin-top: 5px;\r\n    }\r\n    /*.view-projects-add-users .view-projects-add-users--user-email {*/\r\n    /*    margin-top: 5px;*/\r\n    /*}*/\r\n\r\n    .view-projects-add-users .view-projects-add-users--button-add-all {\r\n        font-size: 13px;\r\n        font-weight: bolder;\r\n        text-align: right;\r\n        margin-bottom: 20px;\r\n        display: block;\r\n    } </style> <div class="view-projects-add-users"> <div class="modal-header"> <h1>{{ \'project_users.add_modal.title\' | translate }}</h1> <div class="grey-color" style="margin-top: 5px; font-size: 13px; text-transform: uppercase"> {{ \'project_users.add_modal.project_label\' | translate:{name: project.name} }} </div> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body"> <div spinner-loading="loading" message="{{ \'project_users.add_modal.loading\' | translate }}" style="margin-top: 40px; margin-bottom: 30px;"></div> <div data-ng-if="!loading"> <div data-ng-if="users_available.length == 0" style="text-align: center; margin: 30px"> {{ \'project_users.add_modal.all_added\' | translate }} </div> <div class="list-minimal" data-ng-if="users_available.length > 0"> <a class="link underline view-projects-add-users--button-add-all" data-ng-click="addAllUsers()"> {{ \'project_users.add_modal.add_selected\' | translate:{search: filter.search, count: usersNotAddedFiltered.length} }} </a> <table> <tr class="list-minimal--search__tr"> <td colspan="2"> <input type="search" data-ng-model="filter.search" data-ng-change="filterUsers()" placeholder="{{ \'project_users.add_modal.search_placeholder\' | translate }}" autofocus> </td> </tr> <tr data-ng-repeat="user in users_available | filter: filter.search"> <td> <div class="user-list-item--identity"> <div data-user-avatar data-name="{{ user.name }}" data-photo-url="user.profile_photo_url" data-size="sm"> </div> <div> <div class="bolder" data-ng-bind-html="user.name | highlight: filter.search"></div> <div class="view-projects-add-users--user-details view-projects-add-users--user-email" data-ng-bind-html="user.email | highlight: filter.search"> </div> <div class="view-projects-add-users--user-details" data-ng-if="user.teams && user.teams.length > 0"> {{ \'project_users.add_modal.team_label\' | translate }} <span data-ng-bind-html="user.teams | join: \'name\' | highlight: filter.search"></span> </div> </div> </div> </td> <td style="text-align: right; width: 140px;"> <div data-ng-switch="user.add_status"> <div data-ng-switch-when="adding" class="add-status grey-color"> <span>{{ \'project_users.add_modal.status_adding\' | translate }}</span> </div> <div data-ng-switch-when="added" class="add-status grey-color"> <span class="green-color">{{ \'project_users.add_modal.status_added\' | translate }}</span> </div> <div data-ng-switch-default> <a class="button clean" data-ng-click="add_user(user)"> <span>{{ \'project_users.add_modal.button_add\' | translate }}</span> </a> </div> </div> </td> </tr> </table> </div> </div> </div> <div class="modal-footer"> <div class="row"> <div class="column-70" style="text-align: left;"> <div data-ng-if="$permissionService.hasPrivilegesToCreateUsers()"> <button class="button clean" data-ng-click="invite_user()"> <span class="icon-plus4" style="font-size: 14px; margin-right: 4px;"></span> <span>{{ \'project_users.add_modal.invite_users\' | translate }}</span> </button> </div> </div> <div class="column-30"> <button class="button clean" data-ng-click="close()">{{ \'project_users.add_modal.button_finish\' | translate }}</button> </div> </div> </div> </div> '),$templateCache.put("views/projects/projects-copy.html",'<div class="view-project-copy"> <div class="modal-header"> <h1>{{ \'project_copy.title\' | translate }}</h1> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body" data-on-click-enter="save()"> <div> <div> <label>{{ \'project_copy.project_name_label\' | translate }}</label> </div> <div> <input type="text" data-ng-model="project.name" autofocus="autofocus"> </div> </div> <div> <label>{{ \'project_copy.customer_label\' | translate }}</label> <select data-options-load="$customerService.getCustomersOptionsForCreate" data-options-load-trigger="focus" data-ng-model="project.customer_id" data-selectize="{\r\n                        labelField: \'name\',\r\n                        valueField: \'id\',\r\n                        sortField: \'name\',\r\n                        searchField: \'name\',\r\n                        create: add_customer,\r\n                        render: selectize_render_customer,\r\n                        dropdownParent: \'body\'\r\n                    }"></select> </div> <!--        <div style="margin-top: 5px">--> <!--            <label>--> <!--                <div class="element-todo-checkbox">--> <!--                    <input type="checkbox"--> <!--                           data-ng-check--> <!--                           data-ng-model="project.privacy"--> <!--                           data-ng-true-value="2"--> <!--                           data-ng-false-value="1">-->
9 <!--                    <span>Privado (Somente equipe do projeto pode acessar)</span>--> <!--                </div>--> <!--            </label>--> <!--        </div>--> <!--        <div class="modal-hr" style="margin-top: 25px;"></div>--> <div style="margin-top: 20px"> <div class="view-project-copy--title-options"> {{ \'project_copy.copy_settings_title\' | translate }} </div> <ul> <li data-ng-repeat="option in keep_from_source | toArray: true"> <label class="element-todo-checkbox"> <input type="checkbox" data-ng-check data-ng-model="option.checked"> <span>{{option.name | translate}}</span> </label> </li> </ul> </div> <div> <div class="view-project-copy--todo-options" data-ng-if="keep_from_source.todos.checked"> <div class="view-project-copy--title-options"> {{ \'project_copy.todo_details_title\' | translate }} </div> <ul> <li data-ng-repeat="option in keep_from_todos | toArray: true"> <label class="element-todo-checkbox"> <input type="checkbox" data-ng-check data-ng-model="option.checked"> <span>{{option.name | translate}}</span> </label> </li> </ul> </div> </div> <div class="view-project-copy--obs" data-ng-bind-html="\'project_copy.observation\' | translate"> </div> </div> <div class="modal-footer"> <div> <button data-ng-click="close()" class="button clean" style="margin-right: 5px;" data-ng-hide="saving">{{ \'project_copy.footer.cancel\' | translate }}</button> <button data-ng-click="save()" data-ng-disabled="!project.name || saving" class="button button--blue-brand"> <span>{{ saving ? (\'project_copy.footer.copying\' | translate) : (\'project_copy.footer.save\' | translate) }}</span> </button> </div> </div> </div> '),$templateCache.put("views/projects/projects-custom-fields-manager.html",'<style> .selectize-custom-field-type-icon {\r\n        width: 30px;\r\n        display: inline-block;\r\n        padding: 5px;\r\n        padding-right: 15px;\r\n        text-align: right;\r\n    }\r\n    .selectize-custom-field-type-container .selectize-input {\r\n        padding: 8px 7px 9px;\r\n    }\r\n    .selectize-custom-field-type-container .selectize-input.has-items {\r\n        padding: 6px 3px;\r\n    }\r\n    .selectize-custom-field-type-container .selectize-control {\r\n        height: auto;\r\n    }\r\n    .selectize-custom-field-type-container .selectize-custom-field-type-icon {\r\n        width: auto;\r\n    }\r\n    .custom-field-type-option > span:first-child {\r\n        width: 30px;\r\n        display: inline-block;\r\n        padding: 5px;\r\n        padding-right: 15px;\r\n        text-align: right;\r\n    }\r\n    .list-enum-options table {\r\n        width: 100%;\r\n        border-spacing: 0;\r\n        border: none;\r\n        border-collapse: collapse;\r\n    }\r\n    .list-enum-options table tr td {\r\n        border: solid #dedede;\r\n        border-width: 1px 0;\r\n    }\r\n    .list-enum-options .name-column {\r\n        padding-left: 0;\r\n        padding-top: 3px;\r\n        padding-bottom: 3px;\r\n    }\r\n    .list-enum-options .actions-column {\r\n        width: 10px;\r\n        text-align: right;\r\n        position: relative;\r\n    }\r\n    .list-enum-options input[type="text"] {\r\n        border: none;\r\n        margin-bottom: 0;\r\n        font-size: 15px;\r\n        box-shadow: none;\r\n        -webkit-box-shadow: none;\r\n    }\r\n    .list-enum-options .warning-label {\r\n        position: absolute;\r\n        right: 45px;\r\n        top: 7px;\r\n        white-space: nowrap;\r\n        font-weight: bolder;\r\n        font-size: 13px;\r\n    } </style> <div class="modal-header"> <h1>Gerenciar campos personalizados de horas</h1> <div class="grey-color" style="margin-top: 5px; font-size: 13px; text-transform: uppercase"> Projeto <span style="text-decoration: underline">{{project.name}}</span> </div> </div> <div class="modal-body"> <a class="icon-cross" data-ng-click="close()"></a> <div data-ng-if="$customFieldService.getActiveByEntity(\'projects\').length == 0" class="center bolder grey-color" style="padding: 25px 0 20px;"> Não foi adicionado campo personalizado neste projeto </div> <div class="list-enum-options" data-ng-repeat=" enum_option_group in custom_field.enum_options | filter : { deleted: \'!true\' } | orderBy: \'-active\' | groupBy: \'active\'"> <div data-ng-if="enum_option_group.group_name == false" style="padding: 5px 2px 10px;"> <a class="details has-itens-below" data-ng-checked="options.archived_enum_options_visible" data-ng-click="options.archived_enum_options_visible = !options.archived_enum_options_visible"> Arquivados ({{enum_option_group.items.length}}) </a> </div> <table data-ng-if="enum_option_group.group_name == true || options.archived_enum_options_visible"> <tr data-ng-repeat="enum_option in enum_option_group.items"> <td class="name-column"> <input type="text" data-ng-model="enum_option.name" data-autofocus-if-empty data-on-cl
9ick-enter="add_enum_option()"> </td> <td class="actions-column"> <a title="Opções" data-dropdown="dropdown-enum-option-{{enum_option.id}}" class="grey-color light-blue-on-hover"> <span class="icon-angle-down" style="font-size: 18px;"></span> </a> <div data-ng-if="enum_option.warning" class="warning-label flag orange-color">{{enum_option.warning}}</div> <div id="dropdown-enum-option-{{enum_option.id}}" data-dropdown-content class="f-dropdown dropdown-option-list dropdown-right" dropdown-close-on-click> <div data-ng-if="enum_option.id"> <div class="dropdown-option option-button" data-ng-if="enum_option.active == true"> <a data-ng-click="archive_enum_option(enum_option)"> Arquivar opção </a> </div> <div class="dropdown-option option-button" data-ng-if="enum_option.active == false"> <a data-ng-click="active_enum_option(enum_option)"> Reativar opção </a> </div> <hr> </div> <div class="dropdown-option option-button" data-ng-if="enum_option.delete_blocked != true"> <a data-ng-click="remove_enum_option(enum_option)" class="red-color-on-hover"> Excluir opção </a> </div> </div> </td> </tr> </table> </div> <div class="row" style="margin-bottom: 10px;"> <div class="column-25"> <label>Tipo:</label> </div> <div class="column-50 selectize-custom-field-type-container"> <select data-ng-model="custom_field.type" data-ng-disabled="custom_field.id" data-selectize="{\r\n                        options: $customFieldService.TYPES,\r\n                        labelField: \'name\',\r\n                        valueField: \'id\',\r\n                        sortField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\',\r\n                        placeholder: \'Texto\',\r\n                        render: render_types,\r\n                        onChange: init_enum_options\r\n            }"></select> </div> </div> </div> <div class="modal-footer"> <button data-ng-click="close()" class="button clean" style="margin-right: 5px;" data-ng-hide="saving">Cancelar</button> <button data-ng-click="save()" data-ng-disabled="!custom_field.name || saving" class="button button--blue-brand"> <span>{{ saving ? \'Salvando campo...\' : \'Salvar campo\' }}</span> </button> </div> '),$templateCache.put("views/projects/projects-edit.html",'<div class="project-edit-modal view-project-edit modal__with-tabs"> <div class="modal-header"> <h1>{{ (project.id ? \'project_edit.title_edit\' : \'project_edit.title_new\') | translate }}</h1> <a class="icon-cross" data-ng-click="close()" data-tooltip="{{ \'project_edit.close_tooltip\' | translate }}" data-tooltip-append-to-body="true"></a> <span custom-fields-menu-modal data-entity="projects,time_entries" data-close="close"> </span> <nav data-app-tabs data-tabs="projectEditTabs" data-selected="tabSelected"> </nav> </div> <div class="modal-body" data-on-click-enter="save()" data-spinner-loading-modal="is_loading"> <div data-ng-if="tabSelected === \'main\'"> <div class="row" data-ng-if="!project.id" if-has-feature="PROJECT_TEMPLATES"> <div data-dropdown="dropdown-project-edit-template" class="has-dropdown template-button"> <span class="icon-paper-stack"></span> <span>{{ \'project_edit.main.template_button\' | translate:{name: get_current_template_name()} }}</span> </div> <div id="dropdown-project-edit-template" data-dropdown-content class="f-dropdown dropdown-option-list"> <div> <div class="dropdown-title"> <span>{{ \'project_edit.main.template_dropdown_title\' | translate }}</span> </div> <div class="dropdown-option radio"> <label data-ng-model="project.project_id_source" data-btn-radio="" data-ng-click="set_template(null)" data-dropdown-close-on-click>{{ \'project_edit.main.template_blank\' | translate }}</label> </div> <div data-ng-repeat="template in $projectService.getActive() | filter : { template: true }" class="dropdown-option radio"> <label data-ng-model="project.project_id_source" data-btn-radio="{{template.id}}" data-ng-click="set_template(template.id)" data-dropdown-close-on-click>{{template.name}}</label> </div> </div> </div> </div> <div class="row entity-color-name-row"> <div class="entity-color-name-row__name"> <label>{{ \'project_edit.main.name_label\' | translate }}</label> <input type="text" data-ng-model="project.name" autofocus="autofocus"> </div> <div class="entity-color-form-field entity-color-form-field--inline-end"> <label>{{ \'common.entity_color.label\' | translate }}</label> <div data-entity-color-picker data-variant="dropdown" data-ng-model="project.color"></div> </div> </div> <div style="margin-bottom: 15px;"> <label>{{ \'project_edit.main.customer_label\' | translate }}</label> <select data-ng-model="project.customer_id" data-options-load="$customerService.getCustomersOptionsForCreate" data-ng-disabled="is_loading" data-selectize-key="options-customers" data-selectize="{\r\n                    labelField: \'name\',\r\n                    valueField: \'id\',\r\n                    sortField: \'name\',\r\n                    searchField: \'name\',\r\n                    create: add_customer,\r\n                    createFilter: $permissionService.hasPrivilegesToEditCustomers,\r\n                    render: selectize_render_customer,\r\n                    dropdownParent: \'body\',\r\n                    preload: true\r\n                }"></select> </div> <!--            <div if-has-feature="CONTRACTORS">--> <!--                <div data-ng-if="$settingsService.get(\'project_settings_contractor_visibility\') == true">--> <!--                    <div data-ng-if="$permissionService.hasPermissionToEditProjectContractor()">--> <!--                        <div class="row">--> <!--                            <label>Contratante</label>--> <!--                            <select--> <!--                                data-options=\'$contractorService.getByCustomer(project.customer_id)\'--> <!--                                data-ng-model="project.contractor_id"--> <!--                                data-ng-disabled="!project.customer_id"--> <!--                                data-selectize="{--> <!--                                    labelField: \'name\',--> <!--                                    valueField: \'id\',--> <!--                                    sortField: \'name\',--> <!--                                    searchField: \'name\',--> <!--                                    create: add_contractor,--> <!--                                    dropdownParent: \'body\'--> <!--                                }"></select>--> <!--                        </div>--> <!--                    </div>--> <!--                </div>--> <!--            </div>--> <div data-ng-if="project.description_is_visible"> <label>{{ \'project_edit.main.description_label\' | translate }}</label> <textarea data-ng-model="project.description" style="max-width: 100%; min-height: 95px;"></textarea> </div> <div class="row" style="margin-top: 5px; margin-bottom: 20px;" data-ng-if="project.description_is_visible != true"> <a class="link-dashed" data-ng-click="project.description_is_visible = true"> <span class="icon-plus4" style="margin-right: 5px; font-size: 10px;"></span> <span>{{ \'project_edit.main.add_description\' | translate }}</span> </a> </div> <div class="row element-todo-checkbox" style="margin-top: 5px"> <label data-ng-disabled="!hasFeatures.PROJECT_PRIVATE_PRIVACY"> <div> <input type="checkbox" data-ng-check data-ng-model="project.privacy" data-ng-true-value="2" data-ng-false-value="1" data-ng-disabled="!hasFeatures.PROJECT_PRIVATE_PRIVACY"> <span>{{ \'project_edit.main.privacy_private\' | translate }}</span> </div> </label> </div> <div class="row element-todo-checkbox" style="margin: 10px 0;"> <label data-ng-disabled="!hasFeatures.PROJECT_REQUIRED_FIELDS"> <div> <input type="checkbox" data-ng-check data-ng-model="project.required_task" data-ng-true-value="1" data-ng-false-value="0" data-ng-disabled="!hasFeatures.PROJECT_REQUIRED_FIELDS"> <span>{{ \'project_edit.main.required_task\' | translate }}</span> </div> </label> </div> <div style="margin-top: 2px;"> <!-- Inclui campos personalizados --> <div data-generate-custom-fields-form data-entity="projects" data-model="project" data-errors="errors" data-revalidate="revalidate"> </div> </div> </div> <div data-ng-if="tabSelected === \'budget-and-billing\'"> <div class="row budget-content view-project-edit--budget-content"> <label> {{ \'project_edit.budget.title\' | translate }} </label> <div class="row"> <div class="column-55"> <select data-options="budgetList" data-ng-model="project.budget_by" data-ng-disabled="!isEnabledBudget()" data-selectize="{\r\n                                    labelField: \'name\',\r\n                                    valueField: \'id\',\r\n                                    sortField: \'name\',\r\n                                    searchField: \'name\',\r\n                                    dropdownParent: \'body\',\r\n                                    placeholder: \'\'\r\n                                }"> <!--                            <option value="none">Sem orçamento</option>--> <!--                            <option value="time">Total em horas</option>--> <!--                            <option value="billing">Total cobrável</option>--> <!--                    <option value="cost">Total de custos</option>--> </select> </div> <div class="column-45"> <div data-ng-if="project.budget_by && project.budget_by !== \'none\'"> <div data-ng-class="project.budget_by === \'time\' ? \'input-suffix-inside--container\' : \'input-prefix-inside--container\'"> <label class="input-prefix-inside--label-prefix" for="view-project-edit--budget-content__input_budget" data-ng-if="project.budget_by !== \'time\'"> {{ \'\' | currencySymbol }}</label> <input type="text" id="view-project-edit--budget-content__input_budget" placeholder="0" data-ng-model="project.budget" data-ng-mask="numberFormatted" data-ng-disabled="!isEnabledBudget()"> <label class="input-suffix-inside--label-suffix" for="view-project-edit--budget-content__input_budget" data-ng-if="project.budget_by === \'time\'">{{ \'project_edit.budget.hours_suffix\' | translate }}</label> </div> </div> </div> </div> <div data-ng-if="$subscriptionService.hasFeatureAccess(\'PROJECT_BUDGET\')"> <label data-ng-if="!hasPermissionToEditBudget()" class="bolder"> {{ \'project_edit.budget.permission_insufficient\' | translate }} {{ \'project.budget_by_options.\' + project.budget_options.budget_by | translate}} </label> </div> <div class="view-project-edit--budget-content__options element-todo-checkbox" data-ng-if="project.budget_by === \'time\'"> <label> <input type="checkbox" data-ng-check data-ng-model="project.budget_options.only_billable_time" data-ng-disabled="!isEnabledBudget()"> <span>{{ \'project_edit.budget.only_billable\' | translate }}</span> </label> </div> </div> <div class="row view-project-edit--billing-content" data-ng-if="$permissionService.hasPrivilegesToEditProjectBillingRates(project)"> <!--                 data-ng-if="$permissionService.hasPermissionToEditChargeRate()">--> <label> {{ \'project_edit.billing.title\' | translate }} </label> <div class="row"> <div class="column-55"> <select data-options="billingOptions" data-ng-model="project.is_billable_formatted" data-ng-change="selectizeOnChangeIsBillable()" data-ng-disabled="::!$subscriptionService.hasFeatureAccess(\'BILLABLE_PROJECT\')\r\n                                || !$permissionService.hasPrivilegesToEditProjectBillingRates(project)" data-selectize="{\r\n                                dropdownParent: \'body\',\r\n                                labelField: \'name\',\r\n                                valueField: \'value\',\r\n                                placeholder: (\'project_edit.billing.not_billable\' | translate)\r\n                            }"> <!--                            <option value="false">Não cobrável</option>--> <!--                            <option value="true">Cobrável por hora</option>--> </select> </div> <div class="column-45"> <div data-ng-if="project.is_billable"> <div class="input-prefix-inside--container input-suffix-inside--container"> <label class="input-prefix-inside--label-prefix" for="view-project-edit--billing-content__input_rate"> {{ \'\' | currencySymbol }}</label> <input type="text" id="view-project-edit--billing-content__input_rate" data-ng-mask="money" data-ng-model="project.rate_formatted" data-ng-disabled="::!$subscriptionService.hasFeatureAccess(\'BILLABLE_PROJECT\')\r\n                                        || !$permissionService.hasPrivilegesToEditProjectBillingRates(project)" placeholder="{{0|moneyOnlyAmount}}" class="center view-project-edit--billing-content__input_rate"> <label class="input-suffix-inside--label-suffix" for="view-project-edit--billing-content__input_rate">{{ \'project_edit.billing.rate_suffix\' | translate }}</label> </div> </div> </div> </div> <!--                <div class="view-project-edit&#45;&#45;budget-content__options element-todo-checkbox"--> <!--                     data-ng-if="project.is_billable">--> <!--                    <label>--> <!--                        <input type="checkbox"--> <!--                               data-ng-check--> <!--                               data-ng-model="project.billing_options.allow_task_rate"--> <!--                               data-ng-disabled="::!$subscriptionService.hasFeatureAccess(\'BILLABLE_PROJECT\')--> <!--                                || !$permissionService.hasPrivilegesToEditProjectBillingRates(project)">-->
9 <!--                        <span>Permitir taxa por tarefa</span>--> <!--                    </label>--> <!--                </div>--> <div class="view-project-edit--billing-content__form-rate-is-new" data-ng-if="project.is_billable"> <div data-historical-rate-save-form data-type="billable" data-model="project"> </div> </div> <div data-ng-if="project.rate_start_at" data-historical-rate-list="{\r\n                        project_id: project.id,\r\n                        type: \'billable\'\r\n                    }" data-model="project"></div> </div> <span data-flag-upgrade-required="PROJECT_BUDGET" data-show-long-description="true" data-custom-description="{{ \'project_edit.billing.upgrade_description\' | translate }}" style="margin-top: 10px"></span> </div> <div data-ng-if="tabSelected === \'custom-fields\'"> <label>{{ \'project_edit.custom_fields.label\' | translate }}</label> <!--            <div class="view-project-edit&#45;&#45;clarify-message">--> <!--                Por padrão, campos de registros de horas são adicionados a todos os projetos.--> <!--                Deixe desmarcado para adicionar manualmente o campo a cada projeto.--> <!--            </div>--> <div data-ng-if="$customFieldService.getActiveByEntity(\'time_entries\').length === 0" class="steel-color" style="font-size: 13px; margin-top: 10px;"> {{ \'project_edit.custom_fields.none\' | translate }} </div> <div class="list-manager-custom-fields" data-ng-if="$customFieldService.getActiveByEntity(\'time_entries\').length > 0"> <table> <thead> <tr> <th>{{ \'project_edit.custom_fields.column_description\' | translate }}</th> <th>{{ \'project_edit.custom_fields.column_default_value\' | translate }}</th> </tr> </thead> <tbody> <tr ng-repeat="custom_field in $customFieldService.getActiveByEntity(\'time_entries\') | orderBy: \'name\'"> <td> <div> <label data-ng-class="{ \'label-dashed\' : custom_field.description}" data-tooltip-append-to-body="true" data-tooltip-placement="top" data-tooltip-html="\'\r\n                                            <div><strong>{{custom_field.name}}</strong></div>\r\n                                            <div>{{custom_field.description}}</div>\'"> <span data-ng-class="{ \'label-required\': custom_field.required }" class="list-manager-custom-fields--name overflow-ellipsis" style="max-width: 100%;">{{custom_field.name}}</span> </label> </div> <div class="list-manager-custom-fields--details"> <span data-ng-if="!custom_field.is_restricted">{{ \'project_edit.custom_fields.visible_all\' | translate }}</span> <span data-ng-if="custom_field.is_restricted">{{ \'project_edit.custom_fields.restricted_access\' | translate }}</span> </div> </td> <td> <!--                            <label>Valor padrão</label>--> <div generate-custom-fields-element="custom_field" data-model="project"></div> </td> </tr> </tbody> </table> </div> <!--            <div class="list-minimal" data-ng-if="status === \'active\' || options.archived_custom_fields_visible">--> <!--                <table>--> <!--                    &lt;!&ndash;                <tr data-ng-repeat="custom_field in custom_field_group.items | orderBy : \'name\'"&ndash;&gt;--> <!--                    &lt;!&ndash;                    data-ng-class="{ \'archived\' : custom_field.active == false }">&ndash;&gt;--> <!--                    <tr data-ng-repeat="custom_field in customFieldGroups[options.entity_selected][status] | orderBy : \'name\'"--> <!--                        data-ng-class="{ \'archived\' : status === \'archived\' }">--> <!--                        <td>--> <!--                        <span class="view-custom-fields&#45;&#45;column-large-icon">--> <!--                            <span class="{{$customFieldService.getTypeIcon(custom_field.type)}}"></span>--> <!--                            <span>{{ $customFieldService.getTypeName(custom_field.type) }}</span>--> <!--                        </span>--> <!--                        </td>--> <!--                        <td>--> <!--                            <div class="bolder">--> <!--                                <a data-ng-click="edit_custom_field(custom_field)"--> <!--                                   class="light-blue-on-hover">{{ custom_field.name }}</a>-->
9 <!--                                <span class="view-custom-fields&#45;&#45;archived"--> <!--                                      data-ng-if="custom_field.active == false">(arquivado)</span>--> <!--                            </div>--> <!--                            <div class="view-custom-fields&#45;&#45;details">--> <!--                                <span>Visível para</span>--> <!--                                <strong>{{getRestrictedRolesDescription(custom_field)}}</strong>--> <!--                                <span>com acesso a</span>--> <!--                                <strong--> <!--                                    style="text-transform: lowercase">{{$customFieldService.getTranslationEntity(custom_field.entity)}}</strong>--> <!--                            </div>--> <!--                        </td>--> <!--                        <td class="align-right actions-column">--> <!--                            <a title="Opções" data-dropdown="dropdown-custom-field-{{custom_field.id}}"--> <!--                               class="grey-color light-blue-on-hover">--> <!--                                <span class="icon-angle-down"--> <!--                                      style="font-size: 18px;"></span>--> <!--                            </a>--> <!--                            <div id="dropdown-custom-field-{{custom_field.id}}" data-dropdown-content--> <!--                                 class="f-dropdown dropdown-option-list" dropdown-close-on-click>--> <!--                                <div class="dropdown-option option-button">--> <!--                                    <a data-ng-click="edit_custom_field(custom_field)">--> <!--                                        <span>Editar campo</span>--> <!--                                    </a>--> <!--                                </div>--> <!--                                <div class="dropdown-option option-button" data-ng-if="custom_field.active == true">--> <!--                                    <a data-ng-click="archive_custom_field(custom_field)">--> <!--                                        Arquivar campo--> <!--                                    </a>--> <!--                                </div>--> <!--                                <div class="dropdown-option option-button"--> <!--                                     data-ng-if="custom_field.active == false">--> <!--                                    <a data-ng-click="active_custom_field(custom_field)">--> <!--                                        Reativar campo--> <!--                                    </a>--> <!--                                </div>--> <!--                                <hr>--> <!--                                <div class="dropdown-option option-button">--> <!--                                    <a data-ng-click="remove_custom_field(custom_field)"--> <!--                                       class="red-color-on-hover">--> <!--                                        Excluir campo--> <!--                                    </a>--> <!--                                </div>--> <!--                            </div>--> <!--                        </td>--> <!--                    </tr>--> <!--                </table>--> <!--            </div>--> </div> <div data-ng-if="tabSelected === \'activities\'"> <div data-todo-project-permissions-form data-permissions="project.todo_permissions" data-can-edit="$permissionService.hasPrivilegesToEditProject(project)" data-show-restore-account-default="!!project.id"></div> </div> </div> <div class="modal-footer"> <div> <button data-ng-click="close()" class="button clean" style="margin-right: 5px;" data-ng-hide="saving">{{ \'project_edit.footer.cancel\' | translate }}</button> <button data-ng-click="save()" data-ng-disabled="!project.name || saving" class="button button--blue-brand"> <span>{{ saving ? (\'project_edit.footer.saving\' | translate) : (\'project_edit.footer.save\' | translate) }}</span> </button> </div> <div data-ng-if="!isValid()" class="has-error bolder" style="font-size: 12px; margin-top: 15px;"> {{ \'project_edit.footer.invalid_form\' | translate }} </div> </div> </div> '),
10$templateCache.put("views/projects/projects-header.html",'<div class="view-project-header"> <div data-ng-if="!project" style="margin: 50px"> <div spinner-loading="loading_project" class="spinner-size-mini" message="{{ \'project_home.header.searching\' | translate }}"></div> <div data-ng-if="!loading_project" class="steel-color center bolder" style="font-size: 13px;"> <span class="steel-color">{{ \'project_home.header.not_found\' | translate }}</span> </div> </div> <div data-ng-if="project"> <div class="view-project-header--content" data-training="project-header"> <div class="view-project-header--content__title-section"> <h1 class="overflow-ellipsis view-project-header__project-title"> <span class="view-project-header__project-title-bar" data-entity-color-swatch data-variant="bar-inline" data-color="project.color" data-reserve-inline-sp
10ace="false"></span> <span class="view-project-header__project-title-text">{{project.name}}</span> </h1> <!-- Menu com ações para quem não pode editar o projeto, mas pode copiar projetos  --> <div class="option-section" data-ng-if="!$permissionService.hasPrivilegesToEditProject(project) && !$permissionService.hasPrivilegesToCreateProjects()"> <!--                 data-ng-if="!has_project_edit_permission() && has_project_create_permission()">--> <a title="{{ \'project_home.header.options\' | translate }}" data-dropdown="dropdown-project-home-{{project.id}}-only-for-copy"><span class="icon-double-angle-down"></span></a> <div id="dropdown-project-home-{{project.id}}-only-for-copy" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="copy_project()"> <span>{{ \'project_home.header.copy_project\' | translate }}</span> <span data-flag-upgrade-required="PROJECT_COPY"></span> </a> </div> </div> </div> <!-- Menu completo de ações no projeto --> <div class="option-section" data-ng-if="$permissionService.hasPrivilegesToEditProject(project)"> <!--                 data-ng-if="has_project_edit_permission()">--> <a data-ng-click="edit_project()" title="{{ \'project_home.header.edit_project\' | translate }}"> <span class="icon-pen2"></span> </a> <a title="{{ \'project_home.header.options\' | translate }}" data-dropdown="dropdown-project-home-{{project.id}}"><span class="icon-double-angle-down"></span></a> <div id="dropdown-project-home-{{project.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button" data-ng-if="project.is_member"> <a data-ng-click="leave_project()"> <span>{{ \'project_home.header.leave_project\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="!project.is_member"> <a data-ng-click="enter_project()"> <span>{{ \'project_home.header.enter_project\' | translate }}</span> </a> </div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="edit_project()"> <span>{{ \'project_home.header.edit_project\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="editBudgetAndBilling()"> <span>{{ \'project_home.header.budget_and_billing\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="project.privacy_s == \'public\'"> <a data-ng-click="make_private()"> <span>{{ \'project_home.header.make_private\' | translate }}</span> <span data-flag-upgrade-required="PROJECT_PRIVATE_PRIVACY"></span> </a> </div> <div class="dropdown-option option-button" data-ng-if="project.privacy_s == \'private\'"> <a data-ng-click="make_public()"> <span>{{ \'project_home.header.make_public\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="project.status == \'active\'"> <a data-ng-click="archive_project()"> {{ \'project_home.header.archive_project\' | translate }} </a> </div> <div class="dropdown-option option-button" data-ng-if="project.status == \'archived\'"> <a data-ng-click="active_project()"> {{ \'project_home.header.reactivate_project\' | translate }} </a> </div> <hr> <div class="dropdown-option option-button" data-ng-if="project.template == false"> <a data-ng-click="save_as_template()"> <span>{{ \'project_home.header.save_as_template\' | translate }}</span> <span data-flag-upgrade-required="PROJECT_TEMPLATES"></span> </a> </div> <div class="dropdown-option option-button" data-ng-if="project.template == true"> <a data-ng-click="remove_as_template()"> <span>{{ \'project_home.header.remove_as_template\' | translate }}</span> <span data-flag-upgrade-required="PROJECT_TEMPLATES"></span> </a> </div> <div class="dropdown-option option-button" data-ng-if="has_project_create_permission()"> <a data-ng-click="copy_project()"> <span>{{ \'project_home.header.copy_project\' | translate }}</span> <span data-flag-upgrade-required="PROJECT_COPY"></span> </a> </div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="openTrash()" data-if-has-feature="TODOLIST"> {{ \'project_home.header.view_trash\' | translate }} </a> <a data-ng-click="remove_project()" class="red-color-on-hover"> {{ \'project_home.header.delete_project\' | translate }} </a> </div> </div> </div> <!--                <a data-ng-if="project.privacy === 1 && !project.is_member"--> <!--                   data-ng-click="enter_project()"--> <!--                   class="button clean view-project-header&#45;&#45;content__button-enter">-->
10 <!--                    <span class="icon-enter"></span>--> <!--                    <span>Participar do projeto</span>--> <!--                </a>--> </div> <div class="info-section"> <div class="info"> <div class="info-section--customer-name overflow-ellipsis" data-ng-bind="project.customer_name" title="{{ \'project_home.header.labels.customer\' | translate }}"></div> </div> <div class="info" title="{{ \'project_home.header.labels.privacy\' | translate }}"> <span data-ng-if="project.privacy == 1">{{ \'project_home.header.labels.public\' | translate }}</span> <span data-ng-if="project.privacy == 2"> <span class="icon-lock_outline"></span> <span>{{ \'project_home.header.labels.private\' | translate }}</span> </span> </div> <div class="info" data-ng-if="project.is_billable"> <span class="info-section--dollar-symbol">$</span> <span>{{ \'project_home.header.labels.billable\' | translate }}</span> </div> <div data-ng-if="project.status === \'archived\'" class="info project-status" title="{{ \'project_home.header.labels.status\' | translate }}"> <span class="icon-archive2"></span> <span>{{ \'project_home.header.labels.archived\' | translate }}</span> </div> <div data-ng-if="project.template == true" class="info"> <span class="icon-paper-stack"></span> <span>{{ \'project_home.header.labels.template\' | translate }}</span> </div> <div class="info" title="{{ \'project_home.header.labels.participation\' | translate }}"> <span>{{getMemberDescription()}}</span> </div> <div class="info" data-ng-if="showBudgetProgress()"> <span data-progress-bar data-progress-completed="project.budget_options.progress" data-progress-tooltip-title="{{ \'project_home.header.labels.budget_progress\' | translate }}" data-progress-tooltip-items="getBudgetProgressTooltipItems()" data-progress-tooltip-placement="bottom"> </span> </div> </div> <div class="desc-section" data-ng-if="project.description && currentTab !== \'kanban\'" data-ng-bind="project.description"></div> <div class="custom-fields-section" data-ng-if="currentTab !== \'kanban\'"> <span class="flag radius-full" data-ng-repeat="custom_field in $customFieldService.getActiveByEntity(\'projects\') | orderBy: \'name\'" data-ng-if="project[\'custom_fields\'][custom_field.id]" data-tooltip="{{custom_field.name}}"> <span data-ng-switch="custom_field.type"> <span data-ng-switch-when="date"> {{ project[\'custom_fields\'][custom_field.id][\'value\'] | dateLong }} </span> <span data-ng-switch-when="enum"> {{ project[\'custom_fields\'][custom_field.id][\'enum_name\'] }} </span> <span data-ng-switch-when="money"> {{ project[\'custom_fields\'][custom_field.id][\'value\'] | moneyToRealPrivacy }} </span> <span data-ng-switch-when="numeric"> {{ project[\'custom_fields\'][custom_field.id][\'value\'] | numericHuman }} </span> <span data-ng-switch-when="time"> {{ project[\'custom_fields\'][custom_field.id][\'value\'] | durationFormat: \'default\' }} </span> <span data-ng-switch-default> {{ project[\'custom_fields\'][custom_field.id][\'value\'] }} </span> </span> </span> </div> </div> <div data-app-tabs data-training="project-tabs" data-tabs="projectHeaderTabs" data-selected="currentTab" data-tab-margin-left="25px"> </div> </div> </div> '),$templateCache.put("views/projects/projects-tasks.html",'<div data-ng-controller="ProjectsTasksController" class="view-projects-tasks"> <div class="row" data-ng-if="$permissionService.hasPrivilegesToEditProject(project)"> <!--         data-ng-if="has_project_edit_permission()">--> <button class="button clean" data-ng-click="add_tasks()" data-ng-disabled="!project.id"> <span class="icon-plus4" style="padding-right: 5px;"></span> <span>{{ \'project_tasks.list.button_add\' | translate }}</span> </button> </div> <div> <div data-spinner-loading="loading_tasks" data-message="{{ \'project_tasks.list.loading\' | translate }}" style="margin-top: 50px;"></div> <div data-ng-if="!loading_tasks && project_tasks.length == 0" class="view-projects-tasks--empty-message"> <!--            <span class="grey-color">Não existe nenhuma tarefa no projeto</span>--> <p>{{ \'project_tasks.list.empty_title\' | translate }}</p> <span data-ng-bind-html="\'project_tasks.list.empty_description\' | translate"> </span> <!--            </div>--> </div> <div class="list-minimal" data-ng-if="!loading_tasks && project_tasks.length > 0" style="padding-top: 30px;"> <table> <tbody> <tr class="list-minimal--search__tr"> <td colspan="3"> <input type="search" data-ng-model="filter.search" data-ng-change="filterTasks()" placeholder="{{ \'project_tasks.list.search_placeholder\' | translate }}" autofocus> </td> </tr> <tr data-ng-repeat="task in tasksFiltered"> <!-- Nome e descrição da tarefa --> <td> <div class="view-projects-tasks__task-cell"> <div class="view-projects-tasks__task-name-row"> <span class="view-projects-tasks__task-name-bar" data-entity-color-swatch data-variant="bar-inline" data-color="task.color" data-reserve-inline-sp
10ace="false"></span> <span class="bolder view-projects-tasks__task-name-text" data-ng-class="{ \'task-checked\': task.checked == 1 }" data-ng-bind-html="task.task_name | highlight: filter.search">{{task.task_name}}</span> <a class="icon-info light-grey-color view-projects-tasks__task-info-icon" data-ng-if="task.task_description" data-dropdown="dropdown-project-task-info-{{task.id}}"></a> </div> <!--                                <div class="details"--> <!--                                     data-ng-bind-html="task.description | highlight: filter.search"></div>--> <div id="dropdown-project-task-info-{{task.id}}" data-dropdown-content class="f-dropdown content"> <div style="width: 300px; padding: 5px;"> <div class="bolder" style="padding-bottom: 5px; font-size: 14px;">{{task.task_name}}</div> <div class="details">{{task.task_description}}</div> </div> </div> </div> </td> <td data-ng-if="has_permission_to_edit_charge_rate()" class="view-projects-tasks--column-billable"> <div data-ng-if="!project.is_billable"> <span class="bolder grey-color" tooltip="{{ \'project_tasks.list.project_not_billable_tooltip\' | translate }}" style="font-size: 17px">$</span> </div> <div data-ng-if="project.is_billable"> <a class="light-grey-bgcolor-on-hover radius view-projects-tasks--button-billable-settings" data-dropdown="view-project-tasks--dropdown-change-billable-settings__task-{{task.id}}"> <span class="bolder" data-ng-class="{\'green-color\': task.is_billable, \'grey-color \': !task.is_billable }" data-tooltip="{{ \'project_tasks.list.billable_status_tooltip\' | translate:{status: ((task.is_billable ? \'project_tasks.list.billable_status_yes\' : \'project_tasks.list.billable_status_no\') | translate) } }}" style="font-size: 17px">$</span> </a> </div> <div id="view-project-tasks--dropdown-change-billable-settings__task-{{task.id}}" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="view-project-tasks--dropdown-change-billable-settings__container"> <div class="row"> <label>{{ \'project_tasks.list.billable_edit.label\' | translate }}</label> <div> <label style="margin-right: 5px;"> <input type="radio" ng-model="task.billable_edit.is_billable" data-ng-change="markBillableEditAsDirty(task)" ng-value="true"> <span>{{ \'project_tasks.list.billable_edit.option_yes\' | translate }}</span> </label> <label> <input type="radio" ng-model="task.billable_edit.is_billable" data-ng-change="markBillableEditAsDirty(task)" ng-value="false"> <span>{{ \'project_tasks.list.billable_edit.option_no\' | translate }}</span> </label> </div> </div> <div class="row view-project-tasks--dropdown-change-billable-settings__info"> <p translate="project_tasks.list.billable_edit.default_info" data-translate-values="{\r\n                                                status: ((task.is_billable_default ? \'project_tasks.list.billable_edit.default_status_yes\' : \'project_tasks.list.billable_edit.default_status_no\') | translate)\r\n                                            }"> </p> </div> <div class="explanation explanation--with-icon-info radius" data-ng-if="task.billable_edit.is_dirty" style="margin-top: 10px"> {{ \'project_tasks.list.billable_edit.recalculate_warning\' | translate }} </div> </div> <hr> <div class="view-project-tasks--dropdown-change-billable-settings__buttons"> <div class="row"> <div class="column-50"> <button class="button clean" data-ng-click="cancelBillableEdit($event, task)"> {{ \'project_tasks.list.billable_edit.button_cancel\' | translate }} </button> </div> <div class="column-50"> <button class="button button--blue-brand" data-ng-click="saveBillableEdit($event, task)" data-ng-disabled="!task.billable_edit.is_dirty || task.billable_edit.is_saving"> {{ (task.billable_edit.is_saving ? \'project_tasks.list.billable_edit.button_applying\' : \'project_tasks.list.billable_edit.button_apply\') | translate }} </button> </div> </div> </div> </div> </td> <!-- Menu dropdown --> <td style="text-align: right;"> <div data-ng-if="$permissionService.hasPrivilegesToEditProject(project)"> <!--                                data-ng-if="has_project_edit_permission()">--> <a class="light-grey-color light-blue-on-hover light-grey-bgcolor-on-hover radius" data-dropdown="dropdown-project-task-{{task.id}}"> <span class="icon-ellipsis"></span> </a> </div> <div id="dropdown-project-task-{{task.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <!--                                <div data-ng-if="has_project_edit_permission()">--> <div class="dropdown-option option-button" data-ng-if="!task.checked"> <a ng-click="check(task)"> <span>
10{{ \'project_tasks.list.options.archive\' | translate }}</span> <!--                                        <span class="flag yellow-color" style="margin-left: 10px;"--> <!--                                              if-has-not-feature="TASK_COMPLETED"--> <!--                                        >UPGRADE</span>--> <span data-flag-upgrade-required="TASK_COMPLETED" style="margin-left: 10px;"></span> </a> </div> <div class="dropdown-option option-button" data-ng-if="task.checked"> <a ng-click="uncheck(task)"> <span>{{ \'project_tasks.list.options.reactivate\' | translate }}</span> <!--                                        <span class="flag yellow-color" style="margin-left: 10px;"--> <!--                                              if-has-not-feature="TASK_COMPLETED"--> <!--                                        >UPGRADE</span>--> <span data-flag-upgrade-required="TASK_COMPLETED" style="margin-left: 10px;"></span> </a> </div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="remove_task(task)" class="red-color-on-hover"> {{ \'project_tasks.list.options.remove\' | translate }} </a> </div> <!--                                </div>--> </div> </td> </tr> </tbody> </table> <div data-ng-if="tasksFiltered.length == 0" class="view-projects-tasks--empty-message"> <span data-ng-bind-html="\'project_tasks.add_modal.no_results\' | translate:{search: filter.search}"></span> <span data-ng-if="$permissionService.hasPrivilegesToEditProject(project)"> <a class="link underline" data-ng-click="add_tasks()">{{ \'project_tasks.list.button_add\' | translate }}</a>. </span> </div> </div> </div> </div> '),$templateCache.put("views/projects/projects-users-edit-billable.html",'<div class="view-project-users-edit-billable modal__with-tabs"> <div class="modal-header"> <h1 class="overflow-ellipsis">{{ \'project_users.edit_billable.title\' | translate:{name: project_user.user_name} }}</h1> <div class="modal-header--details"> <p data-ng-bind-html="\'project_users.edit_billable.project_details\' | translate:{name: project.name}"></p> <p> <span data-ng-bind-html="\'project_users.edit_billable.default_rate\' | translate:{rate: (project.rate | moneyToReal)}"></span> <span data-ng-if="project.rate_start_at"> {{ \'project_users.edit_billable.rate_start_at\' | translate:{date: (project.rate_start_at|dateLong)} }}</span> </p> </div> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body"> <div class="row view-project-users-edit-billable--radio-is-billable-container"> <label>{{ \'project_users.edit_billable.billable_label\' | translate }}</label> <div> <label> <input type="radio" data-ng-model="project_user.is_billable" data-ng-change="markBillableEditAsDirty()" ng-value="true"> <span>{{ \'project_users.edit_billable.option_billable\' | translate }}</span> </label> <label> <input type="radio" data-ng-model="project_user.is_billable" data-ng-change="markBillableEditAsDirty()" ng-value="false"> <span>{{ \'project_users.edit_billable.option_not_billable\' | translate }}</span> </label> </div> </div> <div data-ng-if="project_user.is_billable" class="row view-project-users-edit-billable--radio-is-billable-container"> <label>{{ \'project_users.edit_billable.preference_label\' | translate }}</label> <div> <label> <input type="radio" data-ng-model="project_user.bill_by" data-ng-change="changeToProjectRate()" value="project"> <span>{{ \'project_users.edit_billable.option_project\' | translate }}</span> </label> <label> <input type="radio" data-ng-model="project_user.bill_by" value="user"> <span>{{ \'project_users.edit_billable.option_user\' | translate }}</span> </label> </div> </div> <div data-ng-if="project_user.is_billable && project_user.bill_by === \'user\'" class="view-project-users-edit-billable--input-rate-container"> <label> {{ \'project_users.edit_billable.rate_label\' | translate }} </label> <div class="input-prefix-inside--container input-suffix-inside--container"> <label class="input-prefix-inside--label-prefix" for="view-project-users--dropdown-change-billable-settings__user-{{project_user.id}}-input-rate"> {{ \'\' | currencySymbol }}</label> <input type="text" id="view-project-users--dropdown-change-billable-settings__user-{{project_user.id}}-input-rate" data-ng-mask="money" data-ng-model="project_user.rate_formatted" data-ng-change="markBillableEditAsDirt
10y()" placeholder="{{ (project.rate || 0) | moneyOnlyAmount : true }}" class="right"> <label class="input-suffix-inside--label-suffix" for="view-project-users--dropdown-change-billable-settings__user-{{project_user.id}}-input-rate"> {{ \'project_users.edit_billable.rate_suffix\' | translate }} </label> </div> </div> <div data-ng-if="project_user.is_billable"> <div data-historical-rate-save-form data-type="billable" data-model="project_user"> </div> </div> <div data-ng-if="project_user.rate_start_at" data-historical-rate-list="\r\n             {\r\n                project_id: project_user.project_id,\r\n                user_id: project_user.user_id,\r\n                type: \'billable\'\r\n            }" data-model="project_user"> </div> </div> <div class="modal-footer"> <div class="row"> <div class="column-50"> <button class="button clean" data-ng-click="close()"> {{ \'project_users.edit_billable.button_cancel\' | translate }} </button> </div> <div class="column-50"> <button class="button button--blue-brand" data-ng-click="saveBillableEdit($event, user)" data-ng-disabled="!isDirty || isSaving"> {{ isSaving ? (\'project_users.edit_billable.button_applying\' | translate) : (\'project_users.edit_billable.button_apply\' | translate) }} </button> </div> </div> </div> </div> '),$templateCache.put("views/projects/projects-users.html",'<div data-ng-controller="ProjectsUsersController" class="view-projects-users"> <div class="row" data-ng-if="$permissionService.hasPrivilegesToEditProject(project)"> <!--         data-ng-if="has_project_edit_permission()">--> <button class="button clean" data-ng-click="add_users()" data-ng-disabled="!project.id"> <span class="icon-plus4" style="padding-right: 5px;"></span> <span>{{ \'project_users.list.add_users\' | translate }}</span> </button> </div> <div> <div spinner-loading="loading_users" message="{{ \'project_users.list.loading\' | translate }}" style="margin-top: 50px;"></div> <div data-ng-if="!loading_users && project_users.length == 0" class="center" style="padding: 50px 0;"> <span class="grey-color">{{ \'project_users.list.empty\' | translate }}</span> </div> <div class="list-minimal" data-ng-if="!loading_users && project_users.length > 0" style="padding-top: 30px;"> <table> <tbody> <tr class="list-minimal--search__tr"> <td colspan="4"> <input type="search" data-ng-model="filter.search" data-ng-change="filterUsers()" placeholder="{{ \'project_users.list.search_placeholder\' | translate }}" autofocus> </td> </tr> <tr data-ng-repeat="user in usersFiltered" data-ng-class="{ \'permission-warning--show-flag\': user.manager && user.user_role === \'regular\' }"> <td> <div class="user-list-item--identity"> <div data-user-avatar data-name="{{ user.user_name }}" data-photo-url="user.user_profile_photo_url" data-size="sm"> </div> <div> <div class="view-projects-users--user-name" data-ng-bind-html="user.user_name | highlight: filter.search"></div> <div class="view-projects-users--user-details" data-ng-bind-html="user.user_email | highlight: filter.search"></div> <div class="view-projects-users--user-details" data-ng-if="user.teams && user.teams.length > 0"> {{ \'project_users.list.team_label\' | translate }} <span data-ng-bind-html="user.teams | join: \'name\' | highlight: filter.search"></span> </div> </div> </div> </td> <td class="center"> <!--                            <div if-has-feature="ROLE_PERMISSIONS">--> <!--                                <span data-ng-if="user.manager"--> <!--                                      class="flag white-color light-blue-bgcolor bolder"--> <!--                                      title="Gerente do projeto">Gerente</span>--> <!--                            </div>--> <!--                            <div if-has-feature="ROLE_PERMISSIONS">--> <span data-ng-if="user.manager" class="flag flag-project-manager-member" title="{{ \'project_users.list.manager_flag\' | translate }}">{{ \'project_users.list.manager_flag\' | translate }}</span> <span data-ng-if="!user.manager" class="flag flag-project-regular-member" title="{{ \'project_users.list.regular_flag\' | translate }}">{{ \'project_users.list.regular_flag\' | translate }}</span>
10 <!--                                <span data-ng-if="user.manager && user.user_role === \'regular\'"--> <div class="permission-warning--hidden-flag"> <span> <strong>{{ \'project_users.list.permission_warning.title\' | translate }}</strong> {{ \'project_users.list.permission_warning.limited_access\' | translate }} <span data-ng-bind-html="\'project_users.list.permission_warning.instruction\' | translate"></span> </span> </div> <!--                            </div>--> </td> <!-- Icone de cobrável --> <td data-ng-if="has_permission_to_edit_charge_rate()"> <div data-if-has-feature="BILLABLE_PROJECT"> <span data-ng-if="!project.is_billable" class="bolder grey-color" tooltip="{{ \'project_users.list.billable_tooltip.not_billable_project\' | translate }}" style="font-size: 17px">$</span> <div data-ng-if="project.is_billable"> <a class="light-grey-bgcolor-on-hover radius view-projects-users--button-billable-settings" data-ng-click="openEditBillableModal(project, user)"> <div class="bolder" data-ng-class="{\'green-color\': user.is_billable, \'grey-color \': !user.is_billable }" tooltip="{{ \'project_users.list.billable_tooltip.billable_user\' | translate:{status: (user.is_billable ? (\'project_users.list.billable_tooltip.status_yes\' | translate) : (\'project_users.list.billable_tooltip.status_no\' | translate))} }}" style="font-size: 17px">$</div> <div class="view-projects-users--button-billable-settings__rate" data-ng-if="user.is_billable"> <span data-ng-if="user.rate"> <span>{{ user.rate | moneyToRealPrivacy : true }} / h</span> <span class="view-projects-users--button-billable-settings__bill_by"> {{ \'project_users.list.billable_tooltip.personalized\' | translate }} </span> </span> <span data-ng-if="!user.rate"> <span>{{ project.rate | moneyToRealPrivacy: true }} / h</span> <span class="view-projects-users--button-billable-settings__bill_by"> {{ \'project_users.list.billable_tooltip.default\' | translate }} </span> </span> </div> </a> </div> </div> </td> <td style="text-align: right;" data-ng-if="$permissionService.hasPrivilegesToEditProject(project)"> <!--                            data-ng-if="has_project_edit_permission()">--> <a class="light-grey-color light-blue-on-hover light-grey-bgcolor-on-hover radius" data-dropdown="dropdown-project-user-{{user.id}}"> <span class="icon-ellipsis"></span> </a> <div id="dropdown-project-user-{{user.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button" data-ng-if="!user.manager"> <a data-ng-click="promote_manager(user)" data-ng-disabled="user.user_role === \'regular\'"> <span>{{ \'project_users.list.options.promote\' | translate }}</span> <!--                                        <span class="flag yellow-color" style="margin-left: 10px;"--> <!--                                              if-has-not-feature="ROLE_PERMISSIONS"--> <!--                                        >UPGRADE</span>--> <!--                                        <span data-flag-upgrade-required="ROLE_PERMISSIONS"--> <!--                                              style="margin-left: 10px;"></span>--> </a> </div> <div class="dropdown-option option-button" data-ng-if="user.manager"> <a data-ng-click="revoke_manager(user)"> <span>{{ \'project_users.list.options.revoke\' | translate }}</span> <!--                                        <span class="flag yellow-color" style="margin-left: 10px;"--> <!--                                              if-has-not-feature="ROLE_PERMISSIONS"--> <!--                                        >UPGRADE</span>--> <!--                                        <span data-flag-upgrade-required="ROLE_PERMISSIONS"--> <!--                                              style="margin-left: 10px;"></span>--> </a> </div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="remove_user(user)" class="red-color-on-hover"> {{ \'project_users.list.options.remove\' | translate }} </a> </div> </div> </td> </tr> </tbody> </table> <div data-ng-if="usersFiltered.length == 0" class="view-projects-users--empty-message"> <span data-ng-bind-html="\'project_users.list.empty_search\' | translate:{search: filter.search}"></span> <span data-ng-if="$permissionService.hasPrivilegesToEditProject(project)"> <a class="link underline" data-ng-click="add_users()">{{ \'project_users.list.add_users_link\' | translate }}</a>. </span> </div> </div> </div> </div> '),$templateCache.put("views/settings/calendar-edit.html",'<div class="view-calendar-edit"> <div class="modal-header"> <div> <h1>{{calendar.id ? (\'holiday_calendars.edit_title\' | translate) : (\'holiday_calendars.new_title\' | translate)}}</h1> </div> <div> <a class="icon-cross" data-ng-click="$close()"></a> </div> </div>
10 <div class="modal-body" data-on-click-enter="save()" data-spinner-loading-modal="isLoading"> <div data-ng-if="!isLoading"> <div class="row"> <div class="column-50"> <label>{{ \'holiday_calendars.name_label\' | translate }}</label> <input type="text" data-ng-model="calendar.name" placeholder="{{ \'holiday_calendars.name_placeholder\' | translate }}"> </div> <div class="column-50"> <label>{{ \'holiday_calendars.parent_label\' | translate }}</label> <select data-ng-model="calendar.parent_id" data-options-load="loadCalendars" data-options-load-params="{ except_calendar_id: calendar.id }" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'id\',\r\n                            sortField: \'name\',\r\n                            searchField: \'name\',\r\n                            dropdownParent: \'body\',\r\n                            placeholder: (\'holiday_calendars.parent_placeholder\' | translate)\r\n                        }"></select> </div> </div> <div class="row"> <div class="column-100"> <button class="button button--blue-brand" data-ng-click="save()" data-ng-disabled="isSaving"> {{isSaving ? (\'holiday_calendars.saving\' | translate) : (\'holiday_calendars.save\' | translate)}} </button> <button class="button clean" data-ng-click="$close()" style="margin-left: 5px">{{ \'holiday_calendars.close\' | translate }}</button> </div> </div> <div data-ng-if="calendar.id" style="margin-top: 40px;"> <hr> <div class="row" style="margin-top: 20px; margin-bottom: 20px;"> <div class="column-100"> <div class="radius date-frame"> <div class="move-date-container"> <a data-ng-click="move_previous_year()"> <span class="icon-angle-left"></span> </a> </div> <div class="date-display" style="font-weight: bold; font-size: 14px;"> <a data-ng-click="set_filter_year(filter_year - 1)" class="steel-color" style="margin-right: 10px; font-weight: normal;">{{ filter_year - 1 }}</a> <span style="font-size: 16px;">{{ \'holiday_calendars.holidays_title\' | translate:{year: filter_year} }}</span> <a data-ng-click="set_filter_year(filter_year + 1)" class="steel-color" style="margin-left: 10px; font-weight: normal;">{{ filter_year + 1 }}</a> </div> <div class="move-date-container"> <a data-ng-click="move_next_year()"> <span class="icon-angle-right"></span> </a> </div> </div> </div> </div> <div class="row" style="margin-top: 20px;"> <div class="column-40"> <label>{{ \'holiday_calendars.date_label\' | translate }}</label> <div data-button-date="newHoliday.holiday_date"></div> </div> <div class="column-40"> <label>{{ \'holiday_calendars.description_label\' | translate }}</label> <input type="text" data-ng-model="newHoliday.description" placeholder="{{ \'holiday_calendars.description_placeholder\' | translate }}"> </div> <div class="column-20" style="padding-top: 25px;"> <button class="button button--blue-brand full-width" data-ng-click="addHoliday()" data-ng-disabled="!newHoliday.holiday_date || isSavingHoliday"> {{isSavingHoliday ? (\'holiday_calendars.adding_holiday\' | translate) : (\'holiday_calendars.add_holiday\' | translate)}} </button> </div> </div> <div class="list-minimal"> <table> <tbody> <tr data-ng-repeat="holiday in calendar.holidays | orderBy:\'holiday_date\'"> <td> {{holiday.holiday_date | dateLong}} </td> <td>{{holiday.description}}</td> <td class="align-right"> <a data-ng-if="holiday.is_inherited === false" data-ng-click="deleteHoliday(holiday)" class="icon-trash2 red-color" title="{{ \'holiday_calendars.confirm.delete_holiday_confirm\' | translate }}"></a> <span data-ng-if="holiday.is_inherited === true" class="flag grey" style="font-size: 10px; margin-left: 5px;"> {{ \'holiday_calendars.inherited\' | translate }} </span> </td> </tr> <tr data-ng-if="calendar.holidays.length === 0"> <td colspan="3" class="center steel-color" style="padding: 20px;"> {{ \'holiday_calendars.no_holidays\' | translate:{year: filter_year} }} </td> </tr> </tbody> </table> </div> </div> </div> </div> </div> '),
11$templateCache.put("views/settings/calendars.html",'<div class="view radius content-register-edit view-calendars-list"> <div class="row view-content-account--header-container"> <div class="column-50"> <h1>{{ \'holiday_calendars.title\' | translate }}</h1> </div> <div class="column-50 align-right"> <button data-ng-click="edit()" class="button button--blue-brand"> <span class="icon-plus4"></span> {{ \'holiday_calendars.new\' | translate }} </button> </div> </div> <div> <span data-flag-upgrade-required="USER_CAPACITY" data-show-long-description="true" data-custom-description="{{ \'holiday_calendars.upgrade_description\' | translate }}" style="margin-top: 0; margin-bottom: 5px"></span> </div> <div class="list-minimal view-calendars-list--container"> <div data-spinner-loading="isLoading && calendars.length === 0" data-message="{{ \'holiday_calendars.loading\' | translate }}"></div> <table data-ng-if="!isLoading || calendars.length > 0"> <tbody> <tr data-ng-repeat="calendar in calendars"> <td> <div class="view-calendars-list--title"> <a data-ng-click="edit(calendar)" class="light-blue-on-hover">{{calendar.name}}</a> </div> <div class="view-calendars-list--details"> <span class="steel-color" data-ng-if="calendar.people_count === 0">{{ \'holiday_calendars.users_count.none\' | translate }}</span> <span class="steel-color" data-ng-if="calendar.people_count > 0">{{ \'holiday_calendars.users_count.plural\' | translate:{count: calendar.people_count} }}</span> </div> </td> <td class="align-right"> <a data-ng-click="delete(calendar)" class="icon-trash2 red-color" data-ng-disabled="calendar.is_deleting || calendar.people_count > 0" title="{{ \'holiday_calendars.confirm.delete_calendar_title\' | translate }}"></a> </td> </tr> <tr data-ng-if="calendars.length === 0"> <td colspan="2" class="center steel-color" style="padding: 20px;"> {{ \'holiday_calendars.no_calendars\' | translate }} </td> </tr> </tbody> </table> </div> </div> '),$templateCache.put("views/reports/report-daily.html",'<section class="report-layout-grid report-groups-and-sort-2024 view-report-daily" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <div class="report-topbar"> <div> <h3>{{ \'report.daily.title\' | translate }}</h3> <label class="element-todo-checkbox" data-ng-if="$settingsService.settings.integration_time_clock_active"> <input type="checkbox" data-ng-check data-ng-model="filter.apiParams.only_with_divergence"> {{ \'report.daily.only_divergence\' | translate }} </label> </div> <div> <button data-ng-click="export()" class="button clean radius" title="{{ \'report.detailed.export_error\' | translate }}"> <span class="icon-download5"></span> {{ \'report.export\' | translate }} </button> </div> </div> <div> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': reseting_report } "> <div class="report-list-sticky" data-infinite-scroll="load()" data-infinite-scroll-disabled="loading_report" data-infinite-scroll-distance="1" data-infinite-scroll-container=".report-layout-grid--content"> <!--                <div class="report-list-sticky">--> <table class="sticky-table report-round-table-corners"> <thead> <tr> <th style="width: 150px;"> <div class="th-inner overflow-ellipsis"> {{ \'report.daily.weekday\' | translate }} </div> </th> <th style="width: 150px;"> <div class="th-inner overflow-ellipsis"> {{ \'report.daily.date\' | translate }} </div> </th> <th style="width: 150px;"> <div class="th-inner overflow-ellipsis"> {{ \'report.daily.hours\' | translate }} {{$settingsService.settings.integration_time_clock_active ? \'Rabbiit\' : \'\'}} </div> </th> <th data-ng-if="$settingsService.settings.integration_time_clock_active" style="width: 150px;"> <div class="th-inner overflow-ellipsis"> <span class="overflow-ellipsis">{{ \'report.daily.hours\' | translate }} <span style="text-transform: capitalize;">{{$settingsService.settings.integration_time_clock_active}}</span> </span> </div> </th> <th> <div class="th-inner"></div> </th> </tr> </thead> <tbody> <tbody> <tr data-ng-repeat-start="group_report in report_daily | orderBy : \'user_name\' | groupBy : \'user_name\'" class="header-subtotal report-groups-and-sort-2024--total-row"> <td class="title"> <span class="overflow-ellipsis">{{group_report.group_name}}</span> </td> <td></td> <td> <span>{{ subtotals[group_report.group_name].total_time | durationFormat: \'report\' }}</span> </td> <td data-ng-if="$settingsService.settings.integration_time_clock_active"> <span data-ng-if="group_report.items[0].time_clock_integration_active == 1"> <span>{{ subtotals[group_report.group_name].total_time_clock | durationFormat: \'report\' }}</span> </span> </td> <td></td> </tr> <tr data-ng-repeat-end class="content" data-ng-repeat="row in group_report.items | orderBy : \'date\'" data-ng-init="weekday = ( row.date | moment : \'weekday\' )" data-ng-class="{\'end-week\' : ( weekday == \'Sábado\')}" style="height: 30px"> <td> {{ weekday }} </td> <td> {{ row.date | date: \'dd/MM/yyyy\' }} </td> <td data-ng-class="{ \'light-orange-bgcolor orange-color bolder\' : has_divergence(row) }"> <a class="link link-dashed" data-ng-if="hasDayHours(row)" data-ng-click="onDayHoursClick(row, group_report.group_name)"> {{ row.time_total | durationFormat: \'report\' }} </a> <span data-ng-if="!hasDayHours(row)"> {{ row.time_total | durationFormat: \'report\' }} </span> </td> <td data-ng-if="$settingsService.settings.integration_time_clock_active" data-ng-class="{ \'light-orange-bgcolor orange-color bolder\' : has_divergence(row) }"> <div data-ng-if="row.time_clock_integration_active == 1"> <span>{{ row.time_clock | durationFormat: \'report\' }}</span> </div> </td> <td></td> </tr> </tbody> </tbody><tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'report.loading\' | translate }}</span> <span data-ng-if="no_more_entries" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> </div> </section> </section> '),$templateCache.put("views/reports/report-detailed.html",'<section class="report-layout-grid report-groups-and-sort-2024 view-report-detailed" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <div class="report-topbar"> <h3>{{ \'report.detailed.title\' | translate }}</h3> <div class="report-topbar__actions"> <button class="button clean radius" data-ng-click="openAddTimeEntryModal()"> <span class="icon-plus4"></span> <span>{{ \'timesheet.add_entry\' | translate }}</span> </button> <button class="button clean radius" data-ng-click="load()" data-ng-if="$permissionService.hasPrivilegesToChangeInvoiceStatus()" data-dropdown="dropdown-actions"> <span>{{ \'report.detailed.actions\' | translate }}</span> <span data-ng-if="checkedEntries.length > 0">({{checkedEntries.length}})</span> <span class="icon-angle-down"></span> </button> <div id="dropdown-actions" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <strong>{{ \'report.detailed.billing_actions\' | translate }}</strong> </div> <div class="dropdown-option view-report-detailed--dropdown-actions"> <label data-ng-click="markAsInvoiced(1)"> <span class="view-report-detailed--dropdown-actions__invoice_circle background-color-is-invoiced"></span> <span> {{ \'report.detailed.mark_as_invoiced\' | translate:{count: (checkedEntries.length === 0 ? (\'report.detailed.mark_all\' | translate) : (\'report.detailed.mark_selected\' | translate:{count: checkedEntries.length}))} }}
11 </span> <span data-flag-upgrade-required="INVOICED_FLAG"></span> </label> </div> <div class="dropdown-option"> <label data-ng-click="markAsInvoiced(0)"> <span class="view-report-detailed--dropdown-actions__invoice_circle background-color-is-not-invoiced"></span> {{ \'report.detailed.mark_as_not_invoiced\' | translate:{count: (checkedEntries.length === 0 ? (\'report.detailed.mark_all\' | translate) : (\'report.detailed.mark_selected\' | translate:{count: checkedEntries.length}))} }} <span data-flag-upgrade-required="INVOICED_FLAG"></span> </label> </div> </div> <button class="button clean radius" data-training="report-export" data-dropdown="dropdown-export-report"> <span class="icon-download6"></span> {{ \'report.export\' | translate }} </button> <div id="dropdown-export-report" data-dropdown-content data-training="report-export-dropdown" class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <strong>{{ \'report.file_format\' | translate }}</strong> </div> <div class="dropdown-option radio"> <div data-if-has-not-feature="REPORT_EXPORT"> <label disabled="disabled"> <span>{{ \'report.export_csv\' | translate }}</span> </label> </div> <div data-if-has-feature="REPORT_EXPORT"> <label data-ng-model="$prefsService.preferences.report_detailed_export_format" data-btn-radio="\'csv\'" data-training="report-export-format-csv"> <span>{{ \'report.export_csv\' | translate }}</span> </label> </div> <label data-ng-model="$prefsService.preferences.report_detailed_export_format" data-btn-radio="\'pdf\'" data-training="report-export-format-pdf"> <span>{{ \'report.export_pdf\' | translate }}</span> </label> <div data-if-has-not-feature="CUSTOM_REPORTS"> <label disabled="disabled"> <span>{{ \'report.export_xlsx_print\' | translate }}</span> </label> </div> <div data-if-has-feature="CUSTOM_REPORTS"> <label data-ng-model="$prefsService.preferences.report_detailed_export_format" data-btn-radio="\'xlsx_to_print\'" data-training="report-export-format-xlsx-print"> <span>{{ \'report.export_xlsx_print\' | translate }}</span> </label> </div> </div> <div data-ng-if="$prefsService.preferences.report_detailed_export_format === \'csv\'"> <div class="dropdown-title" style="margin-top: 20px"> <strong>{{ \'report.export_columns\' | translate }}</strong> </div> <div class="dropdown-option radio"> <label data-ng-model="$prefsService.preferences.report_detailed_export_columns_option" data-btn-radio="\'all\'" data-training="report-export-columns-all"> <span>{{ \'report.export_columns_all\' | translate }}</span> </label> <label data-ng-model="$prefsService.preferences.report_detailed_export_columns_option" data-btn-radio="\'visible_on_screen\'" data-training="report-export-columns-visible"> <span>{{ \'report.export_columns_visible\' | translate }}</span> </label> </div> </div> <div style="margin: 20px 10px 5px 15px;"> <button class="button button--blue-brand" data-ng-click="export()" data-training="report-export-submit" data-ng-disabled="exporting_report\r\n                                    || !$prefsService.preferences.report_detailed_export_format"> {{exporting_report ? (\'report.exporting\' | translate) : (\'report.export\' | translate)}} </button> </div> <div class="f-dropdown--dropdown-bottom-details"> <a class="link underline" data-ng-if="$permissionService.hasPrivilegesToEditAccountSettings()" data-app-href="#/report-settings">{{ \'report.detailed.configure_report\' | translate }}</a> <a class="link underline" data-ng-click="$supportChannelService.openChat()">{{ \'report.detailed.feedback\' | translate }}</a> </div> </div> <button class="button clean radius" title="{{ \'report.report_columns\' | translate }}" data-dropdown="dropdown-config-columns" data-training="report-columns"> <span class="icon-menu2"></span> <span>{{ \'report.columns\' | translate }}</span> </button> <div id="dropdown-config-columns" data-dropdown-content data-training="report-columns-dropdown" class="f-dropdown dropdown-option-list" data-max-height data-offset-height="150"> <div class="dropdown-title"> <span>{{ \'report.report_columns\' | translate }}</span> </div> <div data-ng-repeat="columns_group in column_options | toArray: true | groupBy: \'is_custom_field\'"> <div class="dropdown-title not-first-child" data-ng-if="columns_group.group_name == true"> <span>{{ \'report.custom_fields\' | translate }}</span> </div> <div class="dropdown-option checkbox" data-ng-repeat="column in columns_group.items"> <label data-ng-class="{ \'disabled\': column.visible_always == true }"> <input type="checkbox" data-ng-model="column.is_visible" data-ng-change="updateColumnVisibility(column)" data-ng-true-value="true" data-ng-false-value="false" data-ng-disabled="column.visible_always == true" data-ng-attr-data-report-column="{{ column.column_key }}"> <span>{{column.name}}</span> <span class="icon-info light-grey-color" data-ng-if="column.is_custom_field" data-tooltip-append-to-body="true" data-tooltip-placement="top-left" data-tooltip-html="\'\r\n                                        <div><strong>{{column.name}}</strong></div>\r\n                                        <div>{{column.description}}</div>\r\n                                        <div>{{ \'custom_fields.edit.entity_label\' | translate:{entity: column.custom_field.entity_name} }}</div>\'\r\n                                    "></span> </label> </div> </div> <div class="dropdown-title"> <span>{{ \'report.report_rows\' | translate }}</span> </div> <div class="dropdown-option checkbox"> <label> <input type="checkbox" data-ng-model="$prefsService.preferences.report_detailed_total_visible" data-ng-change="update_config_column(\'report_detailed_total_visible\')" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'"> <span>{{ \'report.total\' | translate }}</span> </label> </div> <div class="dropdown-option checkbox"> <label> <input type="checkbox" data-ng-model="$prefsService.preferences.report_detailed_subtotal_visible" data-ng-change="update_config_column(\'report_detailed_subtotal_visible\')" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'"> <span>{{ \'report.subtotal\' | translate }}</span> </label> </div> </div> </div> </div> <!--        </div>--> <div> <div class="report-list-container" data-training="report-results" data-ng-class="{\'report-list-container--is-loading\': loading_report && totals.total_rows === 0 } "> <div class="report-list-sticky" data-infinite-scroll="load()" data-infinite-scroll-disabled="loading_report" data-infinite-scroll-distance="1" data-infinite-scroll-container=".report-layout-grid--content"> <table class="sticky-table report-round-table-corners"> <thead> <tr> <th class="checkbox-column" data-ng-click="toggleSortBy(\'date_execution\', true)"> <span>{{ \'report.daily.date\' | translate }}</span> <span class="report-order-direction" data-ng-show="sortBy.column === \'date_execution\'" data-ng-class="sortBy.column === \'date_execution\' && sortBy.direction === \'desc\' ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> <th data-ng-repeat="column in column_options | toArray: true" data-ng-if="column.is_visible" data-ng-click="toggleSortBy(getColumnSortKey(column), column.sortable)" class="{{column.type}}-column"> <div class="overflow-ellipsis">{{column.name}}</div> <span class="report-order-direction" data-ng-if="column.sortable" data-ng-show="sortBy.column === getColumnSortKey(column)" data-ng-class="sortBy.column === getColumnSortKey(column) && sortBy.direction === \'desc\' ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> </tr> </thead> <tbody> <tr class="header-total report-groups-and-sort-2024--total-row" data-ng-if="$prefsService.preferences.report_detailed_total_visible == true"> <td> <span>{{ \'report.total\' | translate }} ({{totals.total_rows}})</span> </td> <td data-ng-repeat="column_subtotal in column_options | toArray: true" data-ng-if="column_subtotal.is_visible"> <div data-ng-if="column_subtotal.visible_subtotal"> <div class="time-column" data-ng-if="column_subtotal.type === \'time\'"> {{ totals[column_subtotal.subtotal_field] | durationFormat: \'report\' }} </div> <div class="money-column" data-ng-if="column_subtotal.type === \'billable\' || column_subtotal.type === \'cost\'"> {{ (totals[column_subtotal.subtotal_field] || 0) | moneyToRealPrivacy: true }} </div> </div> </td> </tr> <tr class="header-subtotal report-groups-and-sort-2024--total-row" data-ng-if="groupColumnId" data-ng-hide="$prefsService.preferences.report_detailed_subtotal_visible === \'0\'" data-ng-repeat-start="entries_group in entryGroups"> <td> <div data-ng-if="isSortByDateColumn()" title="{{ \'report.detailed.realized_on\' | translate:{date: (entries_group.group_name | dateLong)} }}"> <span>
11{{entries_group.group_name | dateShort}}</span> </div> <div data-ng-if="!isSortByDateColumn()" class="overflow-ellipsis"> <span>{{entries_group.items[0][sortBy.column] || column_options[sortBy.column].empty_message }}</span> </div> </td> <td data-ng-repeat="column_subtotal in column_options | toArray: true" data-ng-if="column_subtotal.is_visible"> <div data-ng-if="column_subtotal.visible_subtotal"> <div class="time-column" data-ng-if="column_subtotal.type === \'time\'"> {{subtotals[entries_group.group_name][column_subtotal.subtotal_field] | durationFormat: \'report\'}} </div> <div class="money-column" data-ng-if="column_subtotal.type === \'billable\' || column_subtotal.type === \'cost\'"> {{ (subtotals[[entries_group.group_name]][column_subtotal.subtotal_field] || 0) | moneyToRealPrivacy: true }} </div> </div> </td> </tr> <tr class="content" data-ng-repeat="entry in entries_group.items" data-ng-class="{\'report-row-checked\': entry.isChecked }"> <td> <div class="report-groups-and-sort-2024--item-details"> <label class="element-todo-checkbox"> <input type="checkbox" data-ng-check data-ng-model="entry.isChecked" data-ng-true-value="true" data-ng-false-value="false" data-ng-click="onClickCheck(entry)"> </label> <span>{{entry.date_execution | date: \'dd/MM/yyyy\'}}</span> <span class="stopwatch-active-signal" data-ng-if="entry.stopwatch_active===1" data-tooltip="{{ \'report.detailed.stopwatch_active\' | translate }}" data-tooltip-append-to-body="true"></span> <span data-entry-is-locked-component data-entry="entry"></span> </div> </td> <td data-ng-repeat="column in column_options | toArray: true" data-ng-if="column.is_visible" class="{{column.type}}-column"> <div data-ng-switch="column.type"> <span data-ng-switch-when="billable"> <span class="bolder" data-ng-class="{\'steel-color\': !entry.is_billable }"> {{ (entry.rate_total || 0) | moneyToRealPrivacy: true}}</span> <span class="steel-color" style="font-size: 11px; margin-top: 6px; display: block"> <span data-ng-if="entry.is_billable"> {{ (entry.rate_hour || 0) | moneyToRealPrivacy: true}} / h</span> <span data-ng-if="!entry.is_billable">{{ \'report.detailed.not_billable\' | translate }}</span> </span> </span> <span data-ng-switch-when="cost"> <span class="bolder"> {{ (entry.cost_amount || 0) | moneyToRealPrivacy: true}}</span> <span class="steel-color" style="font-size: 11px; margin-top: 6px; display: block"> {{ (entry.cost_rate || 0) | moneyToRealPrivacy: true }} / h </span> </span> <span data-ng-switch-when="date" class="report-column-content-flex report-list-sticky--column-default-if-empty"> <span data-ng-if="::hasColumnValue(entry, column)"> {{ ::getColumnValue(entry, column) | dateShort }} </span> </span> <span data-ng-switch-when="datetime" class="report-column-content-flex report-list-sticky--column-default-if-empty"> <span data-ng-if="::hasColumnValue(entry, column)"> {{ ::getColumnValue(entry, column) | datetimeShort }} </span> </span> <span data-ng-switch-when="date_execution" class="report-column-content-flex"> <span data-entry-is-locked-component data-entry="entry"></span> <span>{{entry[column.$key] | date: \'dd/MM/yyyy\'}}</span> <span class="stopwatch-active-signal" data-ng-if="entry.stopwatch_active===1" data-tooltip="{{ \'report.detailed.stopwatch_active\' | translate }}"></span> </span> <span data-ng-switch-when="description" data-ng-bind-html="entry.description | descriptionLinkify"> </span> <span data-ng-switch-when="enum" class="report-list-sticky--column-default-if-empty"> <span data-ng-if="::hasColumnValue(entry, column)" class="overflow-ellipsis" data-tooltip="{{ entry[\'custom_fields\'][column.custom_field.id][\'enum_name\'] }}" data-tooltip-ellipsis> {{ entry[\'custom_fields\'][column.custom_field.id][\'enum_name\'] }} </span> </span> <span data-ng-switch-when="is_invoiced"> <span if-has-not-feature="INVOICED_FLAG" class="steel-color nowrap"> {{ \'report.detailed.not_enabled\' | translate }} </span> <span if-has-feature="INVOICED_FLAG"> <span data-ng-if="!entry.is_billable" class="steel-color nowrap">{{ \'report.detailed.not_billable\' | translate }}</span> <span data-ng-if="entry.is_billable"> <span class="flag-inline-report" data-ng-class="{\r\n                                                        \'background-color-is-invoiced\': entry[column.$key] === 1,\r\n                                                        \'background-color-is-not-invoiced\': entry[column.$key] !== 1\r\n                                                        }"> {{entry.is_invoiced === 1 ? (\'report.detailed.invoiced_status\' | translate) : (\'report.detailed.not_invoiced_status\' | translate)}} </span> </span> </span> </span> <span data-ng-switch-when="money" class="report-list-sticky--column-default-if-empty">
11 <!--                                        <span data-ng-if="::entry[column.$key]">--> <!--                                            R$ {{ ::entry[column.$key] | moneyToRealPrivacy : true }}--> <!--                                        </span>--> <span data-ng-if="::hasColumnValue(entry, column)"> {{ ::getColumnValue(entry, column) | moneyToRealPrivacy: true }} </span> </span> <span data-ng-switch-when="numeric" class="report-list-sticky--column-default-if-empty"> <!--                                        <span data-ng-if="::entry[column.$key]">--> <!--                                            {{ ::entry[column.$key] | numericHuman }}--> <!--                                        </span>--> <span data-ng-if="::hasColumnValue(entry, column)"> {{ ::getColumnValue(entry, column) | numericHuman }} </span> </span> <span data-ng-switch-when="time" class="report-list-sticky--column-default-if-empty"> <a class="link link-dashed" data-ng-if="hasColumnValue(entry, column) && column.$key === \'time_total\' && isEntryEditable(entry)" data-ng-click="editEntry(entry)" title="{{ \'time_entries.item.edit_time_entry\' | translate }}"> {{ getColumnValue(entry, column) | durationFormat: \'report\' }} </a> <span data-ng-if="hasColumnValue(entry, column) && column.$key === \'time_total\' && !isEntryEditable(entry)" data-tooltip="{{ getEntryNotEditableTitle(entry) }}" data-tooltip-append-to-body="true"> {{ getColumnValue(entry, column) | durationFormat: \'report\' }} </span> <span data-ng-if="hasColumnValue(entry, column) && column.$key !== \'time_total\'"> {{ getColumnValue(entry, column) | durationFormat: \'report\' }} </span> </span> <!--                                    <span data-ng-switch-when="time" class="report-list-sticky&#45;&#45;column-default-if-empty">--> <!--                                        <span data-ng-if="::reportItem[column.totalsOrDetails][column.$key]">--> <!--                                            {{ ::(reportItem[column.totalsOrDetails][column.$key].time || \'00:00:00\') | time }}--> <!--                                        </span>--> <!--                                    </span>--> <span data-ng-switch-when="time_period"> <span data-ng-if="!entry[\'time_start\']" class="grey-color">{{ \'report.detailed.no_time\' | translate }}</span> <span data-ng-if="entry[\'time_start\']"> <span>{{entry[\'time_start\'] | time}} -</span> <span data-ng-if="!entry[\'time_end\']" class="grey-color">{{ \'report.detailed.open\' | translate }}</span> <span data-ng-if="entry[\'time_end\']">{{entry[\'time_end\'] | time}}</span> </span> </span> <span data-ng-switch-when="time_total" class="time-total-container"> <a class="link link-dashed" data-ng-if="isEntryEditable(entry)" data-ng-click="editEntry(entry)" title="{{ \'time_entries.item.edit_time_entry\' | translate }}"> {{entry[column.$key] | durationFormat: \'report\'}} </a> <span data-ng-if="!isEntryEditable(entry)" data-tooltip="{{ getEntryNotEditableTitle(entry) }}" data-tooltip-append-to-body="true"> {{entry[column.$key] | durationFormat: \'report\'}} </span> </span> <!--                                    <span data-ng-switch-when="bool_int">--> <!--                                        <span class="flag flag-v2"--> <!--                                              data-ng-class="{--> <!--                                                \'green-color\': entry[column.$key] === 1,--> <!--                                                \'grey-color\': entry[column.$key] !== 1--> <!--                                                }">--> <!--                                            {{entry.is_invoiced === 1 ? \'Sim\' : \'Não\'}}--> <!--                                        </span>--> <!--                                    </span>--> <span data-ng-switch-default class="report-list-sticky--column-default-if-empty"> <!--                                        <span data-ng-if="::entry[column.$key]">--> <!--                                            {{::entry[column.$key]}}--> <!--                                        </span>--> <span data-ng-if="::hasColumnValue(entry, column)"> {{ ::getColumnValue(entry, column) }}
11 </span> </span> </div> </td> </tr> <tr data-ng-repeat-end data-ng-hide="true"></tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'report.loading\' | translate }}</span> <span data-ng-if="no_more_entries" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> </div> </section> </section> '),$templateCache.put("views/reports/report-is-premium.html",'<div class="list list-report"> <h3>Relatório Premium</h3> <div class="explanation premium radius"> <strong>Este relatório não está disponível na versão grátis do Rabbiit.</strong> <br> <a class="link underline" app-href="#/upgrade"> Alterar o seu plano</a> para ativar este relatório. </div> </div>'),$templateCache.put("views/reports/report-left-column.html",'<div id="report-left-column" data-training="report-filters" auto-height data-top="45"> <div class="group-filter radius" data-ng-include="\'views/time-entry-filters.html\'"></div> </div> '),$templateCache.put("views/reports/report-management-projects.html",'<section class="report-groups-and-sort-2024 report-layout-grid report-project-management" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <div class="report-topbar"> <div> <h3>{{ \'report.management_projects.title\' | translate }}</h3> <button data-ng-if="$permissionService.hasPrivilegesToCreateProjects()" data-ng-click="add()" class="button clean radius"> <span class="icon-plus4" style="padding-right: 2px;"></span> <span>{{ \'report.management_projects.create\' | translate }}</span> </button> </div> <div> <span data-button-export="export" data-preference-prefix="report_management_projects" data-formats="[\'xlsx\', \'pdf\']" data-enable-column-options="true"> </span> <button class="button clean radius" style="margin-left: 5px;" data-dropdown="dropdown-config-columns"> <span class="icon-menu2"></span> {{ \'report.columns\' | translate }} </button> <div id="dropdown-config-columns" data-dropdown-content class="f-dropdown dropdown-option-list" data-max-height data-offset-height="150"> <div class="dropdown-title"> <span>{{ \'report.report_columns\' | translate }}</span> </div> <div data-ng-repeat="columns_group in column_options | toArray: true | groupBy: \'custom_field\'"> <div class="dropdown-title not-first-child" data-ng-if="columns_group.group_name == true"> <span>{{ \'report.custom_fields\' | translate }}</span> </div> <div class="dropdown-option checkbox" data-ng-repeat="column in columns_group.items"> <label data-ng-class="{ \'disabled\': column.visible_always == true }"> <input type="checkbox" data-ng-model="column.is_visible" data-ng-change="update_column_visible(column.$key)" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'" data-ng-disabled="column.visible_always == true"> <span>{{column.name}}</span> <span class="icon-info light-grey-color" data-ng-if="column.custom_field == true" data-tooltip-append-to-body="true" data-tooltip-placement="top-left" data-tooltip-html="\'\r\n                                    <div><strong>{{column.name}}</strong></div>\r\n                                    <div>{{column.description}}</div>\r\n                                    <div>{{ \'custom_fields.edit.entity_label\' | translate:{entity: column.custom_field.entity_name} }}</div>\'\r\n                                "></span> </label> </div> </div> </div> <button class="button clean radius" style="margin-left: 5px;" title="{{ \'report.detailed.order_by\' | translate }}" data-dropdown="dropdown-sort-report"> <span class="icon-sort-by {{$prefsService.preferences.report_management_projects_sort_direction}}" style="padding-right: 22px;"></span> <span>{{ \'report.ordering\' | translate }}</span> </button> <div id="dropdown-sort-report" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <span>{{ \'report.detailed.order_by\' | translate }}</span> </div> <div class="dropdown-option radio"> <label data-ng-repeat="column in sortableColumns" data-ng-model="sortBy.column" data-btn-radio="\'{{column.column_id}}\'" data-ng-change="changeSortBy(column)"> <span>{{column.name}}</span> </label> </div> <div class="dropdown-title"> <span>{{ \'report.detailed.order_direction\' | translate }}</span> </div> <div class="dropdown-option radio"> <label data-ng-model="sortBy.direction" data-btn-radio="\'asc\'" data-ng-change="changeSortDirection(\'asc\')"> <span>{{ \'report.ascending\' | translate }}</span> <span class="icon-arrow-down light-grey-color" style="font-size: 12px; margin-left: 3px;"></span> </label> <label data-ng-model="sortBy.direction" data-btn-radio="\'desc\'" data-ng-change="changeSortDirection(\'desc\')"> <span>{{ \'report.descending\' | translate }}</span> <span class="icon-arrow-up light-grey-color" style="font-size: 12px; margin-left: 3px;"></span> </label> </div> </div> </div> </div> <div> <!--            <div data-ng-if="reportList.length == 0">--> <!--                <div data-spinner-loading="loading_report" class="spinner-loading-report"></div>--> <!--                <div data-ng-if="!loading_report" class="report-none-register">--> <!--                    <div class="icon-zoom-out"></div>--> <!--                    <h3>Não foi encontrado nenhum registro.</h3>--> <!--                    <p>Verifique o filtro realizado e suas permissões da conta.</p>--> <!--                </div>--> <!--            </div>--> <div class="report-list-container" data-ng-class="{ \'report-list-container--is-loading\': reseting_report }"> <div class="report-list-sticky" data-infinite-scroll="load()" data-infinite-scroll-disabled="loading_report" data-infinite-scroll-distance="2" data-infinite-scroll-container=".report-layout-grid--content"> <table class="sticky-table report-round-table-corners"> <thead> <tr>
11 <th data-ng-click="changeSortBy({ column_id: \'name\', sortable: true })" class="th-sortable"> <div> {{ \'report.management_projects.projects_count\' | translate:{count: (totals.total_rows||0)} }} </div> <span class="report-order-direction" data-ng-show="sortBy.column === \'name\'" data-ng-class="sortBy.column === \'name\' && sortBy.isReverse ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> <th data-ng-repeat="column in visibleColumns" data-ng-click="changeSortBy(column)" data-ng-class="{ \'th-sortable\': column.sortable }" class="{{column.type}}-column"> <div class="overflow-ellipsis">{{column.name}}</div> <span data-ng-if="column.sortable" class="report-order-direction" data-ng-show="sortBy.column === column.column_id" data-ng-class="sortBy.column === column.column_id && sortBy.isReverse ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> <th></th> </tr> </thead> <tbody> <tr class="content" data-ng-repeat="project in reportList track by project.id" style="position: relative"> <td> <div class="report-groups-and-sort-2024--item-details"> <a title="Opções" data-dropdown="dropdown-project-{{project.id}}" class="grey-color light-blue-on-hover"> <span class="icon-angle-down"></span> </a> <div> <a data-ng-click="goto_project_home(project)" title="{{project.name}}" class="bolder light-blue-on-hover entity-color-identity-row"> <span data-entity-color-swatch data-variant="bar-inline" data-color="project.color"></span> <span class="entity-color-identity-row__label">{{project.name}}</span> </a> <!--                                        <div data-ng-if="::$permissionService.hasPermissionToEditProjects(project.id)">--> <!--                                            <a data-ng-click="edit_project(project)"--> <!--                                               class="bolder light-blue-on-hover">--> <!--                                                {{project.name}}--> <!--                                            </a>--> <!--                                        </div>--> <!--                                        <div data-ng-if="::!$permissionService.hasPermissionToEditProjects(project.id)">--> <!--                                            <strong>{{project.name}}</strong>--> <!--                                        </div>--> <div class="report-project-management--first-colum-extra-details"> <span title="Privacidade"> <span data-ng-if="project.privacy == 1">{{ \'report.management_projects.public\' | translate }}</span> <span data-ng-if="project.privacy == 2"> <span class="icon-lock_outline"></span> <span>{{ \'report.management_projects.private\' | translate }}</span> </span> </span> <span title="{{ \'report.management_projects.your_participation\' | translate }}">{{::getMemberDescription(project, true)}}</span> </div> </div> </div> </td> <td data-ng-repeat="column in visibleColumns" class="{{column.type}}-column-type"> <div data-ng-switch="column.type"> <span data-ng-switch-when="active"> <span data-ng-if="project.active === true" class="green-color bolder">{{ \'report.management_projects.active\' | translate }}</span> <span data-ng-if="project.active === false" class="grey-color">{{ \'report.management_projects.archived\' | translate }}</span> </span> <span data-ng-switch-when="budget"> <span data-ng-if="!project.budget_options.budget || !project.budget_options.budget_by"> <span class="grey-color">-</span> </span> <span data-ng-if="project.budget_options.budget && project.budget_options.budget_by"> <span data-ng-if="project.budget_by === \'time\'"> {{project.budget_options[column.property].time | durationFormat: \'default\' : \'humanHideZero\'}} </span> <span data-ng-if="project.budget_by !== \'time\'"> {{project.budget_options[column.property] | moneyToRealPrivacy}} </span> </span> </span> <span data-ng-switch-when="budget_by"> <span class="overflow-ellipsis" data-ng-if="project.budget_options.budget_by && project.budget_options.budget_by !== \'none\'"> {{ \'project.budget_by_options.\' + project.budget_options.budget_by | translate}} </span> <span data-ng-if="!project.budget_options.budget_by || project.budget_options.budget_by === \'none\'"> <span class="grey-color">-</span> </span> </span> <span data-ng-switch-when="date" class="report-list-sticky--column-default-if-empty"> <span data-ng-if="hasColumnValue(project, column)"> {{ getColumnValue(project, column) | dateShort }} </span> </span> <span data-ng-switch-when="datetime"> <span data-ng-if="project[column.$key]">{{project[column.$key] | datetimeShort}}</span> <span data-ng-if="!project[column.$key]" class="grey-color">
11{{column.empty_message}}</span> </span> <span data-ng-switch-when="enum" class="report-list-sticky--column-default-if-empty"> <span data-ng-if="hasColumnValue(project, column)" class="overflow-ellipsis" data-tooltip="{{ project[\'custom_fields\'][column.custom_field.id][\'enum_name\'] }}" data-tooltip-ellipsis> {{ project[\'custom_fields\'][column.custom_field.id][\'enum_name\'] }} </span> </span> <span data-ng-switch-when="members"> <a class="light-blue-on-hover flag-v2 grey-bgcolor" data-ng-click="goto_project_users(project)"> {{get_total_members_description(project)}} </a> </span> <span data-ng-switch-when="money" class="report-list-sticky--column-default-if-empty"> <span data-ng-if="hasColumnValue(project, column)"> {{ (getColumnValue(project, column) || 0) | moneyToRealPrivacy : true }} </span> </span> <span data-ng-switch-when="numeric" class="report-list-sticky--column-default-if-empty"> <span data-ng-if="hasColumnValue(project, column)"> {{ getColumnValue(project, column) | numericHuman }} </span> </span> <span data-ng-switch-when="progress"> <span data-ng-if="!project.budget_options.budget"> <span class="grey-color empty-progress">-</span> </span> <span data-ng-if="project.budget_options.budget"> <span data-progress-bar data-progress-completed="project.budget_options.progress"> </span> </span> </span> <span data-ng-switch-when="project_name"> <a data-ng-click="edit_project(project)" class="bolder light-blue-on-hover"> {{project[column.$key]}} </a> </span> <span data-ng-switch-when="tasks"> <a class="light-blue-on-hover flag-v2 grey-bgcolor" data-ng-click="goto_project_tasks(project)"> {{project.total_active_tasks}} </a> </span> <span data-ng-switch-when="time" class="report-list-sticky--column-default-if-empty"> <span data-ng-if="hasColumnValue(project, column)"> {{ getColumnValue(project, column) | durationFormat: \'default\' }} </span> </span> <span data-ng-switch-when="todos"> <a class="light-blue-on-hover flag-v2 grey-bgcolor" data-ng-click="goto_project_todos(project)"> {{project.total_pending_todos}} </a> </span> <span data-ng-switch-default class="report-list-sticky--column-default-if-empty"> <span data-ng-if="hasColumnValue(project, column)" class="overflow-ellipsis" data-tooltip="{{ getColumnValue(project, column) }}" data-tooltip-ellipsis> {{ getColumnValue(project, column) }} </span> </span> </div> </td> <td> <div id="dropdown-project-{{project.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" data-dropdown-close-on-click data-dropdown-append-to-body="true" data-top="25"> <div class="dropdown-option option-button"> <a data-ng-click="goto_project_home(project)"> <span>{{ \'report.management_projects.open_page\' | translate }}</span> </a> </div> <hr> <div data-ng-if="::$permissionService.hasPrivilegesToEditProject(project)"> <div class="dropdown-option option-button"> <a data-ng-click="edit_project(project)"> <span>{{ \'report.management_projects.edit\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="::project.status == \'active\'"> <a data-ng-click="archive_project(project)"> {{ \'report.management_projects.archive\' | translate }} </a> </div> <div class="dropdown-option option-button" data-ng-if="project.status == \'archived\'"> <a data-ng-click="active_project(project)"> {{ \'report.management_projects.reactivate\' | translate }} </a> </div> </div> <div data-ng-if="::$permissionService.hasPrivilegesToCreateProjects()"> <div class="dropdown-option option-button"> <a data-ng-click="copy_project(project)"> <span>{{ \'report.management_projects.copy\' | translate }}</span> <span data-flag-upgrade-required="PROJECT_COPY"></span> </a> </div> </div> <div data-ng-if="::$permissionService.hasPrivilegesToDeleteProjects()"> <hr> <div class="dropdown-option option-button"> <a data-ng-click="delete_project(project)" class="red-color-on-hover"> {{ \'report.management_projects.delete\' | translate }} </a> </div> </div> </div> </td> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'report.loading\' | translate }}</span> <span data-ng-if="no_more_entries" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> </div> </section> </section> '),
12$templateCache.put("views/reports/report-management-users.html",'<section class="report-layout-grid report-groups-and-sort-2024 view-report-management-users" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <div class="report-topbar"> <!--            <div class="row">--> <div> <h3>{{ \'report.management_users.title\' | translate }}</h3> </div> <div style="text-align: right;"> <button data-ng-click="add()" class="button clean radius"> <span class="icon-plus4" style="padding-right: 2px;"></span> <span>{{ \'report.management_users.invite\' | translate }}</span> </button> <!--                    <button class="button clean radius"--> <!--                            data-ng-click="load()"--> <!--                            title="Exportar relatório"--> <!--                            data-dropdown="dropdown-export-report">-->
12 <!--                        <span class="icon-download5"></span>--> <!--                    </button>--> <div id="dropdown-export-report" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <span>{{ \'report.export_csv\' | translate }}</span> </div> <div class="dropdown-option option-button"> <a data-ng-click="export(\'visible_on_screen\')"> <span>{{ \'report.export_columns_visible\' | translate }}</span> <span class="flag yellow-color" style="margin-left: 10px;" if-has-not-feature="REPORT_EXPORT">UPGRADE</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="export(\'all\')"> <span>{{ \'report.export_columns_all\' | translate }}</span> <span class="flag yellow-color" style="margin-left: 10px;" if-has-not-feature="REPORT_EXPORT">UPGRADE</span> </a> </div> </div> <button class="button clean radius" style="margin-left: 5px;" title="{{ \'report.options\' | translate }}" data-dropdown="dropdown-config-columns"> <span class="icon-list"></span> </button> <div id="dropdown-config-columns" data-dropdown-content class="f-dropdown dropdown-option-list" data-max-height data-offset-height="150"> <div class="dropdown-title"> <span>{{ \'report.report_columns\' | translate }}</span> </div> <div data-ng-repeat="columns_group in column_options | toArray: true | groupBy: \'custom_field\'"> <div class="dropdown-title not-first-child" data-ng-if="columns_group.group_name == true"> <span>{{ \'report.custom_fields\' | translate }}</span> </div> <div class="dropdown-option checkbox" data-ng-repeat="column in columns_group.items"> <label data-ng-class="{ \'disabled\': column.visible_always == true }"> <input type="checkbox" data-ng-model="$prefsService.preferences[\'report_management_users_column_visible_\' + column.$key]" data-ng-change="update_config_column(\'report_management_users_column_visible_\' + column.$key)" data-ng-true-value="\'1\'" data-ng-false-value="\'0\'" data-ng-disabled="column.visible_always == true"> <span>{{column.name}}</span> <span class="icon-info light-grey-color" data-ng-if="column.custom_field == true" data-tooltip-append-to-body="true" data-tooltip-placement="top-left" data-tooltip-html="\'\r\n                                        <div><strong>{{column.name}}</strong></div>\r\n                                        <div>{{column.description}}</div>\r\n                                        <div>Campo de {{$customFieldService.getEntityName(column.custom_field_entity)}}</div>\'\r\n                                    "></span> </label> </div> </div> <!--                        <div class="dropdown-title">--> <!--                            <span>Linhas do relatório</span>--> <!--                        </div>--> <!--                        <div class="dropdown-option checkbox">--> <!--                            <label>--> <!--                                <input type="checkbox"--> <!--                                       data-ng-model="$prefsService.preferences.report_detailed_total_visible"--> <!--                                       data-ng-change="update_config_column(\'report_detailed_total_visible\')"--> <!--                                       data-ng-true-value="\'1\'"--> <!--                                       data-ng-false-value="\'0\'">--> <!--                                <span>Total</span>--> <!--                            </label>--> <!--                        </div>--> <!--                        <div class="dropdown-option checkbox">--> <!--                            <label>--> <!--                                <input type="checkbox"--> <!--                                       data-ng-model="$prefsService.preferences.report_detailed_subtotal_visible"--> <!--                                       data-ng-change="update_config_column(\'report_detailed_subtotal_visible\')"--> <!--                                       data-ng-true-value="\'1\'"--> <!--                                       data-ng-false-value="\'0\'">--> <!--                                <span>Subtotal</span>--> <!--                            </label>--> <!--                        </div>--> </div> <button class="button clean radius" style="margin-left: 5px;" title="{{ \'report.detailed.order_by\' | translate }}" data-dropdown="dropdown-sort-report"> <span class="icon-sort-by {{$prefsService.preferences.report_management_users_sort_direction}}" style="padding-right: 22px;"></span>
12 <!--                        <span>{{column_options[$prefsService.preferences.report_management_users_sort_by].name}}</span>--> <span>{{ \'report.ordering\' | translate }}</span> </button> <div id="dropdown-sort-report" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <span>{{ \'report.detailed.order_by\' | translate }}</span> </div> <div class="dropdown-option radio"> <label data-ng-model="$prefsService.preferences.report_management_users_sort_by" data-btn-radio="\'name\'" data-ng-change="$prefsService.save_by_name(\'report_management_users_sort_by\'); reload()"> <span>{{ \'report.detailed.user\' | translate }}</span> </label> <label data-ng-repeat="column in column_options | toArray: true | filter: { sortable: true }" data-ng-model="$prefsService.preferences.report_management_users_sort_by" data-btn-radio="\'{{column.$key}}\'" data-ng-change="$prefsService.save_by_name(\'report_management_users_sort_by\'); reload()"> <span>{{column.name}}</span> </label> </div> <div class="dropdown-title"> <span>{{ \'report.detailed.order_direction\' | translate }}</span> </div> <div class="dropdown-option radio"> <label data-ng-model="$prefsService.preferences.report_management_users_sort_direction" data-btn-radio="\'asc\'" data-ng-change="$prefsService.save_by_name(\'report_management_users_sort_direction\'); reload()"> <span>{{ \'report.ascending\' | translate }}</span> <span class="icon-arrow-down light-grey-color" style="font-size: 12px; margin-left: 3px;"></span> </label> <label data-ng-model="$prefsService.preferences.report_management_users_sort_direction" data-btn-radio="\'desc\'" data-ng-change="$prefsService.save_by_name(\'report_management_users_sort_direction\'); reload()"> <span>{{ \'report.descending\' | translate }}</span> <span class="icon-arrow-up light-grey-color" style="font-size: 12px; margin-left: 3px;"></span> </label> </div> </div> </div> <!--            </div>--> </div> <div> <!--            <div data-ng-if="reportList.length == 0">--> <!--                <div data-spinner-loading="loading_report" class="spinner-loading-report"></div>--> <!--                <div data-ng-if="!loading_report" class="report-none-register">--> <!--                    <div class="icon-zoom-out"></div>--> <!--                    <h3>Não foi encontrado nenhum registro.</h3>--> <!--                    <p>Verifique o filtro realizado e suas permissões da conta.</p>--> <!--                </div>--> <!--            </div>--> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': loading_report && reportList.length === 0 } "> <div class="report-list-sticky" data-infinite-scroll="load()" data-infinite-scroll-disabled="loading_report" data-infinite-scroll-distance="1" data-infinite-scroll-container=".report-layout-grid--content"> <table class="sticky-table report-round-table-corners"> <!--            <div data-ng-if="reportList.length > 0"--> <!--                 class="report-list-container">--> <!--                <div class="report-list-sticky&#45;&#45;resume-container">--> <!--                    <div class="grey-color counter-active">--> <!--                        {{get_total_active_users_description()}}--> <!--    &lt;!&ndash;                    {{totals.total_active}} usuários ativos&ndash;&gt;--> <!--                    </div>--> <!--                </div>--> <!--                <div class="report-list-sticky hide-middle-border"--> <!--                     >--> <!--                    <table class="sticky-table">--> <thead> <tr> <th>{{ \'report.detailed.user\' | translate }}</th> <th data-ng-repeat="column in column_options | toArray: true" data-ng-if="column_is_visible(column.$key)" class="{{column.type}}-column"> <div class="overflow-ellipsis">{{column.name}}</div> </th> <th></th> </tr> </thead> <tbody> <tr class="content" data-ng-repeat="user in reportList"> <td> <div class="report-groups-and-sort-2024--item-details"> <a title="{{ \'report.options\' | translate }}" data-dropdown="dropdown-user-{{user.id}}" class="grey-color light-blue-on-hover" data-if-has-permission="{{user.role}}"> <span class="icon-angle-down" style="font-size: 18px;"></span> </a> <div class="view-report-management-users--user-content"> <div class="view-report-management-users--user-identity user-list-item--identity"> <div data-user-avatar data-name="{{ user.name }}" data-photo-url="user.profile_photo_url" data-size="md" class="view-report-management-users--user-avatar"> </div> <div class="view-report-management-users--user-info"> <strong data-ng-if="!$permissionService.hasPermission(user.role)" class="view-report-management-users--user-name"> {{ user.name }} </strong> <a data-ng-if="$permissionService.hasPermission(user.role)" data-ng-click="edit_user(user)" class="bolder light-blue-on-hover view-report-management-users--user-name"> {{ user.name }} </a> <span class="view-report-management-users--user-meta details">{{ user.email }}</span> </div> </div> </div> </div> <!--                                <div id="dropdown-users-{{user.id}}"--> <!--                                     data-dropdown-content class="f-dropdown dropdown-option-list"--> <!--                                     data-dropdown-close-on-click--> <!--                                     data-dropdown-append-to-body="true">--> <!--                                    <div class="dropdown-option option-button">--> <!--                                        <a data-ng-click="edit_user(user)">-->
12 <!--                                            <span>Editar usuário</span>--> <!--                                        </a>--> <!--                                    </div>--> <!--                                    <div class="dropdown-option option-button" data-ng-if="user.active == true">--> <!--                                        <a data-ng-click="user.owner == true || archive_user(user)"--> <!--                                           data-ng-disabled="user.owner == true">--> <!--                                            Arquivar usuário--> <!--                                        </a>--> <!--                                    </div>--> <!--                                    <div class="dropdown-option option-button" data-ng-if="user.active == false">--> <!--                                        <a data-ng-click="active_user(user)">--> <!--                                            Reativar usuário--> <!--                                        </a>--> <!--                                    </div>--> <!--                                    <hr>--> <!--                                    <div class="dropdown-option option-button">--> <!--                                        <a data-ng-click="user.owner == true || remove_user(user)"--> <!--                                           data-ng-disabled="user.owner == true"--> <!--                                           class="red-color-on-hover">--> <!--                                            Excluir usuário--> <!--                                        </a>--> <!--                                    </div>--> <!--                                </div>--> </td> <td data-ng-repeat="column in column_options | toArray: true" data-ng-if="column_is_visible(column.$key)" class="{{column.type}}-column"> <div data-ng-switch="column.type"> <span data-ng-switch-when="name"> <div class="bolder" data-ng-if="!$permissionService.hasPermission(user.role)"> {{user.name}} </div> <a data-ng-if="$permissionService.hasPermission(user.role)" data-ng-click="edit_user(user)" class="bolder light-blue-on-hover">{{ user.name }} </a> <div class="details">{{user.email}}</div> </span> <span data-ng-switch-when="date"> {{user[column.$key] | dateShort}} </span> <span data-ng-switch-when="datetime"> <span data-ng-if="user[column.$key]">{{user[column.$key] | datetimeShort}}</span> <span data-ng-if="!user[column.$key]" class="grey-color">{{column.empty_message}}</span> </span> <span data-ng-switch-when="role"> <span data-flag-permission="{{user.role}}" color="true" data-flag-border="false"></span> <span data-ng-if="user.owner == true" class="light-blue-color bolder" title="{{ \'report.management_users.owner\' | translate }}"><br>{{ \'report.management_users.owner\' | translate }}</span> </span> <span data-ng-switch-when="active"> <span data-ng-if="user.active === 0" class="grey-color bolder">{{ \'report.management_projects.archived\' | translate }}</span> <span data-ng-if="user.active === 1" class="green-color bolder">{{ \'report.management_projects.active\' | translate }}</span> </span> <span data-ng-switch-when="integration_active"> <span data-ng-if="user[column.$key] === 0" class="grey-color">{{ \'report.management_users.not_import\' | translate }}</span> <span data-ng-if="user[column.$key] === 1">{{ \'report.management_users.import\' | translate }}</span> </span> <span data-ng-switch-when="integration_status"> <span data-ng-if="user[column.$key] === \'disabled\'" class="grey-color">{{ \'report.management_users.integration_status.disabled\' | translate }}</span> <span data-ng-if="user[column.$key] === \'pending\'">{{ \'report.management_users.integration_status.pending\' | translate }}</span> <span data-ng-if="user[column.$key] === \'successful\'">{{ \'report.management_users.integration_status.successful\' | translate }}</span> <span data-ng-if="user[column.$key] === \'failed\'" class="red-color">{{ \'report.management_users.integration_status.failed\' | translate }}</span> <span data-ng-if="user[column.$key] === \'retry\'" class="red-color"> {{ \'report.management_users.integration_status.retry\' | translate:{count: (user.time_clock_integration_failed_attempts || 0)} }}
12 </span> </span> <span data-ng-switch-when="timesheet_submission_status"> <span data-ng-if="!user.timesheet_submission || !user.timesheet_submission.configured" class="grey-color"> {{ \'report.management_users.timesheet_submission.not_configured\' | translate }} </span> <span data-ng-if="user.timesheet_submission && user.timesheet_submission.configured && user.timesheet_submission.block_reason === \'missing_manager\'" class="red-color"> {{ \'report.management_users.timesheet_submission.missing_manager\' | translate }} </span> <span data-ng-if="user.timesheet_submission && user.timesheet_submission.ready" class="green-color bolder"> {{ \'report.management_users.timesheet_submission.ready\' | translate }} </span> </span> <!--                                    </span>--> <!--                                    <span data-ng-switch-when="time">{{user[column.$key] | time}}</span>--> <!--                                    <span data-ng-switch-when="money">R$ {{ (user.rate_total || 0) | moneyToReal: true--> <!--                                        }}</span>--> <span data-ng-switch-default> <span data-ng-if="user[column.$key]">{{user[column.$key]}}</span> <span data-ng-if="!user[column.$key]" class="grey-color">{{column.empty_message}}</span> </span> </div> </td> <td> <div data-ng-include="\'reportItemDropdownUser\'" data-ng-init="user = user"> </div> </td> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'report.loading\' | translate }}</span> <span data-ng-if="no_more_entries" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> </div> </section> </section> <script type="text/ng-template" id="reportItemDropdownUser"> <div id="dropdown-user-{{user.id}}"\r\n         data-dropdown-content class="f-dropdown dropdown-option-list"\r\n         data-dropdown-close-on-click\r\n         data-dropdown-append-to-body="true">\r\n\r\n        <div class="dropdown-option option-button">\r\n            <a data-ng-click="edit_user(user)">\r\n                <span>{{ \'report.management_users.edit\' | translate }}</span>\r\n            </a>\r\n        </div>\r\n\r\n        <div class="dropdown-option option-button" data-ng-if="user.active == true">\r\n            <a data-ng-click="user.owner == true || archive_user(user)"\r\n               data-ng-disabled="user.owner == true">\r\n                {{ \'report.management_users.archive\' | translate }}\r\n            </a>\r\n        </div>\r\n\r\n        <div class="dropdown-option option-button" data-ng-if="user.active == false">\r\n            <a data-ng-click="active_user(user)">\r\n                {{ \'report.management_users.reactivate\' | translate }}\r\n            </a>\r\n        </div>\r\n\r\n        <hr>\r\n\r\n        <div class="dropdown-option option-button">\r\n            <a data-ng-click="user.owner == true || remove_user(user)"\r\n               data-ng-disabled="user.owner == true"\r\n               class="red-color-on-hover">\r\n                {{ \'report.management_users.delete\' | translate }}\r\n            </a>\r\n        </div>\r\n\r\n    </div>\r\n\r\n<!--    <div id="dropdown-user-{{user.id}}"-->\r\n<!--         data-dropdown-content-->\r\n<!--         class="f-dropdown dropdown-option-list"-->\r\n<!--         data-dropdown-close-on-click-->\r\n<!--         data-dropdown-append-to-body="true">-->\r\n\r\n<!--        <div class="dropdown-option option-button">-->\r\n<!--            <a data-ng-click="goto_project_home(project)">-->\r\n<!--                <span>Abrir página do projeto</span>-->\r\n<!--            </a>-->\r\n<!--        </div>-->\r\n\r\n<!--        <hr>-->\r\n\r\n<!--        <div data-ng-if="::$permissionService.hasPermissionToEditProjects(project.id)">-->\r\n\r\n<!--            <div class="dropdown-option option-button">-->\r\n<!--                <a data-ng-click="edit_project(project)">-->\r\n<!--                    <span>Editar projeto</span>-->\r\n<!--                </a>-->\r\n<!--            </div>-->\r\n\r\n<!--            <div class="dropdown-option option-button"-->\r\n<!--                 data-ng-if="::project.status == \'active\'">-->\r\n<!--                <a data-ng-click="archive_project(project)">-->\r\n<!--                    Arquivar projeto-->\r\n<!--                </a>-->
12\r\n<!--            </div>-->\r\n\r\n<!--            <div class="dropdown-option option-button"-->\r\n<!--                 data-ng-if="project.status == \'archived\'">-->\r\n<!--                <a data-ng-click="active_project(project)">-->\r\n<!--                    Reativar projeto-->\r\n<!--                </a>-->\r\n<!--            </div>-->\r\n\r\n<!--        </div>-->\r\n\r\n<!--        <div data-ng-if="::$permissionService.hasPrivilegesToCreateProjects()">-->\r\n<!--            <div class="dropdown-option option-button">-->\r\n<!--                <a data-ng-click="copy_project(project)">-->\r\n<!--                    <span>Copiar projeto...</span>-->\r\n<!--                    <span data-flag-upgrade-required="PROJECT_COPY"></span>-->\r\n<!--                </a>-->\r\n<!--            </div>-->\r\n<!--        </div>-->\r\n\r\n<!--        <div data-ng-if="::$permissionService.hasPermissionToEditProjects(project.id)">-->\r\n<!--            <hr>-->\r\n<!--            <div class="dropdown-option option-button">-->\r\n<!--                <a data-ng-click="delete_project(project)" class="red-color-on-hover">-->\r\n<!--                    Excluir projeto-->\r\n<!--                </a>-->\r\n<!--            </div>-->\r\n<!--        </div>-->\r\n\r\n<!--    </div>--> </script> '),$templateCache.put("views/reports/report-project-detail.html",'<section class="report-layout-grid report-groups-and-sort-2024 view-report-project-detail" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <div class="report-topbar"> <div> <h3 style="margin-top: 0px;">{{ \'report.detailed.title_project\' | translate }}</h3> <label class="element-todo-checkbox"> <input type="checkbox" data-ng-check data-ng-model="filter.apiParams.show_task_details"> <span>{{ \'report.detailed.show_task_details\' | translate }}</span> </label> </div> <div> <button data-ng-click="export()" class="button clean radius" title="{{ \'report.detailed.export_error\' | translate }}"> <span class="icon-download5"></span> {{ \'report.export\' | translate }} </button> </div> </div> <div> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': loading_report && report_by_project.length === 0 } "> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners"> <thead> <tr> <th style="width: 400px;"> <div class="th-inner overflow-ellipsis"> {{ \'report.detailed.project\' | translate }} <span data-ng-if="filter.apiParams.show_task_details==true">/ {{ \'report.detailed.task\' | translate }}</span> </div> </th> <th style="width: 90px;"> <div class="th-inner overflow-ellipsis"> <span title="{{ \'report.detailed.worked_hours\' | translate }}">{{ \'report.detailed.worked\' | translate }}</span> </div> </th> <th style="width: 90px;"> <div class="th-inner overflow-ellipsis"> <span title="{{ \'report.management_projects.columns.created_at\' | translate }}">{{ \'report.management_projects.columns.created_at\' | translate }}</span> </div> </th> <th style="width: 90px;"> <div class="th-inner overflow-ellipsis"> <span title="{{ \'report.detailed.first_entry\' | translate }}">{{ \'report.detailed.first_entry\' | translate }}</span> </div> </th> <th style="width: 90px;"> <div class="th-inner overflow-ellipsis"> <span title="{{ \'report.detailed.last_entry\' | translate }}">{{ \'report.detailed.last_entry\' | translate }}</span> </div> </th> </tr> </thead> <!-- Mostrar somente projetos --> <tbody class="body-table" data-ng-if="filter.apiParams.show_task_details==false"> <tr class="content" data-ng-repeat="project in report_by_project"> <td> <div class="overflow-ellipsis task_name" title="{{ \'report.detailed.project\' | translate }} {{project.project_name}}{{project.customer_name ? \', \' + (\'report.detailed.customer\' | translate) + \' \' + project.customer_name : \'\'}}"> {{project.project_name}} </div> </td> <td> <span title="{{ \'report.detailed.worked_hours\' | translate }}">{{ project.time_total | durationFormat: \'report\' }}</span> </td> <td> <span title="{{ \'report.management_projects.columns.created_at\' | translate }}">{{ project.created_at | date }}</span> </td> <td> <span title="{{ \'report.detailed.first_entry\' | translate }}">{{ project.first_time_entry_at | date }}</span> </td> <td> <span title="{{ \'report.detailed.last_entry\' | translate }}">{{ project.last_time_entry_at | date }}</span> </td> </tr> </tbody> <!-- Mostrar projetos e tarefas --> <tbody class="body-table" data-ng-if="filter.apiParams.show_task_details==true" data-ng-repeat="group_project in report_by_project | groupBy : \'project_hash\'"> <tr class="header-subtotal"> <td> <div class="overflow-ellipsis" title="{{ \'report.detailed.project\' | translate }} {{group_project.items[0].project_name}}{{group_project.items[0].customer_name ? \', \' + (\'report.detailed.customer\' | translate) + \' \' + group_project.items[0].customer_name : \'\'}}"> {{group_project.items[0].project_name}} </div> </td> <td> <span title="{{ \'report.detailed.worked_hours\' | translate }}"> {{ time_total_subtotal = (calc_time_subtotal(group_project.items, \'time_total\') | durationFormat: \'report\') }}
12 </span> </td> <td> <span title="{{ \'report.management_projects.columns.created_at\' | translate }}">{{ group_project.items[0].created_at | date }}</span> </td> <td> <span title="{{ \'report.detailed.first_entry\' | translate }}">{{ group_project.items[0].first_time_entry_at | date }}</span> </td> <td> <span title="{{ \'report.detailed.last_entry\' | translate }}">{{ group_project.items[0].last_time_entry_at | date }}</span> </td> </tr> <tr class="content" data-ng-repeat="task in group_project.items"> <td> <div class="overflow-ellipsis task_name" title="{{ \'report.detailed.task\' | translate }} {{task.task_name ? task.task_name : (\'report.summary_groups.unknown\' | translate)}}"> {{task.task_name || (\'report.detailed.no_task_label\' | translate)}} </div> </td> <td> <span title="{{ \'report.detailed.worked_hours\' | translate }}">{{ task.time_total | durationFormat: \'report\' }}</span> </td> <td></td> <td></td> <td></td> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'report.loading\' | translate }}</span> <span data-ng-if="!loading_report" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> </div> </section> </section> '),$templateCache.put("views/reports/report-summary-groups.html",'<section class="report-summary-groups report-groups-and-sort-2024 report-layout-grid" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <!--    <div class="view layout-content-width layout-content-report">--> <div class="report-topbar"> <h3 style="display: inline-block;">{{ \'report.summary_groups.title\' | translate }}</h3> <div style="text-align: right;"> <!--                <a data-app-href="#/reports/summary">Acessar versão antiga</a>--> <a data-ng-click="toggleVisibleCharts()"> <!--                        <span data-ng-class="isVisibleCharts ? \'icon-double-angle-up\' : \'icon-double-angle-down\'"></span>--> <span>{{isVisibleCharts ? (\'report.summary_groups.hide_charts\' | translate) : (\'report.summary_groups.show_charts\' | translate) }}</span> </a> </div> </div> <div data-ng-if="reportResult.items.length == 0"> <div spinner-loading="loading_report" class="spinner-loading-report"></div> </div> <div class="row report-summary-groups--chart-container report-layout-grid--content__fixed-content" data-ng-if="isVisibleCharts"> <div> <div class="report-summary-groups--chart-container__button-toggle"> <span button-toggle-inline data-ng-model="$prefsService.preferences.report_summary_group__column_chart_primary_option" data-options="primary_chart_options" data-ng-change="savePreference()"> </span> </div> <div data-ng-switch="$prefsService.preferences.report_summary_group__column_chart_primary_option"> <div data-ng-switch-when="time"> <div summary-time-chart loading="loading_report"></div> </div> <div data-ng-switch-when="financial_progress"> <div data-flag-upgrade-required="USER_COST" data-show-long-description="true" data-custom-description="{{ \'report.summary_groups.charts.financial_description\' | translate }}"></div> <div financial-progress-chart data-if-has-feature="USER_COST" loading="loading_report"></div> </div> <div data-ng-switch-when="invoiced_status"> <div data-flag-upgrade-required="INVOICED_FLAG" data-show-long-description="true" data-custom-description="{{ \'report.summary_groups.charts.invoiced_description\' | translate }}"></div> <div invoiced-column-chart loading="loading_report" data-if-has-feature="INVOICED_FLAG"></div> </div> </div> </div> <div class="row report-summary-groups--chart-container__pie-chart"> <div time-pie-chart data="reportResult" loading="loading_report"></div> </div> </div> <div class="row report-summary-groups--buttons-container report-layout-grid--content__fixed-content"> <div> <button class="button clean radius" style="margin-left: 5px;" data-dropdown="dropdown-group-by"> <span class="icon-contract" style="margin-right: 5px;"></span> <span>{{ \'report.summary_groups.groups\' | translate:{count: selectedGroupByCounter} }}</span> </button> <button class="button clean radius" style="margin-left: 5px;
12" data-ng-click="toggleExpandAll()"> <span data-ng-class="isExpandedAll ? \'icon-double-angle-up\' : \'icon-double-angle-down\'"></span> <span>{{isExpandedAll ? (\'report.summary_groups.collapse_all\' | translate) : (\'report.summary_groups.expand_all\' | translate) }}</span> </button> <div id="dropdown-group-by" data-dropdown-content class="f-dropdown dropdown-group-by"> <div class="dropdown-title"> <span>{{ \'report.summary_groups.group_by\' | translate }}</span> </div> <div class="dropdown-groups-container"> <div data-ng-repeat="groupBy in selectedGroupBy" class="dropdown-group-item"> <div> <select data-options="groupColumns | toArray: true" data-ng-model="groupBy.columnName" data-selectize="{\r\n                                labelField: \'title\',\r\n                                valueField: \'columnName\',\r\n                                sortField: \'title\',\r\n                                searchField: \'title\',\r\n                                onChange: onChangeGroupColumn,\r\n                                optgroupField: \'groupName\',\r\n                                optgroupLabelField: \'groupName\',\r\n                                optgroupValueField: \'groupName\'\r\n                                }"></select> </div> <div> <div data-ng-show="$index !== 0"> <a data-ng-click="removeGroupColumn($index, $event)" class="light-blue-on-hover"> <span class="icon-cross"></span> </a> </div> </div> </div> <div class="dropdown-add-group-button"> <a data-ng-hide="selectedGroupBy.length >= 5" data-ng-click="addGroupColumn()"> <span class="icon-plus4"></span> {{ \'report.summary_groups.add_group\' | translate }} </a> <span data-ng-show="selectedGroupBy.length >= 5"> {{ \'report.summary_groups.limit_groups\' | translate }} </span> </div> </div> </div> </div> <div style="text-align: right;"> <button class="button clean radius" style="margin-left: 5px;" title="{{ \'report.report_columns\' | translate }}" data-dropdown="dropdown-config-columns"> <span class="icon-menu2"></span> {{ \'report.columns\' | translate }} </button> <button class="button clean radius" data-dropdown="dropdown-export-report"> <span class="icon-download6"></span> {{ \'report.export\' | translate }} </button> <div id="dropdown-export-report" data-dropdown-content class="f-dropdown dropdown-option-list"> <div> <div class="dropdown-title"> <strong>{{ \'report.file_format\' | translate }}</strong> </div> <div class="dropdown-option radio dropdown-option--export-format"> <div data-if-has-not-feature="CUSTOM_REPORTS"> <label disabled="disabled"> <span>{{ \'report.export_xlsx\' | translate }}</span> <span class="dropdown-option-details">{{ \'report.export_xlsx_details\' | translate }}</span> </label> </div> <div data-if-has-feature="CUSTOM_REPORTS"> <label data-ng-model="$prefsService.preferences.report_summary_group_export_format" data-btn-radio="\'xlsx\'"> <span>{{ \'report.export_xlsx\' | translate }}</span> <span class="dropdown-option-details">{{ \'report.export_xlsx_details\' | translate }}</span> </label> </div> <div data-if-has-feature="CUSTOM_REPORTS"> <label data-ng-model="$prefsService.preferences.report_summary_group_export_format" data-btn-radio="\'csv\'"> <span>{{ \'report.export_csv\' | translate }}</span> <span class="dropdown-option-details">{{ \'report.export_csv_details\' | translate }}</span> </label> </div> <label data-ng-model="$prefsService.preferences.report_summary_group_export_format" data-btn-radio="\'pdf\'"> <span>{{ \'report.export_pdf\' | translate }}</span> <span class="dropdown-option-details">{{ \'report.export_pdf_details\' | translate }}</span> </label> <div data-if-has-not-feature="CUSTOM_REPORTS"> <label disabled="disabled"> <span>{{ \'report.export_xlsx_print\' | translate }}</span> <span class="dropdown-option-details">{{ \'report.export_xlsx_print_details\' | translate }}</span> </label> </div> <div data-if-has-feature="CUSTOM_REPORTS"> <label data-ng-model="$prefsService.preferences.report_summary_group_export_format" data-btn-radio="\'xlsx_to_print\'"> <span>{{ \'report.export_xlsx_print\' | translate }}</span>
12 <span class="dropdown-option-details">{{ \'report.export_xlsx_print_details\' | translate }}</span> </label> </div> </div> </div> <div> <div> <div class="dropdown-title" style="margin-top: 15px"> <strong>{{ \'report.export_columns\' | translate }}</strong> </div> <div class="dropdown-option radio" data-ng-if="$prefsService.preferences.report_summary_group_export_format === \'xlsx\'\r\n                                 || $prefsService.preferences.report_summary_group_export_format === \'csv\'"> <label data-ng-model="$prefsService.preferences.report_summary_group_export_columns_option" data-btn-radio="\'all\'"> <span>{{ \'report.export_columns_all\' | translate }}</span> </label> <label data-ng-model="$prefsService.preferences.report_summary_group_export_columns_option" data-btn-radio="\'visible_on_screen\'"> <span>{{ \'report.export_columns_visible\' | translate }}</span> </label> </div> <div data-ng-if="$prefsService.preferences.report_summary_group_export_format !== \'xlsx\'\r\n                                 && $prefsService.preferences.report_summary_group_export_format !== \'csv\'" class="explanation radius"> {{ \'report.export_print_notice\' | translate }} </div> </div> <div> <div class="dropdown-title" style="margin-top: 15px"> <strong>{{ \'report.options\' | translate }}</strong> </div> <!--                            <div class="dropdown-option checkbox">--> <!--                                <label>--> <!--                                    <input type="checkbox"--> <!--                                           data-ng-model="$prefsService.preferences.report_summary_group__opt_export_show_header">--> <!--                                    <span>Exibir cabeçalho</span>--> <!--                                </label>--> <!--                            </div>--> <div class="dropdown-option checkbox"> <label class="element-todo-checkbox"> <input type="checkbox" data-ng-check data-ng-model="$prefsService.preferences.report_summary_group__opt_export_hide_filters"> <span>{{ \'report.summary_groups.export_hide_filters\' | translate }}</span> </label> </div> </div> </div> <div> <button class="button button--blue-brand" data-ng-click="export()" data-ng-disabled="exporting_report\r\n                                || !$prefsService.preferences.report_summary_group_export_format"> {{exporting_report ? (\'report.exporting\' | translate) : (\'report.export\' | translate)}} </button> </div> <div> <div class="f-dropdown--dropdown-bottom-details"> <a class="link underline" data-ng-if="$permissionService.hasPrivilegesToEditAccountSettings()" data-app-href="#/report-settings">{{ \'report.detailed.configure_report\' | translate }}</a> <a class="link underline" data-ng-click="$supportChannelService.openChat()">{{ \'report.detailed.feedback\' | translate }}</a> </div> </div> </div> <div id="dropdown-config-columns" data-dropdown-content data-dropdown-on-close="onCloseColumnConfigs" class="f-dropdown dropdown-option-list" data-max-height data-offset-height="150"> <div class="dropdown-config-columns--two-columns"> <div> <div data-ng-repeat="groupColumns in tableColumns | toArray: true | filter: { groupKey: \'totals\', groupVisible: true } | groupBy: \'groupName\' "> <strong class="dropdown-title"> {{groupColumns.group_name}} </strong> <div data-ng-repeat="column in groupColumns.items "> <div class="dropdown-option checkbox"> <label> <input type="checkbox" data-ng-model="column.columnVisible" data-disabled-required-feature="column.featureRequired"> <span>{{column.title}}</span> </label> </div> </div> </div> </div> <div> <div data-ng-repeat="groupColumns in tableColumns | toArray: true | filter: { groupKey: \'!totals\', groupVisible: true } | groupBy: \'groupName\' "> <strong class="dropdown-title"> {{groupColumns.group_name}} </strong> <div data-ng-repeat="column in groupColumns.items "> <div class="dropdown-option checkbox"> <label> <input type="checkbox" data-ng-model="column.columnVisible" data-disabled-required-feature="column.featureRequired"> <span>{{column.title}}</span> </label> </div> </div> </div> </div> </div> </div> </div> </div> <div class="report-list-container" style="calc(100% - 250px)"> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners"> <thead> <tr> <th data-ng-click="changeOrderBy(\'first_column\')"> <div class="th-inner overflow-ellipsis"> <!--                                        Grupos--> {{headerGroupNames}} </div> <span class="report-order-direction" data-ng-show="orderByColumn === \'first_column\'" data-ng-class="orderByColumn === \'first_column\' && orderByReverse ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> <th data-ng-repeat="column in tableColumns | toArray: true | filter: { columnVisible : true, groupVisible: true }" data-ng-click="changeOrderBy(column.$key)" class="{{column.type}}-column-type"> <!--                                    <div class="overflow-ellipsis"--> <!--                                         data-tooltip="{{column.title}}"--> <!--                                         data-tooltip-ellipsis--> <!--                                         data-tooltip-append-to-body="true">--> <div> {{column.title}} </div> <span class="report-order-direction" data-ng-show="orderByColumn === column.$key" data-ng-class="orderByColumn === column.$key && orderByReverse ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> <th></th> </tr> </thead> <tbody> <tr class="report-groups-and-sort-2024--total-row"> <td class="overflow-ellipsis">
12 <div class="report-groups-and-sort-2024--group-details"> <span>{{ \'report.total\' | translate }}</span> <span class="report-groups-and-sort-2024--items-counter" title="{{ \'report.summary_groups.groups\' | translate:{count: \'\'} | trim }}"> ({{reportResult.items.length||0}}) </span> </div> </td> <td data-ng-repeat="column in tableColumns | toArray: true | filter: { columnVisible : true, groupVisible: true }" class="{{column.type}}-column-type"> <div data-ng-switch="column.type"> <span data-ng-switch-when="time"> {{ reportResult.totals[column.$key].time | durationFormat: \'report\' }} </span> <span data-ng-switch-when="money"> {{ reportResult.totals[column.$key] | moneyToRealPrivacy : true }} </span> <span data-ng-switch-when="percentage"> {{ reportResult.totals[column.$key] | numericHuman }} % </span> <span data-ng-switch-default> {{ reportResult.totals[column.$key] || \'-\' }} </span> </div> </td> <td></td> </tr> </tbody> <tbody> <tr data-ng-repeat-start="itemLevel1 in reportResult.items | orderBy : orderBy " data-ng-include="\'reportItemRowTemplate\'" data-ng-init="reportItem = itemLevel1; tableSubItemCount = 1; ancestorItems = [itemLevel1]" data-include-replace> </tr> <tr data-ng-if="itemLevel1.isExpanded" data-ng-repeat-start="itemLevel2 in itemLevel1.items | orderBy : orderBy " data-ng-include="\'reportItemRowTemplate\'" data-ng-init="reportItem = itemLevel2; tableSubItemCount = 2; ancestorItems = [itemLevel1, itemLevel2]" data-include-replace> </tr> <tr data-ng-if="itemLevel2.isExpanded" data-ng-repeat-start="itemLevel3 in itemLevel2.items | orderBy : orderBy " data-ng-include="\'reportItemRowTemplate\'" data-ng-init="reportItem = itemLevel3; tableSubItemCount = 3; ancestorItems = [itemLevel1, itemLevel2, itemLevel3]" data-include-replace> </tr> <tr data-ng-if="itemLevel3.isExpanded" data-ng-repeat-start="itemLevel4 in itemLevel3.items | orderBy : orderBy " data-ng-include="\'reportItemRowTemplate\'" data-ng-init="reportItem = itemLevel4; tableSubItemCount = 4; ancestorItems = [itemLevel1, itemLevel2, itemLevel3, itemLevel4]" data-include-replace> </tr> <tr data-ng-if="itemLevel4.isExpanded" data-ng-repeat="itemLevel5 in itemLevel4.items | orderBy : orderBy " data-ng-include="\'reportItemRowTemplate\'" data-ng-init="reportItem = itemLevel5; tableSubItemCount = 5; ancestorItems = [itemLevel1, itemLevel2, itemLevel3, itemLevel4, itemLevel5]" data-include-replace> </tr> <tr data-ng-if="itemLevel4.isExpanded" data-ng-repeat-end data-ng-include="\'reportItemCloseTemplate\'" data-ng-init="reportItem = itemLevel4; tableSubItemCount = 4" data-include-replace></tr> <tr data-ng-if="itemLevel3.isExpanded" data-ng-repeat-end data-ng-include="\'reportItemCloseTemplate\'" data-ng-init="reportItem = itemLevel3; tableSubItemCount = 3" data-include-replace></tr> <tr data-ng-if="itemLevel2.isExpanded" data-ng-repeat-end data-ng-include="\'reportItemCloseTemplate\'" data-ng-init="reportItem = itemLevel2; tableSubItemCount = 2" data-include-replace></tr> <tr data-ng-if="itemLevel1.isExpanded" data-ng-repeat-end data-ng-include="\'reportItemCloseTemplate\'" data-ng-init="reportItem = itemLevel1; tableSubItemCount = 1" data-include-replace></tr> </tbody> </table> </div> </div> </section> </section> <script type="text/ng-template" id="reportItemCloseTemplate"> <tr class="report-groups-and-sort-2024--item-row is-expanded item-level-{{tableSubItemCount}} report-groups-and-sort-2024--item-close">\r\n        <td colspan="100"></td>\r\n    </tr> </script> <script type="text/ng-template" id="reportItemRowTemplate"> <tr class="report-groups-and-sort-2024--item-row item-level-{{tableSubItemCount}}"\r\n        data-ng-class="{\r\n                \'is-expanded\': reportItem.isExpanded && reportItem.items.length,\r\n                \'has-items\': reportItem.items.length,\r\n            }"\r\n        data-ng-click="toggleExpandedItems(reportItem)">\r\n        <td class="overflow-ellipsis">\r\n            <div class="report-groups-and-sort-2024--item-details">\r\n\r\n                <span data-ng-checked="reportItem.isExpanded"\r\n                      data-ng-class="{\r\n                        \'has-itens-below\': reportItem.items.length\r\n                     }"></span>\r\n\r\n                <div class="report-groups-and-sort-2024--item-primary">
12\r\n                <span class="entity-color-identity-row">\r\n                    <span data-entity-color-swatch\r\n                          data-variant="bar-inline"\r\n                          data-color="reportItem.details[reportItem.details.group_type + \'_color\']"></span>\r\n                <span data-ng-switch="reportItem.details.group_key"\r\n                      title="{{::getFirstColumnTitle(reportItem)}}"\r\n                      class="entity-color-identity-row__label {{::reportItem.details.group_key}}-item-details">\r\n\r\n                        <span data-ng-switch-when="user_id"\r\n                              class="user-list-item--identity">\r\n                            <div data-user-avatar\r\n                                 data-name="{{ ::reportItem.details.user_name }}"\r\n                                 data-photo-url="reportItem.details.user_profile_photo_url"\r\n                                 data-size="sm">\r\n                            </div>\r\n\r\n                            <strong data-tooltip="{{::reportItem.details.user_name}}"\r\n                                    data-tooltip-ellipsis class="overflow-ellipsis">\r\n                                {{ ::reportItem.details.user_name | shortening }}\r\n                            </strong>\r\n                        </span>\r\n                        <span data-ng-switch-when="project_id">\r\n                            <strong data-tooltip="{{::reportItem.details.project_name}}"\r\n                                    data-tooltip-ellipsis class="overflow-ellipsis">\r\n                                {{ ::reportItem.details.project_name }}\r\n                            </strong>\r\n                        </span>\r\n                        <span data-ng-switch-when="week">\r\n                            <strong class="overflow-ellipsis">\r\n                                {{ ::reportItem.details.week | dateWeek }}\r\n                            </strong>\r\n                        </span>\r\n                         <span data-ng-switch-when="month">\r\n                            <strong class="overflow-ellipsis">\r\n                                {{ ::reportItem.details.month | monthYear }}\r\n                            </strong>\r\n                        </span>\r\n                        <span data-ng-switch-when="date">\r\n                            <strong class="overflow-ellipsis">\r\n                                {{ ::reportItem.details.date | dateLong }}\r\n                            </strong>\r\n                        </span>\r\n                        <span data-ng-switch-when="todo_id">\r\n                            <strong class="overflow-ellipsis"\r\n                                    data-ng-class="::{\'grey-color\' : !reportItem.details.todo_name}">\r\n                                {{ ::reportItem.details.todo_name || \'Sem atividade\' }}\r\n                            </strong>\r\n                        </span>\r\n                        <span data-ng-switch-when="task_id">\r\n                            <strong class="overflow-ellipsis"\r\n                                    data-ng-class="::{\'grey-color\' : !reportItem.details.task_id}">\r\n                                {{ ::reportItem.details.task_name || \'Sem tarefa\' }}\r\n                            </strong>\r\n                        </span>\r\n                        <span data-ng-switch-when="customer_id">\r\n                            <strong class="overflow-ellipsis"\r\n                                    data-ng-class="::{\'grey-color\' : !reportItem.details.customer_id}">\r\n                                {{ ::reportItem.details.customer_name || \'Sem cliente\' }}\r\n                            </strong>\r\n                        </span>\r\n                        <span data-ng-switch-default>\r\n                            <strong class="overflow-ellipsis"\r\n                                    data-ng-class="::{\'grey-color\' : !reportItem.details[reportItem.details.group_key]}">\r\n                                {{ ::getFirstColumnDescription(reportItem) }}\r\n                            </strong>\r\n                        </span>\r\n                </span>\r\n                </span>
12\r\n                <span class="report-groups-and-sort-2024--items-counter"\r\n                      data-ng-if="::reportItem.items.length"\r\n                      title="Quantidade de subgrupos">\r\n                    ({{::reportItem.items.length}})\r\n                </span>\r\n                </div>\r\n            </div>\r\n        </td>\r\n\r\n        <td data-ng-repeat="column in tableColumns | toArray: true | filter: { columnVisible : true, groupVisible: true }"\r\n            class="{{column.type}}-column-type">\r\n            <div data-ng-switch="column.type" >\r\n                <span data-ng-switch-when="date" class="report-list-sticky--column-default-if-empty">\r\n                    <span data-ng-if="::reportItem[column.totalsOrDetails][column.$key]">\r\n                        {{ ::reportItem[column.totalsOrDetails][column.$key] | dateShort }}\r\n                    </span>\r\n                </span>\r\n                <span data-ng-switch-when="time" class="report-list-sticky--column-default-if-empty">\r\n                    <span data-ng-if="reportItem[column.totalsOrDetails][column.$key]">\r\n                        <a class="link link-dashed"\r\n                           data-ng-if="column.$key === \'time_total\' && canOpenSummaryHoursModal(ancestorItems, reportItem)"\r\n                           data-ng-click="onSummaryTimeTotalClick(ancestorItems, reportItem, $event)">\r\n                            {{ (reportItem[column.totalsOrDetails][column.$key].time || reportItem[column.totalsOrDetails][column.$key] || \'00:00:00\') | durationFormat: \'report\' }}\r\n                        </a>\r\n                        <span data-ng-if="column.$key !== \'time_total\' || !canOpenSummaryHoursModal(ancestorItems, reportItem)">\r\n                            {{ (reportItem[column.totalsOrDetails][column.$key].time || reportItem[column.totalsOrDetails][column.$key] || \'00:00:00\') | durationFormat: \'report\' }}\r\n                        </span>\r\n                    </span>\r\n                </span>\r\n                <span data-ng-switch-when="money" class="report-list-sticky--column-default-if-empty">\r\n                    <span data-ng-if="::reportItem[column.totalsOrDetails][column.$key]">\r\n                        {{ ::reportItem[column.totalsOrDetails][column.$key] | moneyToRealPrivacy : true }}\r\n                    </span>\r\n                </span>\r\n                <span data-ng-switch-when="numeric" class="report-list-sticky--column-default-if-empty">\r\n                     <span data-ng-if="::reportItem[column.totalsOrDetails][column.$key]">\r\n                        {{ ( ::reportItem[column.totalsOrDetails][column.$key] || 0) | numericHuman }}\r\n                     </span>\r\n                </span>\r\n                <span data-ng-switch-when="percentage">\r\n                    {{ ::reportItem[column.totalsOrDetails][column.$key] | numericHuman }} %\r\n                </span>\r\n                <span data-ng-switch-when="progress">\r\n                    <span data-ng-if="reportItem[column.totalsOrDetails][column.$key]">\r\n                         <span data-progress-bar\r\n                               data-progress-completed="reportItem[column.totalsOrDetails][column.$key]">\r\n                        </span>\r\n                    </span>\r\n                </span>\r\n                <span data-ng-switch-when="budget" class="report-list-sticky--column-default-if-empty">\r\n                    <span data-ng-if="reportItem.details.project_budget_by && reportItem.details.project_budget_by !== \'none\'">\r\n                        <span data-ng-if="reportItem.details.project_budget_by === \'time\'">\r\n                            {{::reportItem[column.totalsOrDetails][column.$key].time |time}} h\r\n                        </span>\r\n                        <span data-ng-if="reportItem.details.project_budget_by !== \'time\'">\r\n                            {{::reportItem[column.totalsOrDetails][column.$key]|moneyToRealPrivacy}}\r\n                        </span>\r\n                    </span>\r\n                </span>
12\r\n                <span data-ng-switch-when="budget_by">\r\n                    <span class="overflow-ellipsis"\r\n                          data-ng-if="reportItem.details.project_budget_by && reportItem.details.project_budget_by !== \'none\'">\r\n                        {{ \'project.budget_by_options.\' + reportItem.details.project_budget_by | translate}}\r\n                    </span>\r\n                </span>\r\n                <span data-ng-switch-default class="report-list-sticky--column-default-if-empty">\r\n                    <span data-ng-if="::reportItem[column.totalsOrDetails][column.$key]"\r\n                          class="overflow-ellipsis"\r\n                          data-tooltip="{{::reportItem[column.totalsOrDetails][column.$key]}}"\r\n                          data-tooltip-ellipsis>\r\n                        {{ ::reportItem[column.totalsOrDetails][column.$key] }}\r\n                    </span>\r\n                </span>\r\n            </div>\r\n        </td>\r\n\r\n        <td></td>\r\n    </tr> </script> '),
13$templateCache.put("views/reports/report-team.html",'<section class="report-layout-grid report-groups-and-sort-2024 view-report-daily" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <!--<div>--> <!--    <div data-ng-include="\'views/reports/report-left-column.html\'"></div>--> <!--    <div class="view layout-content-width layout-content-report">--> <div class="report-topbar"> <div> <h3>{{ \'report.detailed.title_team\' | translate }}</h3> </div> </div> <div> <!--            <div data-ng-if="report_by_team.length == 0">--> <!--                <div spinner-loading="loading_report" class="spinner-loading-report"></div>--> <!--                <div data-ng-if="!loading_report" class="report-none-register">--> <!--                    <h3>Não foi encontrado nenhum registro.</h3>--> <!--                    <p>Verifique o filtro realizado e suas permissões da conta.</p>--> <!--                </div>--> <!--            </div>--> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': loading_report && report_by_team.length === 0 } "> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners"> <!--            <div data-ng-if="report_by_team.length > 0"--> <!--                 class="report-list-container"--> <!--                 auto-height top="180" >--> <!--                <div class="header-background"></div>--> <!--                <div class="list report-list report-list-container-inner">--> <!--                    <table report-list-width-fix>--> <thead> <tr> <th style="width: 400px;"> <div class="th-inner overflow-ellipsis" title="{{ \'report.detailed.project\' | translate }}"> <span>{{ \'report.detailed.project\' | translate }}</span> </div> </th> <th style="width: 90px;"> <div class="th-inner overflow-ellipsis" title="{{ \'report.detailed.worked_hours\' | translate }}"> <span>{{ \'report.detailed.worked_hours\' | translate }}</span> </div> </th> <th></th> </tr> </thead> <tbody class="content" data-ng-repeat="group_team in report_by_team | orderBy : \'team_name\' | groupBy : \'team_name\'"> <tr class="header-subtotal" data-ng-repeat="team in group_team.items | filter : { \'type_item\' : \'team\' } : true "> <td style="width: 450px;"> <div class="overflow-ellipsis"> <span title="Equipe {{team.team_name}}">{{team.team_name}}</span> <span>({{ team.members_count | pluralize: (\'report.detailed.user\' | translate) : (\'report.detailed.users_label\' | translate) }})</span> </div> </td> <td style="width: 300px;"> <span>{{ team.time_total | durationFormat: \'report\' }}</span> </td> <td></td> </tr> <tr class="content" data-ng-repeat="project in group_team.items | filter : { \'type_item\' : \'project\' } : true | orderBy : \'project_name\'"> <td> <div class="overflow-ellipsis"> <span title="Projeto {{project.project_name}}" class="task_name">{{project.project_name}}</span> </div> </td> <td> <span>{{ project.time_total | durationFormat: \'report\' }}</span> </td> <td></td> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'report.loading\' | translate }}</span> <span data-ng-if="!loading_report" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> <!--            <div data-ng-if="report_by_team.length > 0"--> <!--                 class="report-list-container"--> <!--                 auto-height top="180" >--> <!--                <div class="header-background"></div>--> <!--                <div class="list report-list report-list-container-inner">--> <!--                    <table report-list-width-fix>--> <!--                        <thead>--> <!--                            <tr>--> <!--                                <th style="width: 400px;">--> <!--                                    <div class="th-inner overflow-ellipsis" title="Projeto">-->
13 <!--                                        <span>Projeto</span>--> <!--                                    </div>--> <!--                                </th>--> <!--                                <th style="width: 90px;" >--> <!--                                    <div class="th-inner overflow-ellipsis" title="Horas Trabalhadas">--> <!--                                        <span>Horas Trabalhadas</span>--> <!--                                    </div>--> <!--                                </th>--> <!--                                <th></th>--> <!--                            </tr>--> <!--                        </thead>--> <!--                        <tbody class="content"--> <!--                               data-ng-repeat="group_team in report_by_team | orderBy : \'team_name\' | groupBy : \'team_name\'">--> <!--                            <tr class="foot" data-ng-repeat="team in group_team.items | filter : { \'type_item\' : \'team\' } : true ">--> <!--                                <td style="width: 450px;" class="title">--> <!--                                    <span title="Equipe {{team.team_name}}">Equipe {{team.team_name}}</span>--> <!--                                    <span>({{ team.members_count }} usuário)</span>--> <!--                                </td>--> <!--                                <td style="width: 300px;"  >--> <!--                                    {{ team.time_total | time }}--> <!--                                </td>--> <!--                                <td></td>--> <!--                            </tr>--> <!--                            <tr class="content" data-ng-repeat="project in group_team.items | filter : { \'type_item\' : \'project\' } : true | orderBy : \'project_name\'">--> <!--                                <td>--> <!--                                    <span title="Projeto {{project.project_name}}" class="task_name">{{project.project_name}}</span>--> <!--                                </td>--> <!--                                <td>--> <!--                                    {{ project.time_total | time }}--> <!--                                </td>--> <!--                                <td></td>--> <!--                            </tr>--> <!--                        </tbody>--> <!--                    </table>--> <!--                </div>--> <!--            </div>--> </div> </section> </section> '),$templateCache.put("views/reports/report-template.html",'<div> <div class="report-content"> <div data-sub-view="content"></div> </div> </div> '),$templateCache.put("views/reports/report-user-grid.html",'<section class="report-layout-grid report-groups-and-sort-2024 view-report-users-grid" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <div class="report-topbar"> <div> <h3 style="margin-top: 0;">{{ \'report.user_grid.title\' | translate }}</h3> </div> <div> <button data-ng-click="export()" class="button clean radius" title="{{ \'report.detailed.export_error\' | translate }}"> <span class="icon-download5"></span> {{ \'report.export\' | translate }} </button> </div> </div> <div> <!--                <div data-ng-if="report_by_user.length == 0">--> <!--                    <div spinner-loading="loading_report" class="spinner-loading-report"></div>--> <!--                    <div data-ng-if="!loading_report" class="report-none-register">--> <!--                        <h3>Não foi encontrado nenhum registro.</h3>--> <!--                        <p>Verifique o filtro realizado e suas permissões da conta.</p>--> <!--                    </div>--> <!--                </div>--> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': loading_report && report_by_user.length === 0 } "> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners"> <!--                <div id="report-user-grid" data-ng-if="report_by_user.length > 0">--> <!--                    <div class="report-list-container"--> <!--                         data-auto-height data-top="180" style="width: 250px; float: left;">--> <!--                        <div class="header-background"></div>--> <!--                        <div class="list report-list report-list-container-inner report-list-group-columns-left-fixed">--> <!--                            <table report-list-width-fix data-scroll="hidden">--> <thead> <tr> <th class="enum-column"> <div class="th-inner overflow-ellipsis">{{ \'report.detailed.user\' | translate }}</div> </th> <th data-ng-repeat="column_project in report_by_user[0].time_per_project | orderBy : \'name\'" style="min-width: 70px; max-width: 150px;"> <div class="th-inner overflow-ellipsis" data-tooltip="{{column_project.name}}" data-tooltip-placement="top-left" data-tooltip-class="tooltip-report-header" data-tooltip-popup-delay="100" data-tooltip-append-to-body="true"> {{column_project.name}} </div> </th> <th style="min-width: 80px; max-width: 80px;"> <div class="th-inner overflow-ellipsis bolder"> <span>{{ \'report.user_grid.total_hours\' | translate }}</span> <span data-ng-if="$settingsService.get(\'integration_time_clock_active\')">Rabbiit</span> </div> </th> <th style="min-width: 80px; max-width: 80px;" data-ng-if="$settingsService.get(\'integration_time_clock_active\')"> <div class="th-inner overflow-ellipsis bolder"> <span>{{ \'report.user_grid.total_hours\' | translate }} {{$settingsService.get(\'integration_time_clock_active\') }}</span> </div> </th> </tr> </thead> <tbody> <tr class="header-total"> <td></td> <td data-ng-repeat="(index, column_project) in report_by_user[0].time_per_project | orderBy : \'name\'"> {{calc_time_subtotal_per_project(report_by_user, index) | durationFormat: \'report\' }} </td> <td> {{calc_time_subtotal(report_by_user, \'time_total\') | durationFormat: \'report\' }} </td> <td data-ng-if="$settingsService.get(\'integration_time_clock_active\')"> {{calc_time_subtotal(report_by_user, \'time_clock\') | durationFormat: \'report\' }} </td> </tr> <tr class="content" data-ng-repeat="report in report_by_user | orderBy : \'user_name\' "> <td class="enum-column"> <div class="user-list-item--identity"> <div data-user-avatar data-name="{{ report.user_name }}" data-photo-url="report.user_profile_photo_url" data-size="sm"> </div> <div class="overflow-ellipsis">{{ report.user_name }}</div> </div> </td> <td data-ng-repeat="column_project in report.time_per_project | orderBy : \'name\'"> <a class="link link-dashed" data-ng-if="hasProjectHours(column_project)" data-ng-click="onProjectHoursClick(report, column_project)"> {{ column_project.time | durationFormat: \'report\' }} </a> <span data-ng-if="!hasProjectHours(column_project)">-</span> </td> <td class="bolder"> <a class="link link-dashed" data-ng-if="hasUserHours(report)" data-ng-click="onUserTotalHoursClick(report)"> {{ report.time_total | durationFormat: \'report\' }} </a> <span data-ng-if="!hasUserHours(report)"> {{ report.time_total ? (report.time_total | durationFormat: \'report\') 
13: \'-\' }} </span> </td> <td class="bolder" data-ng-if="$settingsService.get(\'integration_time_clock_active\')"> {{ report.time_clock ? (report.time_clock | durationFormat: \'report\') : \'-\' }} </td> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'report.loading\' | translate }}</span> <span data-ng-if="!loading_report" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span> <!--                                <span data-ng-if="no_more_entries" class="steel-color">Não há mais registros.</span>--> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> <!--                    <div class="report-list-container"--> <!--                         auto-height top="180" style="calc(100% - 250px)">--> <!--                        <div class="header-background"></div>--> <!--                        <div class="list report-list report-list-container-inner report-list-group-columns-right-unfixed"--> <!--                             scroll-connect="report-list-group-columns-left-fixed">--> <!--                            <table report-list-width-fix>--> <!--                                <thead>--> <!--                                <tr>--> <!--                                    <th data-ng-repeat="column_project in report_by_user[0].time_per_project | orderBy : \'name\'"--> <!--                                        style="min-width: 70px; max-width: 150px;">--> <!--                                        <div class="th-inner overflow-ellipsis"--> <!--                                             tooltip="{{column_project.name}}"--> <!--                                             tooltip-placement="top-left"--> <!--                                             tooltip-class="tooltip-report-header"--> <!--                                             tooltip-popup-delay="100"--> <!--                                             tooltip-append-to-body="true">--> <!--                                            {{column_project.name}}--> <!--                                        </div>--> <!--                                    </th>--> <!--                                    <th style="min-width: 80px; max-width: 80px;">--> <!--                                        <div class="th-inner overflow-ellipsis bolder">--> <!--                                            <span>Total de horas</span>--> <!--                                            <span data-ng-if="$settingsService.get(\'integration_time_clock_active\')">Rabbiit</span>--> <!--                                        </div>--> <!--                                    </th>--> <!--                                    <th style="min-width: 80px; max-width: 80px;"--> <!--                                        data-ng-if="$settingsService.get(\'integration_time_clock_active\')">--> <!--                                        <div class="th-inner overflow-ellipsis bolder">--> <!--                                            <span>Total de horas {{$settingsService.get(\'integration_time_clock_active\') }}</span>--> <!--                                        </div>--> <!--                                    </th>--> <!--                                </tr>--> <!--                                </thead>--> <!--                                <tbody>--> <!--                                <tr class="header-total">--> <!--                                    <td data-ng-repeat="(index, column_project) in report_by_user[0].time_per_project | orderBy : \'name\'">--> <!--                                        {{calc_time_subtotal_per_project(report_by_user, index) | time }}--> <!--                                    </td>--> <!--                                    <td>--> <!--                                        {{calc_time_subtotal(report_by_user, \'time_total\') | time }}--> <!--                                    </td>--> <!--                                    <td data-ng-if="$settingsService.get(\'integration_time_clock_active\')">--> <!--                                        {{calc_time_subtotal(report_by_user, \'time_clock\') | time }}--> <!--                                    </td>--> <!--                                </tr>--> <!--                                <tr class="content" data-ng-repeat="report in report_by_user | orderBy : \'user_name\' ">--> <!--                                    <td data-ng-repeat="column_project in report.time_per_project | orderBy : \'name\'">--> <!--                                        {{ is_time_empty(column_project.time) ? \'-\' : (column_project.time | time) }}--> <!--                                    </td>--> <!--                                    <td class="bolder">--> <!--                                        {{ report.time_total ? (report.time_total | time) : \'-\' }}--> <!--                                    </td>--> <!--                                    <td class="bolder" data-ng-if="$settingsService.get(\'integration_time_clock_active\')">--> <!--                                        {{ report.time_clock ? (report.time_clock | time) : \'-\' }}--> <!--                                    </td>--> <!--                                </tr>--> <!--                                </tbody>--> <!--                            </table>--> <!--                        </div>--> <!--                    </div>--> <!--                </div>--> </div> <!--        </div>--> </section> </section> <!--<div>--> <!--    <div data-ng-include="\'views/reports/report-left-column.html\'"></div>--> <!--    <div class="view layout-content-width layout-content-report">--> <!--        <div class="report-topbar">--> <!--            <div class="row">--> <!--                <div class="column-70">--> <!--                    <h3 style="margin-top: 0;">Relatório Usuários Vs. Projetos</h3>--> <!--                </div>--> <!--                <div class="column-30" style="text-align: right;">--> <!--                    <button data-ng-click="export()"--> <!--                            class="button clean radius"--> <!--                            title="Exportar para Excel (.csv)">-->
13 <!--                        <span class="icon-download5"></span> Exportar--> <!--                    </button>--> <!--                </div>--> <!--            </div>--> <!--        </div>--> <!--        <div>--> <!--            <div data-ng-if="report_by_user.length == 0">--> <!--                <div spinner-loading="loading_report" class="spinner-loading-report"></div>--> <!--                <div data-ng-if="!loading_report" class="report-none-register">--> <!--                    <h3>Não foi encontrado nenhum registro.</h3>--> <!--                    <p>Verifique o filtro realizado e suas permissões da conta.</p>--> <!--                </div>--> <!--            </div>--> <!--            <div id="report-user-grid" data-ng-if="report_by_user.length > 0">--> <!--                <div class="report-list-container"--> <!--                     data-auto-height data-top="180" style="width: 250px; float: left;">--> <!--                    <div class="header-background"></div>--> <!--                    <div class="list report-list report-list-container-inner report-list-group-columns-left-fixed">--> <!--                        <table report-list-width-fix data-scroll="hidden">--> <!--                            <thead>--> <!--                                <tr>--> <!--                                    <th class="enum-column">--> <!--                                        <div class="th-inner overflow-ellipsis">Usuário</div>--> <!--                                    </th>--> <!--                                </tr>--> <!--                            </thead>--> <!--                            <tbody>--> <!--                                <tr class="header-total">--> <!--                                    <td></td>--> <!--                                </tr>--> <!--                                <tr class="content" data-ng-repeat="report in report_by_user | orderBy : \'user_name\' ">--> <!--                                    <td class="enum-column overflow-ellipsis">{{ report.user_name }}</td>--> <!--                                </tr>--> <!--                            </tbody>--> <!--                        </table>--> <!--                    </div>--> <!--                </div>--> <!--                <div class="report-list-container"--> <!--                     auto-height top="180" style="calc(100% - 250px)">--> <!--                    <div class="header-background"></div>--> <!--                    <div class="list report-list report-list-container-inner report-list-group-columns-right-unfixed"--> <!--                         scroll-connect="report-list-group-columns-left-fixed">--> <!--                        <table report-list-width-fix>--> <!--                            <thead>--> <!--                                <tr>--> <!--                                    <th data-ng-repeat="column_project in report_by_user[0].time_per_project | orderBy : \'name\'"--> <!--                                        style="min-width: 70px; max-width: 150px;">--> <!--                                        <div class="th-inner overflow-ellipsis"--> <!--                                             tooltip="{{column_project.name}}"--> <!--                                             tooltip-placement="top-left"--> <!--                                             tooltip-class="tooltip-report-header"--> <!--                                             tooltip-popup-delay="100"--> <!--                                             tooltip-append-to-body="true">--> <!--                                            {{column_project.name}}--> <!--                                        </div>--> <!--                                    </th>--> <!--                                    <th style="min-width: 80px; max-width: 80px;">--> <!--                                        <div class="th-inner overflow-ellipsis bolder">--> <!--                                            <span>Total de horas</span>--> <!--                                            <span data-ng-if="$settingsService.get(\'integration_time_clock_active\')">Rabbiit</span>--> <!--                                        </div>--> <!--                                    </th>--> <!--                                    <th style="min-width: 80px; max-width: 80px;"--> <!--                                        data-ng-if="$settingsService.get(\'integration_time_clock_active\')">--> <!--                                        <div class="th-inner overflow-ellipsis bolder">-->
13 <!--                                            <span>Total de horas {{$settingsService.get(\'integration_time_clock_active\') }}</span>--> <!--                                        </div>--> <!--                                    </th>--> <!--                                </tr>--> <!--                            </thead>--> <!--                            <tbody>--> <!--                                <tr class="header-total">--> <!--                                    <td data-ng-repeat="(index, column_project) in report_by_user[0].time_per_project | orderBy : \'name\'">--> <!--                                        {{calc_time_subtotal_per_project(report_by_user, index) | time }}--> <!--                                    </td>--> <!--                                    <td>--> <!--                                        {{calc_time_subtotal(report_by_user, \'time_total\') | time }}--> <!--                                    </td>--> <!--                                    <td data-ng-if="$settingsService.get(\'integration_time_clock_active\')">--> <!--                                        {{calc_time_subtotal(report_by_user, \'time_clock\') | time }}--> <!--                                    </td>--> <!--                                </tr>--> <!--                                <tr class="content" data-ng-repeat="report in report_by_user | orderBy : \'user_name\' ">--> <!--                                    <td data-ng-repeat="column_project in report.time_per_project | orderBy : \'name\'">--> <!--                                        {{ is_time_empty(column_project.time) ? \'-\' : (column_project.time | time) }}--> <!--                                    </td>--> <!--                                    <td class="bolder">--> <!--                                       {{ report.time_total ? (report.time_total | time) : \'-\' }}--> <!--                                    </td>--> <!--                                    <td class="bolder" data-ng-if="$settingsService.get(\'integration_time_clock_active\')">--> <!--                                        {{ report.time_clock ? (report.time_clock | time) : \'-\' }}--> <!--                                    </td>--> <!--                                </tr>--> <!--                            </tbody>--> <!--                        </table>--> <!--                    </div>--> <!--                </div>--> <!--            </div>--> <!--        </div>--> <!--    </div>--> <!--</div>--> '),$templateCache.put("views/reports/report-user.html",'<style> .list.report-list table {\r\n        position: inherit;\r\n    }\r\n    .report-list-container-inner.report-list.report-list-group-columns-left-fixed table tbody tr.header-total {\r\n        height: 38px;\r\n    }\r\n    .report-list-container-inner.report-list.report-list-group-columns-right-unfixed table thead tr th.time-column {\r\n        min-width: 160px;\r\n    }\r\n    .report-list-container-inner.report-list.report-list-content table thead tr th.enum-column {\r\n        min-width: 160px;\r\n    } </style> <section class="report-layout-grid report-groups-and-sort-2024 view-report-users-grid" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <!--<div>--> <!--    <div data-ng-include="\'views/reports/report-left-column.html\'"></div>--> <!--    <div class="view layout-content-width layout-content-report">--> <div class="report-topbar"> <!--            <div class="row">--> <div> <h3 style="margin-top: 0;">{{ \'report.detailed.title_user\' | translate }}</h3> </div> <div> <button class="button clean radius" data-ng-click="export()" title="{{ \'report.export\' | translate }}"> <span class="icon-download5"></span> <span>{{ \'report.export\' | translate }}</span> <span class="flag yellow-color" style="margin-left: 10px;" if-has-not-feature="REPORT_EXPORT">UPGRADE</span> </button> <!--                    <div id="dropdown-export-report"--> <!--                         data-dropdown-content--> <!--                         class="f-dropdown dropdown-option-list">--> <!--                        <div class="dropdown-title">-->
13 <!--                            <span>Exportar para CSV</span>--> <!--                        </div>--> <!--                        <div class="dropdown-option option-button">--> <!--                            <a data-ng-click="export()">--> <!--                                <span>Exportar todos as colunas</span>--> <!--                                <span class="flag yellow-color" style="margin-left: 10px;"--> <!--                                      if-has-not-feature="REPORT_EXPORT"--> <!--                                >UPGRADE</span>--> <!--                            </a>--> <!--                        </div>--> <!--                    </div>--> <button class="button clean radius" style="margin-left: 5px;" data-tooltip="{{ \'report.summary_groups.group_by\' | translate }}" data-dropdown="dropdown-group-by"> <span class="icon-contract" style="margin-right: 5px;"></span> <span>{{ \'report.summary_groups.group_by\' | translate }}</span> </button> <div id="dropdown-group-by" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <span>{{ \'report.summary_groups.group_by\' | translate }}</span> </div> <div class="dropdown-option checkbox" data-ng-repeat="column in column_options | toArray: true | filter: { group_by_visible : true } "> <label> <input type="checkbox" ng-model="column.group_by_selected" data-ng-change="update_group_by_columns(column.column_id)" ng-true-value="true" ng-false-value="false"> <span>{{column.name}}</span> <span data-ng-if="column.is_custom_field" class="icon-info light-grey-color" data-tooltip-append-to-body="true" data-tooltip-placement="top-left" data-tooltip-html="\'\r\n                                        <div><strong>{{column.name}}</strong></div>\r\n                                        <div>{{column.description}}</div>\r\n                                        <div>Campo de {{$customFieldService.getEntityName(column.entity)}}</div>\'\r\n                                    "></span> </label> </div> </div> </div> <!--            </div>--> </div> <div> <!--            <div data-ng-if="report_by_user.length == 0">--> <!--                <div spinner-loading="loading_report" class="spinner-loading-report"></div>--> <!--                <div data-ng-if="!loading_report" class="report-none-register">--> <!--                    <h3>Não foi encontrado nenhum registro.</h3>--> <!--                    <p>Verifique o filtro realizado e suas permissões da conta.</p>--> <!--                </div>--> <!--            </div>--> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': loading_report && report_by_user.length === 0 } "> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners"> <!--                        <div data-ng-if="report_by_user.length > 0">--> <!--                            <div class="report-list-container"--> <!--                                 data-auto-height data-top="180" style="width: 250px; float: left;">--> <!--                                <div class="header-background"></div>--> <!--                                <div class="list report-list report-list-container-inner report-list-group-columns-left-fixed">--> <!--                                    <table report-list-width-fix data-scroll="hidden">--> <thead> <tr> <th class="enum-column"> <div class="th-inner overflow-ellipsis">{{ \'report.detailed.user\' | translate }}</div> </th> <th data-ng-repeat="column in column_options | toArray: true" data-ng-if="column_is_visible(column.$key)" class="{{column.type}}-column" data-tooltip="{{column.name}}" data-tooltip-placement="top-left" data-tooltip-class="tooltip-report-header" data-tooltip-popup-delay="100" data-tooltip-append-to-body="true"> <div class="th-inner overflow-ellipsis">{{column.name}}</div> </th> </tr> </thead> <tbody> <tr class="header-total"> <td></td> <td data-ng-repeat="column in column_options | toArray: true" data-ng-if="column_is_visible(column.$key)" class="{{column.type}}-column"> <div data-ng-switch="column.visible_subtotal"> <span data-ng-switch-when="true"> {{calc_time_subtotal(report_by_user, column.$key) | durationFormat: \'report\' }} </span> <span data-ng-switch-default>-</span> </div> </td> </tr> <tr class="content" data-ng-repeat="report in report_by_user | orderBy : \'user_name\' "> <td class="enum-column"> <div class="user-list-item--identity"> <div data-user-avatar data-name="{{ report.user_name }}" data-photo-url="report.user_profile_photo_url" data-size="sm"> </div> <div class="overflow-ellipsis">{{ report.user_name }}</div> </div> </td> <td data-ng-repeat="column in column_options | toArray: true" data-ng-if="column_is_visible(column.$key)" class="{{column.type}}-column"> <div data-ng-switch="column.type"> <span data-ng-switch-when="time"> <span data-ng-if="!isTimeColumnClickable(column)"> {{ report[column.$key] ? (report[column.$key] | durationFormat: \'report\') 
13: \'-\' }} </span> <span data-ng-if="isTimeColumnClickable(column)"> <a class="link link-dashed" data-ng-if="hasReportHours(report, column)" data-ng-click="onReportHoursClick(report, column)"> {{ report[column.$key] | durationFormat: \'report\' }} </a> <span data-ng-if="!hasReportHours(report, column)"> {{ report[column.$key] ? (report[column.$key] | durationFormat: \'report\') : \'-\' }} </span> </span> </span> <span data-ng-switch-when="month">{{ report[column.$key] ? (report[column.$key] | monthYear) : column.empty_message }}</span> <span data-ng-switch-default class="overflow-ellipsis">{{ report[(column.column_value || column.$key)] || column.empty_message}}</span> </div> </td> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'report.loading\' | translate }}</span> <span data-ng-if="!loading_report" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span> <!--                                <span data-ng-if="no_more_entries" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span>--> </td> <td colspan="100"></td> </tr> </tfoot> <!--                                    </table>--> <!--                                </div>--> <!--                            </div>--> <!--                            <div class="report-list-container"--> <!--                                 auto-height top="180" style="calc(100% - 250px)">--> <!--                                <div class="header-background"></div>--> <!--                                <div class="list report-list report-list-container-inner report-list-group-columns-right-unfixed" scroll-connect="report-list-group-columns-left-fixed">--> <!--                                    <table report-list-width-fix>--> <!--                                        <thead>--> <!--                                        <tr>--> <!--                                            <th data-ng-repeat="column in column_options | toArray: true"--> <!--                                                data-ng-if="column_is_visible(column.$key)"--> <!--                                                class="{{column.type}}-column"--> <!--                                                data-tooltip="{{column.name}}"--> <!--                                                data-tooltip-placement="top-left"--> <!--                                                data-tooltip-class="tooltip-report-header"--> <!--                                                data-tooltip-popup-delay="100"--> <!--                                                data-tooltip-append-to-body="true">--> <!--                                                <div class="th-inner overflow-ellipsis">{{column.name}}</div>--> <!--                                            </th>--> <!--                                        </tr>--> <!--                                        </thead>--> <!--                                        <tbody>--> <!--                                        <tr class="header-total">--> <!--                                            <td data-ng-repeat="column in column_options | toArray: true"--> <!--                                                data-ng-if="column_is_visible(column.$key)"--> <!--                                                class="{{column.type}}-column">--> <!--                                                <div data-ng-switch="column.visible_subtotal">--> <!--                                            <span data-ng-switch-when="true">--> <!--                                                {{calc_time_subtotal(report_by_user, column.$key) | time }}--> <!--                                            </span>--> <!--                                                    <span data-ng-switch-default>-</span>--> <!--                                                </div>--> <!--                                            </td>--> <!--                                        </tr>--> <!--                                        <tr class="content" data-ng-repeat="report in report_by_user | orderBy : \'user_name\'">--> <!--                                            <td data-ng-repeat="column in column_options | toArray: true"--> <!--                                                data-ng-if="column_is_visible(column.$key)"--> <!--                                                class="{{column.type}}-column">--> <!--                                                <div data-ng-switch="column.type">-->
13 <!--                                                    <span data-ng-switch-when="time">{{report[column.$key] | time}}</span>--> <!--                                                    <span data-ng-switch-default class="overflow-ellipsis">{{ report[(column.column_value || column.$key)] || column.empty_message}}</span>--> <!--                                                </div>--> <!--                                            </td>--> <!--                                        </tr>--> <!--                                        </tbody>--> <!--                                    </table>--> <!--                                </div>--> <!--                            </div>--> <!--                        </div>--> </table> </div> </div> <!--            <div data-ng-if="report_by_user.length > 0">--> <!--                <div class="report-list-container"--> <!--                     data-auto-height data-top="180" style="width: 250px; float: left;">--> <!--                    <div class="header-background"></div>--> <!--                    <div class="list report-list report-list-container-inner report-list-group-columns-left-fixed">--> <!--                        <table report-list-width-fix data-scroll="hidden">--> <!--                            <thead>--> <!--                                <tr>--> <!--                                    <th class="enum-column">--> <!--                                        <div class="th-inner overflow-ellipsis">Usuário</div>--> <!--                                    </th>--> <!--                                </tr>--> <!--                            </thead>--> <!--                            <tbody>--> <!--                                <tr class="header-total">--> <!--                                    <td></td>--> <!--                                </tr>--> <!--                                <tr class="content" data-ng-repeat="report in report_by_user | orderBy : \'user_name\' ">--> <!--                                    <td class="enum-column overflow-ellipsis">{{ report.user_name }}</td>--> <!--                                </tr>--> <!--                            </tbody>--> <!--                        </table>--> <!--                    </div>--> <!--                </div>--> <!--                <div class="report-list-container"--> <!--                     auto-height top="180" style="calc(100% - 250px)">--> <!--                    <div class="header-background"></div>--> <!--                    <div class="list report-list report-list-container-inner report-list-group-columns-right-unfixed" scroll-connect="report-list-group-columns-left-fixed">--> <!--                        <table report-list-width-fix>--> <!--                            <thead>--> <!--                                <tr>--> <!--                                    <th data-ng-repeat="column in column_options | toArray: true"--> <!--                                        data-ng-if="column_is_visible(column.$key)"--> <!--                                        class="{{column.type}}-column"--> <!--                                        data-tooltip="{{column.name}}"--> <!--                                        data-tooltip-placement="top-left"--> <!--                                        data-tooltip-class="tooltip-report-header"--> <!--                                        data-tooltip-popup-delay="100"--> <!--                                        data-tooltip-append-to-body="true">--> <!--                                        <div class="th-inner overflow-ellipsis">{{column.name}}</div>--> <!--                                    </th>--> <!--                                </tr>--> <!--                           </thead>--> <!--                           <tbody>--> <!--                               <tr class="header-total">--> <!--                                    <td data-ng-repeat="column in column_options | toArray: true"--> <!--                                        data-ng-if="column_is_visible(column.$key)"--> <!--                                        class="{{column.type}}-column">--> <!--                                        <div data-ng-switch="column.visible_subtotal">-->
13 <!--                                            <span data-ng-switch-when="true">--> <!--                                                {{calc_time_subtotal(report_by_user, column.$key) | time }}--> <!--                                            </span>--> <!--                                            <span data-ng-switch-default>-</span>--> <!--                                        </div>--> <!--                                    </td>--> <!--                               </tr>--> <!--                                <tr class="content" data-ng-repeat="report in report_by_user | orderBy : \'user_name\'">--> <!--                                    <td data-ng-repeat="column in column_options | toArray: true"--> <!--                                        data-ng-if="column_is_visible(column.$key)"--> <!--                                        class="{{column.type}}-column">--> <!--                                        <div data-ng-switch="column.type">--> <!--                                            <span data-ng-switch-when="time">{{report[column.$key] | time}}</span>--> <!--                                            <span data-ng-switch-default class="overflow-ellipsis">{{ report[(column.column_value || column.$key)] || column.empty_message}}</span>--> <!--                                        </div>--> <!--                                    </td>--> <!--                                </tr>--> <!--                            </tbody>--> <!--                        </table>--> <!--                    </div>--> <!--                </div>--> <!--            </div>--> </div> </section> </section> '),
14$templateCache.put("views/reports/report-weekly-v2.html",'<section class="report-groups-and-sort-2024 report-layout-grid report-weekly" data-ng-class="{\'report-weekly--is-range-by-day\': isRangeByDay}" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <div class="report-topbar"> <div> <h3>{{ \'report.management_users.title\' | translate }}</h3> <div class="button-group" data-ng-if="$permissionService.hasPrivilegesToCreateUsers()"> <button data-ng-click="openNewUser()" class="button clean"> <span class="icon-plus4"></span> <span>{{ \'report.management_users.invite\' | translate }}</span> </button> <button data-ng-click="openInviteBulk()" class="button clean"> <span>{{ \'report.management_users.invite_bulk\' | translate }}</span> </button> </div> <a data-app-href="#/account" style="margin-left: 20px;" data-ng-if="$subscriptionService.getPlanName() === \'PRO\'"> {{ \'report.management_users.licenses_usage\' | translate:{active: $subscriptionService.getTotalActiveUsers(), limit: $subscriptionService.getUsersLimit()} }} </a> </div> <div style="text-align: right;"> <button data-ng-click="openHolidayCalendars()" class="button clean"> <span>{{ \'holiday_calendars.button_label\' | translate }}</span> </button> <button data-ng-click="openTeams()" class="button clean"> <span>{{ \'teams.title\' | translate }}</span> </button> <span data-button-export="export2" data-preference-prefix="report_users_capacity" data-formats="[\'csv_users_days\', \'csv\', \'xlsx\']" data-enable-column-options="false" data-extra-formats="exportExtraFormats"> </span> </div> </div> <div class="report-list-container" data-ng-class="{\r\n             \'report-list-container--is-loading\': loading_report\r\n             } "> <div class="report-list-sticky" data-infinite-scroll="showMoreItems()" data-infinite-scroll-disabled="loading_report" data-infinite-scroll-distance="2" data-infinite-scroll-container=".report-layout-grid--content"> <table class="sticky-table report-round-table-corners"> <thead> <tr> <th data-ng-click="changeOrderBy(\'details.user_name\')"> <div> {{ \'report.management_users.title\' | translate }} ({{reportResult.items.length||0}}) </div> <span class="report-order-direction" data-ng-show="orderByColumn === \'details.user_name\'" data-ng-class="orderByColumn === \'details.user_name\' && orderByReverse ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> <th data-ng-repeat="dateItem in reportResult.items[0].items" class="report-weekly--day-column" data-ng-class="{\r\n                                \'is-weekend\' : is_weekend(dateItem.details),\r\n                                \'is-today\' : is_current_date(dateItem.details)\r\n                                }" data-ng-click="changeOrderBy(\'items[\'+$index+\'].totals.time_total.seconds\')"> <div class="overflow-ellipsis"> <div data-ng-if="dateItem.details.group_key === \'date\'"> <div class="report-weekly--day-column__weekday">{{dateItem.details.date | moment: \'ddd\'}}</div> <div>{{dateItem.details.date | moment: \'D\'}}</div> </div> <div data-ng-if="dateItem.details.group_key === \'week\'"> <div>{{dateItem.details.week_start | moment: \'MMM\'}}</div> <div> <span>{{dateItem.details.week_start | moment: \'D\'}}</span> — <span>{{dateItem.details.week_end | moment: \'D\'}}</span> </div> </div> <div data-ng-if="dateItem.details.group_key === \'month\'"> {{dateItem.details.month | moment: \'MMMM\' : \'YYYY-MM\'}} </div> </div> <span class="report-order-direction" data-ng-show="orderByColumn === \'items[\'+$index+\'].totals.time_total.seconds\'" data-ng-class="orderByColumn === \'items[\'+$index+\'].totals.time_total.seconds\' && orderByReverse ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> <th class="time-column-type" data-ng-click="changeOrderBy(\'totals.time_total.seconds\')"> <div> {{ \'report.summary_groups.columns.time_total\' | translate }} </div> <span class="report-order-direction" data-ng-show="orderByColumn === \'totals.time_total.seconds\'" data-ng-class="orderByColumn === \'totals.time_total.seconds\' && orderByReverse ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> <th class="time-column-type" data-ng-click="changeOrderBy(\'details.user_capacity_total.seconds\')"> <div> {{ \'report.summary_groups.columns.capacity_total\' | translate }} </div> <span class="report-order-direction" data-ng-show="orderByColumn === \'details.user_capacity_total.seconds\'" data-ng-class="orderByColumn === \'details.user_capacity_total.seconds\' && orderByReverse ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> <th data-ng-click="changeOrderBy(\'details.user_capacity_consumed.seconds\')"> <div> {{ \'report.summary_groups.columns.capacity_consumed\' | translate }} </div> <span class="report-order-direction" data-ng-show="orderByColumn === \'details.user_capacity_consumed.seconds\'" data-ng-class="orderByColumn === \'details.user_capacity_consumed.seconds\' && orderByReverse ? \'icon-arrow-up\' : \'icon-arrow-down\'"></span> </th> <th></th> </tr> </thead> <tbody> </tbody> <tbody> <tr data-ng-repeat="reportItem in reportResult.items | limitTo: limitItems | orderBy : orderBy track by reportItem.details.user_id" data-ng-include="\'reportItemRowTemplate\'" data-include-replace> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'report.loading\' | translate }}</span> <span data-ng-if="!loading_report" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span>
14 <!--                                <span data-ng-if="no_more_entries" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span>--> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> </section> </section> <script type="text/ng-template" id="reportItemCloseTemplate"> <tr class="report-groups-and-sort-2024--item-row is-expanded item-level-{{tableSubItemCount}} report-groups-and-sort-2024--item-close">\r\n        <td colspan="100"></td>\r\n    </tr> </script> <script type="text/ng-template" id="reportItemRowTemplate"> <tr class="report-groups-and-sort-2024--item-row" style="position: relative">\r\n        <td class="overflow-ellipsis">\r\n            <div class="report-groups-and-sort-2024--item-details">\r\n\r\n                <a title="Opções"\r\n                   data-dropdown="dropdown-users-{{reportItem.details.user_id}}"\r\n                   class="grey-color light-blue-on-hover">\r\n                    <span class="icon-angle-down"\r\n                          style="font-size: 18px;"></span>\r\n                </a>\r\n\r\n<!--                <div>-->\r\n                <div class="report-weekly--user-content">\r\n\r\n                    <div class="report-weekly--user-identity">\r\n                        <div data-user-avatar\r\n                             data-name="{{ reportItem.details.user_name }}"\r\n                             data-photo-url="reportItem.details.user_profile_photo_url"\r\n                             data-size="md"\r\n                             class="report-weekly--user-avatar open-edit-user-link"\r\n                             data-ng-click="openEditUser(reportItem.details.user_id)">\r\n                        </div>\r\n\r\n                        <div class="report-weekly--user-info">\r\n                            <strong data-tooltip="{{reportItem.details.user_name}}"\r\n                                    data-tooltip-ellipsis\r\n                                    class="overflow-ellipsis open-edit-user-link report-weekly--user-name"\r\n                                    data-ng-click="openEditUser(reportItem.details.user_id)">\r\n                                <span>{{ reportItem.details.user_name | shortening }}</span>\r\n                            </strong>\r\n\r\n                            <span class="report-weekly--user-meta">\r\n                                <span data-flag-permission="{{reportItem.details.user_role}}" color="true"></span>\r\n                                <span data-ng-if="reportItem.details.user_is_owner"\r\n                                      class="directive-flag-permission flag-permission-highlight-color">{{ \'report.detailed.user_owner\' | translate }}</span>\r\n\r\n                                <span class="report-weekly--is-archived"\r\n                                      data-ng-if="reportItem.details.user_active == 0">{{ \'report.detailed.user_archived\' | translate }}</span>\r\n                            </span>\r\n                        </div>\r\n                    </div>\r\n\r\n                </div>\r\n\r\n            </div>\r\n        </td>\r\n\r\n        <td data-ng-repeat="dateItem in reportItem.items track by $index"\r\n            class="report-weekly--day-column">\r\n            <div data-ng-if="dateItem.details.group_key === \'date\'">\r\n                <span data-progress-capacity-bar\r\n                      data-title="{{dateItem.details.date | dateLong }}"\r\n                      data-progress="dateItem.details.date_user_capacity_progress"\r\n                      data-consumed="dateItem.details.date_user_capacity_consumed"\r\n                      data-remaining="dateItem.details.date_user_capacity_remaining"\r\n                      data-total="dateItem.details.date_user_capacity_total"\r\n                      data-exceed="dateItem.details.date_user_capacity_exceed"\r\n                      data-status="dateItem.details.date_user_capacity_context"\r\n                      data-on-overlay-click="onDayColumnHoursClick(reportItem, dateItem)"\r\n                      data-ng-class="{\'report-weekly--day-capacity--clickable\': dateItem.totals.time_total.minutes > 0}"\r\n                      class="progress-bar-exceed-warning">\r\n                </span>\r\n                <div class="report-weekly--day-column__hours">
14\r\n                    <span data-ng-if=" dateItem.totals.time_total.minutes === 0"\r\n                            data-ng-switch="dateItem.details.date_user_capacity_context">\r\n                        <span data-ng-switch-when="work_day">0</span>\r\n                        <span data-ng-switch-when="holiday" class="icon-moon"></span>\r\n                        <span data-ng-switch-when="vacation" class="icon-moon"></span>\r\n                        <span data-ng-switch-when="leave" class="icon-moon"></span>\r\n                        <span data-ng-switch-default class="color-steel">-</span>\r\n                    </span>\r\n                    <span data-ng-if=" dateItem.totals.time_total.minutes > 0"\r\n                          class="report-weekly--hours-clickable__value">\r\n                        {{dateItem.totals.time_total.time | durationFormat: \'default\' : \'short\'}}\r\n                    </span>\r\n                </div>\r\n            </div>\r\n            <div data-ng-if="dateItem.details.group_key === \'week\'">\r\n                <span data-progress-capacity-bar\r\n                      data-title="{{dateItem.details.week_start | moment: \'D MMM\'}} — {{dateItem.details.week_end | moment: \'D MMM\'}}"\r\n                      data-progress="dateItem.details.week_user_capacity_progress"\r\n                      data-consumed="dateItem.details.week_user_capacity_consumed"\r\n                      data-remaining="dateItem.details.week_user_capacity_remaining"\r\n                      data-total="dateItem.details.week_user_capacity_total"\r\n                      data-exceed="dateItem.details.week_user_capacity_exceed"\r\n                      data-on-overlay-click="onDayColumnHoursClick(reportItem, dateItem)"\r\n                      data-ng-class="{\'report-weekly--day-capacity--clickable\': dateItem.totals.time_total.minutes > 0}"\r\n                      class="progress-bar-exceed-warning">\r\n                </span>\r\n                <div class="report-weekly--day-column__hours">\r\n                    <span data-ng-if="dateItem.totals.time_total.minutes > 0"\r\n                          class="report-weekly--hours-clickable__value">\r\n                        {{dateItem.totals.time_total.time | durationFormat: \'default\' : \'short\'}}\r\n                    </span>\r\n                    <span data-ng-if="dateItem.totals.time_total.minutes === 0"\r\n                          class="color-steel">-</span>\r\n                </div>\r\n            </div>\r\n            <div data-ng-if="dateItem.details.group_key === \'month\'">\r\n                <span data-progress-capacity-bar\r\n                      data-title="{{dateItem.details.month | moment: \'MMMM\' : \'YYYY-MM\'}}"\r\n                      data-progress="dateItem.details.month_user_capacity_progress"\r\n                      data-consumed="dateItem.details.month_user_capacity_consumed"\r\n                      data-remaining="dateItem.details.month_user_capacity_remaining"\r\n                      data-total="dateItem.details.month_user_capacity_total"\r\n                      data-exceed="dateItem.details.month_user_capacity_exceed"\r\n                      data-on-overlay-click="onDayColumnHoursClick(reportItem, dateItem)"\r\n                      data-ng-class="{\'report-weekly--day-capacity--clickable\': dateItem.totals.time_total.minutes > 0}"\r\n                      class="progress-bar-exceed-warning">\r\n                </span>\r\n                <div class="report-weekly--day-column__hours">\r\n                    <span data-ng-if="dateItem.totals.time_total.minutes > 0"\r\n                          class="report-weekly--hours-clickable__value">\r\n                        {{dateItem.totals.time_total.time | durationFormat: \'default\' : \'short\'}}\r\n                    </span>\r\n                    <span data-ng-if="dateItem.totals.time_total.minutes === 0"\r\n                          class="color-steel">-</span>\r\n                </div>\r\n            </div>\r\n\r\n        </td>\r\n\r\n        <td class="time-column-type">\r\n            <strong>
14\r\n                <span data-ng-if="reportItem.totals.time_total.minutes > 0"\r\n                      class="report-weekly--hours-clickable__value"\r\n                      data-ng-click="onUserTotalHoursClick(reportItem)">\r\n                    {{reportItem.totals.time_total.time | durationFormat: \'default\'}}\r\n                </span>\r\n                <span data-ng-if="reportItem.totals.time_total.minutes === 0">\r\n                    {{reportItem.totals.time_total.time | durationFormat: \'default\'}}\r\n                </span>\r\n            </strong>\r\n        </td>\r\n\r\n        <td class="time-column-type">\r\n            <strong class="open-edit-user-link"\r\n                    data-ng-click="openEditUser(reportItem.details.user_id, \'capacity\')">\r\n                {{ reportItem.details.user_capacity_total.time | durationFormat: \'default\' }}\r\n            </strong>\r\n            <span class="report-weekly--user-capacity-weekly"\r\n                  data-ng-if="reportItem.details.user_active == 1 && reportItem.details.user_capacity_weekly"\r\n                  title="{{ \'report.detailed.weekly_capacity\' | translate }}">\r\n                {{reportItem.details.user_capacity_weekly | numericHuman}}h/{{ \'report.summary_groups.week_abbr\' | translate }}\r\n            </span>\r\n        </td>\r\n\r\n        <td>\r\n            <span data-progress-capacity-bar\r\n                  data-title="{{ \'report.summary_groups.columns.capacity_total\' | translate }}"\r\n                  data-progress="reportItem.details.user_capacity_progress"\r\n                  data-consumed="reportItem.details.user_capacity_consumed"\r\n                  data-remaining="reportItem.details.user_capacity_remaining"\r\n                  data-total="reportItem.details.user_capacity_total"\r\n                  data-exceed="reportItem.details.user_capacity_exceed"\r\n                  class="progress-bar-exceed-warning">\r\n            </span>\r\n        </td>\r\n\r\n        <td>\r\n            <div data-ng-include="\'reportItemDropdownUser\'"\r\n                 data-ng-init="user = reportItem.details">\r\n            </div>\r\n        </td>\r\n    </tr> </script> <script type="text/ng-template" id="reportItemDropdownUser"> <div id="dropdown-users-{{user.user_id}}"\r\n         data-dropdown-content\r\n         class="f-dropdown dropdown-option-list"\r\n         data-dropdown-close-on-click\r\n         data-dropdown-append-to-body="false">\r\n\r\n        <div class="dropdown-option option-button"\r\n             data-ng-if="canManageProfilePhoto(user)">\r\n            <a data-ng-click="openProfilePhotoModal(user)">\r\n                <span>{{ \'users.edit.main.profile_photo_edit_button\' | translate }}</span>\r\n            </a>\r\n        </div>\r\n\r\n        <div class="dropdown-option option-button">\r\n            <a data-ng-click="openEditUser(user.user_id)">\r\n                <span>{{$permissionService.hasPrivilegesToEditAnyUsers() ? (\'report.management_users.edit\' | translate) : (\'report.management_users.view\' | translate) }}</span>\r\n            </a>\r\n        </div>\r\n\r\n        <div>\r\n            <div class="dropdown-option option-button"\r\n                 data-ng-if="user.user_active == true">\r\n                <a data-ng-click="archiveUser(user)"\r\n                   data-ng-disabled="!canArchiveUser(user)">\r\n                    {{ \'report.management_users.archive\' | translate }}\r\n                </a>\r\n            </div>\r\n\r\n            <div class="dropdown-option option-button"\r\n                 data-ng-if="user.user_active == false">\r\n                <a data-ng-click="activeUser(user)"\r\n                   data-ng-disabled="!canArchiveUser(user)">\r\n                    {{ \'report.management_users.reactivate\' | translate }}\r\n                </a>\r\n            </div>\r\n        </div>\r\n\r\n<!--        <hr>-->\r\n\r\n        <div class="dropdown-option option-button"\r\n            data-ng-if="showSessionOverride">\r\n            <a data-ng-click="activeSessionOverride(user)">
14\r\n                <span>{{ \'report.management_users.access_as\' | translate:{name: (user.user_name|firstname)} }}</span>\r\n            </a>\r\n        </div>\r\n\r\n        <div data-ng-if="$permissionService.hasPrivilegesToDeleteAnyUsers()">\r\n            <hr>\r\n            <div class="dropdown-option option-button">\r\n                <a data-ng-click="removeUser(user)"\r\n                   data-ng-disabled="user.user_is_owner == true"\r\n                   class="red-color-on-hover">\r\n                    {{ \'report.management_users.delete\' | translate }}\r\n                </a>\r\n            </div>\r\n        </div>\r\n\r\n    </div> </script> '),$templateCache.put("views/tasks/tasks-edit.html",'<div class="task-edit-modal"> <div class="modal-header"> <h1>{{task.id ? (\'tasks.edit.title_edit\' | translate) : (\'tasks.edit.title_new\' | translate)}}</h1> <a class="icon-cross" data-ng-click="close()" data-tooltip="{{ \'tasks.edit.close_tooltip\' | translate }}" data-tooltip-append-to-body="true"></a> <span custom-fields-menu-modal data-entity="tasks" data-close="close"> </span> </div> <div class="modal-body" data-on-click-enter="save()"> <div class="row entity-color-name-row"> <div class="entity-color-name-row__name"> <label>{{ \'tasks.edit.name_label\' | translate }}</label> <input type="text" data-ng-model="task.name" autofocus> </div> <div class="entity-color-form-field entity-color-form-field--inline-end"> <label>{{ \'common.entity_color.label\' | translate }}</label> <div data-entity-color-picker data-variant="dropdown" data-ng-model="task.color"></div> </div> </div> <div data-ng-if="options.description_visible"> <label>{{ \'tasks.edit.description_label\' | translate }}</label> <textarea data-ng-model="task.description" style="max-width: 100%; min-height: 95px;"></textarea> </div> <div class="row" style="margin-top: 5px; margin-bottom: 20px;" data-ng-if="options.description_visible != true"> <a class="link-dashed" data-ng-click="options.description_visible = true"> <span class="icon-plus4" style="margin-right: 5px; font-size: 10px;"></span> <span>{{ \'tasks.edit.add_description\' | translate }}</span> </a> </div> <div class="row" data-ng-class="{ \'disabled-all-labels\' : !hasFeatures.BILLABLE_PROJECT }"> <label>{{ \'tasks.edit.billable_default_label\' | translate }}</label> <div> <label> <input type="radio" data-ng-model="task.is_billable_default" data-ng-disabled="!hasFeatures.BILLABLE_PROJECT" ng-value="true"> <span>{{ \'tasks.edit.billable\' | translate }}</span> </label> <label style="margin-right: 5px;"> <input type="radio" data-ng-model="task.is_billable_default" data-ng-disabled="!hasFeatures.BILLABLE_PROJECT" ng-value="false"> <span>{{ \'tasks.edit.not_billable\' | translate }}</span> </label> </div> </div> <!-- Inclui campos personalizados --> <div data-generate-custom-fields-form data-entity="tasks" data-model="task" data-errors="errors" data-revalidate="revalidate"> </div> </div> <div class="modal-footer"> <div data-ng-if="!task.id"> <label class="checkbox-to-save-and-new"> <span>{{ \'tasks.edit.save_and_new\' | translate }}</span> <input type="checkbox" data-ng-model="options.save_and_new"> </label> </div> <div> <button class="button clean" data-ng-click="close()" style="margin-right: 5px;" data-ng-hide="saving"> {{ \'tasks.edit.cancel\' | translate }} </button> <button class="button button--blue-brand" data-ng-click="save()" data-ng-disabled="!task.name || saving"> {{ saving ? (\'tasks.edit.saving\' | translate) : (\'tasks.edit.save\' | translate) }} </button> </div> </div> </div> '),$templateCache.put("views/tasks/tasks.html",'<div class="view radius content-register-edit views-task-list"> <div class="row view-content-account--header-container"> <h1>{{ \'tasks.title\' | translate }}</h1> <ul class="toolbar right"> <li> <button data-ng-click="edit()" class="button button--blue-brand"> <span class="icon-plus4"></span> <span>{{ \'tasks.create\' | translate }}</span> </button> </li> </ul> </div> <div data-ng-if="!tasks" spinner-loading="loading" message="{{ \'tasks.loading\' | translate }}" style="margin-top: 25px; margin-bottom: 25px;"></div> <div class="explanation empty-state" data-ng-if="tasks.length == 0"> <h3>
14{{ \'tasks.empty_state.title\' | translate }}</h3> {{ \'tasks.empty_state.description\' | translate }}<br> <br><br> </div> <div class="list list-register" data-ng-if="tasks.length > 0"> <table> <tbody> <tr data-ng-repeat="task in tasks | orderBy : \'name\'" data-ng-class="{selected:type.checked}"> <td style="width: 1px;"> <span class="status"></span> </td> <td> <div> <a data-ng-click="edit(task)" class="title entity-color-identity-row"> <span data-entity-color-swatch data-variant="bar-inline" data-color="task.color"></span> <span class="entity-color-identity-row__label">{{ task.name }}</span> </a> </div> <div class="views-task-list--details"> <span class="billable-content" data-if-has-feature="BILLABLE_PROJECT"> <span class="views-task-list--details__icon-dolar" data-ng-class="{ \'green-color\': task.is_billable_default }">$</span> <span>{{ (task.is_billable_default ? \'tasks.details.billable\' : \'tasks.details.not_billable\') | translate }}</span> </span> <span>{{ (task.active ? \'tasks.details.active\' : \'tasks.details.archived\') | translate }}</span> </div> </td> <td class="align-right"> <a title="{{ \'tasks.options.title\' | translate }}" data-dropdown="dropdown-tasks-{{task.id}}" class="grey-color light-blue-on-hover"> <span class="icon-angle-down" style="font-size: 18px;"></span> </a> <div id="dropdown-tasks-{{task.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="edit(task)"> <span>{{ \'tasks.options.edit\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="task.active"> <a data-ng-click="archive_task(task)"> <span>{{ \'tasks.options.archive\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="!task.active"> <a data-ng-click="active_task(task)"> <span>{{ \'tasks.options.reactivate\' | translate }}</span> </a> </div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="remove(task)" class="red-color-on-hover"> {{ \'tasks.options.delete\' | translate }} </a> </div> </div> </td> </tr> </tbody> </table> </div> </div> '),$templateCache.put("views/directives/app-empty-state.html",'<div class="app-empty-state"> <img src="assets/img/empty-states/empty-timesheet.png" alt="" class="app-empty-state__image"> <p class="app-empty-state__message steel-color" data-ng-if="message">{{ message }}</p> </div> '),$templateCache.put("views/directives/app-tabs.html",'<div class="directives-app-tabs-root"> <nav class="directives-app-tabs" data-ng-style="navStyle"> <a class="directives-app-tabs__item" data-ng-repeat="tab in visibleTabs track by tab.id" href="#" data-ng-class="{ \'is-active\': isTabActive(tab) }" data-ng-style="tabStyle" data-ng-click="handleTabClick(tab, $event)" data-ng-attr-data-app-href="{{ tab.href || undefined }}" data-ng-attr-data-training="{{ tab.trainingSelector || undefined }}" data-ng-attr-title="{{ tab.title }}"> {{ tab.label }} <span data-ng-if="tab.isNew" class="flag flag-new-feature">{{ \'common.new\' | translate }}</span> <span data-ng-if="hasCounter(tab)" class="directives-app-tabs__counter" data-ng-attr-title="{{ tab.counterTitle }}">{{ tab.counter }}</span> </a> </nav> </div> '),$templateCache.put("views/directives/assigned-to.html",'<span class="directive-assignee-to" data-tooltip-html="tooltipMessage" data-tooltip-append-to-body="true"> <span data-ng-if="userName" data-user-avatar data-name="{{ userName }}" data-photo-url="photoUrl" data-size="{{ assignedToSize || \'xs\' }}"></span> <span class="directive-assignee-to__name">{{userName | shortening: true }}</span> </span> '),$templateCache.put("views/directives/button-checkbox-multi.html",'<div class="directives-button-checkbox-multi element-todo-checkbox"> <label class="directives-button-checkbox-multi__button" data-ng-repeat="opt in options track by $index" data-ng-class="{\'active\': opt.checked, \'is-disabled\': disabled}"> <input type="checkbox" data-ng-check data-ng-model="opt.checked" data-ng-change="onToggle(opt, $event)" data-ng-disabled="disabled"> <span>{{ opt[nameProperty] }}</span> </label> </div> '),$templateCache.put("views/directives/button-date.html",'<div class="directive-button-date"> <button data-dropdown="directive-button-date--dropdown-{{directive_dynamic_id}}" class="button clean directive-button-date--display" data-ng-class="{\r\n                \'has-error\' : errors.date_lock_fixed_date || inputError,\r\n                \'directive-button-date--empty\': !date\r\n            }" tooltip="{{errors.date_lock_fixed_date || inputError}}" data-tooltip-enable="errors.date_lock_fixed_date || inputError" data-tooltip-class="tooltip-alert" data-ng-disabled="buttonDisabled" style="margin-bottom: 2px;"> <span class="icon-calendar4"></span> <span data-ng-if="useDateCalendar"> {{ date ? (date | dateCalendar) : (emptyLabelKey | translate) }}
14 </span> <span data-ng-if="!useDateCalendar"> {{ date ? (date | dateLong) : (\'directives.button_date.empty\' | translate) }} </span> </button> <div id="directive-button-date--dropdown-{{directive_dynamic_id}}" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown content rabbiit-datepicker directive-button-date__dropdown"> <div datepicker data-ng-model="date_object" data-ng-change="changeFromDatepicker()" data-show-weeks="false" data-max-mode="day" data-min-mode="day" data-min-date="minDate" data-max-date="maxDate"> </div> <div class="directive-button-date__footer"> <div class="directive-button-date__date-input-wrap"> <input type="text" title="{{ \'directives.button_date.input_title\' | translate }}" class="directive-button-date__date-input" data-ng-class="{\'has-error\': inputError}" data-ng-mask="date" data-ng-model="date_input" placeholder="__/__/____"> <span data-ng-if="inputError" class="directive-button-date__input-error">{{ inputError }}</span> </div> <div> <button data-ng-if="!hideClearButton" class="button clean" title="{{ \'directives.button_date.clean_title\' | translate }}" data-ng-click="cleanDate()"> {{ \'common.clean\' | translate }} </button> </div> <div> <button class="button clean" title="{{ \'directives.button_date.today_title\' | translate }}" data-ng-click="setToday()"> {{ \'common.calendar.today\' | translate }} </button> </div> </div> </div> </div> '),$templateCache.put("views/directives/button-export.html",'<div class="directive-button-export"> <button class="button clean radius" data-dropdown="directive-button-export--dropdown-{{directive_dynamic_id}}"> <span class="icon-download6"></span> {{ \'report.export\' | translate }} </button> <div id="directive-button-export--dropdown-{{directive_dynamic_id}}" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="f-dropdown--content-options"> <div> <div class="dropdown-title"> <strong>{{ \'report.file_format\' | translate }}</strong> </div> <div class="dropdown-option radio dropdown-option--export-format"> <div data-ng-repeat="format in formats" data-ng-if="format.isVisible"> <label data-ng-if="format.isEnabled" data-ng-model="options.opt_export_format" data-btn-radio="\'{{format.key}}\'"> <span>{{format.title}}</span> <span class="dropdown-option-details">{{format.description}}</span> </label> <label data-ng-if="!format.isEnabled" disabled="disabled"> <span>{{format.title}}</span> <span class="dropdown-option-details">{{format.description}}</span> </label> </div> </div> </div> <div> <div data-ng-if="showColumnOptions"> <div class="dropdown-title"> <strong>{{ \'report.export_columns\' | translate }}</strong> </div> <div class="dropdown-option radio" data-ng-if="options.opt_export_format === \'xlsx\'"> <label data-ng-model="options.opt_export_columns" data-btn-radio="\'all\'"> <span>{{ \'report.export_columns_all\' | translate }}</span> </label> <label data-ng-model="options.opt_export_columns" data-btn-radio="\'visible_on_screen\'"> <span>{{ \'report.export_columns_visible\' | translate }}</span> </label> </div> <div data-ng-if="options.opt_export_format !== \'xlsx\'" class="explanation radius"> {{ \'report.export_print_notice\' | translate }} </div> </div> <div data-ng-if="extraOptions.length > 0"> <div class="dropdown-title" style="margin-top: 15px"> <strong>{{ \'report.options\' | translate }}</strong> </div> <!--                            <div class="dropdown-option checkbox">--> <!--                                <label>--> <!--                                    <input type="checkbox"--> <!--                                           data-ng-model="$prefsService.preferences.report_summary_group__opt_export_show_header">--> <!--                                    <span>Exibir cabeçalho</span>--> <!--                                </label>--> <!--                            </div>--> <div data-ng-if="extraOptions.includes(\'opt_export_hide_filters\')" class="dropdown-option checkbox"> <label class="element-todo-checkbox"> <input type="checkbox" data-ng-check data-ng-model="options.opt_export_hide_filters"> <span>{{ \'report.detailed.export_hide_filters\' | translate }}</span> </label> </div> </div> </div> </div> <div class="directive-button-export--bottom-buttons"> <button class="button button--blue-brand" data-ng-click="callExport()" data-ng-disabled="exporting_report || !options.opt_export_format"> {{exporting_report ? (\'report.exporting\' | translate) : (\'report.export\' | translate)}} </button> <a class="link underline" data-ng-if="$permissionService.hasPrivilegesToEditAccountSettings()" data-app-href="#/report-settings">{{ \'report.detailed.configure_export\' | translate }}</a> </div> </div> </div> '),
15$templateCache.put("views/directives/button-toggle-inline.html",'<div class="directives-button-toggle-inline"> <a data-ng-repeat="option in options" data-ng-click="onClickButton(option[valueProperty])" data-ng-class="{\'active\': option[valueProperty] === ngModel }" class="button clean" data-ng-bind-html="option[nameProperty]"> </a> </div> '),$templateCache.put("views/directives/button-toggle-multi.html",'<div class="directives-button-toggle-multi"> <button type="button" class="button clean btn-toggle" ng-repeat="opt in options track by $index" data-ng-click="onClickButton(opt, $event)" data-ng-disabled="disabled" ng-class="{\'active\': isSelected(opt)}"> {{ opt[nameProperty] }} </button> </div> '),$templateCache.put("views/directives/button-toggle.html",'<label class="directives-button-toggle" data-ng-attr-title="{{ title }}" data-ng-attr-aria-label="{{ ariaLabel || title }}"> <input type="checkbox" class="directives-button-toggle__input" data-ng-model="checked" data-ng-disabled="disabled"> <span class="directives-button-toggle__track" data-ng-class="{\'is-on\': checked}"> <span class="directives-button-toggle__thumb"></span> </span> </label>
15 '),$templateCache.put("views/directives/copy-to-clipboard-button.html",'<span class="directive-copy-to-clipboard-button"> <span class="copy-button {{buttonClass}}" data-ng-click="copy()"> {{buttonLabel}} </span> </span> '),$templateCache.put("views/directives/custom-fields-menu-modal-items.html",'<hr data-ng-if="showDivider"> <div class="dropdown-title"> <span>{{ \'custom_fields.menu_modal.title\' | translate }}</span> </div> <div class="dropdown-option option-button"> <a data-ng-click="createCustomField(primaryEntity)"> <span class="icon-plus4" style="margin-right: 5px;"></span> <span>{{ \'custom_fields.menu_modal.create_in_entity\' | translate:{entity: primaryEntityName} }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="showCreateForTimeEntry"> <a data-ng-click="createCustomField(\'time_entries\')"> <span class="icon-plus4" style="margin-right: 5px;"></span> <span>{{ \'custom_fields.menu_modal.create_in_time_entry\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="gotoCustomFields()"> <span class="icon-launch" style="margin-right: 5px;"></span> <span>{{ \'custom_fields.menu_modal.manage_fields\' | translate }}</span> </a> </div> '),$templateCache.put("views/directives/custom-fields-menu-modal.html",'<div class="directive-custom-fields-menu-modal" data-ng-if="display === \'
15standalone\' && hasEditPermission"> <a class="icon-toggle" data-dropdown="directive-custom-fields-menu-modal--dropdown-{{directive_dynamic_id}}" data-tooltip="{{ \'custom_fields.menu_modal.tooltip\' | translate }}" data-tooltip-append-to-body="true"></a> <div id="directive-custom-fields-menu-modal--dropdown-{{directive_dynamic_id}}" data-dropdown-content data-left="-130" class="f-dropdown dropdown-option-list dropdown-toolbar-menu" dropdown-close-on-click> <div data-ng-include="\'views/directives/custom-fields-menu-modal-items.html\'"></div> </div> </div> <div data-ng-if="display === \'items\' && hasEditPermission" data-ng-include="\'views/directives/custom-fields-menu-modal-items.html\'"> </div> '),$templateCache.put("views/directives/due-date.html",'<span data-ng-if="!editable" class="directive-due-date" data-ng-class="{\r\n        \'directive-due-date--is-late\': isLate,\r\n        \'directive-due-date--is-due-soon\': isDueToday || isDueTomorrow,\r\n        \'directive-due-date--empty\': !dueDate\r\n      }" data-tooltip-html="tooltipMessage" data-tooltip-enable="dueDate" data-tooltip-append-to-body="true"> {{ dueDate ? (dueDate | dateCalendar) : (\'common.due_date.empty\' | translate) }} </span> <div data-ng-if="editable" class="directive-due-date-field" data-ng-class="{\r\n        \'directive-due-date--is-late\': isLate,\r\n        \'directive-due-date--is-due-soon\': isDueToday || isDueTomorrow\r\n     }" data-tooltip-html="tooltipMessage" data-tooltip-enable="dueDate" data-tooltip-append-to-body="true"> <div data-button-date="dueDate" use-date-calendar="true" data-on-change="onPickerChange" data-min-date="minDate" data-max-date="maxDate" data-hide-clear-button="{{ hideClearButton }}"> </div> </div> '),$templateCache.put("views/directives/entity-attachments.html",'<div class="entity-attachments"> <label class="entity-attachments__title">{{ \'entity_attachments.title\' | translate }}</label> <div class="entity-attachments__list" data-ng-if="attachments.length > 0"> <div class="entity-attachments__item" data-ng-repeat="attachment in attachments track by attachment.id"> <div class="entity-attachments__info" data-ng-if="renamingId !== attachment.id"> <span class="icon-attachment2 entity-attachments__icon"></span> <div class="entity-attachments__details"> <a class="entity-attachments__name light-blue-on-hover" data-ng-click="downloadAttachment(attachment)" data-ng-class="{\'steel-color\': downloadingId === attachment.id}" title="{{ downloadingId === attachment.id ? (\'entity_attachments.downloading\' | translate) : (\'entity_attachments.download\' | translate) }}"> {{ attachment.original_name }} </a> <div class="entity-attachments__meta steel-color"> <span>{{ attachment.created_at | dateEntry }}</span> <span>{{ formatSize(attachment.size_bytes) }}</span> </div> </div> </div> <div class="entity-attachments__rename" data-ng-if="renamingId === attachment.id"> <span class="icon-attachment2 entity-attachments__icon"></span> <input type="text" class="entity-attachments__rename-input radius" data-ng-model="renameBaseName" data-ng-keydown="onRenameKeydown($event, attachment)" data-ng-blur="onRenameBlur(attachment)" placeholder="{{ \'entity_attachments.rename_placeholder\' | translate }}"> <span class="entity-attachments__rename-extension" data-ng-if="getFileExtension(attachment)">.{{ getFileExtension(attachment) }}</span> <div class="entity-attachments__rename-actions"> <button type="button" class="button clean entity-attachments__rename-save" data-ng-mousedown="$event.preventDefault()" data-ng-disabled="savingRename" data-ng-click="saveRename(attachment)" title="{{ \'entity_comments.edit_save\' | translate }}"> <span class="icon-checkmark"></span> </button> <button type="button" class="button clean entity-attachments__rename-cancel" data-ng-mousedown="$event.preventDefault()" data-ng-disabled="savingRename" data-ng-click="cancelRename()" title="{{ \'entity_comments.edit_cancel\' | translate }}"> <span class="icon-cross"></span> </button> </div> </div> <a class="entity-attachments__options light-grey-color light-blue-on-hover light-grey-bgcolor-on-hover radius" title="{{ \'entity_attachments.options\' | translate }}" data-dropdown="entity-attachments-dropdown-{{ attachment.id }}"> <span class="icon-angle-down"></span> </a> <div id="entity-attachments-dropdown-{{ attachment.id }}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="downloadAttachment(attachment)" data-ng-disabled="downloadingId === attachment.id"> <span>{{ downloadingId === attachment.id ? (\'entity_attachments.downloading\' | translate) : (\'entity_attachments.download\' | translate) }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="copyAttachmentName(attachment)"> <span>{{ \'entity_attachments.copy\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canEdit"> <a data-ng-click="startRename(attachment)"> <span>{{ \'entity_attachments.rename\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canEdit"> <a data-ng-click="deleteAttachment(attachment)" class="red-color-on-hover" data-ng-disabled="deletingId === attachment.id"> <span>{{ \'entity_attachments.delete\' | translate }}</span> </a> </div> </div> </div> </div> <p class="steel-color entity-attachments__empty" data-ng-if="!loading && attachments.length === 0 && !canEdit"> {{ \'entity_attachments.empty\' | translate }} </p> <div class="entity-attachments__upload-panel entity-attachments__dropzone" data-ng-if="canEdit" data-ng-class="{\r\n             \'entity-attachments__dropzone--drag-over\': isDragOver,\r\n             \'entity-attachments__dropzone--editable\': canEdit\r\n         }"> <p class="steel-color entity-attachments__drop-hint"> {{ \'entity_attachments.drop_files_here\' | translate }} <a class="light-blue-on-hover" data-ng-click="openFilePicker()"> {{ \'entity_attachments.choose_files\' | translate }} </a> </p> <div class="entity-attachments__upload"> <input type="file" class="entity-attachments__file-input" onchange="angular.element(this).scope().onFileSelected(this);"> <button type="button" class="button clean" data-ng-click="openFilePicker()" data-ng-disabled="uploading"> <span class="icon-attachment2"></span> {{ uploading ? (\'entity_attachments.uploading\' | translate) : (\'entity_attachments.upload\' | translate) }} </button> <span class="steel-color entity-attachments__hint">{{ \'entity_attachments.formats_hint\' | translate }}</span> </div> </div> </div> '),$templateCache.put("views/directives/entity-color-picker-palette.html",'<button type="button" class="entity-color-picker__none" data-ng-class="{\'is-selected\': !selectedColor}" data-ng-click="clearColor()" data-ng-disabled="disabled" data-tooltip="{{ \'common.entity_color.
15none\' | translate }}" data-tooltip-append-to-body="true"> <span class="entity-color-picker__none-icon"></span> </button> <button type="button" class="entity-color-picker__swatch" data-ng-repeat="paletteColor in palette track by paletteColor" data-ng-class="{\'is-selected\': isSelected(paletteColor)}" data-ng-style="{\'background-color\': paletteColor}" data-ng-click="selectColor(paletteColor)" data-ng-disabled="disabled"> </button> '),$templateCache.put("views/directives/entity-color-picker.html",'<div data-ng-class="rootClass()"> <a data-ng-if="isSubmenu"> <span>{{ \'common.entity_color.label\' | translate }}</span> </a> <button type="button" data-ng-if="isDropdown" class="entity-color-dropdown__trigger" data-ng-attr-data-dropdown="{{ disabled ? undefined : dropdownContentId }}" data-ng-disabled="disabled" data-tooltip="{{ selectedColor ? \'\' : (\'common.entity_color.none\' | translate) }}" data-tooltip-append-to-body="true"> <span data-ng-if="selectedColor" class="entity-color-swatch entity-color-dropdown__swatch" data-ng-style="{\'background-color\': selectedColor}"></span> <span data-ng-if="!selectedColor" class="entity-color-picker__none"> <span class="entity-color-picker__none-icon"></span> </span> </button> <div data-ng-if="isSubmenu" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list entity-color-submenu__panel"> <div class="entity-color-picker entity-color-picker__palette" data-ng-include="\'views/directives/entity-color-picker-palette.html\'"></div> </div> <div data-ng-if="isDropdown" id="{{dropdownContentId}}" data-dropdown-content class="f-dropdown content dropdown-right entity-color-picker entity-color-picker__palette entity-color-dropdown__panel" data-ng-include="\'views/directives/entity-color-picker-palette.html\'"></div> </div> '),$templateCache.put("views/directives/entity-comments-thread.html",'<div class="entity-comments-thread"> <label class="entity-comments-thread__title" data-ng-if="!hideTitle">{{ \'entity_comments.title\' | translate }}</label> <div class="entity-comments-thread__list" data-ng-if="comments.length > 0"> <div class="entity-comments-thread__item" data-ng-class="{\r\n                 \'entity-comments-thread__item--compact\': layout === \'compact\',\r\n                 \'entity-comments-thread__item--pinned\': comment.pinned_at\r\n             }" data-ng-repeat="comment in comments track by comment.id"> <div class="entity-activity-feed__row"> <div data-user-avatar data-name="{{ comment.user_name }}" data-photo-url="comment.profile_photo_url" data-size="{{ layout === \'compact\' ? \'xs\' : \'sm\' }}"> </div> <div class="entity-activity-feed__body"> <div class="entity-activity-feed__header"> <span class="entity-activity-feed__author">{{ comment.user_name | shortening: true }}</span> <span class="entity-comments-thread__pinned-badge" data-ng-if="comment.pinned_at" title="{{ \'entity_comments.pinned_label\' | translate }}"> <span class="icon-pin2" aria-hidden="true"></span> <span>{{ \'entity_comments.pinned_label\' | translate }}</span> </span> <a class="entity-comments-thread__options light-grey-color light-blue-on-hover light-grey-bgcolor-on-hover radius" data-ng-if="canShowCommentOptions(comment)" title="{{ \'entity_comments.options\' | translate }}" data-dropdown="entity-comments-dropdown-{{ comment.id }}"> <span class="icon-angle-down"></span> </a> <div id="entity-comments-dropdown-{{ comment.id }}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button" data-ng-if="canEditComment(comment)"> <a data-ng-click="startEditComment(comment)"> <span>{{ \'entity_comments.edit\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canPinComment()"> <a data-ng-click="togglePinComment(comment)"> <span>{{ comment.pinned_at ? (\'entity_comments.unpin\' | translate) : (\'entity_comments.pin\' | translate) }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canDeleteComment(comment)"> <a data-ng-click="deleteComment(comment)" class="red-color-on-hover"> <span>{{ \'entity_comments.remove\' | translate }}</span> </a> </div> </div> </div> <div class="entity-activity-feed__message entity-comments-thread__content" data-ng-if="editingCommentId !== comment.id" data-ng-bind-html="formatContent(comment.content)"> </div> <div class="entity-comments-thread__edit" data-ng-if="editingCommentId === comment.id"> <textarea class="entity-comments-thread__edit-textarea radius" rows="3" data-ng-model="editingText" data-ng-keydown="onEditKeydown($event, comment)"></textarea> <div class="entity-comments-thread__edit-actions"> <button type="button" class="button clean" data-ng-click="cancelEditComment()"> {{ \'entity_comments.edit_cancel\' | translate }} </button> <button type="button" class="button button--blue-brand" data-ng-disabled="!canSaveEditComment() || savingEdit" data-ng-click="saveEditComment(comment)"> {{ savingEdit ? (\'entity_comments.saving\' | translate) : (\'entity_comments.edit_save\' | translate) }} </button> </div> </div> <div class="entity-comments-thread__comment-attachments" data-ng-if="comment.attachments && comment.attachments.length > 0"> <div class="entity-comments-thread__comment-attachment" data-ng-repeat="attachment in comment.attachments track by attachment.id"> <span class="icon-attachment2"></span> <a class="light-blue-on-hover" data-ng-click="downloadCommentAttachment(attachment)"> {{ attachment.original_name }} </a> <span class="steel-color">{{ formatAttachmentSize(attachment) }}</span> </div> </div> <div class="entity-activity-feed__datetime steel-color"> {{ comment.created_at | dateEntry }} </div> </div> </div> </div> </div> <div class="entity-comments-thread__empty" data-ng-if="!loading && comments.length === 0"> <span class="entity-comments-thread__empty-icon icon-comments" aria-hidden="true"></span> <p class="entity-comments-thread__empty-title"> {{ (canEdit ? \'entity_comments.empty_title\' : \'entity_comments.empty_title_readonly\') | translate }} </p> <p class="entity-comments-thread__empty-hint steel-color" data-ng-if="canEdit"> {{ \'entity_comments.empty_hint\' | translate }} </p> </div> <div class="entity-comments-thread__composer" data-ng-show="canEdit"> <div class="entity-comments-thread__staged-list" data-ng-if="stagedAttachments.length > 0"> <div class="entity-comments-thread__staged-item" data-ng-repeat="staged in stagedAttachments track by $index" data-ng-class="{\'entity-comments-thread__staged-item--failed\': staged.failed}"> <span class="icon-attachment2"></span> <span class="entity-comments-thread__staged-name">{{ staged.original_name }}</span> <span class="steel-color" data-ng-if="staged.uploading">{{ \'entity_comments.uploading_attachment\' | translate }}</span> <button type="button" class="button clean entity-comments-thread__staged-remove" data-ng-if="!staged.uploading" data-ng-click="removeStagedAttachment(staged)" title="{{ \'entity_comments.remove_attachment\' | translate }}"> <span class="icon-cross"></span> </button> </div> </div> <div class="entity-comments-thread__composer-wrap"> <textarea class="entity-comments-thread__textarea radius" rows="3" data-ng-model="composerText" data-ng-keydown="onComposerKeydown($event)" data-ng-keyup="onComposerKeyup($event)" placeholder="{{ \'entity_comments.placeholder\' | translate }}"></textarea> <div class="entity-comments-thread__mention-dropdown" data-ng-if="mentionDropdownVisible && filteredMentionCandidates.length > 0" data-ng-style="mentionDropdownStyle" data-ng-class="{\'entity-comments-thread__mention-dropdown--append-to-body\': mentionDropdownAppendToBody}" role="listbox"> <ul class="entity-comments-thread__mention-list"> <li class="entity-comments-thread__mention-item" data-ng-repeat="candidate in filteredMentionCandidates track by candidate.user_id"> <button type="button" class="entity-comments-thread__mention-option" role="option" data-ng-click="selectMention(candidate)"> <div data-user-avatar data-name="{{ candidate.user_name }}
15" data-photo-url="candidate.user_profile_photo_url" data-size="sm"> </div> <span class="entity-comments-thread__mention-name">{{ candidate.user_name }}</span> </button> </li> </ul> </div> </div> <input type="file" class="entity-comments-thread__file-input" tabindex="-1" onchange="angular.element(this).scope().onAttachmentSelected(this)"> <div class="entity-comments-thread__composer-actions"> <button type="button" class="button clean entity-comments-thread__attach" data-ng-click="openAttachmentPicker()" title="{{ \'entity_comments.attach\' | translate }}"> <span class="icon-attachment2"></span> </button> <span class="steel-color entity-comments-thread__hint">{{ \'entity_comments.mention_hint\' | translate }}</span> <button type="button" class="button button--blue-brand" data-ng-disabled="!canSubmitComment()" data-ng-click="submitComment()"> {{ saving ? (\'entity_comments.saving\' | translate) : (\'entity_comments.submit\' | translate) }} </button> </div> </div> </div> '),$templateCache.put("views/directives/entity-events-timeline.html",'<div class="entity-events-timeline" data-ng-class="{\'entity-events-timeline--datetime-stacked\': datetimeLayout === \'stacked\'}" data-infinite-scroll="loadMore()" data-infinite-scroll-disabled="loading || loadingMore || reloadingSilently || noMoreEntries || !entityId" data-infinite-scroll-distance="1" data-ng-attr-data-infinite-scroll-container="{{ scrollContainer || \'.view-home-layout--right-container\' }}"> <h4 class="entity-events-timeline__title" data-ng-if="!hideTitle"> {{ \'entity_event.title\' | translate }} </h4> <div data-ng-if="loading && dayGroups.length === 0" spinner-loading="loading" message="{{ \'report.loading\' | translate }}" style="margin-top: 16px;"></div> <div data-ng-if="!loading && dayGroups.length === 0" class="steel-color entity-events-timeline__empty"> {{ \'entity_event.empty\' | translate }} </div> <div data-ng-if="dayGroups.length > 0" class="entity-events-timeline__groups"> <div class="entity-events-timeline__day-group" data-ng-repeat="dayGroup in dayGroups track by dayGroup.key"> <div class="entry-list-group-separator"> <span data-ng-if="dayGroup.date" title="{{ dayGroup.date | dateLong }}"> {{ dayGroup.date | dateTimeline }} </span> <span data-ng-if="!dayGroup.date" class="steel-color">—</span> </div> <div class="list-minimal entity-events-timeline__list"> <table> <tbody> <tr data-ng-repeat="item in dayGroup.items track by item.id"> <td> <div class="entity-activity-feed__row entity-events-timeline__row"> <div class="user-avatar user-avatar--xs entity-events-timeline__avatar"> <img data-ng-if="item.actorPhotoUrl" class="user-avatar__photo" data-ng-src="{{ item.actorPhotoUrl }}" alt=""> <span data-ng-if="!item.actorPhotoUrl" class="user-avatar__initials">{{ item.actorName | userInitials }}</span> </div> <span class="entity-activity-feed__message entity-events-timeline__message">{{ item.message }}</span> </div> </td> <td class="entity-activity-feed__datetime entity-events-timeline__datetime steel-color"> {{ item.created_at | dateEntry }} </td> </tr> </tbody> </table> </div> </div> </div> </div> '),$templateCache.put("views/directives/entries-date-filter.html",'<div class="directive-entries-date-filter"> <div class="directive-entries-date-filter__panel radius"> <div class="directive-entries-date-filter__date-nav"> <a data-ng-click="movePrevious()" class="directive-entries-date-filter__move-date directive-entries-date-filter__move-date--prev" data-ng-class="{\'directive-entries-date-filter__move-date--hidden\': !showDateNavigator()}"> <span class="icon-angle-left"></span> </a> <div class="directive-entries-date-filter__date-display"> <span data-ng-show="formParams[intervalField] === \'day\'"> {{ formParams[dateField] | moment: \'ll\' }} </span> <span data-ng-show="formParams[intervalField] === \'month\'" class="capitalize-first-letter"> {{ formParams[dateField] | moment: \'MMMM [de] YYYY\' }} </span> <span data-ng-show="formParams[intervalField] === \'year\'"> {{ \'time_entries.filter.year\' | translate }} {{ formParams[dateField] | moment: \'YYYY\' }} </span> <span data-ng-show="formParams[intervalField] === \'6-months\'"> <span class="capitalize-first-letter">{{ apiParams[startApiKey] | moment: \'MMM YYYY\' }}</span> <span>—</span> <span class="capitalize-first-letter">{{ apiParams[endApiKey] | moment: \'MMM YYYY\' }}</span> </span> <span data-ng-show="isCustomInterval()" class="directive-entries-date-filter__custom-date-nav"> <span class="directive-entries-date-filter__custom-date-button" data-button-date="startCustomDateApi" data-on-change="onCustomStartDateChange" data-hide-clear-button="true"> </span> <span> — </span> <span class="directive-entries-date-filter__custom-date-button" data-button-date="endCustomDateApi" data-on-change="onCustomEndDateChange" data-hide-clear-button="true"> </span> </span> <span data-ng-show="isAllTimeInterval()" class="directive-entries-date-filter__open-date"> {{ \'time_entries.filter.intervals.all_time\' | translate }} </span> <span data-ng-show="isRangeInterval()"> {{ apiParams[startApiKey] | moment: \'DD MMM\' }} — {{ apiParams[endApiKey] | moment: \'DD MMM\' }} </span> </div> <a data-ng-click="moveNext()" class="directive-entries-date-filter__move-date directive-entries-date-filter__move-date--next" data-ng-class="{\'directive-entries-date-filter__move-date--hidden\': !showDateNavigator()}"> <span class="icon-angle-right"></span> </a> </div> <div class="directive-entries-date-filter__interval-row"> <span class="directive-entries-date-filter__interval-label"> {{ \'time_entries.filter.in_interval\' | translate }} </span> <button type="button" class="button clean directive-entries-date-filter__interval-trigger" data-dropdown="directive-entries-date-filter--interval-{{ directiveDynamicId }}
15"> <span>{{ selectedIntervalLabel() }}</span> <span class="icon-angle-down"></span> </button> </div> </div> <div id="directive-entries-date-filter--interval-{{ directiveDynamicId }}" data-dropdown-content data-dropdown-append-to-body="true" data-top="28" class="f-dropdown dropdown-option-list directive-entries-date-filter__interval-dropdown"> <div data-ng-repeat="option in intervalOptions" class="dropdown-option option-button"> <a data-ng-click="selectInterval(option)" data-dropdown-close-on-click data-ng-class="{\'directive-entries-date-filter__interval-option--active\': formParams[intervalField] === option.type}"> <span>{{ option.name }}</span> </a> </div> <div data-ng-if="frequentIntervalOptions.length" class="dropdown-title not-first-child"> <span>{{ \'time_entries.filter.intervals.frequent\' | translate }}</span> </div> <div data-ng-if="frequentIntervalOptions.length" data-ng-repeat="option in frequentIntervalOptions" class="dropdown-option option-button"> <a data-ng-click="selectInterval(option)" data-dropdown-close-on-click data-ng-class="{\'directive-entries-date-filter__interval-option--active\': formParams[intervalField] === option.type}"> <span>{{ option.name }}</span> </a> </div> </div> </div> '),$templateCache.put("views/directives/entries-filter-chip-multi-select.html","<input ng-model=\"filter.apiParams[config.apiParam]\" data-options-load=\"optionsLoad\" data-options-load-trigger=\"focus\" data-options-load-params=\"filter.formParams[config.optionsLoadParamsKey || 'user__options_load_params']\" data-options-filters=\"filter.formParams[config.optionsFiltersKey || 'user__options_filters']\" data-ng-attr-data-selectize-key=\"{{ config.selectizeKey }}\" class=\"entries-filter-chips__chip-select\" data-selectize=\"{\r\n            labelField: 'name',\r\n            searchField: 'name',\r\n            valueField: 'id',\r\n            sortField: 'name',\r\n            optgroups: [\r\n                {id: true, name: ('time_entries.filter.active_users' | translate)},\r\n                {id: false, name: ('time_entries.filter.archived_users' | translate)}\r\n            ],\r\n            lockOptgroupOrder: true,\r\n            optgroupField: 'active',\r\n            optgroupLabelField: 'name',\r\n            optgroupValueField: 'id',\r\n            plugins: ['remove_button'],\r\n            placeholder: (config.placeholderKey | translate)\r\n       }\"> "),$templateCache.put("views/directives/entries-filter-chip-panel.html",'<div data-ng-switch="component.type"> <div data-ng-switch-when="selectFilter" data-entries-filter-chip-select data-filter="filter" data-config="component.config"></div> <div data-ng-switch-when="multiSelectFilter" data-entries-filter-chip-multi-select data-filter="filter" data-config="component.config"></div> <div data-ng-switch-when="userFilter" data-entries-filter-chip-user data-filter="filter" data-config="component.config"></div> <div data-ng-switch-when="dateFilter" data-entries-filter-date data-filter="filter" data-config="component.config"></div> </div> '),$templateCache.put("views/directives/entries-filter-chip-select.html",'<select ng-model="filter.apiParams[config.apiParam]" data-options="resolvedOptions" class="entries-filter-chips__chip-select selectize-keep-default-width" data-selectize="{\r\n            labelField: \'name\',\r\n            valueField: \'type\',\r\n            placeholder: (config.placeholderKey | translate)\r\n        }"> </select> '),$templateCache.put("views/directives/entries-filter-chip-user.html","<input ng-model=\"filter.apiParams.user_id\" data-options-load=\"loadUsers\" data-options-load-trigger=\"focus\" data-options-load-params=\"filter.formParams.user__options_load_params\" data-options-filters=\"filter.formParams.user__options_filters\" data-selectize-key=\"filter-users-chip\" class=\"entries-filter-chips__chip-select\" data-selectize=\"{\r\n            labelField: 'name',\r\n            searchField: 'name',\r\n            valueField: 'id',\r\n            sortField: 'name',\r\n            optgroups: [\r\n                {id: true, name: ('time_entries.filter.active_users' | translate)},\r\n                {id: false, name: ('time_entries.filter.archived_users' | translate)}\r\n            ],\r\n            lockOptgroupOrder: true,\r\n            optgroupField: 'active',\r\n            optgroupLabelField: 'name',\r\n            optgroupValueField: '
15id',\r\n            plugins: ['remove_button'],\r\n            placeholder: ('time_entries.filter.filter_by_user' | translate)\r\n       }\"> "),$templateCache.put("views/directives/entries-filter-chips.html",'<div class="entries-filter-chips"> <div class="entries-filter-chips__list"> <div class="entries-filter-chips__chip-item" data-ng-if="isComposableMode" data-ng-repeat="component in activeComponents track by component.id"> <a class="entries-filter-chips__chip" data-dropdown="{{ getChipDropdownId(component) }}" data-ng-click="toggleChipDropdown($event, component)"> <span class="entries-filter-chips__label">{{ component.config.labelKey | translate }}</span> <span class="entries-filter-chips__value" data-ng-if="hasComponentDisplayValue(component.id)">{{ componentDisplayValues[component.id] }}</span> <span class="entries-filter-chips__value entries-filter-chips__value--empty icon-angle-down" data-ng-if="!hasComponentDisplayValue(component.id)"></span> <span class="entries-filter-chips__remove icon-cross" data-ng-click="deactivateComponent($event, component)" data-tooltip="{{ \'common.cancel\' | translate }}" data-tooltip-append-to-body="true"></span> </a> <div data-ng-attr-id="{{ getChipDropdownId(component) }}" data-dropdown-content class="f-dropdown entries-filter-chips__chip-dropdown"> <div data-ng-include="\'views/directives/entries-filter-chip-panel.html\'"></div> </div> </div> <span class="entries-filter-chips__chip" data-ng-if="!isComposableMode" data-ng-repeat="chip in chipItems track by chip.key"> <span class="entries-filter-chips__label">{{ chip.label | translate }}</span> <span class="entries-filter-chips__value">{{ chip.value }}</span> <a class="entries-filter-chips__remove icon-cross" data-ng-click="removeChip(chip)" data-tooltip="{{ \'common.cancel\' | translate }}" data-tooltip-append-to-body="true"></a> </span> <a class="entries-filter-chips__button" data-dropdown="{{ dropdownId }}"> <span class="icon-plus4"></span> <span>{{ \'time_entries.filter.add_filters\' | translate }}</span> </a> </div> <div data-ng-attr-id="{{ dropdownId }}" data-dropdown-content class="f-dropdown entries-filter-chips__dropdown dropdown-option-list"> <div data-ng-if="isComposableMode" data-ng-include="\'views/directives/entries-filter-picker.html\'"></div> <div data-ng-if="!isComposableMode" data-ng-include="\'views/time-entry-filters.html\'"></div> </div> </div> '),$templateCache.put("views/directives/entries-filter-date.html",'<div class="filters-column--item-container" style="margin-bottom: 10px"> <label style="margin-top: 30px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.date_execution_checked" data-ng-if="!filter.formParams.date_execution_disabled"> <span>{{ config.labelKey | translate }}</span> </label> <div ng-show="filter.formParams.date_execution_checked" class="filters-subgroup"> <div ng-show="[\'custom\', \'7-days-ago\', \'30-days-ago\'].indexOf(filter.formParams.date_execution_interval) == -1" class="row collapse radius date-frame"> <div class="column-15 move-date-container"> <a data-ng-click="movePreviousDate()" class="move-date">&#9668;</a> </div> <div class="column-70 date-display"> <span ng-switch="filter.formParams.date_execution_interval"> <span ng-switch-when="day"> {{ filter.formParams.date_execution | moment: "ll" }} </span> <span ng-switch-when="month" class="capitalize-first-letter"> {{ filter.formParams.date_execution | moment: "MMMM [de] YYYY" }} </span> <span ng-switch-when="year"> {{ \'time_entries.filter.year\' | translate }} {{ filter.formParams.date_execution | moment: "YYYY" }} </span> <span ng-switch-when="6-months"> <span class="capitalize-first-letter">{{ filter.apiParams.date_execution_start | moment: "MMM YYYY" }}</span> <span>—</span> <span class="capitalize-first-letter">{{ filter.apiParams.date_execution_end | moment: "MMM YYYY" }}</span> </span> <span ng-switch-default> {{ filter.apiParams.date_execution_start | moment: "DD MMM" }} — {{ filter.apiParams.date_execution_end | moment: "DD MMM" }} </span> </span> </div> <div class="column-15 move-date-container"> <a ng-click="moveNextDate()" class="move-date">&#9658;</a> </div> </div> <div class="row collapse" style="margin-top: 5px; margin-bottom: 5px"> <div class="column-50"> <label style="padding-top: 8px">{{ \'time_entries.filter.in_interval\' | translate }} </label> </div> <div class="column-50"> <select ng-model="filter.formParams.date_execution_interval" data-options="intervalOptions" class="selectize-keep-default-width" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'type\',\r\n                            placeholder: (\'time_entries.filter.select_interval\' | translate)\r\n                        }"> </select> </div> </div> <div ng-show="filter.formParams.date_execution_interval == \'custom\'"> <div class="row collapse" style="margin-bottom: 5px"> <div class="column-50"> <label><input type="checkbox" ng-model="filter.formParams.date_execution_start_custom_checked"> {{ \'time_entries.filter.from\' | translate }}</label> </div> <div class="column-50" ng-if="filter.formParams.date_execution_start_custom_checked"> <input type="text" ng-model="filter.formParams.date_execution_start_custom" ng-mask="date" style="margin: 0; margin-top: 6px;" class="input-text"> </div> </div> <div class="row collapse" style="margin-bottom: 5px"> <div class="column-50"> <label><input type="checkbox" ng-model="filter.formParams.date_execution_end_custom_checked"> {{ \'time_entries.filter.to\' | translate }}</label> </div> <div class="column-50" ng-if="filter.formParams.date_execution_end_custom_checked"> <input type="text" ng-model="filter.formParams.date_execution_end_custom" ng-mask="date" style="margin: 0; margin-top: 3px;" class="input-text"> </div> </div> <div style="margin-bottom: 5px; padding-top: 20px; margin-left: 5px; font-size: 14px;"> <a class="link underline bolder" ng-click="updateFilter()">{{ \'time_entries.filter.apply_date_filter\' | translate }}</a> </div> </div> </div> </div> '),
16$templateCache.put("views/directives/entries-filter-multi-select.html",'<div class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams[config.checkedKey]"> <span>{{ config.labelKey | translate }}</span> </label> <div ng-show="filter.formParams[config.checkedKey]" class="filters-subgroup"> <input ng-model="filter.apiParams[config.apiParam]" data-options-load="optionsLoad" data-options-load-trigger="focus" data-options-load-params="filter.formParams[config.optionsLoadParamsKey || \'user__options_load_params\']" data-options-filters="filter.formParams[config.optionsFiltersKey || \'user__options_filters\']" data-ng-attr-data-selectize-key="{{ config.selectizeKey }}" data-selectize="{\r\n                    labelField: \'name\',\r\n                    searchField: \'name\',\r\n                    valueField: \'id\',\r\n                    sortField: \'name\',\r\n                    optgroups: [\r\n                        {id: true, name: (\'time_entries.filter.active_users\' | translate)},\r\n                        {id: false, name: (\'time_entries.filter.archived_users\' | translate)}\r\n                    ],\r\n                    lockOptgroupOrder: true,\r\n                    optgroupField: \'active\',\r\n                    optgroupLabelField: \'name\',\r\n                    optgroupValueField: \'id\',\r\n                    plugins: [\'remove_button\'],\r\n                    placeholder: (config.placeholderKey | translate)\r\n               }"> </div> </div> '),$templateCache.put("views/directives/entries-filter-panel.html",'<div data-ng-controller="EntriesFilterPanelController"> <div class="filters-column element-todo-checkbox" data-ng-class="{\'hide-checked-filter\': filter.formParams.hide_checked_filter }"> <div class="filters-header"> <p class="title" id="filters"> <span>{{ \'time_entries.filter.search_filters\' | translate }}</span> </p> <a data-ng-click="reload()" class="icon-loop right" title="{{ \'common.reload\' | translate }}"></a> </div> <div data-ng-repeat="component in filter.availableComponents track by component.id" data-ng-switch="component.type"> <div data-ng-switch-when="dateFilter" data-entries-filter-date data-filter="filter" data-config="component.config"></div> <div data-ng-switch-when="userFilter" data-entries-filter-user data-filter="filter" data-config="component.config"></div> <div data-ng-switch-when="selectFilter" data-entries-filter-select data-filter="filter" data-config="component.config"></div> <div data-ng-switch-when="multiSelectFilter" data-entries-filter-multi-select data-filter="filter" data-config="component.config"></div> </div> </div> </div> '),$templateCache.put("views/directives/entries-filter-picker.html",'<div class="entr
16ies-filter-chips__picker dropdown-option-list"> <div class="dropdown-title"> <span>{{ \'time_entries.filter.search_filters\' | translate }}</span> </div> <a class="entries-filter-chips__picker-item" data-ng-repeat="component in menuComponents track by component.id" data-ng-click="activateComponent(component)" data-dropdown-close-on-click> {{ component.config.labelKey | translate }} </a> </div> '),$templateCache.put("views/directives/entries-filter-select.html",'<div class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams[config.checkedKey]"> <span>{{ config.labelKey | translate }}</span> </label> <div ng-show="filter.formParams[config.checkedKey]" class="filters-subgroup"> <select ng-model="filter.apiParams[config.apiParam]" data-options="resolvedOptions" class="selectize-keep-default-width" data-selectize="{\r\n                    labelField: \'name\',\r\n                    valueField: \'type\',\r\n                    placeholder: (config.placeholderKey | translate)\r\n                }"> </select> </div> </div> '),$templateCache.put("views/directives/entries-filter-user.html",'<div class="filters-column--item-container"> <label style="margin-top: 20px;"> <input type="checkbox" class="slim-check-expand-icon" data-ng-check ng-model="filter.formParams.user_checked"> <span>{{ config.labelKey | translate }}</span> </label> <div ng-show="filter.formParams.user_checked" class="filters-subgroup"> <div> <input ng-model="filter.apiParams.user_id" data-options-load="loadUsers" data-options-load-trigger="focus" data-options-load-params="filter.formParams.user__options_load_params" data-options-filters="filter.formParams.user__options_filters" data-selectize-key="filter-users" data-selectize="{\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        valueField: \'id\',\r\n                        sortField: \'name\',\r\n                        optgroups: [\r\n                            {id: true, name: (\'time_entries.filter.active_users\' | translate)},\r\n                            {id: false, name: (\'time_entries.filter.archived_users\' | translate)}\r\n                        ],\r\n                        lockOptgroupOrder: true,\r\n                        optgroupField: \'active\',\r\n                        optgroupLabelField: \'name\',\r\n                        optgroupValueField: \'id\',\r\n                        plugins: [\'remove_button\'],\r\n                        placeholder: (\'time_entries.filter.filter_by_user\' | translate)\r\n                    }"> </div> <div class="sub-filters"> <div ng-if="filter.formParams.include_archived_users_visible" class="filters-column--checkbox-container"> <label style="margin-top: 30px;"> <input type="checkbox" data-ng-check class="slim-check-width-12" data-ng-model="filter.apiParams.include_archived_users" data-ng-click="onChangeIncludeArchivedUsers()"> <span>{{ \'time_entries.filter.include_archived_users\' | translate }}</span> <span class="icon-info light-grey-color" data-tooltip-append-to-body="true" data-tooltip-placement="top-right" data-tooltip-html="\'{{ \'time_entries.filter.include_archived_users_info\' | translate }}\'"></span> </label> <sub>{{ \'time_entries.filter.include_archived_users_sub\' | translate }}</sub> </div> </div> </div> </div> '),$templateCache.put("views/directives/feature-ads.html",'<div class="directive-feature-ads"> <span class="directive-feature-ads--tag"> {{context.isNew ? \'Nova funcionalidade\' : \'Desbloqueie essa funcionalidade\'}} </span> <h1>{{context.title}}</h1> <ul class="element-todo-checkbox"> <li data-ng-repeat="feature in context.features"> <span class="icon-check"></span> <span>{{feature}}</span> </li> </ul> <div data-ng-if="hasFeature"> <a class="button button--blue-brand" data-ng-click="onClickHasFeature()"> {{context.buttonHasFeature.label}} </a> <span class="directive-feature-ads--has-feature"> Está incluso no seu plano atual </span> </div> <div data-ng-if="!hasFeature"> <div data-ng-if="$permissionService.hasPrivilegesToEditAccountSubscription()"> <a class="button button--blue-brand" data-ng-click="upgrade()"> Faça upgrade do seu plano </a> <span class="directive-feature-ads--has-feature"> Disponível no plano BUSINESS </span> </div> <span data-ng-if="!$permissionService.hasPrivilegesToEditAccountSubscription()" class="directive-feature-ads--request-to-admin"> Quer desbloquear essa funcionalidade?<br> Solicite ao administrador da conta para fazer upgrade de plano. </span> </div>
16 <img src="./assets/img/features/{{context.img}}"> </div> '),$templateCache.put("views/directives/flag-upgrade-required.html",'<span class="directive-flag-upgrade-required"> <a data-ng-click="showUpgradeModal()"> <span class="icon-auto_awesome"></span> <strong>{{label}}</strong> </a> <span data-ng-if="showLongDescription"> {{ \'directives.flag_upgrade_required.to_unlock\' | translate }} {{description}}.</span> </span> '),$templateCache.put("views/directives/historical-calendar-list.html",'<div class="directive-historical-rate-list" data-if-has-feature="HISTORICAL_RATES"> <div class="directive-historical-rate-list--link-toggle-visibility"> <a class="link-dashed" data-ng-click="toggleHistoricalCalendarsVisibility()"> <span>{{ \'holiday_calendars.historical.history_title\' | translate }}</span> <span data-ng-class="historicalCalendarsIsVisible ? \'icon-angle-up\' : \'icon-angle-down\'"></span> </a> </div> <div data-ng-if="historicalCalendarsIsVisible" class="directive-historical-rate-list--list-historical-rate-list"> <div data-spinner-loading="historicalCalendarsIsLoading" data-message="{{ \'holiday_calendars.historical.loading_history\' | translate }}"> </div> <div data-ng-if="!historicalCalendarsIsLoading" class="list-minimal"> <table> <tbody> <tr> <td>{{ \'holiday_calendars.historical.effective_date_label\' | translate }}</td> <td></td> <td>{{ \'holiday_calendars.historical.calendar_label\' | translate }}</td> </tr> <tr data-ng-repeat="historicalCalendar in historicalCalendarsList"> <td> <span data-ng-if="historicalCalendar.start_at"> {{ \'holiday_calendars.historical.from_date\' | translate:{date: (historicalCalendar.start_at | dateShort2:true)} }} </span> <span data-ng-if="!historicalCalendar.start_at"> {{ \'holiday_calendars.historical.from_beginning\' | translate }} </span> </td> <td style="padding: 5px;"> <a data-ng-if="historicalCalendar.showDeleteButton" class="icon-trash2 red-color" data-dropdown="directive-historical-calendar-list--dropdown-delete-latest-calendar__{{directive_dynamic_id}}"></a> </td> <td> {{historicalCalendar.calendar.name || (\'holiday_calendars.historical.default_calendar\' | translate)}} </td> </tr> </tbody> </table> </div> </div> <div id="directive-historical-calendar-list--dropdown-delete-latest-calendar__{{directive_dynamic_id}}" data-dropdown-content data-dropdown-append-to-body="{{dropdownAppendToBody}}" class="f-dropdown content directive-historical-rate-list--dropdown-delete-latest-rate__container"> <p> {{ \'holiday_calendars.historical.delete_history_confirm\' | translate:{name: (historicalCalendarsList[0].calendar.name ? (\'"\' + historicalCalendarsList[0].calendar.name + \'"\') : (\'holiday_calendars.historical.delete_history_confirm_default\' | translate))} }} </p> <div class="row directive-historical-rate-list--dropdown-delete-latest-rate__buttons"> <div class="column-50"> <button class="button clean" data-ng-disabled="latestCalendarIsDeleting" data-ng-click="closeDropdownDeleteLatestCalendar($event)"> {{ \'holiday_calendars.historical.cancel\' | translate }} </button> </div> <div class="column-50"> <button class="button red" data-ng-disabled="latestCalendarIsDeleting" data-ng-click="deleteLatestCalendar($event)"> {{latestCalendarIsDeleting ? (\'holiday_calendars.historical.deleting\' | translate) : (\'holiday_calendars.historical.delete\' | translate)}} </button> </div> </div> </div> </div> '),$templateCache.put("views/directives/historical-calendar-save-form.html",'<div class="explanation radius directive-historical-rate-save-form" data-ng-if="form.is_new_calendar"> <div class="directive-historical-rate-save-form--input-actions"> <p>{{ \'holiday_calendars.historical.apply_from\' | translate }}</p> <div> <label> <input type="radio" data-ng-model="form.new_calendar_action" data-ng-change="updateCalendarStartAtNew()" value="update-current-period"> <span data-ng-if="!form.calendar_start_at"> {{ \'holiday_calendars.historical.action_initial\' | translate }} </span> <span data-ng-if="form.calendar_start_at"> {{ \'holiday_calendars.historical.action_replace\' | translate }} <div class="steel-color" style="margin: 5px 0;"> {{ \'holiday_calendars.historical.current_period\' | translate:{date: (form.calendar_start_at | dateLong)} }} </div> </span> </label> <label> <input type="radio" data-ng-model="form.new_calendar_action" data-ng-change="updateCalendarStartAtNew()" value="create-new-period"> <span>{{ \'holiday_calendars.historical.action_new_period\' | translate }}</span> </label> </div> <div data-ng-if="form.new_calendar_action === \'create-new-period\'"> <div data-button-date="form.new_calendar_start_at" data-min-date="form.new_calendar_start_at_min_date" data-on-change="updateCalendarStartAtNew" data-hide-clear-button="true" style="max-width: 200px"> </div> </div> <div data-ng-if="form.showErrors" class="has-error"> <span data-ng-if="form.errors[\'new_calendar_start_at\']">{{ form.errors[\'new_calendar_start_at\'] | translate }}</span> <span data-ng-if="form.errors[\'new_calendar_action\']">{{ form.errors[\'new_calendar_action\'] | translate }}</span> </div> </div> </div> '),$templateCache.put("views/directives/historical-rate-list.html",'<div class="directive-historical-rate-list" data-if-has-feature="HISTORICAL_RATES"> <div class="directive-historical-rate-list--link-toggle-visibility"> <a class="link-dashed" data-ng-click="toggleHistoricalRatesVisibility()"> <span data-ng-if="options.type === \'cost\'"> {{ \'rates.historical.cost_history\' | translate }} </span> <span data-ng-if="options.type === \'billable\'"> {{ \'rates.historical.billable_history\' | translate }} </span> <span data-ng-if="options.type === \'tax\'"> {{ \'rates.historical.tax_history\' | translate }} </span>
16 <span data-ng-class="historicalRatesIsVisible ? \'icon-angle-up\' : \'icon-angle-down\'"></span> </a> </div> <div data-ng-if="historicalRatesIsVisible" class="directive-historical-rate-list--list-historical-rate-list"> <div data-spinner-loading="historicalRatesIsLoading" data-message="{{ \'rates.historical.loading\' | translate }}"> </div> <div data-ng-if="!historicalRatesIsLoading" class="list-minimal"> <table> <tbody> <tr> <td>{{ \'rates.historical.effective_date\' | translate }}</td> <td></td> <td>{{ \'rates.historical.value\' | translate }}</td> </tr> <tr data-ng-repeat="historicalRate in historicalRatesList"> <td> <span data-ng-if="historicalRate.start_at"> {{ \'rates.historical.from_date\' | translate:{date: (historicalRate.start_at | dateShort2:true)} }} </span> <span data-ng-if="!historicalRate.start_at"> {{ \'rates.historical.since_start\' | translate }} </span> </td> <td style="padding: 5px;"> <a data-ng-if="historicalRate.showDeleteButton" class="icon-trash2 red-color" data-dropdown="directive-historical-rate-list--dropdown-delete-latest-rate__{{directive_dynamic_id}}"></a> </td> <td> <span data-ng-if="historicalRate.rate"> {{historicalRate.rate | moneyToReal:true}} </span> <span class="steel-color" data-ng-if="!historicalRate.rate"> <span data-ng-if="options.type === \'billable\'"> <span data-ng-bind-html="\'rates.historical.project_default_value\' | translate"></span> </span> <span data-ng-if="options.type !== \'billable\'"> {{ 0 | moneyToReal:true}} </span> </span> </td> </tr> </tbody> </table> </div> </div> <div id="directive-historical-rate-list--dropdown-delete-latest-rate__{{directive_dynamic_id}}" data-dropdown-content data-dropdown-append-to-body="{{dropdownAppendToBody}}" class="f-dropdown content directive-historical-rate-list--dropdown-delete-latest-rate__container"> <p> {{ \'rates.historical.delete_confirmation\' | translate }} <span data-ng-if="!historicalRatesList[0].rate"> <span data-ng-if="options.type === \'billable\'"> {{ \'rates.historical.delete_project_default\' | translate }} </span> <span data-ng-if="options.type !== \'billable\'"> {{ 0 | moneyToReal:true}} </span> </span> <span data-ng-if="historicalRatesList[0].rate"> {{historicalRatesList[0].rate|moneyToReal:true}} </span> {{ \'rates.historical.delete_confirmation_suffix\' | translate }} </p> <div class="row directive-historical-rate-list--dropdown-delete-latest-rate__buttons"> <div class="column-50"> <button class="button clean" data-ng-disabled="latestRateIsDeleting" data-ng-click="closeDropdownDeleteLatestRate($event)"> {{ \'rates.historical.cancel\' | translate }} </button> </div> <div class="column-50"> <button class="button red" data-ng-disabled="latestRateIsDeleting" data-ng-click="deleteLatestRate($event)"> {{latestRateIsDeleting ? (\'rates.historical.deleting\' | translate) : (\'rates.historical.delete\' | translate)}} </button> </div> </div> </div> </div> '),$templateCache.put("views/directives/historical-rate-save-form.html",'<div class="explanation radius directive-historical-rate-save-form" data-ng-if="form.is_new_rate"> <div class="directive-historical-rate-save-form--input-actions"> <p>{{ \'rates.historical.apply_from\' | translate }}</p> <div> <label> <input type="radio" data-ng-model="form.new_rate_action" data-ng-change="updateRateStartAtNew()" value="update-current-period"> <span data-ng-if="!form.rate_start_at"> {{ \'rates.historical.action_initial\' | translate }} </span> <span data-ng-if="form.rate_start_at"> {{ \'rates.historical.action_replace\' | translate }} <div class="steel-color" style="margin: 5px 0;"> {{ \'rates.historical.current_period\' | translate:{date: (form.rate_start_at | dateLong)} }} </div> </span> </label> <label> <input type="radio" data-ng-disabled="!hasFeatures.HISTORICAL_RATES" data-ng-model="form.new_rate_action" data-ng-change="updateRateStartAtNew()" value="create-new-period"> <span>{{ \'rates.historical.action_new_period\' | translate }}</span> <span data-flag-upgrade-required="HISTORICAL_RATES" show-description="true"></span> </label> </div> <div data-ng-if="form.new_rate_action === \'create-new-period\'"> <div data-button-date="form.new_rate_start_at" data-min-date="form.new_rate_start_at_min_date" data-on-change="updateRateStartAtNew" data-hide-clear-button="true" style="max-width: 200px"> </div> </div> <div data-ng-if="form.showErrors" class="has-error"> <span data-ng-if="form.errors[\'new_rate_start_at\']">{{ form.errors[\'new_rate_start_at\'] }}</span> <span data-ng-if="form.errors[\'new_rate_action\']">{{ form.errors[\'new_rate_action\'] }}</span> </div> </div> </div> '),$templateCache.put("views/directives/input-money.html",'<div class="directive-input-money"> <div class="input-prefix-inside--container input-suffix-inside--container"> <label class="input-prefix-inside--label-prefix" for="directive-input-money--input-{{directive_dynamic_id}}">{{prefix}}</label> <input type="text" id="directive-input-money--input-{{directive_dynamic_id}}" data-ng-mask="money" data-ng-model="moneyFormatted" data-ng-model-options="{ debounce: 500 }" data-ng-change="updateInput()" data-disabled-required-feature="requiredFeature" placeholder="{{0|moneyOnlyAmount}}" class="center view-project-edit--billing-content__input_rate"> <label data-ng-if="suffix" class="input-suffix-inside--label-suffix" for="directive-input-money--input-{{directive_dynamic_id}}">{{suffix}}</label> </div> </div> '),$templateCache.put("views/directives/input-number-stepper.html",'<div class="directive-input-number-stepper"> <span class="directive-input-number-stepper__btn-wrap" data-tooltip="{{ minTooltip }}" data-tooltip-enable="showMinTooltip()"> <button type="button" class="directive-input-number-stepper__btn" data-ng-click="decrement
16()" data-ng-disabled="!canDecrement()" data-ng-attr-aria-label="{{ ariaLabelDecrease }}">−</button> </span> <input type="number" id="directive-input-number-stepper--input-{{ directive_dynamic_id }}" class="directive-input-number-stepper__input" data-ng-model="model" data-ng-change="onInputChange()" data-ng-blur="onInputBlur()" data-ng-attr-step="{{ step }}" data-ng-attr-placeholder="{{ placeholder }}"> <button type="button" class="directive-input-number-stepper__btn" data-ng-click="increment()" data-ng-disabled="!canIncrement()" data-ng-attr-aria-label="{{ ariaLabelIncrease }}">+</button> </div> '),$templateCache.put("views/directives/json-tree.html",'<div class="json-tree" data-ng-class="{\'json-tree--nested\': jsonKey != null && jsonKey !== \'\'}"> <div class="json-tree__line"> <button type="button" class="json-tree__toggle" data-ng-if="isExpandable()" data-ng-click="toggle($event)" data-ng-attr-aria-expanded="{{ expanded }}"> <span class="json-tree__caret icon-angle-right" data-ng-class="{\'is-expanded\': expanded}"></span> </button> <span class="json-tree__toggle-spacer" data-ng-if="!isExpandable()"></span> <span class="json-tree__key" data-ng-if="jsonKey != null && jsonKey !== \'\'" data-ng-click="toggle($event)" data-ng-class="{\'is-expandable\': isExpandable()}">{{ jsonKey }}</span> <span class="json-tree__colon" data-ng-if="jsonKey != null && jsonKey !== \'\'">:</span> <span class="json-tree__preview" data-ng-if="isExpandable() && !expanded">{{ collapsedPreview() }}</span> <span class="json-tree__bracket" data-ng-if="isExpandable() && expanded && getType() === \'object\'">{</span> <span class="json-tree__bracket" data-ng-if="isExpandable() && expanded && getType() === \'array\'">[</span> <span class="json-tree__value" data-ng-if="!isExpandable()" data-ng-class="\'json-tree__value--\' + getType()">{{ formatPrimitive() }}</span> </div> <div class="json-tree__children" data-ng-if="isExpandable() && expanded"> <div data-ng-repeat="entry in entries track by entry.key" data-json-tree="entry.value" data-json-key="{{ entry.key }}" data-json-depth="{{ childDepth }}"></div> <div class="json-tree__line json-tree__line--closing"> <span class="json-tree__toggle-spacer"></span> <span class="json-tree__bracket" data-ng-if="getType() === \'object\'">}</span> <span class="json-tree__bracket" data-ng-if="getType() === \'array\'">]</span> </div> </div> </div> '),$templateCache.put("views/directives/language-selector.html",'<div class="language-container-directive"> <div class="language-selector"> <button type="button" class="language-button" data-dropdown="language-menu"> <span class="icon-globe"></span> <span data-ng-bind="currentLanguage.name"></span> <span class="icon-angle-down"></span> </button> <div id="language-menu" class="language-menu f-dropdown" data-dropdown-content> <div data-ng-repeat="lang in supportedLanguages" class="language-option" data-ng-click="changeLanguage(lang.id)" data-ng-class="{\'active\': lang.id === currentLanguage.id}"> <span data-ng-bind="lang.name"></span> </div> </div> </div> </div> '),$templateCache.put("views/directives/progress-bar-tooltip.html",'<div> <div class="progress-bar-tooltip--title" data-ng-if="progressTooltipTitle || progressCompleted || progressCompleted === 0"> <strong data-ng-if="progressTooltipTitle">{{ progressTooltipTitle }}</strong> <div data-ng-if="progressCompleted || progressCompleted === 0"> <span data-ng-if="progressCompleted <= 100" class="progress-bar-tooltip__progress"> {{ \'common.progress_bar.remaining_percent\' | translate:{ percent: getProgressRemainingPercent() } }} </span> <span data-ng-if="progressCompleted > 100" class="progress-bar-tooltip__progress progress-bar-tooltip__progress-exceed"> {{ \'common.progress_bar.exceeded_percent\' | translate:{ percent: getProgressExceededPercent() } }} </span> </div> </div> <table class="progress-bar-tooltip--item-list"> <tr data-ng-repeat="item in progressTooltipItems"> <td>{{ item.label }}</td> <td>{{ item.value }}</td> </tr> </table> </div> '),$templateCache.put("views/directives/progress-capacity-bar-tooltip.html",'<div> <div data-ng-if="status && status !== \'work_day\'" class="progress-capacity-bar--tooltip--status"> <span class="icon-moon" data-ng-if="isAbsenceDay"></span> <strong>{{ \'users.capacity-status.\' + status | translate }}</strong> </div> <div class="progress-capacity-bar--tooltip--title"> <strong>{{title}}</strong> <div data-ng-if="progress || progress === 0"> <span data-ng-if="progress <= 100" class="progress-capacity-bar--tooltip__progress"> {{100 - progressDisplay|numericHuman}}% Livre </span> <span data-ng-if="progress > 100" class="progress-capacity-bar--tooltip__progress progress-capacity-bar--tooltip__progress-exceed"> {{(progressDisplay - 100)|numericHuman}}% Excedido </span> </div> </div> <table class="progress-capacity-bar--tooltip--item-list"> <tr> <td> <span class="progress-capacity-bar--tooltip--legend progress-capacity-bar--tooltip--legend__total"></span> </td> <td>Capacidade</td> <td> <span>{{ getCapacityTimeDisplay(total) | durationFormat: \'default\' }}</span> </td> </tr> <tr> <td> <span class="progress-capacity-bar--tooltip--legend progress-capacity-bar--tooltip--legend__consumed"></span> </td> <td>Consumido</td> <td> <span>{{ getCapacityTimeDisplay(consumed) | durationFormat: \'default\' }}</span> </td> </tr> <tr> <td> <span class="progress-capacity-bar--tooltip--legend progress-capacity-bar--tooltip--legend__remaining"></span> </td> <td>Livre</td> <td> <span>{{ getCapacityTimeDisplay(remaining) | durationFormat: \'default\' }}</span> </td> </tr> <tr> <td> <span class="progress-capacity-bar--tooltip--legend progress-capacity-bar--tooltip--legend__exceed"></span> </td> <td>Excedido</td> <td> <span>{{ getCapacityTimeDisplay(exceed) | durationFormat: \'default\' }}</span> </td> </tr> </table> </div> '),$templateCache.put("views/directives/progress-capacity-bar.html",'<div class="progress-bar-container progress-capacity-bar-container"> <div class="progress-bar-background"> <span class="progress-bar-completed"></span> </div> <div class="progress-capacity-bar--tooltip-focus" data-tooltip-class="progress-capacity-bar--tooltip" data-tooltip-append-to-body="true" data-tooltip-animation="true" data-tooltip-template="\'views/directives/progress-capacity-bar-tooltip.html\'"></div> </div> '),$templateCache.put("views/directives/reminder-email-custom-message.html",'<button type="button" class="button clean reminder-email-custom-message--preview-button" data-ng-click="openPreview()"> {{ \'general_account_settings.reminders.email_preview_button\' | translate }} </button> '),$templateCache.put("views/directives/response-popup.html",'<div id="response-popup"> <div class="response-popup--wrapper"> <!--    {{notifications}}--> <div class="response-popup--message-container" data-ng-repeat="notification in notifications"> <!--        <div>--> <div class="response-popup--message" data-ng-bind-html="notification.message"></div> <div class="response-popup--buttons"> <a data-ng-repeat="button in notification.buttons" data-ng-click="onClick(button, notification)" data-ng-disabled="button.active"> {{button.active ? (button.labelActive || \'Processando\') + \'...\' : button.label }} </a> </div> <a data-ng-click="close(notification)" class="response-popup--close-button"> <span class="icon-cross"></span> <svg class="response-popup--progress-ring" viewBox="0 0 36 36"> <circle class="response-popup--progress-circle" cx="18" cy="18" r="16"/> </svg> </a> </div> </div> </div> '),$templateCache.put("views/directives/stopwatch-display.html",'<span class="directive-stopwatch-display"> <span class="hours">{{display.hours}}</span> <span class="colon1">:</span> <span class="minutes">{{display.minutes}}</span> <span class="colon2">:</span> <span class="seconds">{{display.seconds}}</span> </span> '),$templateCache.put("views/directives/timesheet-user-picker.html",'<span class="timesheet-user-picker"> <button type="button" class="button clean timesheet-user-picker__btn" data-dropdown="{{ dropdownId }}
16" data-ng-click="onOpen()" title="{{ \'timesheet.user_picker.select_person_button\' | translate }}"> {{ \'timesheet.user_picker.select_person_button\' | translate }} </button> <div id="{{ dropdownId }}" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown content timesheet-user-picker__dropdown"> <div class="timesheet-user-picker__search"> <input type="search" data-ng-model="search" placeholder="{{ \'timesheet.user_picker.search_placeholder\' | translate }}" autofocus> </div> <div class="timesheet-user-picker__table" data-ng-if="!loading"> <table> <tr data-ng-repeat="user in users | filter: { name: search }"> <td> <div class="timesheet-user-picker__user"> <div data-user-avatar data-name="{{ user.name }}" data-photo-url="user.profile_photo_url" data-size="sm"> </div> <span class="timesheet-user-picker__user-name" data-ng-bind-html="user.name | highlight: search"></span> </div> </td> <td> <span data-ng-if="isSelected(user)" class="green-color"> {{ \'timesheet.user_picker.current\' | translate }} </span> <a data-ng-if="!isSelected(user)" class="button clean" dropdown-close-on-click data-ng-click="selectUser(user)"> {{ \'timesheet.user_picker.select\' | translate }} </a> </td> </tr> </table> </div> <div data-ng-if="loading" class="timesheet-user-picker__loading"> <div spinner-loading="loading"></div> </div> <hr> <div class="timesheet-user-picker__footer"> <button type="button" class="button clean" dropdown-close-on-click> {{ \'common.cancel\' | translate }} </button> <span></span> <button type="button" class="button clean" dropdown-close-on-click data-ng-click="selectSelf()" data-ng-if="!isSelfSelected()"> {{ (isDayMode ? \'timesheet.my_day\' : \'timesheet.my_timesheet\') | translate }} </button> </div> </div> </span> '),$templateCache.put("views/directives/timesheet-week-navigator.html",'<div class="timesheet-week-navigator"> <div class="timesheet-week-navigator__nav" data-ng-if="showNavigation"> <button type="button" class="button clean timesheet-week-navigator__btn" data-ng-click="onPrev()" data-ng-attr-aria-label="{{ isDayMode ? (\'timesheet.prev_day\' | translate) : (\'timesheet.prev_week\' | translate) }}"> <span class="icon-angle-left"></span> </button> <button type="button" class="button clean timesheet-week-navigator__btn" data-ng-click="onNext()" data-ng-attr-aria-label="{{ isDayMode ? (\'timesheet.next_day\' | translate) : (\'timesheet.next_week\' | translate) }}"> <span class="icon-angle-right"></span> </button> </div> <p class="timesheet-week-navigator__period" data-ng-if="!isDayMode"> {{ week.start | dateLong }} — {{ week.end | dateLong }} </p> <p class="timesheet-week-navigator__period" data-ng-if="isDayMode"> {{ selectedDay | moment: \'ddd\' }}, {{ selectedDay | dateLong }} </p> </div> '),$templateCache.put("views/directives/todo-items-list.html",'<tr data-ng-repeat-start="entry in displayEntries track by (entry.isAddSubtodoRow ? (\'add-\' + entry.parentTodoId + \'-\' + (entry.depth || 0)) : (entry.todo.id || $index))" data-ng-if="!entry.isAddSubtodoRow" data-todo-id="{{entry.todo.id}}" data-drop="canDropOnRow(entry)" class="view-todos--tr-todo-item view-todos--tr-todo-item__edit-todo" data-ng-class="{\r\n        \'todo-is-completed\': entry.todo.is_completed,\r\n        \'view-todos--todo-is-new\': !entry.todo.id,\r\n        \'todo-items-list__row--subtodo\': entry.isSubtodo,\r\n        \'todo-items-list__row--nested\': entry.depth > 0,\r\n        \'todo-items-list__row--drop-blocked\': isDropBlockedForRow(entry)\r\n    }" jqyoui-droppable="dragDropConfigs.droppableSettings" data-jqyoui-options="dragDropConfigs.droppableOptions"> <td class="todo-items-list__color-cell"> <span data-entity-color-swatch data-variant="bar" data-colors="entry.todo.tags"></span> <div data-drag="isDragEnabled(entry)" class="view-todos--ui-draggable draggable-todo-item" jqyoui-draggable="dragDropConfigs.draggableSettings" data-jqyoui-options="dragDropConfigs.draggableOptions"> <a class="button clean" data-dropdown="{{ dropdownIdForTodo(entry.todo) }}"> <span class="icon-more_vert"></span> </a> <span class="dragging-description" data-ng-bind-html="entry.todo.name"></span> </div> <div id="{{ dropdownIdForTodo(entry.todo) }}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="openTodo(entry.todo)"> <span>{{ \'todos.dropdown_todo.open_details\' | translate }}</span> <span class="dropdown-option--shortcut-key">Ctrl Enter</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canAddSubtodoFromMenu(entry)"> <a data-ng-click="addSubtodoFromMenu($event, entry.todo)"> <span>{{ \'todos.dropdown_todo.add_subtodo\' | translate }}</span> </a> </div>
16 <div data-ng-if="canCompleteTodo(entry.todo) || canEditTodos"> <div class="dropdown-option option-button" data-ng-if="canCompleteTodo(entry.todo) && !entry.todo.is_completed"> <a data-ng-click="toggleIsCompleted(entry.todo)"> <span>{{ \'todos.dropdown_todo.mark_completed\' | translate }}</span> <span class="dropdown-option--shortcut-key">Alt C</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canCompleteTodo(entry.todo) && entry.todo.is_completed"> <a data-ng-click="toggleIsCompleted(entry.todo)"> <span>{{ \'todos.dropdown_todo.mark_incomplete\' | translate }}</span> <span class="dropdown-option--shortcut-key">Alt C</span> </a> </div> <div data-ng-if="canEditTodos && canReorderTodo(entry)"> <hr> <div class="dropdown-option option-button"> <a data-ng-click="moveTodoToPrevFocus($event, entry.todo)"> <span>{{ \'todos.dropdown_todo.move_above\' | translate }}</span> <span class="dropdown-option--shortcut-key"> Ctrl <span class="icon-arrow-up"></span> </span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="moveTodoToNextFocus($event, entry.todo)"> <span>{{ \'todos.dropdown_todo.move_below\' | translate }}</span> <span class="dropdown-option--shortcut-key"> Ctrl <span class="icon-arrow-down"></span> </span> </a> </div> </div> <div data-ng-if="canEditTodos && enableMoveBetweenLists && !entry.isSubtodo"> <hr data-ng-if="!canReorderTodo(entry)"> <div class="dropdown-option option-button"> <a data-ng-click="moveTodoToPrevList(entry.todo)"> <span>{{ \'todos.dropdown_todo.move_above_list\' | translate }}</span> <span class="dropdown-option--shortcut-key"> Ctrl <span class="icon-arrow-left"></span> </span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="moveTodoToNextList(entry.todo)"> <span>{{ \'todos.dropdown_todo.move_below_list\' | translate }}</span> <span class="dropdown-option--shortcut-key"> Ctrl <span class="icon-arrow-right"></span> </span> </a> </div> </div> <div class="dropdown-option option-button dropdown-sub-menu" data-ng-if="canEditTodoContent(entry.todo)"> <a> <span>{{ \'todos.tags.label\' | translate }}</span> </a> <div data-dropdown-content class="f-dropdown dropdown-option-list todo-tag-picker__submenu"> <div data-todo-tag-picker data-ng-model="entry.todo.tags" data-disabled="!canEditTodoContent(entry.todo)" data-on-change="saveTodo(entry.todo)"></div> </div> </div> <hr data-ng-if="canEditTodos"> <div class="dropdown-option option-button" data-ng-if="canEditTodos"> <a data-ng-click="deleteTodo($event, entry.todo)" class="red-color-on-hover"> <span>{{ \'todos.dropdown_todo.delete_todo\' | translate }}</span> <span class="dropdown-option--shortcut-key">Ctrl Del</span> </a> </div> </div> <div data-ng-if="canRestoreTodos"> <hr> <div class="dropdown-option option-button"> <a data-ng-click="restoreTodo(entry.todo)"> {{ \'todos.dropdown_todo.restore_todo\' | translate }} </a> </div> </div> </div> </td> <td class="todo-items-list__main-column" data-ng-click="onMainColumnClick($event, entry.todo)"> <div class="todo-items-list__main-column-inner" data-ng-style="entry.depth > 0 ? {\'padding-left\': (entry.depth * 28) + \'px\'} : null"> <span class="todo-items-list__expand-slot todo-items-list__interactive-control" data-ng-if="expandableSubtodos"> <button type="button" class="button clean todo-items-list__expand-subtodos has-itens-below" data-ng-if="shouldShowSubtodoExpandToggle(entry)" data-ng-checked="isSubtodoExpanded(entry.todo)" data-ng-disabled="isSubtodosLoading(entry.todo)" data-ng-class="{\'todo-items-list__expand-subtodos--loading\': isSubtodosLoading(entry.todo)}" data-ng-click="onSubtodoExpandClick($event, entry.todo)" data-tooltip="{{ isSubtodoExpanded(entry.todo) ? (\'todos.list.collapse_subtodos\' | translate) : (\'todos.list.expand_subtodos\' | translate) }}" data-tooltip-append-to-body="true"> </button> </span> <div class="element-todo-checkbox view-todos--is-completed-checkbox todo-items-list__interactive-control" data-ng-click="$event.stopPropagation()"> <input type="checkbox" data-ng-check data-ng-disabled="!canCompleteTodo(entry.todo)" data-ng-model="entry.todo.is_completed" data-ng-change="saveCompletedStatus(entry.todo)"> </div> <div class="todo-items-list__main-body"> <span contenteditable="{{canEditTodoContent(entry.todo)}}" class="radius todo-items-list__todo-name" data-ng-click="canEditTodoContent(entry.todo) ? $event.stopPropagation() : null" data-ng-model="entry.todo.name" data-ng-keydown="onKeyDownTodo($event, entry.todo)" data-ng-keyup="onKeyUpTodo($event)" data-ng-model-options="{ updateOn: \'blur\' }" data-ng-change="saveTodoName(entry.todo)"></span> <div class="view-todos--label-details"> <span data-ng-if="entry.todo.description"> <span class="icon-align-left" style="font-size: 1.1em" data-tooltip="{{ \'todos.edit.description\' | translate }}" data-tooltip-append-to-body="true"></span> </span> <span data-ng-if="entry.todo.subtodos_count > 0" class="button clean view-todos--label-detail-badge todo-items-list__subtodos-count-badge" data-ng-class="{\r\n                              \'todo-items-list__interactive-control\': shouldShowSubtodoExpandToggle(entry),\r\n                              \'todo-items-list__subtodos-count-badge--loading\': isSubtodosLoading(entry.todo)\r\n                          }" data-ng-click="onSubtodosCountBadgeClick($event, entry)" data-tooltip="{{ shouldShowSubtodoExpandToggle(entry) ? (isSubtodoExpanded(entry.todo) ? (\'todos.list.collapse_subtodos\' | translate) : (\'todos.list.expand_subtodos\' | translate)) : (\'todos.list.subtodos_count\' | translate:{ count: entry.todo.subtodos_count }) }}" data-tooltip-append-to-body="true"> <span class="icon-alt"></span> <span data-ng-bind="entry.todo.subtodos_count"></span> </span> <span data-ng-if="entry.todo.attachments_count > 0" class="view-todos--label-detail-badge"> <span class="icon-attachment2" style="font-size: 0.9em" data-tooltip="{{ \'todos.list.attachments_count\' | translate:{ count: entry.todo.attachments_count } }}" data-tooltip-append-to-body="true"></span> <span data-ng-bind="entry.todo.attachments_count"></span> </span> <span data-ng-if="entry.todo.comments_count > 0" class="view-todos--label-detail-badge"> <span class="icon-speech-bubble" data-tooltip="{{ \'todos.list.comments_count\' | translate:{ count: entry.todo.comments_count } }}" data-tooltip-append-to-body="true"></span> <span data-ng-bind="entry.todo.comments_count"></span> </span> <span data-ng-if="entry.todo.user_id" data-assigned-to="entry.todo.user_name" data-assigned-to-photo-url="entry.todo.user_profile_photo_url"></span> <span data-ng-if="entry.todo.due_on" data-due-date="entry.todo.due_on" data-is-completed="entry.todo.is_completed"></span> </div> </div> </div> </td> <td class="view-todos--time-total-column nowrap"> <div class="view-todos--time-total-actions"> <span class="view-todos--time-total-value"> <a class="link link-dashed" data-ng-if="canOpenTodoLoggedHoursModal(entry.todo)" data-ng-click="onTodoLoggedHoursClick(entry.todo, $event)"> {{entry.todo.time_total | durationFormat: \'default\'}} </a> <span data-ng-if="!canOpenTodoLoggedHoursModal(entry.todo)" data-ng-class="{\'grey-color\': isTimeEmpty(entry.todo.time_total)}"> {{isTimeEmpty(entry.todo.time_total) ? \'-\' : (entry.todo.time_total | durationFormat: \'default\')}} </span> </span> <span class="view-todos--time-estimate-group" data-ng-if="entry.todo.time_estimate || entry.todo.subtodo_time_estimate_sum"> <span class="view-todos--time-estimate-separator" aria-hidden="true"></span> <span class="view-todos--time-estimate-value grey-color"> {{ (entry.todo.time_estimate | timeSum: entry.todo.subtodo_time_estimate_sum) | durationFormat: \'default\' }} </span> <span data-progress-bar data-progress-completed="entry.todo.time_progress" data-progress-tooltip-title="{{ \'todos.edit.progress\' | translate }}" data-progress-tooltip-items="getTodoProgressTooltipItems(entry.todo)"> </span> </span> <span class="view-todos--time-total-commands" data-ng-if="canEditTodos && entry.todo.id && entry.todo.project_id"> <button type="button" class="button clean view-todos--time-action" data-ng-click="openTodoAddTimeEntry($event, entry.todo)" data-tooltip="{{ \'todos.log_hours_tooltip\' | translate }}" data-tooltip-append-to-body="true"> <span class="icon-time2"></span> </button> <button type="button" class="button clean view-todos--time-action button-stopwatch" data-ng-click="toggleTodoStopwatch($event, entry.todo)" data-tooltip="{{ isTodoStopwatchActive(entry.todo) ? (\'todos.pause_stopwatch\' | translate) : (\'todos.play_stopwatch\' | translate) }}" data-tooltip-append-to-body="true"> <span data-ng-class="{\'icon-pause\': isTodoStopwatchActive(entry.todo), \'icon-play3\': !isTodoStopwatchActive(entry.todo)}"></span> </button> <span data-ng-if="isTodoStopwatchActive(entry.todo)" stopwatch-display class="view-todos--stopwatch-display"></span> </span> </div> </td> <td></td> </tr> <tr data-ng-if="entry.isAddSubtodoRow && canEditTodos" data-ng-repeat-end data-drop="canDropOnAddSubtodoRow(entry)" class="view-todos--tr-todo-item view-todos--tr-todo-item__add-todo todo-items-list__row--add-subtodo" data-ng-class="{\'todo-items-list__row--drop-blocked\': isDropBlockedForAddSubtodoRow(entry)}" data-parent-todo-id="{{entry.parentTodoId}}" data-parent-todo-list-id="{{entry.parentTodoListId}}" jqyoui-droppable="addSubtodoRowDragDropConfigs.droppableSettings" data-jqyoui-options="addSubtodoRowDragDropConfigs.droppableOptions" data-ng-click="newSubtodoOnBottomFromAddRow($event)"> <td></td> <td colspan="100"> <div class="todo-items-list__main-column-inner" data-ng-style="entry.depth > 0 ? {\'padding-left\': (entry.depth * 28) + \'px\'} : null"> <button type="button" class="button clean view-todos--button-add-task"> <span class="icon-plus4"></span> <span>{{ \'todos.add_subtodo\' | translate }}</span> </button> </div> </td> </tr> <tr data-ng-if="shouldShowAddRow()" data-drop="canEditTodos" class="view-todos--tr-todo-item view-todos--tr-todo-item__add-todo" jqyoui-droppable="addRowDragDropConfigs.droppableSettings" data-jqyoui-options="addRowDragDropConfigs.droppableOptions" data-ng-click="newTodoOnBottom(getTodoList().id, parentTodoId, $event)"> <td></td> <td colspan="100"> <button class="button clean view-todos--button-add-task"> <span class="icon-plus4"></span> <span>{{ \'todos.add_todo\' | translate }}</span> </button> </td> </tr> '),
17$templateCache.put("views/directives/todo-project-permissions-form.html",'<div class="todo-project-permissions-form"> <p class="todo-project-permissions-form__intro" data-ng-if="showIntro"> {{ \'todo_permissions.intro\' | translate }} </p> <div class="todo-project-permissions-form__block" data-ng-repeat="section in sections track by section.titleKey"> <p class="todo-project-permissions-form__group"> {{ section.titleKey | translate }} </p> <div class="todo-project-permissions-form__row" data-ng-repeat="field in section.fields track by field.key"> <div class="todo-project-permissions-form__label"> <span>{{ \'todo_permissions.fields.\' + field.key | translate }}</span> <span class="icon-info light-grey-color" data-ng-if="fieldHint(field)" data-tooltip-html="fieldHint(field)" data-tooltip-append-to-body="true"></span> </div> <div class="todo-project-permissions-form__control"> <select data-ng-model="permissions[field.key]" data-ng-disabled="!canEdit" data-options="audienceOptions[fieldOptionKey(field.key)]" data-selectize="{\r\n                            valueField: \'id\',\r\n                            labelField: \'name\',\r\n                            searchField: \'name\',\r\n                            dropdownParent: \'body\'\r\n                        }"></select> </div> </div> </div> <!--    <div class="todo-project-permissions-form__actions"--> <!--         data-ng-if="showRestoreAccountDefault">--> <!--        <button type="button"--> <!--                class="button button&#45;&#45;link"--> <!--                data-ng-click="restoreAccountDefault()"--> <!--                data-ng-disabled="!canEdit">--> <!--            {{ \'todo_permissions.restore_account_default\' | translate }}--> <!--        </button>--> <!--    </div>--> </div> '),$templateCache.put("views/directives/todo-tag-picker.html",'<div class="todo-tag-picker" data-ng-class="{\r\n        \'todo-tag-picker--dropdown\': isDropdown,\r\n        \'todo-tag-picker--panel\': isPanel,\r\n        \'todo-tag-picker--disabled\': disabled,\r\n        \'todo-tag-picker--editing\': editorTag\r\n     }"> <a data-ng-if="isDropdown" class="todo-tag-picker__trigger" data-ng-class="{ \'view-todo-edit--empty\': !hasSelectedTags() }" data-ng-click="togglePanel($event)"> <span data-ng-if="!hasSelectedTags()">{{ \'todos.edit.empty\' | translate }}</span> <span data-ng-repeat="tag in selectedTags track by tag.id" class="todo-tag-picker__chip todo-tag-picker__chip--readonly" data-ng-style="tag.color | entityColorChip"> <span>{{ tag.name }}</span> </span> </a> <div class="todo-tag-picker__panel" data-ng-if="isPanel || isPanelOpen"> <input type="text" class="todo-tag-picker__search" data-ng-model="draft.name" data-ng-focus="closeTagEditor()" data-ng-keydown="onQueryKeydown($event)" placeholder="{{ \'todos.tags.search_placeholder\' | translate }}"> <div class="todo-tag-picker__catalog" data-ng-class="{\'is-editing\': editorTag}"> <div class="todo-tag-picker__empty" data-ng-if="!catalog.length && !canCreateFromQuery()"> {{ \'todos.tags.empty_catalog\' | translate }} </div> <div class="todo-tag-picker__option" data-ng-repeat="tag in catalog | filter:{ name: draft.name } | orderBy: \'name\' track by tag.id" data-ng-class="{\r\n                    \'is-selected\': isSelected(tag),\r\n                    \'is-editing\': isEditingTag(tag)\r\n                 }" data-ng-click="toggleTag(tag)"> <input type="checkbox" class="todo-tag-picker__checkbox" data-ng-checked="isSelected(tag)" tabindex="-1"> <span class="todo-tag-picker__swatch" data-ng-style="{\'background-color\': tag.color}"></span> <span class="todo-tag-picker__name">{{ tag.name }}</span> <button type="button" class="todo-tag-picker__highlight" data-ng-class="{\'is-on\': isHighlighted(tag)}" title="{{ (isHighlighted(tag) ? \'todos.tags.unhighlight\' : \'todos.tags.highlight\') | translate }}" data-ng-click="toggleHighlight(tag, $event)"> <span data-ng-class="isHighlighted(tag) ? \'icon-star-full\' : \'icon-star-empty\'"></span> </button> <button type="button" class="todo-tag-picker__caret" data-ng-if="canManageCatalog()" title="{{ \'todos.tags.edit\' | translate }}" data-ng-click="toggleTagEditor(tag, $event)"> <span class="icon-angle-right"></span> </button> <div class="todo-tag-picker__editor" data-ng-if="isEditingTag(tag)" data-ng-click="$event.stopPropagation()"> <input type="text" class="todo-tag-picker__editor-name" data-ng-model="draft.editName" data-ng-keydown="onEditorNameKeydown($event, tag)" data-ng-blur="saveEditorName(tag)" placeholder="{{ \'todos.tags.name_placeholder\' | translate }}"> <div class="entity-color-picker entity-color-picker__palette"> <button type="button" class="entity-color-picker__swatch" data-ng-repeat="paletteColor in palette track by paletteColor" data-ng-class="{\'is-selected\': tag.color === paletteColor}" data-ng-style="{\'background-color\': paletteColor}" data-ng-click="selectEditorColor(paletteColor)"> </button> </div> <button type="button" class="todo-tag-picker__delete" data-ng-click="deleteC
17atalogTag(tag)"> {{ \'todos.tags.delete\' | translate }} </button> </div> </div> </div> <button type="button" class="todo-tag-picker__create-button" data-ng-if="canCreateFromQuery()" data-ng-click="createTag()"> <span class="icon-plus4"></span> <span>{{ \'todos.tags.create_named\' | translate:{ name: draft.name } }}</span> </button> </div> </div> '),$templateCache.put("views/directives/training-tour-trigger.html",'<div class="training-tour-trigger" data-ng-if="visible" data-training="training-tour-trigger"> <button type="button" class="button clean training-tour-trigger__button" data-ng-click="startTour()" data-tooltip="{{ \'training.tour_trigger_tooltip\' | translate }}" data-tooltip-placement="left"> <span class="icon-help_outline"></span> </button> </div> '),$templateCache.put("views/directives/upgrade-plan-price.html",'<div class="directive-upgrade-plan-price--container"> <span class="directive-upgrade-plan-price--container__plan-name"> <span>{{plan.name}}</span> <span data-ng-if="showInterval"> <span data-ng-if="interval === \'month\'">{{ \'directives.upgrade_plan_price.monthly\' | translate }}</span> <span data-ng-if="interval === \'year\'">{{ \'directives.upgrade_plan_price.yearly\' | translate }}</span> </span> </span> <span class="directive-upgrade-plan-price--container__plan-description" data-ng-if="showDescription"> {{plan.description | translate}} </span> <div class="directive-upgrade-plan-price--container__price-disabled" data-ng-if="priceTotal === null"> <div data-ng-if="plan.users_limit"> {{ \'directives.upgrade_plan_price.max_users\' | translate:{limit: plan.users_limit} }} </div> <div data-ng-if="!plan.users_limit"> {{ (interval === \'month\' ? \'directives.upgrade_plan_price.monthly\' : \'directives.upgrade_plan_price.yearly\') | translate }} {{ \'directives.upgrade_plan_price.unavailable\' | translate }} </div> </div> <div class="directive-upgrade-plan-price--container__price" data-ng-if="priceTotal !== null"> <div class="directive-upgrade-plan-price--container__price-unit"> <span data-ng-if="plan.show_currency" class="currency">{{currency | currencySymbol}}</span> <span class="directive-upgrade-plan-price--container__price-unit-value"> <strong data-ng-if="plan.price.charge_type === \'fixed\'">{{pricePerMonth | moneyOnlyAmount: false}}</strong> <strong data-ng-if="plan.price.charge_type === \'per_user\'">{{priceUnit | moneyOnlyAmount: false}}</strong> <strong data-ng-if="plan.price.charge_type === \'free\'">0</strong> </span> <span class="directive-upgrade-plan-price--container__price-unit-label" data-ng-bind-html="plan.unit | translate"></span> </div> </div> <div class="directive-upgrade-plan-price--container__after-price"> <div class="directive-upgrade-plan-price--container__plan-label" data-ng-bind-html="plan.label | translate"></div> <div data-ng-if="!plan.is_free"> <div class="directive-upgrade-plan-price--container__price-total" data-ng-if="showTotal"> <span data-ng-if="showTotalPerMonth"> <span>{{ \'directives.upgrade_plan_price.total_per_month\' | translate:{symbol: (currency | currencySymbol), amount: (pricePerMonth | moneyOnlyAmount:false)} }}</span> </span> <span data-ng-if="!showTotalPerMonth"> <span data-ng-if="interval === \'month\'"> {{ \'directives.upgrade_plan_price.total_per_month\' | translate:{symbol: (currency | currencySymbol), amount: (priceTotal | moneyOnlyAmount:false)} }} </span> <span data-ng-if="interval !== \'month\'"> {{ \'directives.upgrade_plan_price.total_per_year\' | translate:{symbol: (currency | currencySymbol), amount: (priceTotal | moneyOnlyAmount: false)} }} </span> </span> <span>{{getQuantityUsersDescription(plan)}}</span> </div> <div class="directive-upgrade-plan-price--container__price-interval"> {{ (interval === \'month\' ? \'directives.upgrade_plan_price.billed_monthly\' : \'directives.upgrade_plan_price.billed_yearly\') | translate }} </div> <a class="link-dashed directive-upgrade-plan-price--container__price-tiers-link" data-ng-if="priceTiers.length" data-tooltip-html="priceTiersTooltip" data-tooltip-class="tooltip-upgrade-plan-price-tiers"> {{ \'directives.upgrade_plan_price.volume_discounts_above\' | translate:{ count: priceTiersThreshold } }} </a>
17 <!--            <span data-ng-if="interval === \'year\'"--> <!--                  class="directive-upgrade-plan-price&#45;&#45;container__price-flag-annual">--> <!--                <span class="icon-auto_awesome"></span>20% OFF--> <!--            </span>--> </div> </div> </div> '),$templateCache.put("views/directives/users-invite-bulk-directive.html",'<div class="directive-user-invite-bulk"> <div class="directive-user-invite-bulk--emails-section"> <label data-ng-if="type === \'onboarding\'"> {{ \'users.edit.invite-bulk.onboarding_label\' | translate }} </label> <label data-ng-if="type === \'invite-bulk\'"> {{ \'users.edit.invite-bulk.emails_label\' | translate }} </label> <sub>{{ \'users.edit.invite-bulk.emails_sub\' | translate }}</sub> <textarea placeholder="{{placeholderEmail}}" data-ng-model="form.emails" data-ng-change="onChangeEmailField()" data-ng-blur="parseEmails()" data-ng-disabled="saving" title="{{ \'users.edit.invite-bulk.emails_title\' | translate }}"></textarea> <sub data-ng-if="invalidEmails.length > 0" class="has-error"> {{ \'users.edit.invite-bulk.invalid_emails\' | translate:{emails: invalidEmail
17s.join(\', \')} }} </sub> </div> <div data-ng-if="isVisibleRoles"> <label>{{ \'users.edit.invite-bulk.permission_label\' | translate }}</label> <select data-ng-model="form.role" data-options="$permissionService.getRoles()" data-ng-disabled="!$permissionService.hasPrivilegesToChangeUserPermissions()" data-selectize="{\r\n                    labelField: \'name\',\r\n                    valueField: \'id\',\r\n                    sortField: \'name\',\r\n                    searchField: \'name\',\r\n                    dropdownParent: \'body\',\r\n                    render: $permissionService.renderRoles,\r\n                    placeholder: $permissionService.getRoleName(\'regular\')\r\n        }"></select> </div> <div data-ng-if="inviteUsers.length > 0" class="directive-user-invite-bulk--processed-container"> <sup>{{ \'users.edit.invite-bulk.processed_emails\' | translate }}</sup> <ul> <li data-ng-repeat="user in inviteUsers"> <span>{{user.email}}</span> – <strong class="directive-user-invite-bulk--status" data-ng-class="{\r\n                        \'green-color\': user.status === \'saved\',\r\n                        \'has-error\': user.status === \'failed\' }"> {{ \'users.edit.invite-bulk.status.\' + user.status | translate}} </strong> </li> </ul> </div> </div> '),$templateCache.put("views/directives/users-teams-assignee-picker.html",'<div class="users-teams-assignee-picker"> <div data-spinner-loading-modal="isLoadingAssignments"> <div class="users-teams-assignee-picker--header" data-ng-if="canManage"> <div> <button class="button clean" data-dropdown="users-teams-assignee-picker--dropdown-available-{{instanceId}}" data-ng-click="loadAvailable()"> <span class="icon-plus4"></span> <span>{{ \'users.assigned.button_assign\' | translate }}</span> </button> </div> <div data-ng-if="showBulkActions"> <button class="button clean" data-dropdown="users-teams-assignee-picker--dropdown-options-{{instanceId}}"> <span>{{ \'users.assigned.button_actions\' | translate }}</span> <span class="icon-angle-down"></span> </button> <div id="users-teams-assignee-picker--dropdown-options-{{instanceId}}" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list" data-top="33" data-left="-160" dropdown-close-on-click> <div class="dropdown-option option-button"> <a class="red-color-on-hover" data-ng-click="requestRemoveAll()"> <span>{{ \'users.assigned.clear_all\' | translate }}</span> </a> </div> </div> </div> </div> <div class="explanation radius users-teams-assignee-picker--auto-assign-note" data-ng-if="showAutoAssign && user.auto_assign_new_users"> <span>{{ \'users.assigned.auto_assign_active\' | translate:{ name: (user.name | firstname) } }}</span> <a class="link-dashed light-blue-on-hover bolder" data-ng-if="canManage" data-ng-click="requestToggleAutoAssign()">{{ \'users.assigned.button_deactivate\' | translate }}</a> </div> <div data-ng-if="isEmptyAssignments()" class="steel-color center bolder users-teams-assignee-picker--empty"> <span class="steel-color">{{ (emptyListLabel || \'users.assigned.empty_list\') | translate }}</span> </div> <div class="users-teams-assignee-picker--assignee-chips" data-ng-if="!isEmptyAssignments() && isChipsLayout()"> <div class="users-teams-assignee-picker--assignee-chips__search" data-ng-if="showSearch"> <input type="search" data-ng-model="filter.searchAssignee" placeholder="{{ \'users.assigned.filter_placeholder\' | translate }}" autofocus> </div> <div class="users-teams-assignee-picker--assignee-chips__group" data-ng-if="assignments.users.length > 0"> <div class="users-teams-assignee-picker--assignee-chips__wrap"> <div class="users-teams-assignee-picker--member-item radius" data-ng-repeat="assignee in assignments.users | filter: { name: filter.searchAssignee } | orderBy: \'name\'"> <div data-user-avatar data-name="{{ assignee.name }}" data-photo-url="assignee.profile_photo_url" data-size="sm" class="users-teams-assignee-picker--member-item__avatar"> </div> <span data-ng-bind-html="assignee.name | highlight: filter.searchAssignee"></span> <a data-ng-if="canManage" data-ng-click="removeAssignee(assignee, \'users\')" class="icon-cross" title="{{ \'users.assigned.remove_assignment\' | translate }}"></a> <span data-ng-if="!canManage" class="icon-lock_outline steel-color"></span> </div> </div> </div> <div class="users-teams-assignee-picker--assignee-chips__group" data-ng-if="assignments.teams.length > 0"> <div class="users-teams-assignee-picker--assignee-chips__wrap"> <div class="users-teams-assignee-picker--member-item radius users-teams-assignee-picker--member-item--team" data-ng-repeat="assignee in assignments.teams | filter: { name: filter.searchAssignee } | orderBy: \'name\'"> <span class="bolder" data-ng-bind-html="assignee.name | highlight: filter.searchAssignee"></span> <span class="users-teams-assignee-picker--member-item__team-count steel-color"> {{ \'users.assigned.members_count\' | translate:{ count: assignee.total_members || 0 } }}
17 </span> <a data-ng-if="canManage" data-ng-click="removeAssignee(assignee, \'teams\')" class="icon-cross" title="{{ \'users.assigned.remove_assignment\' | translate }}"></a> <span data-ng-if="!canManage" class="icon-lock_outline steel-color"></span> </div> </div> </div> </div> <div class="list-minimal users-teams-assignee-picker--assignee-table" data-ng-if="!isEmptyAssignments() && !isChipsLayout()"> <table> <tbody data-ng-if="showSearch"> <tr class="list-minimal--search__tr"> <td colspan="4"> <input type="search" data-ng-model="filter.searchAssignee" placeholder="{{ \'users.assigned.filter_placeholder\' | translate }}" autofocus> </td> </tr> </tbody> <tbody data-ng-repeat="schema in [\'teams\', \'users\']"> <tr data-ng-repeat="assignee in assignments[schema] | filter: { name: filter.searchAssignee } | orderBy: \'name\'"> <td> <div class="user-list-item--identity" data-ng-if="schema === \'users\'"> <div data-user-avatar data-name="{{ assignee.name }}" data-photo-url="assignee.profile_photo_url" data-size="sm"> </div> <span class="users-teams-assignee-picker--assignee-table__title" data-ng-bind-html="assignee.name | highlight: filter.searchAssignee"></span> </div> <span data-ng-if="schema === \'teams\'"> <span class="users-teams-assignee-picker--assignee-table__title" data-ng-bind-html="assignee.name | highlight: filter.searchAssignee"></span> <span class="flag-v2 grey-bgcolor users-teams-assignee-picker--assignee-table__team-count"> {{ \'users.assigned.members_count\' | translate:{ count: assignee.total_members } }} </span> </span> </td> <td style="text-align: right;"> <a data-ng-if="!canManage" class="disabled steel-color red-color-on-hover light-grey-bgcolor-on-hover radius"> <span class="icon-lock_outline"></span> </a> <a class="steel-color light-blue-on-hover light-grey-bgcolor-on-hover radius" data-dropdown="users-teams-assignee-picker--dropdown-{{instanceId}}-{{schema}}-{{assignee.id}}" data-ng-if="canManage"> <span class="icon-angle-down"></span> </a> <div id="users-teams-assignee-picker--dropdown-{{instanceId}}-{{schema}}-{{assignee.id}}" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list dropdown-right" data-top="35" data-left="-160" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="removeAssignee(assignee, schema)" class="red-color-on-hover"> {{ \'users.assigned.remove_assignment\' | translate }} </a> </div> </div> </td> </tr> </tbody> </table> </div> </div> <div id="users-teams-assignee-picker--dropdown-available-{{instanceId}}" data-dropdown-content data-dropdown-append-to-body="true" data-dropdown-disabled-close data-top="35" class="f-dropdown content users-teams-assignee-picker--dropdown-available__container"> <div> <div> <div button-toggle-inline="" data-options="tabOptions" ng-model="availableTab"> </div> </div> </div> <div data-spinner-loading-modal="isLoadingAvailable"> <div data-ng-if="available[availableTab].length === 0" class="steel-color center bolder users-teams-assignee-picker--empty"> <span class="steel-color" data-ng-if="availableTab === \'users\'"> {{ \'users.assigned.all_assigned_users\' | translate }} </span> <span class="steel-color" data-ng-if="availableTab === \'teams\'"> {{ \'users.assigned.all_assigned_teams\' | translate }} </span> </div> <div class="users-teams-assignee-picker--dropdown-available__table" data-ng-if="available[availableTab].length > 0"> <div class="users-teams-assignee-picker--table-search"> <input type="search" data-ng-model="filter.searchAvailable" placeholder="{{ (availableTab === \'users\' ? \'users.assigned.filter_users_placeholder\' : \'users.assigned.filter_teams_placeholder\') | translate }}" autofocus> </div> <table> <tr data-ng-repeat="assignee in available[availableTab] | filter: { name: filter.searchAvailable }"> <td> <div class="user-list-item--identity" data-ng-if="availableTab === \'users\'"> <div data-user-avatar data-name="{{ assignee.name }}" data-photo-url="assignee.profile_photo_url" data-size="sm"> </div> <span class="users-teams-assignee-picker--dropdown-available__name" data-ng-bind-html="assignee.name | highlight: filter.searchAvailable"></span> </div> <span data-ng-if="availableTab === \'teams\'"> <span class="users-teams-assignee-picker--dropdown-available__name" data-ng-bind-html="assignee.name | highlight: filter.searchAvailable"></span> <span class="flag-v2 grey-bgcolor"> {{ \'users.assigned.members_count\' | translate:{ count: assignee.total_members } }}
17 </span> </span> </td> <td> <div class="users-teams-assignee-picker--dropdown-available__status_saved" data-ng-show="assignee.addStatus === \'saved\'"> <button class="button clean"> <span class="green-color">{{ \'users.assigned.status_saved\' | translate }}</span> </button> </div> <div data-ng-show="assignee.addStatus === \'saving\'"> <button disabled="disabled" class="button clean"> <span>{{ \'users.assigned.status_saving\' | translate }}</span> </button> </div> <div data-ng-show="!assignee.addStatus"> <button class="button clean" data-ng-click="addAssignee(assignee, availableTab)"> <span>{{ \'users.assigned.button_assign_item\' | translate }}</span> </button> </div> </td> </tr> </table> </div> <div class="users-teams-assignee-picker--dropdown-available__buttons"> <div> <button class="button clean" dropdown-close-on-click> {{ \'users.assigned.button_close\' | translate }} </button> </div> <div data-ng-if="showAutoAssign && availableTab === \'users\'"> <button class="button clean" data-ng-if="available.users.length > 0" data-ng-click="requestAssignAll()"> {{ \'users.assigned.button_assign_all_users\' | translate }} </button> <button class="button clean" data-ng-if="available.users.length === 0 && !user.auto_assign_new_users" data-ng-click="requestToggleAutoAssign()"> {{ \'users.assigned.button_activate_future_users\' | translate }} </button> </div> </div> </div> </div> </div> '),$templateCache.put("views/teams/teams-add-users.html",'<style> .view-projects-add-users table {\r\n        margin-bottom: 0;\r\n    }\r\n    .view-projects-add-users .add-status {\r\n        font-weight: bolder;\r\n        font-size: 14px;\r\n        margin-right: 7px;\r\n    } </style> <div class="view-projects-add-users"> <div class="modal-header"> <h1>{{ \'teams.add_users.title\' | translate }}</h1> <div>{{ \'teams.add_users.team_label\' | translate }} <strong>{{team.name}}</strong></div> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body" data-spinner-loading-modal="loading"> <!--        <div data-spinner-loading="loading" data-message="Buscando usuários..." style="margin-top: 40px; margin-bottom: 30px;"></div>--> <div> <div data-ng-if="users_available.length == 0" style="text-align: center; margin: 30px"> {{ \'teams.add_users.all_members\' | translate }} </div> <div class="list-minimal" data-ng-if="users_available.length > 0"> <table> <tr class="list-minimal--search__tr"> <td colspan="2"> <input type="search" data-ng-model="search" placeholder="{{ \'teams.add_users.search_placeholder\' | translate }}" autofocus> </td> </tr> <tr data-ng-repeat="user in users_available | filter: search"> <td> <div class="user-list-item--identity"> <div data-user-avatar data-name="{{ user.name }}" data-photo-url="user.profile_photo_url" data-size="sm"> </div> <div> <div class="bolder" style="padding-bottom: 4px; padding-top: 2px" data-ng-bind-html="user.name | highlight: search"></div> <div class="details" data-ng-bind-html="user.email | highlight: search"></div> </div> </div> </td> <td style="text-align: right; width: 140px;"> <div data-ng-switch="user.add_status"> <div data-ng-switch-when="adding" class="add-status grey-color"> <span>{{ \'teams.add_users.adding\' | translate }}</span> </div> <div data-ng-switch-when="added" class="add-status grey-color"> <span class="green-color">{{ \'teams.add_users.added\' | translate }}</span> </div> <div data-ng-switch-default> <a class="button clean" data-ng-click="add_user(user)"> <span>{{ \'teams.add_users.add\' | translate }}</span> </a> </div> </div> </td> </tr> </table> </div> </div> <div class="modal--bottom-permission-note"> <span class="icon-lock_outline"></span> <span>{{ \'teams.add_users.admin_only\' | translate }}</span> </div> </div> <div class="modal-footer"> <div class="row"> <div class="column-70" style="text-align: left;"> <div data-ng-if="$permissionService.hasPrivilegesToCreateUsers()"> <button class="button clean" data-ng-click="invite_user()"> <span class="icon-plus4" style="font-size: 14px; margin-right: 4px;"></span> <span>{{ \'teams.add_users.invite_users\' | translate }}</span> </button> </div> </div> <div class="column-30"> <button class="button clean" data-ng-click="close()">{{ \'teams.add_users.finish\' | translate }}</button> </div> </div> </div> </div> '),$templateCache.put("views/teams/teams-edit.html",'<!--<style>--> <!--\t/*.members-list-edit { margin-top: 10px; }*/--> <!--\t.members-list-edit .flag {padding: 3px 5px;\tfont-size: 13px; margin-bottom: 8px; margin-right: 8px; background-color: #fff; border: solid 1px #ddd; color: #333; }--> <!--\t.members-list-edit .icon-close { font-size: 10px; color: #aaa; margin-left: 2px; position: inherit; }--> <!--</style>--> <div class="modal-header"> <h1>{{ team.id ? (\'teams.edit.title_edit\' | translate) : (\'teams.edit.title_new\' | translate) }}</h1> <a class="icon-cross" data-ng-click="close()"></a> </div>
17 <div class="modal-body" data-on-click-enter="save()"> <div class="row"> <div class="column-100"> <div> <label>{{ \'teams.edit.name_label\' | translate }}</label> </div> <input type="text" data-ng-model="team.name" autofocus> </div> </div> <div class="modal--bottom-permission-note"> <span class="icon-lock_outline"></span> <span>{{ \'teams.edit.admin_only\' | translate }}</span> </div> </div> <div class="modal-footer"> <button class="button clean" data-ng-click="close()" data-ng-if="!saving" style="margin-right: 5px;">{{ \'teams.edit.cancel\' | translate }}</button> <button class="button button--blue-brand" data-ng-click="save()" data-ng-disabled="!team.name || saving">{{ saving ? (\'teams.edit.saving\' | translate) : (\'teams.edit.save\' | translate)}}</button> </div> '),$templateCache.put("views/teams/teams-is-premium.html",'<div class="view radius content-register-edit"> <div class="row" style="margin-bottom: 30px;"> <h1>Equipes</h1> </div> <div class="explanation premium radius"> <strong>Gerenciar usuários em equipes não está disponível na versão grátis do Rabbiit.</strong> <a class="link underline" app-href="#/upgrade">Faça upgrade do seu plano</a> para ativar gerenciamento em equipes. </div> </div>'),$templateCache.put("views/teams/teams.html",'<div class="view radius content-register-edit view-teams"> <div class="row" style="margin-bottom: 30px;"> <div class="column-60 view-content-account--header-container"> <h1>{{ \'teams.title\' | translate }}</h1> </div> <span data-flag-upgrade-required="TEAMS" data-show-long-description="true" data-custom-description="{{ \'teams.upgrade_description\' | translate }}" style="margin-top: 5px"></span> <div class="column-40"> <ul class="toolbar right"> <li> <button data-ng-click="editTeam()" class="button button--blue-brand" data-ng-if="::$permissionService.hasPrivilegesToEditTeams()"> <span class="icon-plus4"></span> <span>{{ \'teams.create\' | translate }}</span> </button> </li> </ul> </div> </div> <div class="explanation empty-state" data-ng-if="teams.length == 0"> <h3>{{ \'teams.no_teams\' | translate }}</h3> </div> <div class="list-minimal" data-ng-if="teams.length > 0"> <table> <tbody> <tr class="list-minimal--search__tr"> <td colspan="2"> <input type="search" data-ng-model="search.name" data-ng-change="filterTeams()" placeholder="{{ \'teams.search_placeholder\' | translate }}" autofocus> </td> </tr> <tr data-ng-repeat="team in teamsFiltered" data-ng-class="{selected:type.checked}"> <td class="view-teams--team-container"> <div class="view-teams--team-container__header"> <div> <a title="{{ \'teams.options.title\' | translate }}" data-dropdown="view-teams--dropdown-team-options" data-ng-click="selectTeam(team)" class="light-blue-on-hover view-teams--team-options"> <span class="icon-angle-down"></span> </a> </div> <div> <a class="bolder" data-ng-click="editTeam(team)" data-ng-bind-html="team.name | highlight: search.name"></a> </div> <span class="view-teams--team-container__count">{{ \'teams.members_count\' | translate:{count: team.total_members} }}</span> </div> <div class="view-teams--team-container__content"> <div class="view-teams--team-container__add-members" data-ng-if="::$permissionService.hasPrivilegesToEditTeams()"> <a class="link link-small" data-ng-click="addMembers(team)">{{ \'teams.add_members_link\' | translate }}</a> </div> <div class="view-teams--team-container__members" data-ng-if="team.users.length > 0"> <div class="view-teams--team-container__member-item radius" data-ng-repeat="user in team.users"> <div data-user-avatar data-name="{{ user.name }}" data-photo-url="user.profile_photo_url" data-size="sm" class="view-teams--team-container__member-avatar"> </div> <span data-tooltip-html="\'\r\n                                    <strong>{{user.name}}</strong>\r\n                                    <br>\r\n                                    <span>{{user.email}}</span>\r\n                                    \'"> <span data-ng-bind-html="user.name | highlight: search.name"></span> <span data-ng-if="!user.active" class="view-teams--team-container__archived">{{ \'teams.archived\' | translate }}</span> </span> <a data-ng-if="::$permissionService.hasPrivilegesToEditTeams()" data-dropdown="view-teams--dropdown-remove-member" data-ng-click="selectTeamMember(team, user)" class="icon-cross" title="{{ \'teams.remove_member.title\' | translate }}"></a> </div> </div> <div data-ng-if="team.assigned_to.length > 0" class="view-teams--team-container__assigned_to"> {{ \'teams.assigned_to\' | translate }} <span data-ng-repeat="manager in team.assigned_to"> <span data-ng-if="$index > 0">{{$last ? (\'teams.and\' | translate) : \',\'}}</span> <span data-ng-bind-html="manager.name | highlight: search.name "></span> <span data-ng-if="!manager.active">{{ \'teams.archived\' | translate }}</span> </span> </div> <div class="view-teams--timesheet-submitter-badge" data-ng-if="team.timesheet_submission_configured"> <span class="icon-flag2"></span> {{ \'teams.timesheet_submission_configured\' | translate }} </div> </div> </td> </tr> </tbody> </table> <div data-ng-if="teamsFiltered.length == 0" class="view-teams--empty-message"> <span data-ng-bind-html="\'teams.empty_search\' | translate:{search: search.name}"></span> </div> </div>
17 <div id="view-teams--dropdown-team-options" data-dropdown-content class="f-dropdown dropdown-option-list" data-dropdown-close-on-click data-top="20" data-dropdown-append-to-body="true"> <div class="dropdown-option option-button"> <a data-ng-click="editTeam(selectedTeam)"> <span>{{ \'teams.options.edit_name\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="addMembers(selectedTeam)"> <span>{{ \'teams.options.add_members\' | translate }}</span> </a> </div> <div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="removeTeam(selectedTeam)" class="red-color-on-hover"> {{ \'teams.options.delete_team\' | translate }} </a> </div> </div> </div> <div id="view-teams--dropdown-remove-member" data-dropdown-content data-top="20" data-left="-160" data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list view-teams--dropdown-remove-member"> <div class="view-teams--dropdown-remove-member__message"> <span data-ng-bind-html="\'teams.remove_member.confirm_message\' | translate:{user: selectedMember.name, team: selectedTeam.name}"></span> </div> <div class="view-teams--dropdown-remove-member__buttons"> <div> <button class="button clean" data-ng-click="closeRemoveMember($event)"> {{ \'teams.remove_member.cancel\' | translate }} </button> </div> <div> <button class="button red" data-ng-click="removeMember(selectedTeam, selectedMember, $event)" data-ng-disabled="selectedMember.is_deleting"> {{ selectedMember.is_deleting ? (\'teams.remove_member.removing\' | translate) : (\'teams.remove_member.remove\' | translate) }} </button> </div> </div> </div> </div> '),$templateCache.put("views/time-clock/configuration-pontomais.html",'<div class="view radius content-register-edit"> <div class="row"> <h1> <span>Pontomais</span> <span class="flag yellow-color" style="font-size: 16px; margin-left: 10px; position: relative; top: -3px;" if-has-not-feature="TIME_CLOCK_INTEGRATION">UPGRADE</span> </h1> <p style="line-height: 1.8em; font-size: 14px; margin-bottom: 30px; margin-top: 10px; color: #6a6a6a;"> </p><div>Pontomais - Controle de ponto online.</div> <a class="link underline" href="https://pontomais.com.br/" target="_blank">https://pontomais.com.br/</a> <p></p> </div> <!--    <div class="explanation premium radius" data-ng-if="$subscriptionService.isFree()" style="margin-bottom: 25px; margin-top: 0">--> <div class="explanation premium radius" if-has-not-feature="TIME_CLOCK_INTEGRATION" style="margin-bottom: 25px; margin-top: 0"> A integração com software de ponto não esta disponível no seu plano. Contate nossa equipe de vendas. <!--        <a class="link underline" app-href="#/upgrade"> Faça upgrade do seu plano</a> para ativar a integração.--> </div> <div style="margin-top: 20px;"> <h3 style="margin-bottom: 10px;">Autenticação e configuração</h3> <div class="row"> <div class="column-80"> <label>Token</label> <input type="text" data-ng-model="$settingsService.settings.integration_time_clock_pontomais_token" autofocus> </div> </div> <div class="row"> <div class="column-30"> <label>A partir da data (opcional)</label> <input type="text" data-ng-mask="date" data-ng-model="$settingsService.settings.integration_time_clock_pontomais_allowed_after_date"> </div> </div> <div style="margin-top: 15px;"> <!--\t\t\t<div  data-ng-show="!$subscriptionService.isFree()" data-ng-switch="$settingsService.settings.integration_time_clock_active">--> <div if-has-feature="TIME_CLOCK_INTEGRATION" data-ng-switch="$settingsService.settings.integration_time_clock_active"> <button data-ng-switch-when="pontomais" type="button" class="button button--blue-brand" data-ng-click="save()" data-ng-disabled="saving"> {{ saving ? \'Atualizando...\' : \'Atualizar\' }} </button> <button data-ng-switch-default type="button" class="button button--blue-brand" data-ng-click="activate()" data-ng-disabled="enabling"> {{ enabling ? \'Ativando...\' : \'Ativar integração\'}} </button> </div> <!--            <div data-ng-show="$subscriptionService.isFree()" style="margin-bottom: 10px;">--> <!--                <a class="button clean" style="font-size: 13px;" app-href="#/upgrade"> <span class="icon-fire"></span> Ativar integração </a>--> <!--            </div>--> </div> </div> <div data-ng-if="$settingsService.settings.integration_time_clock_active == \'pontomais\'"> <hr style="margin: 30px 0"> <div class="row"> <div class="explanation clean"> <h3>Desativar esta integração</h3> Para parar a sincronização clique no botão DESATIVAR abaixo. <div> <button type="button" class="button red" style="margin-top: 10px" data-ng-click="deactivate()" data-ng-disabled="disabling">{{ disabling ? \'Desativando...\' : \'Desativar\' }}</button> </div> </div> </div> </div> </div> '),
18$templateCache.put("views/time-clock/configuration.html",'<div class="view radiu
18s content-register-edit"> <h1 style="margin-bottom: 10px;"> <span>Integração com ponto eletrônico</span> <span class="flag yellow-color" style="font-size: 16px; margin-left: 10px; position: relative; top: -3px;" if-has-not-feature="TIME_CLOCK_INTEGRATION"> RECURSO ADICIONAL </span> </h1> <p style="line-height: 1.8em; font-size: 14px; margin-bottom: 30px; color: #6a6a6a;"> A integração com software de ponto eletrônico de terceiros permite aos gestores fazer a gestão entre as horas registrada nos projetos e as horas da jornada de trabalho dos funcionários. </p> <!--    <div class="explanation premium radius" data-ng-if="$subscriptionService.isFree()" style="margin-bottom: 25px;">--> <div class="explanation premium radius" style="margin-bottom: 25px;" if-has-not-feature="TIME_CLOCK_INTEGRATION"> A integração com software de ponto não esta disponível no seu plano.<br> Entre em contato para contratar esse recurso adicional. <!--        <a class="link underline" app-href="#/upgrade"> Faça upgrade do seu plano</a> para ativar a integração.--> </div> <div class="list-minimal"> <table> <tbody> <tr> <td colspan="2" style="padding-left: 15px;"> <img src="assets/img/integration/pontomais.png" style="width: 150px;"> </td> <td style="padding: 10px;"> <span class="green-color bolder" data-ng-if="$settingsService.settings.integration_time_clock_active == \'pontomais\'"> Integração ativada </span> </td> <td style="width: 150px; text-align: right;"> <a class="button clean" app-href="#/time-clock/configuration/pontomais"> <span>Configurar</span> </a> </td> </tr> <!--<tr>--> <!--<td style="width: 50px; padding-left: 15px;">--> <!--<img src="assets/img/integration/primeponto.png" style="width: 50px;">--> <!--</td>--> <!--<td>--> <!--<a class="bolder light-blue-on-hover"--> <!--app-href="#/time-clock/configuration/primeponto">Prime ponto</a>--> <!--</td>--> <!--<td style="width: 150px; text-align: right;">--> <!--<span class="green-color bolder"--> <!--data-ng-if="$settingsService.settings.integration_time_clock_active == \'primeponto\'">--> <!--Integração ativada--> <!--</span>--> <!--</td>--> <!--<td style="width: 150px; text-align: right;">--> <!--<a class="button clean"--> <!--app-href="#/time-clock/configuration/primeponto">--> <!--<span>Configurar</span>--> <!--</a>--> <!--</td>--> <!--</tr>--> </tbody> </table> </div> </div> '),$templateCache.put("views/time-clock/divergences-summary.html",'<section class="report-layout-grid report-groups-and-sort-2024 view-time-clock-report-divergences-summary" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <!--<div class="new-layout-report">--> <!--    <div data-ng-include="\'views/reports/report-left-column.html\'"></div>--> <!--    <div class="view layout-content-width layout-content-report">--> <div class="report-topbar"> <!--            <div class="row">--> <div> <h3>Total de divergências com <span style="text-transform: capitalize">{{$settingsService.settings.integration_time_clock_active}}</span></h3> <label class="element-todo-checkbox"> <input type="checkbox" data-ng-check data-ng-model="filter.apiParams.only_with_divergences"> Buscar somente usuários com divergências </label> </div> <div> <button class="button clean radius" title="Exportar relatório" data-dropdown="dropdown-export-report"> <span class="icon-download5" style="margin-right: 3px;"></span> Exportar </button> <div id="dropdown-export-report" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <span>Exportar</span> </div> <div class="dropdown-option option-button"> <label data-ng-click="export()"> <span>Exportar para CSV</span> <span class="flag yellow-color" style="margin-left: 10px;" if-has-not-feature="REPORT_EXPORT">UPGRADE</span> </label> </div> </div> </div> <!--            </div>--> </div> <div> <!--            <div data-ng-if="report_list.length == 0">--> <!--                <div spinner-loading="loading_report" class="spinner-loading-report"></div>--> <!--                <div data-ng-if="!loading_report" class="report-none-register">--> <!--                    <div class="icon-zoom-out"></div>--> <!--                    <h3>Não foi encontrado nenhum registro.</h3>--> <!--                    <p>Verifique o filtro realizado e suas permissões da conta.</p>--> <!--                </div>--> <!--            </div>--> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': loading_report && report_list.length === 0 } "> <!--            <div data-ng-if="report_list.length > 0"--> <!--                class="report-list-container"--> <!--                auto-height top="180">--> <!--                <div class="header-background"></div>--> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners"> <!--                <div class="list report-list report-list-container-inner">--> <!--                    <table report-list-width-fix>--> <thead> <tr> <th style="width: 300px;"> <div class="th-inner overflow-ellipsis">Usuário</div> </th> <th style="width: 150px;"> <div class="th-inner overflow-ellipsis">Total de divergências</div> </th> <th> <div class="th-inner"></div> </th> </tr> </thead> <tbody> <tr class="content" data-ng-repeat="row in report_list | orderBy : \'user_name\'"> <td> <span>{{row.user_name}}</span> </td> <td data-ng-class="{ \'light-orange-bgcolor\' : row.total_divergences > 0 }"> <div data-ng-if="row.total_divergences > 0" class="orange-color bolder"> <span>{{row.total_divergences}} dias</span> </div> <div data-ng-if="row.total_divergences == 0" class="grey-color"> <span>nenhuma</span> </div> </td> <td></td> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">Carregando...</span> <span data-ng-if="!loading_report" class="steel-color">Não há mais registros.</span> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> </div> </section> </section> '),$templateCache.put("views/time-clock/sync.html",'<style> .sync-component .filters-column {\r\n        padding-left: 0;\r\n    }\r\n    .sync-component .filters-column label {\r\n        margin-bottom: 10px;\r\n    } </style>
18 <div class="view radius content-register-edit sync-component"> <div> <h3 style="margin-bottom: 20px;">Sincronização com {{$settingsService.get(\'integration_time_clock_active\')}}</h3> <p style="line-height: 1.8em; font-size: 14px; margin-bottom: 30px; color: #6a6a6a;"> Toda madrugada é realizado a sincronização automática com o software de ponto, mantendo sempre os últimos 30 dias atualizados, e durante o dia também são feitas várias sincronizações para buscar horas de jornadas de trabalho do dia corrente. Se precisar de atualização de um período ou em um momento específico, você pode executar a sincronização manual abaixo. </p> <div class="filters-column"> <!--            <div class="row" style="margin-bottom: 10px;">--> <!--                <div class="column-15">--> <!--                    <label>Usuários:</label>--> <!--                </div>--> <!--                <div class="column-35">--> <!--                    <input ng-model="sync.user_id"--> <!--                           data-options="filtered_users"--> <!--                           placeholder="Todos os usuário"--> <!--                           data-selectize="{--> <!--                        labelField: \'name\',--> <!--                        searchField: \'name\',--> <!--                        valueField: \'id\',--> <!--                        sortField: \'name\',--> <!--                        optgroups: [--> <!--                            {id: \'active\', name: \'Usuários ativos\'},--> <!--                            {id: \'archived\', name: \'Usuários arquivados\'}--> <!--                        ],--> <!--                        optgroupField: \'status\',--> <!--                        optgroupLabelField: \'name\',--> <!--                        optgroupValueField: \'id\',--> <!--                        optgroupOrder: [\'active\', \'archived\'],--> <!--                        plugins: [\'remove_button\']--> <!--                    }">--> <!--                </div>--> <!--            </div>--> <!--            <div class="row" style="margin-bottom: 10px;">--> <!--                <div class="column-15">--> <!--                    <label>Intervalo:</label>--> <!--                </div>--> <!--                <div class="column-35">--> <!--                    <select ng-model="sync.interval"--> <!--                            data-options=\'interval_options\'--> <!--                            placeholder="Selecione um intervalo"--> <!--                            class="selectize-keep-default-width"--> <!--                            data-selectize="{--> <!--                                labelField: \'name\',--> <!--                                valueField: \'type\',--> <!--                                onChange: onChangeInterval--> <!--                            }">--> <!--                    </select>--> <!--                </div>--> <!--            </div>--> <!--            <div class="row" style="margin-bottom: 10px;">--> <!--                <div class="column-15">--> <!--                    <label>Período:</label>--> <!--                </div>--> <!--                <div class="column-35">--> <!--                    <div class="row collapse radius date-frame">--> <!--                        <div class="column-15 move-date-container">--> <!--                            <a ng-click="move_previous_date()"--> <!--                               class="move-date">&#9668;</a>--> <!--                        </div>--> <!--                        <div class="column-70 date-display">--> <!--                            <span ng-switch="sync.interval">--> <!--                                <span ng-switch-when="day">--> <!--                                    {{ sync.date_start | moment: "ll" }}--> <!--                                </span>--> <!--                                <span ng-switch-when="month">--> <!--                                    {{ sync.date_start | moment: "MMMM [de] YYYY" }}--> <!--                                </span>--> <!--                                <span ng-switch-default>--> <!--                                    {{ sync.date_start | moment: "DD MMM" }} a--> <!--                                    {{ sync.date_end | moment: "DD MMM" }}--> <!--                                </span>--> <!--                            </span>--> <!--                        </div>--> <!--                        <div class="column-15 move-date-container">--> <!--                            <a ng-click="move_next_date()"--> <!--                               class="move-date">&#9658;</a>--> <!--                        </div>--> <!--                    </div>--> <!--                </div>--> <!--            </div>--> <div class="row" style="margin-bottom: 10px;"> <label>Período para integração</label> <div class="row"> <div class="column-20"> <select ng-model="sync.interval" data-options="interval_options" placeholder="Selecione um intervalo" class="selectize-keep-default-width" data-selectize="{\r\n                                labelField: \'name\',\r\n                                valueField: \'type\',\r\n                                onChange: onChangeInterval\r\n                            }"> </select> </div> <div class="column-35"> <div class="row collapse radius date-frame"> <div class="column-15 move-date-container"> <a ng-click="move_previous_date()" class="move-date">&#9668;</a> </div> <div class="column-70 date-display"> <span ng-switch="sync.interval"> <span ng-switch-when="day"> {{ sync.date_start | moment: "ll" }} </span> <span ng-switch-when="month"> {{ sync.date_start | moment: "MMMM [de] YYYY" }} </span> <span ng-switch-default> {{ sync.date_start | moment: "DD MMM" }} a {{ sync.date_end | moment: "DD MMM" }} </span> </span> </div> <div class="column-15 move-date-container"> <a ng-click="move_next_date()" class="move-date">&#9658;</a> </div> </div> </div> </div> </div> <div class="row" style="margin-bottom: 10px;"> <label>Selecione usuários (opcional)</label> <div class="row"> <div class="column-55"> <input ng-model="sync.user_id" data-options-load="$userService.getUserOptions" data-options-load-trigger="focus" placeholder="Todos os usuário" data-selectize="{\r\n                            labelField: \'name\',\r\n                            searchField: \'name\',\r\n                            valueField: \'id\',\r\n                            sortField: \'name\',\r\n                            plugins: [\'remove_button\']\r\n                        }"> </div> </div> </div> </div> <!--        <div class="row" style="margin-bottom: 20px;">--> <!--            <div class="column-25">--> <!--                <label>Data para atualizar:</label>--> <!--            </div>--> <!--            <div class="column-20">--> <!--                <input type="text"--> <!--                       data-ng-model="sync.date"--> <!--                       datetime="dd/MM/yyyy">--> <!--            </div>--> <!--        </div>--> <div style="margin-bottom: 5px;"> <button type="button" class="button button--blue-brand" data-ng-click="synchronize()" data-ng-disabled="syncing"> {{ syncing ? \'Sincronizando...\' : \'Sincronizar\' }} </button> </div> </div> </div> '),$templateCache.put("views/time-automation/automation-rules-by-user.html",'<section class="report-layout-grid report-groups-and-sort-2024 view-time-clock-report-automation-rules-by-user" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <div class="report-topbar"> <div> <h3>{{ \'timesheet-automation.title\' | translate }}</h3>
18 <button class="button clean radius" title="{{ \'timesheet-automation.create_rule\' | translate }}" data-ng-click="new()"> <span class="icon-plus4 bolder"></span> <span>{{ \'timesheet-automation.create_rule\' | translate }}</span> </button> </div> <div> <button class="button clean radius timesheet-automation-schedule-settings-button" data-ng-if="$settingsService.get(\'integration_time_clock_active\') !== \'pontomais\'" data-ng-attr-title="{{ scheduleSettings.active\r\n                            ? (\'timesheet-automation.schedule_settings.button_tooltip_active\' | translate)\r\n                            : (\'timesheet-automation.schedule_settings.button_tooltip_inactive\' | translate) }}" data-ng-click="openSettings()"> <span class="timesheet-automation-schedule-status-dot" data-ng-if="!scheduleSettingsLoading" data-ng-class="scheduleSettings.active ? \'is-active\' : \'is-inactive\'" aria-hidden="true"></span> <!--                    <span class="icon-cog bolder"></span>--> <span>{{ \'timesheet-automation.schedule_settings.button\' | translate }}</span> </button> <button class="button clean radius" title="{{ \'timesheet-automation.manual_execute\' | translate }}" data-ng-click="openExecute()"> <span class="icon-play3 bolder"></span> <span>{{ \'timesheet-automation.manual_execute\' | translate }}</span> </button> <button class="button clean radius" title="{{ \'timesheet-automation.export\' | translate }}" style="margin-right: 5px;" data-ng-click="export()"> <span class="icon-download5"></span> {{ \'timesheet-automation.export\' | translate }} </button> </div> </div> <div> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': loading_report && report_list.length === 0 } "> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners"> <thead> <tr> <th> <div class="th-inner overflow-ellipsis">{{ \'timesheet-automation.user\' | translate }}</div> </th> <th style="width: 20%;"> <div class="th-inner overflow-ellipsis">{{ \'timesheet-automation.previous_rule\' | translate }}</div> </th> <th style="width: 20%;"> <div class="th-inner overflow-ellipsis">{{ \'timesheet-automation.current_rule\' | translate }}</div> </th> <th style="width: 20%;"> <div class="th-inner overflow-ellipsis">{{ \'timesheet-automation.next_rule\' | translate }}</div> </th> </tr> </thead> <tbody> <tr class="content" data-ng-repeat="automation_rule in report_list | orderBy : \'user_name\'"> <td> <div class="user-list-item--identity"> <div data-user-avatar data-name="{{ automation_rule.user_name }}" data-photo-url="automation_rule.user_profile_photo_url" data-size="sm"> </div> <a class="bolder light-blue-on-hover" data-app-href="#/time-automation-rules?user_id={{automation_rule.user_id}}"> {{automation_rule.user_name}} </a> </div> </td> <td> <span data-ng-if="!automation_rule.previous_rule_id" class="steel-color">—</span> <div data-ng-if="automation_rule.previous_rule_id"> <a class="bolder light-blue-on-hover" data-ng-click="edit(automation_rule.previous_rule_id)">{{automation_rule.previous_rule_summary || \'—\'}}</a> <div class="timesheet-automation--date-range"> <span>{{ automation_rule.previous_rule_date_start | date : \'dd/MM/yyyy\'}}</span> <span>—</span> <span>{{automation_rule.previous_rule_date_end ? (automation_rule.previous_rule_date_end | date : \'dd/MM/yyyy\') : (\'timesheet-automation.open\' | translate)}}</span> </div> <span data-ng-if="automation_rule.previous_rule_status === \'active\'" class="flag flag-automation-past"> {{ \'timesheet-automation.phases.past\' | translate }} </span> <span data-ng-if="automation_rule.previous_rule_status === \'draft\'" class="flag flag-automation-draft"> {{ \'timesheet-automation.status.draft\' | translate }} </span> </div> </td> <td> <div data-ng-if="!automation_rule.current_rule_id" class="timesheet-automation--add-rule-hover"> <span class="steel-color timesheet-automation--add-rule-hover__dash">—</span> <a class="bolder light-blue-on-hover timesheet-automation--add-rule-hover__link" data-ng-click="new({\'user_id\': automation_rule.user_id})"> {{ \'timesheet-automation.add_rule\' | translate }} </a> </div> <div data-ng-if="automation_rule.current_rule_id"> <a class="bolder light-blue-on-hover" data-ng-click="edit(automation_rule.current_rule_id)">{{automation_rule.current_rule_summary || \'—\'}}</a> <div class="timesheet-automation--date-range"> <span>{{ automation_rule.current_rule_date_start | date : \'dd/MM/yyyy\'}}</span> <span>—</span> <span>{{automation_rule.current_rule_date_end ? (automation_rule.current_rule_date_end | date : \'dd/MM/yyyy\') : (\'timesheet-automation.open\' | translate)}}</span> </div> <span data-ng-if="automation_rule.current_rule_status === \'active\'" class="flag flag-automation-current"> {{ \'timesheet-automation.phases.current\' | translate }} </span> <span data-ng-if="automation_rule.current_rule_status === \'draft\'" class="flag flag-automation-draft"> {{ \'timesheet-automation.status.draft\' | translate }} </span> </div> </td> <td> <div data-ng-if="!automation_rule.next_rule_id" class="timesheet-automation--add-rule-hover"> <span class="steel-color timesheet-automation--add-rule-hover__dash">—</span> <a class="bolder light-blue-on-hover timesheet-automation--add-rule-hover__link" data-ng-click="new({\'user_id\': automation_rule.user_id})"> {{ \'timesheet-automation.add_rule\' | translate }} </a> </div> <div data-ng-if="automation_rule.next_rule_id"> <a class="bolder light-blue-on-hover" data-ng-click="edit(automation_rule.next_rule_id)">{{automation_rule.next_rule_summary || \'—\'}}</a> <div class="timesheet-automation--date-range"> <span>{{ automation_rule.next_rule_date_start | date : \'dd/MM/yyyy\'}}</span> <span>—</span> <span>{{automation_rule.next_rule_date_end ? (automation_rule.next_rule_date_end | date : \'dd/MM/yyyy\') : (\'timesheet-automation.open\' | translate)}}</span> </div> <span data-ng-if="automation_rule.next_rule_status === \'active\'" class="flag flag-automation-scheduled"> {{ \'timesheet-automation.phases.scheduled\' | translate }} </span> <span data-ng-if="automation_rule.next_rule_status === \'draft\'" class="flag flag-automation-draft"> {{ \'timesheet-automation.status.draft\' | translate }} </span> </div> </td> <!--                                <td>--> <!--                                    <a title="Opções"--> <!--                                       data-dropdown="dropdown-automation-rule-{{automation_rule.user_id}}"--> <!--                                       class="icon-ellipsis light-grey-color light-blue-on-hover">--> <!--                                    </a>-->
18 <!--                                    <div id="dropdown-automation-rule-{{automation_rule.user_id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click>--> <!--                                        <div data-ng-if="automation_rule.id">--> <!--                                            <div class="dropdown-option option-button">--> <!--                                                <a ng-click="edit(automation_rule)">--> <!--                                                    <span>Editar</span>--> <!--                                                </a>--> <!--                                            </div>--> <!--                                            <div class="dropdown-option option-button">--> <!--                                                <hr>--> <!--                                                <a data-ng-click="remove(automation_rule)">--> <!--                                                    Excluir regra--> <!--                                                </a>--> <!--                                            </div>--> <!--                                        </div>--> <!--                                        <div data-ng-if="!automation_rule.id">--> <!--                                            <div class="dropdown-option option-button">--> <!--                                                <a ng-click="edit({--> <!--                                                    \'user_id\': automation_rule.user_id--> <!--                                                })">--> <!--                                                    <span>Criar regra</span>--> <!--                                                </a>--> <!--                                            </div>--> <!--                                        </div>--> <!--                                    </div>--> <!--                                </td>--> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'timesheet-automation.loading\' | translate }}</span> <span data-ng-if="!loading_report" class="steel-color">{{ \'timesheet-automation.no_registers\' | translate }}</span> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> </div> </section> </section> '),$templateCache.put("views/time-automation/automation-rules-change-date.html",'<section class="report-layout-grid report-groups-and-sort-2024 view-time-clock-report-automation-rules-by-user" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <!--        --> <!--<div class="new-layout-report">--> <!--    <div data-ng-include="\'views/reports/report-left-column.html\'"></div>--> <!--    <div class="view layout-content-width layout-content-report">--> <div class="report-topbar"> <!--            <div class="row">--> <div> <h3>{{ \'timesheet-automation.change_date_rules_title\' | translate }}</h3> </div> <div> <button class="button clean radius" title="{{ \'timesheet-automation.export\' | translate }}" style="margin-right: 5px;" data-ng-click="export()"> <span class="icon-download5" style="margin-right: 3px;"></span> <span>{{ \'timesheet-automation.export\' | translate }}</span> </button> <button class="button clean radius" style="margin-left: 5px;" title="{{ \'timesheet-automation.columns\' | translate }}" data-dropdown="dropdown-config-columns"> <span class="icon-list" style="margin-right: 3px;"></span> <span>{{ \'timesheet-automation.columns\' | translate }}</span> </button> <div id="dropdown-config-columns" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <span>{{ \'timesheet-automation.report_columns\' | translate }}</span> </div> <div class="dropdown-option checkbox" data-ng-repeat="column in column_options | toArray: true "> <label data-ng-disabled="column.report_column_fixed"> <input type="checkbox" data-ng-model="column.report_column_visible" data-ng-change="update_visible_columns(column.$key)" data-ng-disabled="column.report_column_fixed" data-ng-true-value="true" data-ng-false-value="false"> <span>{{column.name}}</span> </label> </div> </div> </div> <!--            </div>--> </div> <div> <!--            <div data-ng-if="report_list.length == 0">--> <!--                <div spinner-loading="loading_report" class="spinner-loading-report"></div>--> <!--                <div data-ng-if="!loading_report" class="report-none-register">--> <!--                    <div class="icon-zoom-out"></div>--> <!--                    <h3>Não foi encontrado nenhum registro.</h3>--> <!--                    <p>Verifique o filtro realizado e suas permissões da conta.</p>--> <!--                </div>--> <!--            </div>--> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': loading_report && report_list.length === 0 } "> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners"> <!--            <div data-ng-if="report_list.length > 0"--> <!--                 class="report-list-container"--> <!--                 auto-height top="180">--> <!--                <div class="header-background"></div>--> <!--                <div class="list report-list report-list-container-inner">--> <!--                    <table report-list-width-fix>--> <thead> <tr> <th> <div class="th-inner overflow-ellipsis">{{ \'timesheet-automation.user\' | translate }}</div> </th> <th style="width: 150px;"> <div class="th-inner overflow-ellipsis">{{ \'timesheet-automation.date\' | translate }}</div> </th> <th data-ng-repeat="column in column_options | toArray: true | filter: { report_column_fixed: false, report_column_visible: true }" class="date-column"> <div class="th-inner overflow-ellipsis">{{column.name}}</div> </th> </tr> </thead> <tbody> <tr class="content" data-ng-repeat="row in report_list | orderBy : [ \'user_name\' , \'date\' ]"> <td> <span>{{row.user_name}}</span> </td> <td> <span>{{row.date | date : \'dd/MM/yyyy\'}}</span> </td> <td data-ng-repeat="column in column_options | toArray : true | filter: { report_column_fixed: false, report_column_visible: true }" data-ng-switch="column.$key" data-ng-class="{ \'light-orange-bgcolor orange-color bolder\' : !row[column.$key] }"> <span>{{ row[column.$key] ? row[(column.column_value || column.$key)] : column.empty }}</span> </td> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'timesheet-automation.loading\' | translate }}</span> <span data-ng-if="!loading_report" class="steel-color">{{ \'timesheet-automation.no_registers\' | translate }}</span> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> </div> </section> </section> '),$templateCache.put("views/time-automation/automation-rules-edit.html",'<div class="view-time-automation-rules-edit"> <div class="modal-header"> <div> <h1>{{ automation_rule.id ? (\'timesheet-automation.edit_modal.title_edit\' | translate) : (\'timesheet-automation.edit_modal.title_new\' | translate) }}</h1> </div> <div>
18 <span data-dropdown="dropdown-time-automation-rules-edit--change-status" class="has-dropdown template-button"> <span data-ng-if="automation_rule.status === \'active\'" class="flag green-color">{{ \'timesheet-automation.edit_modal.status_active\' | translate }}</span> <span data-ng-if="automation_rule.status === \'draft\'" class="flag grey-color">{{ \'timesheet-automation.edit_modal.status_draft\' | translate }}</span> <span data-ng-if="!automation_rule.status" class="flag grey-color">...</span> </span> <div id="dropdown-time-automation-rules-edit--change-status" data-dropdown-content class="f-dropdown dropdown-option-list"> <div data-ng-repeat="status in statusList" class="dropdown-option radio"> <label data-ng-model="automation_rule.status" data-btn-radio="\'{{status.id}}\'" data-dropdown-close-on-click> <span>{{status.name}}</span> <span class="dropdown-option-details">{{status.description}}</span> </label> </div> </div> </div> <a class="icon-cross" data-ng-click="close()" data-tooltip="{{ \'timesheet-automation.execute_manually.close_tooltip\' | translate }}" data-tooltip-popup-delay="600" data-tooltip-append-to-body="true"></a> </div> <div class="modal-body" style="min-height: 200px;" data-spinner-loading-modal="is_loading"> <div class="view-time-automation-rules-edit--main-form"> <div class="row"> <div class="column-60" data-ng-class="{\'has-error\' : errors.user_id}"> <label>{{ \'timesheet-automation.edit_modal.user_label\' | translate }}</label> <select data-ng-model="automation_rule.user_id" data-options-load="$userService.getUserOptions" data-ng-disabled="is_loading" data-ng-readonly="automation_rule.id" data-selectize-key="automation-rules-user-id" data-selectize="{\r\n                                labelField: \'name\',\r\n                                valueField: \'id\',\r\n                                sortField: \'name\',\r\n                                searchField: \'name\',\r\n                                dropdownParent: \'body\',\r\n                                onChange: revalidateOnChange\r\n                                }"> </select> <sub data-ng-if="errors.user_id">{{errors.user_id}}</sub> </div> <div class="column-20" data-ng-class="{\'has-error\' : errors.date_start}"> <label>{{ \'timesheet-automation.edit_modal.start_date\' | translate }}</label> <input type="text" style="max-width: 110px" datetime="dd/MM/yyyy" data-ng-change="revalidateOnChange()" data-ng-model="automation_rule.date_start_object"> <sub data-ng-if="errors.date_start">{{errors.date_start}}</sub> </div> <div class="column-20"> <div data-ng-class="{\'has-error\' : errors.date_end}"> <label>{{ \'timesheet-automation.edit_modal.end_date\' | translate }}</label> <div data-ng-show="!automation_rule.date_end_empty"> <input type="text" style="max-width: 110px" datetime="dd/MM/yyyy" data-ng-change="revalidateOnChange()" data-ng-model="automation_rule.date_end_object"> </div> <sub data-ng-if="errors.date_end">{{errors.date_end}}</sub> </div> <div data-ng-show="automation_rule.date_end_empty"> <input type="text" disabled="disabled" readonly="readonly" placeholder="{{ \'timesheet-automation.edit_modal.end_open\' | translate }}" style="max-width: 110px"> </div> <div> <label class="element-todo-checkbox"> <input type="checkbox" data-ng-check data-ng-model="automation_rule.date_end_empty" data-ng-true-value="true" data-ng-false-value="false" data-ng-change="change_date_end_empty()"> <span>{{ \'timesheet-automation.edit_modal.end_open\' | translate }}</span> </label> </div> </div> </div> </div> <div class="modal-hr"></div> <div class="view-time-automation-rules-edit--split-rules__title_section"> <strong>{{ \'timesheet-automation.edit_modal.section_title\' | translate }}</strong> </div> <div data-ng-repeat="category in split_categories"> <div class="view-time-automation-rules-edit--split-rules--container"> <div class="view-time-automation-rules-edit--split-rules__empty-message" data-ng-show="splits[category.type].length === 0"> {{ \'timesheet-automation.edit_modal.empty_splits\' | translate:{category: category.name} }} </div> <div class="list-minimal view-time-automation-rules-edit--split-rules-table"> <table data-ng-show="splits[category.type].length > 0"> <colgroup> <col style="width:5%"> <col style="width:38%"> <col style="width:38%"> <col style="width:13%"> <col style="width:6%"> </colgroup> <thead> <tr> <th></th> <th>{{ \'timesheet-automation.edit_modal.project_label\' | translate }}</th> <th>{{ \'timesheet-automation.edit_modal.task_label\' | translate }}</th> <th data-ng-if="category.type === \'percentage\'">{{ \'timesheet-automation.edit_modal.percentage_label\' | translate }}</th> <th data-ng-if="category.type === \'hours\'">{{ \'timesheet-automation.edit_modal.hours_label\' | translate }}</th> <th></th> </tr> </thead> <tr data-ng-repeat="(split_rule_index, split_rule) in splits[category.type]"> <td class="actions-column visible-editable-mode"> <div class="move-up-action">
18 <a title="{{ \'timesheet-automation.edit_modal.move_up\' | translate }}" class="grey-color light-blue-on-hover" data-ng-click="moveToUp(split_rule_index, category.type)"> <span class="icon-angle-up"></span> </a> </div> <div class="move-down-action"> <a title="{{ \'timesheet-automation.edit_modal.move_down\' | translate }}" class="grey-color light-blue-on-hover" data-ng-click="moveToDown(split_rule_index, category.type)"> <span class="icon-angle-down"></span> </a> </div> </td> <td> <div data-ng-class="{\'has-error\': split_rule.errors.project_id}"> <select data-options="$projectService.getActive(automation_rule_original.project_id)" data-ng-model="split_rule.project_id" data-selectize="projectSelectizeConfig"></select> <sub data-ng-if="split_rule.errors.project_id">{{split_rule.errors.project_id}}</sub> </div> </td> <td> <div class="select-project-container"> <select class="selectize-projects" title="{{ \'timesheet-automation.edit_modal.task_label\' | translate }}" data-ng-model="split_rule.task_id" data-options-load="loadProjectTasks" data-options-load-params="{ project_id: split_rule.project_id }" data-options-filters="task__options_filters" data-ng-disabled="!split_rule.project_id" data-selectize-key="options-project-tasks" data-selectize="taskSelectizeConfig"> </select> </div> </td> <td data-ng-if="category.type === \'percentage\'"> <div data-ng-class="{\'has-error\': split_rule.errors.percentage}"> <div class="input-suffix-inside--container"> <input type="text" maxlength="3" data-ng-model="split_rule.percentage" data-ng-change="onChangePercentageOrHours()" placeholder="0" data-ng-mask="number"> <label class="input-suffix-inside--label-suffix">%</label> </div> <sub data-ng-if="split_rule.errors.percentage">{{split_rule.errors.percentage}}</sub> </div> </td> <td data-ng-if="category.type === \'hours\'"> <div data-ng-class="{\'has-error\': split_rule.errors.hours}"> <div class="input-suffix-inside--container"> <input type="text" data-ng-model="split_rule.hours" data-ng-change="onChangePercentageOrHours()" placeholder="00:00" data-ng-mask="time"> <label class="input-suffix-inside--label-suffix">h</label> </div> <sub data-ng-if="split_rule.errors.hours">{{split_rule.errors.hours}}</sub> </div> </td> <td class="actions-column visible-editable-mode"> <div class="delete-action"> <a data-ng-click="deleteSplitRule(split_rule_index, category.type)" tooltip="{{ \'timesheet-automation.edit_modal.remove_tooltip\' | translate }}" class="steel-color red-color-on-hover"> <span class="icon-remove"></span> </a> </div> </td> </tr> </table> </div> <div class="view-time-automation-rules-edit--split-rules-bottom"> <div> <a class="link-dashed link-dashed-blue" data-ng-click="newSplitRule(category.type)"> <span class="icon-plus4"></span> <span>{{ \'timesheet-automation.edit_modal.add_rule_prefix\' | translate }}{{category.name}} <span>({{category.example}})</span></span> </a> </div> <div data-ng-show="splits[category.type].length > 0"> <span>{{ \'timesheet-automation.edit_modal.total\' | translate }}</span> <span data-ng-if="category.type === \'hours\'">{{total.hours | durationFormat: \'default\'}}</span> <span data-ng-if="category.type === \'percentage\'">{{total.percentage || 0}} %</span> </div> </div> </div> </div> <div class="has-error view-time-automation-rules-edit--general-errors"> <p data-ng-if="errors.hours_total"> {{errors.hours_total}} </p> <p data-ng-if="errors.percentage_total"> {{errors.percentage_total}} </p> <p data-ng-if="errors.duplicate"> {{errors.duplicate}} </p> <p data-ng-if="errors.no_splits"> {{errors.no_splits}} </p> </div> </div> <div class="modal-footer"> <div> <button class="button clean" data-ng-click="close()" data-ng-disabled="saving"> {{ \'timesheet-automation.edit_modal.cancel\' | translate }} </button> </div> <div> <button class="button button--blue-brand" data-ng-click="save()" data-ng-disabled="saving"> {{ saving ? (\'timesheet-automation.edit_modal.saving\' | translate) : (\'timesheet-automation.edit_modal.save_button\' | translate) }} </button> </div> </div> </div> '),
19$templateCache.put("views/time-automation/automation-rules-execute.html",'<div class="view-time-automation-rules-execute"> <div class="modal-header"> <div> <h1 style="margin-top: 5px">{{ \'timesheet-automation.execute_manually.title\' | translate }}</h1> </div> <p style="line-height: 1.6em; font-size: 14px;
19 color: var(--font-color-1-details); margin-top: 10px;"> {{ \'timesheet-automation.execute_manually.description\' | translate }} </p> <a class="icon-cross" data-ng-click="$close()" data-tooltip="{{ \'timesheet-automation.execute_manually.close_tooltip\' | translate }}" data-tooltip-popup-delay="600" data-tooltip-append-to-body="true"></a> </div> <div class="modal-body" style="min-height: 200px;"> <div class="filters-column"> <div class="row" style="margin-bottom: 10px;"> <label>{{ \'timesheet-automation.execute_manually.period_label\' | translate }}</label> <div class="row"> <div class="column-40"> <select ng-model="sync.interval" data-options="interval_options" placeholder="{{ \'timesheet-automation.execute_manually.interval_placeholder\' | translate }}" class="selectize-keep-default-width" data-selectize="{\r\n                                labelField: \'name\',\r\n                                valueField: \'type\',\r\n                                onChange: onChangeInterval\r\n                            }"> </select> </div> <div class="column-40"> <div class="row collapse radius date-frame"> <div class="column-15 move-date-container"> <a ng-click="move_previous_date()" class="move-date">&#9668;</a> </div> <div class="column-70 date-display"> <span ng-switch="sync.interval"> <span ng-switch-when="day"> {{ sync.date_start | moment: "ll" }} </span> <span ng-switch-default> {{ sync.date_start | moment: "DD MMM" }} a {{ sync.date_end | moment: "DD MMM" }} </span> </span> </div> <div class="column-15 move-date-container"> <a ng-click="move_next_date()" class="move-date">&#9658;</a> </div> </div> </div> </div> </div> <div ng-show="show_future_warning" style="margin-bottom: 15px;"> <div class="explanation explanation--with-icon-info radius"> {{ \'timesheet-automation.execute_manually.future_warning\' | translate }} </div> </div> <div class="row" style="margin-bottom: 10px;"> <label>{{ \'timesheet-automation.execute_manually.users_label\' | translate }}</label> <div class="row"> <div class="column-80"> <input ng-model="sync.user_id" data-options-load="$userService.getUserOptions" data-options-load-trigger="focus" data-selectize="usersSelectizeConfig"> </div> </div> </div> </div> </div> <div class="modal-footer"> <div> <button class="button clean" data-ng-click="$close()">{{ \'timesheet-automation.execute_manually.cancel\' | translate }}</button> </div> <div> <button type="button" class="button button--blue-brand" data-ng-click="synchronize()" data-ng-disabled="syncing"> {{ syncing ? (\'timesheet-automation.execute_manually.executing\' | translate) : (\'timesheet-automation.execute_manually.execute_button\' | translate) }} </button> </div> </div> </div> '),$templateCache.put("views/time-automation/automation-rules-settings.html",'<div class="view-time-automation-rules-settings"> <div class="modal-header"> <div> <h1 style="margin-top: 5px">{{ \'timesheet-automation.schedule_settings.title\' | translate }}</h1> </div> <p class="title-description"> {{ \'timesheet-automation.schedule_settings.description\' | translate }} </p> <a class="icon-cross" data-ng-click="$close()" data-tooltip="{{ \'timesheet-automation.schedule_settings.close_tooltip\' | translate }}" data-tooltip-popup-delay="600" data-tooltip-append-to-body="true"></a> </div> <div class="modal-body" style="min-height: 200px;"> <div class="timesheet-automation-schedule-settings" data-ng-if="!loading"> <div class="timesheet-automation-schedule-settings__status-card" data-ng-class="settings.active ? \'is-active\' : \'is-inactive\'"> <div class="timesheet-automation-schedule-settings__status-card-content"> <span class="timesheet-automation-schedule-status-dot" data-ng-class="settings.active ? \'is-active\' : \'is-inactive\'" aria-hidden="true"></span> <div class="timesheet-automation-schedule-settings__status-card-text"> <strong class="timesheet-automation-schedule-settings__status-title"> {{ settings.active ? (\'timesheet-automation.schedule_settings.status_active\' | translate) : (\'timesheet-automation.schedule_settings.status_inactive\' | translate) }} </strong> <p class="title-description timesheet-automation-schedule-settings__status-description"> {{ \'timesheet-automation.schedule_settings.active_description\' | translate }} </p> </div> </div> <span data-button-toggle data-ng-model="settings.active" data-title="{{ \'t
19imesheet-automation.schedule_settings.active_label\' | translate }}"></span> </div> <div class="timesheet-automation-schedule-settings__sentence-block"> <p class="timesheet-automation-schedule-settings__sentence"> <strong class="timesheet-automation-schedule-settings__sentence-token-wrap"> <a data-dropdown="dropdown-schedule-sentence-frequency" class="timesheet-automation-schedule-settings__sentence-token has-dropdown" title="{{ \'timesheet-automation.schedule_settings.frequency_click_hint\' | translate }}"> {{ getFrequencyLabel() }} </a> </strong> {{ \'timesheet-automation.schedule_settings.sentence_time_prefix\' | translate }} <strong class="timesheet-automation-schedule-settings__sentence-token-wrap"> <input type="text" class="timesheet-automation-schedule-settings__sentence-time-input" data-ng-model="settings.time" data-ng-mask="time" data-ng-blur="normalizeTime()" placeholder="00:00"> <span data-ng-if="settings.timezone">({{ getTimezoneLabel() }})</span> </strong> <span>{{ \'timesheet-automation.schedule_settings.sentence_middle\' | translate }}</span> <strong class="timesheet-automation-schedule-settings__sentence-token-wrap"> <a data-dropdown="dropdown-schedule-sentence-target" class="timesheet-automation-schedule-settings__sentence-token has-dropdown" data-ng-attr-title="{{ isDailyFrequency()\r\n                               ? (\'timesheet-automation.schedule_settings.day_offset_click_hint\' | translate)\r\n                               : (\'timesheet-automation.schedule_settings.week_offset_click_hint\' | translate) }}"> {{ getTargetLabel() }} </a> </strong> </p> <div id="dropdown-schedule-sentence-frequency" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button" data-ng-repeat="option in frequency_options"> <a data-ng-click="selectFrequency(option.type)"> <span>{{ option.name }}</span> </a> </div> </div> <div id="dropdown-schedule-sentence-target" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button" data-ng-repeat="option in (isDailyFrequency() ? day_offset_options : week_offset_options)"> <a data-ng-click="selectTarget(option.type)"> <span>{{ option.name }}</span> </a> </div> </div> </div> </div> <div data-ng-if="loading" class="steel-color"> {{ \'timesheet-automation.loading\' | translate }} </div> </div> <div class="modal-footer"> <div> <button class="button clean" data-ng-click="$close()">{{ \'timesheet-automation.schedule_settings.cancel\' | translate }}</button> </div> <div> <button type="button" class="button button--blue-brand" data-ng-click="save()" data-ng-disabled="saving || loading"> {{ saving ? (\'timesheet-automation.schedule_settings.saving\' | translate) : (\'timesheet-automation.schedule_settings.save_button\' | translate) }} </button> </div> </div> </div> '),$templateCache.put("views/time-automation/automation-rules.html",'<section class="report-layout-grid report-groups-and-sort-2024 view-time-clock-report-automation-rules" left-column-toggle-size> <section class="report-layout-grid--filters"> <div data-ng-include="\'views/reports/report-left-column.html\'"></div> </section> <section class="report-layout-grid--content" auto-height data-top="45"> <div class="report-topbar"> <div> <h3>{{ \'timesheet-automation.rules_title\' | translate }}</h3> </div> <div> <button class="button clean radius" title="{{ \'timesheet-automation.export\' | translate }}" style="margin-right: 5px;" data-ng-click="export()"> <span class="icon-download5"></span> {{ \'timesheet-automation.export\' | translate }} </button> <button class="button clean radius" title="{{ \'timesheet-automation.create_rule\' | translate }}" data-ng-click="edit()"> <span class="icon-plus4 bolder"></span> <span>{{ \'timesheet-automation.create_rule\' | translate }}</span> </button> </div> <!--            </div>--> </div> <div> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': loading_report && report_list.length === 0 } "> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners"> <thead> <tr> <th> <div class="overflow-ellipsis">{{ \'timesheet-automation.user\' | translate }}</div> </th> <th style="width: 120px;"> <div class="overflow-ellipsis">{{ \'timesheet-automation.rule\' | translate }}</div> </th> <th style="width: 120px;"> <div class="overflow-ellipsis">{{ \'timesheet-automation.period\' | translate }}</div> </th> <th style="width: 120px;"> <div class="overflow-ellipsis">{{ \'timesheet-automation.status_label\' | translate }}</div> </th> <th style="width: 15px;"></th> </tr> </thead> <tbody> <tr class="content" data-ng-repeat="automation_rule in report_list | orderBy : \'user_name\'" style="position: relative"> <td> <div class="report-groups-and-sort-2024--item-details">
19 <a title="{{ \'timesheet-automation.edit\' | translate }}" data-dropdown="dropdown-automation-rule-{{automation_rule.id}}" class="grey-color light-blue-on-hover"> <span class="icon-angle-down" style="font-size: 18px;"></span> </a> <div class="user-list-item--identity"> <div data-user-avatar data-name="{{ automation_rule.user_name }}" data-photo-url="automation_rule.user_profile_photo_url" data-size="sm"> </div> <div> <a class="bolder light-blue-on-hover" data-ng-click="edit(automation_rule)">{{automation_rule.user_name}}</a> </div> </div> </div> </td> <td> <a class="bolder light-blue-on-hover" data-ng-click="edit(automation_rule)">{{automation_rule.summary}}</a> </td> <td> <div> <span>{{ automation_rule.date_start | date : \'dd/MM/yyyy\'}}</span> <span>—</span> <span>{{automation_rule.date_end ? (automation_rule.date_end | date : \'dd/MM/yyyy\') : (\'timesheet-automation.open\' | translate)}}</span> </div> </td> <td> <div> <span data-ng-if="automation_rule.status === \'draft\'" class="flag flag-automation-draft"> {{ \'timesheet-automation.status.draft\' | translate }} </span> <span data-ng-if="automation_rule.status === \'active\'"> <span class="flag flag-automation-{{automation_rule.phase}}"> {{ \'timesheet-automation.phases.\'+automation_rule.phase | translate }} </span> </span> </div> </td> <td> <div data-ng-include="\'reportItemDropdownAutomationRule\'" data-ng-init="automation_rule = automation_rule"> </div> </td> </tr> </tbody> <tfoot> <tr> <td> <span data-ng-if="loading_report" class="steel-color">{{ \'timesheet-automation.loading\' | translate }}</span> <span data-ng-if="!loading_report" class="steel-color">{{ \'timesheet-automation.no_registers\' | translate }}</span> </td> <td colspan="100"></td> </tr> </tfoot> </table> </div> </div> </div> </section> </section> <script type="text/ng-template" id="reportItemDropdownAutomationRule"> <div id="dropdown-automation-rule-{{automation_rule.id}}"\r\n         data-dropdown-content\r\n         class="f-dropdown dropdown-option-list"\r\n         dropdown-close-on-click\r\n         data-dropdown-append-to-body="false">\r\n\r\n        <div class="dropdown-option option-button">\r\n            <a data-ng-click="edit(automation_rule)">\r\n                <span>{{ \'timesheet-automation.edit\' | translate }}</span>\r\n            </a>\r\n        </div>\r\n\r\n        <div class="dropdown-option option-button">\r\n            <hr>\r\n            <a data-ng-click="remove(automation_rule)" class="red-color-on-hover">\r\n                {{ \'timesheet-automation.delete\' | translate }}\r\n            </a>\r\n        </div>\r\n\r\n    </div> </script> '),$templateCache.put("views/timesheet/time-tracking-tabs.html",'<div class="time-tracking-tabs" data-ng-controller="TimeTrackingTabsController"> <h3 class="time-tracking-tabs__title">{{ \'home_left.time_entries\' | translate }}</h3> <div data-app-tabs class="time-tracking-tabs__nav" data-tabs="timeTrackingTabs" data-selected="activeTab" data-nav-padding-left="0px" data-tab-margin-left="26px"> </div> </div> '),$templateCache.put("views/timesheet/timesheet-approval-action-details.html",'<div class="timesheet-approval-action-details"> <p class="timesheet-approval-action-details__question" data-ng-if="question">{{ question }}</p> <dl class="timesheet-approval-action-details__list"> <dt>{{ \'timesheet.column_collaborator\' | translate }}</dt> <dd>{{ userName }}</dd> <dt>{{ \'timesheet.column_period\' | translate }}</dt> <dd>{{ periodLabel }}</dd> </dl> </div> '),$templateCache.put("views/timesheet/timesheet-approval-review.html",'<div class="timesheet-page timesheet-approval-review-page report-groups-and-sort-2024" data-ng-class="{\'timesheet-page--embed\': approvalViewMode && hasTimesheetApprovalFeature}"> <div class="timesheet-approval-review-page__header"> <div> <span class="timesheet-approval-review-page__back-link" data-ng-if="fromApprovals" data-ng-click="goBackToApprovals()"> <span class="icon-arrow-left"></span> {{ \'timesheet.back_to_approvals\' | translate }} </span> </div> <h3 class="timesheet-page__title timesheet-approval-review-page__user-title" data-ng-if="approvalViewMode"> <div data-user-avatar data-name="{{ embedUserName || selectedUserName }}" data-photo-url="embedUserPhotoUrl" data-size="md"> </div> <span class="timesheet-approval-review-page__user-title-label">{{ \'timesheet.approval_review_label\' | translate }}</span> <span>{{ embedUserName || selectedUserName }}</span> </h3> <div data-ng-controller="TimesheetTopBarController" data-ng-include="\'views/timesheet/timesheet-topbar.html\'"></div> </div> <div class="timesheet-approval-review-page__view-toggle" button-toggle-inline data-ng-model="contentView" data-options="contentViewOptions"> </div> <div data-ng-include="\'views/timesheet/timesheet-rejection-comment-banner.html\'"></div> <div data-ng-if="contentView === \'timesheet\'" data-ng-controller="TimesheetWeekGridController" data-ng-include="\'views/timesheet/timesheet-week-grid.html\'"></div> <div data-ng-if="contentView === \'entries\'" data-ng-include="\'views/time-entries/entries.html\'"></div> <section class="timesheet-approval-review-page__events" data-ng-if="approval && approval.id"> <div entity-events-timeline entity-type="timesheet_approval" entity-id="{{ approval.id }}"> </div> </section> </div> '),$templateCache.put("views/timesheet/timesheet-approvals-tabs-header.html",'<header class="timesheet-approvals-page__header" data-ng-controller="TimesheetApprovalsTabsHeaderController"> <div class="timesheet-approvals-page__header-top"> <h3 class="timesheet-approvals-page__title">{{ \'timesheet.approvals_page_title\' | translate }}</h3> <a class="button clean timesheet-approvals-page__settings-link" data-ng-if="$permissionService.hasPrivilegesToEditAccountSettings()" data-app-href="#/timesheet-approval-sett
19ings"> {{ \'timesheet.approvals_settings\' | translate }} </a> </div> <div data-app-tabs class="timesheet-approvals-page__status-tabs" data-tabs="approvalStatusTabs" data-selected="selectedApprovalStatusTab" data-on-change="onApprovalStatusTabChange(tabId)" data-nav-padding-left="26px" data-tab-margin-left="0px" data-tab-margin-right="26px"> </div> </header> '),$templateCache.put("views/timesheet/timesheet-approvals.html",'<div class="timesheet-approvals-page timesheet-page report-groups-and-sort-2024"> <div class="timesheet-page__body timesheet-approvals-page__body" data-ng-if="canManageApprovals" data-infinite-scroll="loadMoreList()" data-infinite-scroll-disabled="loading || loadingMore || noMoreEntries" data-infinite-scroll-distance="1" data-infinite-scroll-container=".timesheet-approvals-page__body"> <div class="timesheet-approvals-page__filters" data-entries-filter-chips data-filter="filter" data-dropdown-id="dropdown-timesheet-approvals-filter"> </div> <div class="report-list-container" data-training="approvals-list" data-ng-class="{\'report-list-container--is-loading\': loading}"> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners"> <thead> <tr> <th>{{ \'timesheet.column_collaborator\' | translate }}</th> <th>{{ \'timesheet.column_approver\' | translate }}</th> <th data-ng-if="hasUserCapacityFeature">{{ \'timesheet.column_capacity\' | translate }}</th> <th class="time-column-type">{{ \'timesheet.column_hours_total\' | translate }}</th> <th class="time-column-type">{{ \'timesheet.column_hours_billable\' | translate }}</th> <th>{{ \'timesheet.column_status\' | translate }}</th> <th></th> </tr> </thead> <tbody data-ng-repeat="week in displayWeekGroups track by week.key"> <tr class="report-groups-and-sort-2024--total-row timesheet-approvals-page__week-group"> <td colspan="100"> <div class="report-groups-and-sort-2024--group-details"> <span>{{ week.period_start | dateLong }} — {{ week.period_end | dateLong }}</span> <span class="report-groups-and-sort-2024--items-counter">({{ week.items.length }})</span> </div> </td> </tr> <tr data-ng-repeat="item in week.items track by item.id" class="report-groups-and-sort-2024--item-row item-level-1"> <td> <div class="report-groups-and-sort-2024--item-details"> <a title="{{ \'timesheet.row_menu\' | translate }}" data-ng-if="canShowRowMenu()" data-dropdown="dropdown-approval-row-{{ item.id }}" class="grey-color light-blue-on-hover"> <span class="icon-angle-down" style="font-size: 18px;"></span> </a> <div class="timesheet-approvals-page__collaborator-content"> <div class="timesheet-approvals-page__collaborator-identity"> <div data-user-avatar data-name="{{ item.user_name }}" data-photo-url="item.user_profile_photo_url" data-size="sm" class="timesheet-approvals-page__collaborator-avatar"> </div> <div class="timesheet-approvals-page__collaborator-info"> <strong data-tooltip="{{ item.user_name }}" data-tooltip-ellipsis class="overflow-ellipsis timesheet-approvals-page__collaborator-name light-blue-on-hover" data-ng-click="openCollaboratorTimesheet(item, $event)"> <span>{{ item.user_name | shortening }}</span> </strong> </div> </div> </div> </div> </td> <td> <div class="user-list-item--identity" data-ng-if="item.approver_name"> <div data-user-avatar data-name="{{ item.approver_name }}" data-photo-url="item.approver_profile_photo_url" data-size="sm"> </div> <span class="overflow-ellipsis" data-tooltip="{{ item.approver_name }}" data-tooltip-ellipsis>{{ item.approver_name | shortening }}</span> </div> <span data-ng-if="!item.approver_name">—</span> </td> <td class="timesheet-approvals-page__capacity-column" data-ng-if="hasUserCapacityFeature"> <div class="timesheet-approvals-page__capacity-cell"> <span data-progress-capacity-bar data-time-format="hours" data-progress="item.week_capacity_hours.progress" data-consumed="item.week_capacity_hours.consumed" data-remaining="item.week_capacity_hours.remaining" data-total="item.week_capacity_hours.total" data-exceed="item.week_capacity_hours.exceed" data-status="item.week_capacity_hours.status" class="progress-bar-exceed-warning"> </span> <span class="timesheet-approvals-page__capacity-hours"> {{ formatHoursForDisplay(item.week_capacity_hours.consumed) | durationFormat:\'default\':\'short\' }} / {{ formatHoursForDisplay(item.week_capacity_hours.total) | durationFormat:\'default\':\'short\' }} </span> </div> </td> <td class="time-column-type"> <strong>{{ formatHoursForDisplay(item.total_hours) | durationFormat:\'default\':\'short\' }}</strong> </td> <td class="time-column-type"> <strong>{{ formatHoursForDisplay(item.billable_hours) | durationFormat:\'default\':\'short\' }}</strong> <span class="steel-color"> ({{ formatBillablePercentage(item) }})</span> </td> <td> <span class="timesheet-status-badge timesheet-status-badge--{{ item.status }}"> {{ getStatusLabel(item.status) }}
19 </span> </td> <td> <div class="timesheet-approvals-page__actions" data-ng-if="canApproveLine(item)"> <button class="button clean red timesheet-approvals-page__action-button" data-ng-click="requestRevisionForLine(item, $event)" data-ng-disabled="approving || requestingRevision || loading"> {{ \'timesheet.reject\' | translate }} </button> <button class="button clean green timesheet-approvals-page__action-button" data-training="approvals-approve" data-ng-click="approveWeek(item, $event)" data-ng-disabled="approving || requestingRevision || loading"> {{ \'timesheet.approve\' | translate }} </button> </div> <div data-ng-include="\'timesheetApprovalRowDropdown\'" data-ng-init="item = item"> </div> </td> </tr> </tbody> <tbody data-ng-if="!loading && displayWeekGroups.length === 0"> <tr> <td colspan="100" class="steel-color"> {{ getEmptyListMessageKey() | translate }} </td> </tr> </tbody> <tfoot> <tr> <td colspan="100"> <span data-ng-if="loadingMore" class="steel-color">{{ \'report.loading\' | translate }}</span> <span data-ng-if="noMoreEntries && displayWeekGroups.length > 0" class="steel-color">{{ \'report.no_more_registers\' | translate }}</span> </td> </tr> </tfoot> </table> </div> </div> </div> <p data-ng-if="!canManageApprovals" class="steel-color timesheet-approvals-page__forbidden"> {{ \'timesheet.approvals_forbidden\' | translate }} </p> </div> <script type="text/ng-template" id="timesheetApprovalRowDropdown"> <div id="dropdown-approval-row-{{ item.id }}"\r\n         data-dropdown-content\r\n         class="f-dropdown dropdown-option-list"\r\n         data-dropdown-close-on-click\r\n         data-top="24"\r\n         data-dropdown-append-to-body="true">\r\n        <div class="dropdown-option option-button">\r\n            <a data-ng-click="openCollaboratorTimesheet(item, $event)">\r\n                {{ \'timesheet.review\' | translate }}\r\n            </a>\r\n        </div>\r\n        <div class="dropdown-option option-button"\r\n             data-ng-if="canRemindSubmit(item)">\r\n            <a data-ng-click="remindSubmitForLine(item, $event)">\r\n                {{ \'timesheet.remind_submit\' | translate }}\r\n            </a>\r\n        </div>\r\n        <div class="dropdown-option option-button"\r\n             data-ng-if="canEditTimesheetApprovalApprover">\r\n            <a data-ng-click="openEditApproverModal(item, $event)">\r\n                {{ \'timesheet.edit_approver\' | translate }}\r\n            </a>\r\n        </div>\r\n    </div> </script> '),$templateCache.put("views/timesheet/timesheet-day-header-bar.html",'<div class="timesheet-day-bar__row"> <div class="timesheet-day-bar__cell timesheet-day-bar__cell--day timesheet-day-bar__cell--clickable" data-ng-repeat="dayItem in dayItems track by dayItem.details.date" data-ng-click="selectDay(dayItem.details.date)" data-ng-class="{\r\n             \'timesheet-day-bar__cell--weekend\': isWeekendDay(dayItem.details.date),\r\n             \'timesheet-day-bar__cell--today\': isTodayDay(dayItem.details.date),\r\n             \'timesheet-day-bar__cell--selected\': isSelectedDay(dayItem.details.date)\r\n         }"> <div class="timesheet-page--day-description"> <span>{{ dayItem.details.date | moment: \'ddd\' }}</span> <span>{{ dayItem.details.date | moment: \'D\' }}</span> </div> <div data-ng-if="dayItem.details.group_key === \'date\'"> <span data-progress-capacity-bar data-title="{{ dayItem.details.date | dateLong }}" data-progress="dayItem.details.date_user_capacity_progress" data-consumed="dayItem.details.date_user_capacity_consumed" data-remaining="dayItem.details.date_user_capacity_remaining" data-total="dayItem.details.date_user_capacity_total" data-exceed="dayItem.details.date_user_capacity_exceed" data-status="dayItem.details.date_user_capacity_context" class="progress-bar-exceed-warning"> </span> <div> <span> <strong>{{ dayItem.totals.time_total.time | durationFormat: \'default\' }}</strong> </span> <span data-ng-switch="dayItem.details.date_user_capacity_context"> <!--                    <span data-ng-switch-when="work_day">0</span>--> <span data-ng-switch-when="holiday" class="icon-moon"></span> <span data-ng-switch-when="vacation" class="icon-moon"></span> <span data-ng-switch-when="leave" class="icon-moon"></span>
19 <!--                    <span data-ng-switch-default class="color-steel">-</span>--> </span> </div> </div> </div> <div class="timesheet-day-bar__cell timesheet-day-bar__cell--total"> <div class="timesheet-day-bar__total-label"> {{ \'timesheet.column_week_total\' | translate }} </div> <div data-ng-include="\'views/timesheet/timesheet-week-total-header-content.html\'"></div> </div> </div> '),$templateCache.put("views/timesheet/timesheet-day-v2.html",'<div class="timesheet-page report-groups-and-sort-2024" data-ng-class="{\'timesheet-page--embed\': approvalViewMode}"> <div data-ng-controller="TimesheetTopBarController" data-ng-include="\'views/timesheet/timesheet-topbar.html\'"></div> <div data-ng-include="\'views/timesheet/timesheet-missing-manager-banner.html\'"></div> <div data-ng-include="\'views/timesheet/timesheet-day-view-bar.html\'"></div> </div> '),$templateCache.put("views/timesheet/timesheet-day-view-bar.html",'<div class="timesheet-page__body timesheet-day-view"> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': loading}"> <div class="timesheet-day-bar"> <div data-ng-include="\'views/timesheet/timesheet-day-header-bar.html\'"></div> </div> </div> <div class="timesheet-day-view__entries" data-ng-if="selectedDay"> <div data-ng-include="\'views/time-entries/entries.html\'"></div> </div> <p class="title-description timesheet-page__hint" data-ng-if="isWeekLocked() && !approvalViewMode"> {{ \'timesheet.week_locked_hint\' | translate }} </p> </div> '),$templateCache.put("views/timesheet/timesheet-edit-approver-modal.html",'<div class="default-confirm-modal timesheet-edit-approver-modal"> <div class="modal-header"> <p class="title">{{ \'timesheet.edit_approver_confirm.title\' | translate }}</p> </div> <div class="modal-body" data-on-click-enter="save()"> <div data-ng-include="\'views/timesheet/timesheet-approval-action-details.html\'"></div> <label>{{ \'timesheet.edit_approver_label\' | translate }}</label> <div class="timesheet-edit-approver-modal__approver-row"> <div class="user-list-item--identity" data-ng-if="approverUserId && approverName"> <div data-user-avatar data-name="{{ approverName }}" data-photo-url="approverPhotoUrl" data-size="sm"> </div> <span class="overflow-ellipsis">{{ approverName }}</span> </div> <span class="steel-color" data-ng-if="!approverUserId">—</span> <timesheet-user-picker data-selected-user-id="approverUserId" data-is-day-mode="false" data-exclude-user-id="excludeUserId" data-on-select="onSelectApprover(userId, user)"> </timesheet-user-picker> </div> <p class="timesheet-edit-approver-modal__error steel-color" data-ng-if="validationError">{{ validationError }}</p> </div> <div class="modal-footer"> <div></div> <div> <button type="button" class="button clean" data-ng-click="cancel()"> {{ \'common.cancel\' | translate }} </button> <button type="button" class="button" data-ng-click="save()"> {{ \'common.save\' | translate }} </button> </div> </div> </div> '),$templateCache.put("views/timesheet/timesheet-grid-entries-modal.html",'<div class="timesheet-grid-entries-modal modal__with-tabs"> <div class="modal-header"> <h1>{{ \'timesheet.hours_segment\' | translate }}</h1> <div class="modal-header--details timesheet-grid-entries-modal__details"> <span class="timesheet-grid-entries-modal__filter" data-ng-repeat="item in entriesModalContextItems"> <span class="timesheet-grid-entries-modal__label">{{ item.label | translate }}</span> <span class="timesheet-grid-entries-modal__value" data-ng-class="{\'timesheet-grid-entries-modal__value--empty\': item.isEmpty}"> {{ item.value }} </span> </span> </div> <a class="icon-cross" data-ng-click="cancel()" data-tooltip="{{ \'common.cancel\' | translate }}" data-tooltip-append-to-body="true"></a> </div> <div class="modal-body"> <div data-ng-include="\'views/time-entries/entries.html\'"></div> </div> </div> '),$templateCache.put("views/timesheet/timesheet-missing-manager-banner.html",'<div class="app-banner app-banner--warning" data-if-timesheet-approval-workflow data-ng-if="shouldShowMissingManagerBanner()"> <span class="app-banner__icon icon-warning" aria-hidden="true"></span> <div class="app-banner__body"> <p class="app-banner__text"> {{ \'timesheet.missing_manager_banner\' | translate }} <a app-href="#/my-permissions">{{ \'timesheet.missing_manager_banner_link\' | translate }}</a> </p> </div> </div> '),$templateCache.put("views/timesheet/timesheet-rejection-comment-banner.html",'<div class="timesheet-rejection-comment-banner" data-if-timesheet-approval-workflow data-ng-if="shouldShowRejectionCommentBanner()"> <span class="timesheet-rejection-comment-banner__icon icon-warning" aria-hidden="true"></span> <div class="timesheet-rejection-comment-banner__body"> <p class="timesheet-rejection-comment-banner__label"> {{ getRejectionCommentBannerLabelKey() | translate }} </p> <p class="timesheet-rejection-comment-banner__comment"> {{ approval.last_rejection_comment }} </p> </div> </div> '),$templateCache.put("views/timesheet/timesheet-revision-modal.html",'<div class="default-confirm-modal timesheet-revision-modal"> <div class="modal-header"> <p class="title">{{ \'timesheet.reject_confirm.title\' | translate }}</p> </div>
19 <div class="modal-body" data-on-click-enter="save()"> <div data-ng-include="\'views/timesheet/timesheet-approval-action-details.html\'"></div> <label for="timesheet-revision-comment">{{ \'timesheet.reject_comment_label\' | translate }}</label> <textarea id="timesheet-revision-comment" class="timesheet-revision-modal__comment" rows="4" data-ng-model="form.comment" placeholder="{{ \'timesheet.reject_comment_placeholder\' | translate }}"></textarea> <p class="timesheet-revision-modal__error steel-color" data-ng-if="validationError">{{ validationError }}</p> </div> <div class="modal-footer"> <div></div> <div> <button type="button" class="button clean" data-ng-click="cancel()"> {{ \'common.cancel\' | translate }} </button> <button type="button" class="button red" data-ng-click="save()"> {{ \'timesheet.reject_confirm_button\' | translate }} </button> </div> </div> </div> '),$templateCache.put("views/timesheet/timesheet-topbar.html",'<header class="timesheet-page__topbar"> <div> <div class="timesheet-page__title-row" data-ng-if="!approvalViewMode"> <h3 class="timesheet-page__title"> <div data-user-avatar data-name="{{ getTimesheetPageAvatarName() }}" data-photo-url="selectedUserPhotoUrl" data-size="md"> </div> <span>{{ getTimesheetPageTitle() }}</span> </h3> <timesheet-user-picker data-ng-if="canSelectTimesheetUser()" data-selected-user-id="selectedUserId" data-is-day-mode="navigatorIsDayMode" data-on-select="onChangeTimesheetUser(userId)"> </timesheet-user-picker> </div> <h3 data-ng-if="approvalViewMode && !fromApprovals" data-if-timesheet-approval-workflow class="timesheet-page__title timesheet-approval-review-page__user-title"> <div data-user-avatar data-name="{{ embedUserName }}" data-photo-url="embedUserPhotoUrl" data-size="md"> </div> <span class="timesheet-approval-review-page__user-title-label">{{ \'timesheet.approval_review_label\' | translate }}</span> <span>{{ embedUserName }}</span> </h3> <div class="timesheet-page__period-row"> <timesheet-week-navigator data-week="week" data-selected-day="selectedDay" data-is-day-mode="navigatorIsDayMode" data-show-navigation="!approvalViewMode" data-on-prev="onNavigatorPrev()" data-on-next="onNavigatorNext()"> </timesheet-week-navigator> <span class="timesheet-status-badge" data-if-timesheet-approval-workflow data-ng-class="\'timesheet-status-badge--\' + (approval.status || \'none\')"> {{ getHeaderStatusLabel() }}
19 </span> </div> </div> <div class="timesheet-page__topbar-actions" data-ng-if="!approvalViewMode"> <button class="button clean yellow" data-if-timesheet-approval-workflow data-ng-if="canUndoSubmitWeek()" data-ng-click="undoSubmitWeek()" data-ng-disabled="submitting || undoSubmitting || loading"> {{ \'timesheet.undo_submit\' | translate }} </button> <button class="button" data-if-timesheet-approval-workflow data-ng-if="canForceSubmitWeek()" data-ng-click="forceSubmitWeek()" data-ng-disabled="submitting || loading"> {{ \'timesheet.force_submit\' | translate }} </button> <button class="button" data-training="timesheet-submit-week" data-if-timesheet-approval-workflow data-ng-if="canSubmitWeek()" data-ng-click="submitWeek()" data-ng-disabled="submitting || undoSubmitting || loading"> {{ canResubmitWeek() ? (\'timesheet.resubmit_week\' | translate) : (\'timesheet.submit_week\' | translate) }} </button> </div> <div class="timesheet-page__topbar-actions" data-ng-if="approvalViewMode" data-if-timesheet-approval-workflow> <button class="button green" data-ng-if="canManageApprovalActions()" data-ng-click="approveWeek()" data-ng-disabled="approving || requestingRevision || undoApproving || loading"> {{ \'timesheet.approve\' | translate }} </button> <button class="button clean red" data-ng-if="canManageApprovalActions()" data-ng-click="requestRevisionForWeek()" data-ng-disabled="approving || requestingRevision || undoApproving || loading"> {{ \'timesheet.reject\' | translate }} </button> <button class="button clean yellow" data-ng-if="canUndoApproveAction()" data-ng-click="undoApproveWeek()" data-ng-disabled="approving || requestingRevision || undoApproving || loading"> {{ \'timesheet.undo_approve\' | translate }} </button> <button class="button clean" data-ng-if="!fromApprovals" data-ng-click="goToTimesheetFullscreen()"> {{ \'timesheet.open_timesheet\' | translate }} </button> </div> </header> '),
20$templateCache.put("views/timesheet/timesheet-week-grid-header.html",'<tr> <th>{{ \'timesheet.column_project\' | translate }}</th> <th data-ng-repeat="dayItem in dayItems track by dayItem.details.date" data-ng-class="{\r\n            \'timesheet-page--is-weekend-column\': isWeekendDay(dayItem.details.date),\r\n            \'timesheet-page--is-today-column\': isTodayDay(dayItem.details.date)\r\n        }"> <div class="timesheet-page--day-description"> <span>{{ dayItem.details.date | moment: \'ddd\' }}</span> <span>{{ dayItem.details.date | moment: \'D\' }}</span> </div> <div data-ng-if="dayItem.details.group_key === \'date\'"> <span data-progress-capacity-bar data-title="{{ dayItem.details.date | dateLong }}" data-progress="dayItem.details.date_user_capacity_progress" data-consumed="dayItem.details.date_user_capacity_consumed" data-remaining="dayItem.details.date_user_capacity_remaining" data-total="dayItem.details.date_user_capacity_total" data-exceed="dayItem.details.date_user_capacity_exceed" data-status="dayItem.details.date_user_capacity_context" class="progress-bar-exceed-warning"> </span> <div class="timesheet-page--total-content" data-ng-class="{\'timesheet-page--total-content--clickable\': dayItem.totals.time_total.minutes > 0}" data-ng-click="onDayHeaderTotalClick(dayItem)"> <span data-ng-if="dayItem.totals.time_total.minutes === 0" data-ng-switch="dayItem.details.date_user_capacity_context"> <span data-ng-switch-when="holiday" class="icon-moon"></span> <span data-ng-switch-when="vacation" class="icon-moon"></span> <span data-ng-switch-when="leave" class="icon-moon"></span> <span data-ng-switch-default class="color-steel">—</span> </span> <span data-ng-if="dayItem.totals.time_total.minutes > 0"> <strong class="timesheet-page--total-content__hours">{{ dayItem.totals.time_total.time | durationFormat: \'default\' }}</strong> </span> </div> </div> </th> <th class="total-time-column"> <div class="timesheet-page--day-description"> <span>{{ \'timesheet.column_week_total\' | translate }}</span> </div> <div data-ng-include="\'views/timesheet/timesheet-week-total-header-content.html\'"></div> </th> </tr> '),$templateCache.put("views/timesheet/timesheet-week-grid.html",'<div class="timesheet-page__body"> <div class="report-list-container" data-ng-class="{\'report-list-container--is-loading\': gridLoading || loading}"> <div class="report-list-sticky"> <table class="sticky-table report-round-table-corners timesheet-grid" data-training="timesheet-grid"> <thead> <tr data-ng-include="\'views/timesheet/timesheet-week-grid-header.html\'" data-include-replace></tr> </thead> <!--                <tbody>--> <!--                <tr data-ng-include="\'views/timesheet/timesheet-week-summary-row.html\'"--> <!--                    data-include-replace></tr>--> <!--                </tbody>--> <tbody> <tr data-ng-repeat="row in gridRows track by (row.project_id + \'-\' + (row.task_id || \'none\') + \'-\' + (row.todo_id || \'none\'))" class="report-groups-and-sort-2024--item-row item-level-1"> <td> <div class="report-groups-and-sort-2024--item-details"> <span class="project_id-item-details timesheet-grid-row__label entity-color-identity-row--accent-left" data-ng-style="row.project_color | entityColorBorderLeft"> <a data-ng-if="row.project_id" class="timesheet-grid-row__project-line overflow-ellipsis light-blue-on-hover timesheet-grid-row__project-link" data-app-href="#/projects/{{row.project_id}}" data-tooltip="{{ getRowProjectTooltip(row) }}" data-tooltip-ellipsis> <span>{{ row.project_name }}<span class="timesheet-grid-row__customer" data-ng-if="row.customer_name"> ({{ row.customer_name }})</span></span> </a> <span data-ng-if="!row.project_id" class="timesheet-grid-row__project-line overflow-ellipsis" data-tooltip="{{ getRowProjectTooltip(row) }}" data-tooltip-ellipsis> <span><strong>{{ row.project_name }}</strong><span class="timesheet-grid-row__customer" data-ng-if="row.customer_name"> ({{ row.customer_name }})</span></span> </span> <span class="timesheet-grid-row__task-line overflow-ellipsis"> <span data-ng-class="{\'grey-color\': !row.task_name}"> {{ row.task_name || (\'timesheet.no_task\' | translate) }}
20 </span><span data-ng-if="hasRowTodo(row) && row.todo_name" data-tooltip="{{ row.todo_name_path || row.todo_name }}" data-tooltip-append-to-body="true"> , {{ row.todo_name }} </span> </span> </span> </div> </td> <td data-ng-repeat="dayItem in dayItems track by dayItem.details.date" data-ng-click="onGridCellEmptyClick(row, dayItem.details.date, $event)" data-ng-class="getGridCellClass(row, dayItem.details.date)" class="timesheet-grid-cell__wrap"> <span> <span class="timesheet-grid-cell__add-icon timesheet-grid-cell__add-icon--corner icon-plus4" data-ng-if="isGridCellHasHoursAddable(row, dayItem.details.date)" data-ng-click="onGridCellAddClick(row, dayItem.details.date, $event)" aria-hidden="true"></span> <span class="timesheet-grid-cell__lock" data-ng-if="isGridCellBlocked(row, dayItem.details.date)"> <span data-entry-is-locked-component data-entry="getGridCellLockedEntry(row, dayItem.details.date)"></span> </span> <span class="timesheet-grid-cell__hours" data-ng-class="{\'timesheet-grid-cell__hours--clickable\': isGridCellHasHours(row, dayItem.details.date)}" data-ng-click="onGridCellHoursClick(row, dayItem.details.date, $event)">{{ formatSeconds(row.days[dayItem.details.date]) }}</span> <span class="timesheet-grid-cell__add-icon timesheet-grid-cell__add-icon--center icon-plus4" data-ng-if="isGridCellEmptyAddable(row, dayItem.details.date)" data-ng-click="onGridCellAddClick(row, dayItem.details.date, $event)" aria-hidden="true"></span> </span> </td> <td class="total-time-column timesheet-grid-cell--has-hours" data-ng-click="onGridRowTotalClick(row)"> <span class="timesheet-grid-cell__hours timesheet-grid-cell__hours--clickable"> {{ formatSeconds(row.totalSeconds) }} </span> </td> </tr> </tbody> <tbody data-ng-if="!gridLoading && !loading && gridRows.length === 0"> <tr> <td colspan="100"> <app-empty-state message="{{ \'timesheet.no_entries\' | translate }}"></app-empty-state> </td> </tr> </tbody> <tfoot data-ng-if="canEditTimesheet() && !approvalViewMode"> <tr class="timesheet-grid__add-row"> <td colspan="100"> <button type="button" class="button clean light-blue-on-hover timesheet-grid__add-row-button" data-ng-click="openAddGridRowModal()" data-ng-disabled="!canAddGridRow()"> <span class="icon-plus4"></span> {{ \'timesheet.add_grid_row\' | translate }} </button> </td> </tr> </tfoot> </table> </div> </div> <p class="title-description timesheet-page__hint" data-ng-if="isWeekLocked() && !approvalViewMode"> {{ \'timesheet.week_locked_hint\' | translate }} </p> </div> '),$templateCache.put("views/timesheet/timesheet-week-total-header-content.html",'<div data-ng-if="weekUserSummary"> <span data-progress-capacity-bar data-title="{{ \'timesheet.column_week_total\' | translate }}" data-progress="weekUserSummary.details.user_capacity_progress" data-consumed="weekUserSummary.details.user_capacity_consumed" data-remaining="weekUserSummary.details.user_capacity_remaining" data-total="weekUserSummary.details.user_capacity_total" data-exceed="weekUserSummary.details.user_capacity_exceed" class="progress-bar-exceed-warning"> </span> <div class="timesheet-page--total-content" data-ng-class="{\'timesheet-page--total-content--clickable\': weekUserSummary.totals.time_total.minutes > 0}" data-ng-click="onWeekHeaderTotalClick()"> <span data-ng-if="weekUserSummary.totals.time_total.minutes === 0" class="color-steel">—</span> <span data-ng-if="weekUserSummary.totals.time_total.minutes > 0"> <strong class="timesheet-page--total-content__hours">{{ weekUserSummary.totals.time_total.time | durationFormat: \'default\' : \'short\' }}</strong> </span> </div> </div> '),$templateCache.put("views/timesheet/timesheet-week.html",'<div class="timesheet-page report-groups-and-sort-2024" data-ng-class="{\'timesheet-page--embed\': approvalViewMode && hasTimesheetApprovalFeature}"> <div data-ng-controller="TimesheetTopBarController" data-ng-include="\'views/timesheet/timesheet-topbar.html\'"></div> <div data-ng-include="\'views/timesheet/timesheet-missing-manager-banner.html\'"></div> <div data-ng-include="\'views/timesheet/timesheet-rejection-comment-banner.html\'"></div> <div data-ng-controller="TimesheetWeekGridController" data-ng-include="\'views/timesheet/timesheet-week-grid.html\'"></div> </div> '),$templateCache.put("views/time-entries/entries-add.html",'<style> .view-time-entry-edit .entry-list-item-content [contenteditable]:empty::before {\r\n        content: attr(title);\r\n    } </style> <div data-ng-controller="EntriesAddController"> <div class="view-time-entry-edit" data-training="entry-form" data-ng-class="{ \'view-time-entry-edit--modal-mode\': timeEntryFormModalMode }"> <div class="view-time-entry-edit--header-container" data-ng-if="!timeEntryFormModalMode || $timeEntryFormService.countAll() > 0"> <div> <div data-ng-if="$timeEntryFormService.countAll() == 0 && !timeEntryFormModalMode"> <span data-ng-if="entry.id">{{ \'time_entries.add.edit_entry\' | translate }}</span> <span data-ng-if="!entry.id">{{ \'time_entries.add.new_entry\' | translate }}</span> </div> <div data-ng-if="$timeEntryFormService.countAll() > 0" class="time-entry-form-selection"> <a data-ng-repeat="form in $timeEntryFormService.getAll()" data-ng-click="entry.form = form.name" data-ng-class="{ \'link\' : entry.form == form.name }">{{form.label}}</a> </div> </div> <div data-ng-if="!timeEntryFormModalMode"> <a data-ng-if="entry.id" class="close right" data-ng-click="close()"> <span class="icon-cross"></span> </a> <a data-ng-if="!entry.id" data-ng-click="cleanTime()" class="clean-form">{{ \'time_entries.add.clean_hours\' | translate }}</a> </div> </div> <div class="view-time-entry-edit--fields-container"> <div> <div class="app-banner app-banner--warning" data-ng-if="shouldShowThirdPartyEntryBanner()"> <span class="app-banner__icon icon-warning" aria-hidden="true"></span> <div class="app-banner__body"> <p class="app-banner__text" data-ng-bind-html="\'time_entries.add.third_party_banner\' | translate:{ user_name: entry.user_name }"></p> <p class="app-banner__text app-banner__text--secondary">{{ \'time_entries.add.third_party_banner_log_note\' | translate }}</p> </div> </div>
20 <div class="entry-list-item-content" style="position: relative;" data-ng-if="field_is_enable(\'description\')"> <div class="radius" contenteditable="true" data-training="entry-description" data-ng-model="entry.description" title="{{ \'time_entries.add.what_are_you_doing\' | translate }}" data-ng-click="expand()" data-ng-keydown="expand()" data-ng-change="strip_description()" autofocus="autofocus"> </div> </div> <div class="entry-list-item-extras view-time-entry-edit--labeled-field"> <div data-ng-class="{\'has-error\' : errors.project}" style="position: relative"> <label class="view-time-entry-edit--field-label" data-ng-if="timeEntryFormModalMode">{{ \'time_entries.common.project\' | translate }}</label> <select class="selectize-projects" title="{{ \'time_entries.common.project\' | translate }}" data-training="entry-project" data-ng-model="entry.project_id" data-options="projects" data-ng-disabled="isProjectFieldDisabled()" data-optgroup="customer" data-selectize="projectSelectizeConfig"> </select> <sub data-ng-if="errors.project">{{errors.project}}</sub> <div spinner-loading="loading_projects" class="spinner-size-mini" style="display: inline-block; position: absolute; top: 10px; right: 20px; z-index: 100;"></div> </div> </div> <div class="entry-list-item-extras view-time-entry-edit--labeled-field"> <div data-ng-class="{\'has-error\' : errors.task}" style="position: relative"> <label class="view-time-entry-edit--field-label" data-ng-if="timeEntryFormModalMode">{{ \'time_entries.common.task\' | translate }}</label> <select class="selectize-projects" title="{{ \'time_entries.common.task\' | translate }}" data-training="entry-task" data-ng-model="entry.task_id" data-options-load="loadProjectTasks" data-options-filters="task__options_filters" data-ng-disabled="!entry.project_id" data-selectize-key="options-project-tasks" data-selectize="taskSelectizeConfig"> </select> <sub data-ng-if="errors.task">{{errors.task}}</sub> <!--                        <div spinner-loading="loading_project_tasks"--> <!--                             class="spinner-size-mini"--> <!--                             style="display: inline-block; position: absolute; top: 10px; right: 20px; z-index: 100;"></div>--> </div> </div> <div class="entry-list-item-extras view-time-entry-edit--labeled-field" data-if-has-feature="TODOLIST"> <div data-ng-if="todoVisible || entry.todo_id"> <div data-ng-class="{\'has-error\' : errors.task}" tooltip="{{errors.todo}}" tooltip-enable="errors.todo" tooltip-class="tooltip-alert" tooltip-placement="top" style="position: relative"> <label class="view-time-entry-edit--field-label" data-ng-if="timeEntryFormModalMode">{{ \'time_entries.common.activity\' | translate }}</label> <select class="selectize-projects" title="{{ \'time_entries.common.activity\' | translate }}" data-ng-model="entry.todo_id" data-options-load="loadProjectTodos" data-options-filters="[{ key: \'include_completed\', label: (\'time_entries.add.include_completed\' | translate), value: false },\r\n                                    { key: \'assigned_to_me\', label: (\'time_entries.add.assigned_to_me\' | translate), value: false }]" data-ng-disabled="!entry.project_id" data-selectize-key="options-project-todos" data-selectize="{\r\n                                            labelField: \'name\',\r\n                                            valueField: \'id\',\r\n                                            sortField: [\'todo_list_position\', \'picker_order\'],\r\n                                            searchField: [\'name\', \'name_path\', \'ancestor_name_path\'],\r\n                                            placeholder : (\'time_entries.common.activity\' | translate),\r\n                                            onChange: revalidate_required,\r\n                                            optgroupField: \'todo_list_id\',\r\n                                            optgroupLabelField: \'todo_list_name\',\r\n                                            optgroupValueField: \'todo_list_id\',\r\n                                            render: render_todos\r\n                                        }"> </select> <!--                            <div spinner-loading="loading_todos"--> <!--                                 class="spinner-size-mini"--> <!--                                 style="display: inline-block; position: absolute; top: 10px; right: 20px; z-index: 100;"></div>--> </div> </div> </div> <!-- campos customizados - início --> <div class="row entry-list-item-extras" data-ng-if="$fieldService.getTimeEntryFields().length > 0" data-ng-repeat="field in $fieldService.getTimeEntryFields() | filter: { form : entry.form }  | orderBy: sequence "> <input type="text" data-ng-model="entry[field.name]" placeholder="{{field.label}}" style="padding-left: 10px; font-size: 13px;" data-ng-class="{ \'has-error\' : errors[field.name] }" tooltip="{{errors[field.name]}}" tooltip-enable="errors[field.name]" tooltip-class="tooltip-alert" tooltip-placement="bottom" title="{{field.label}}" data-ng-change="revalidate_required()"> </div> <!-- campos customizados - fim --> <div data-generate-custom-fields-form data-entity="time_entries" data-model="entry" data-errors="errors" data-revalidate="revalidate_required"> </div> </div>
20 <div class="entry-list-item-time-fields" data-ng-class="{\'time-fields-disabled\' : !time_is_editable() }"> <div class="stopwatch-active-notice green-color" data-ng-if="entry.stopwatch_active==\'1\'"> {{ \'time_entries.add.stopwatch_active_notice\' | translate }} </div> <!-- Tempo total --> <div class="time-total-container radius view-time-entry-edit--labeled-field" data-ng-class="{\'has-error\' : errors.time_total}" tooltip="{{errors.time_total}}" tooltip-enable="errors.time_total" tooltip-class="tooltip-alert"> <label class="view-time-entry-edit--field-label"> {{ \'time_entries.add.total_time\' | translate }} </label> <input data-ng-model="entry.time_total" data-training="entry-duration" data-ng-change="calculate_time(\'time_total\')" data-ng-blur="format_time(\'time_total\'); revalidate_time()" data-ng-mask="time" data-ng-disabled="!time_is_editable()" data-ng-class="{\'has-error\' : errors.time_total}" placeholder="{{ time_is_editable() ? \'0:00\' : \'--:--\' }}" type="text" title="{{ \'time_entries.add.total_time\' | translate }} {{ time_is_editable() ? \'\' : (\'time_entries.status.locked_prefix\' | translate) }}"> </div> <div class="entry-list-item-extras view-time-entry-edit--time-period-container"> <!-- Horário inicial --> <div class="view-time-entry-edit--labeled-field"> <label class="view-time-entry-edit--field-label" data-ng-if="timeEntryFormModalMode">{{ \'time_entries.add.start_time_label\' | translate }}</label> <input data-ng-model="entry.time_start" data-ng-change="calculate_time(\'time_start\')" data-ng-blur="format_time(\'time_start\'); revalidate_time()" data-ng-dblclick="add_current_time(\'time_start\')" data-ng-mask="time" data-ng-disabled="!time_is_editable()" data-ng-class="{\'has-error\' : errors.time_start}" tooltip="{{errors.time_start}}" tooltip-enable="errors.time_start" tooltip-class="tooltip-alert" tooltip-placement="bottom" placeholder="{{ time_is_editable() ? (\'time_entries.add.start_time_placeholder\' | translate) : \'--:--\' }}" type="text" title="{{ \'time_entries.add.start_time_label\' | translate }} {{ time_is_editable() ? \'\' : (\'time_entries.status.locked_prefix\' | translate) }}" maxlength="5" autocomplete="off"> </div> <div class="view-time-entry-edit--time-period-separator"> <label>{{ \'time_entries.common.to\' | translate }}</label> </div> <!-- Horário final --> <div class="view-time-entry-edit--labeled-field"> <label class="view-time-entry-edit--field-label" data-ng-if="timeEntryFormModalMode">{{ \'time_entries.add.end_time_label\' | translate }}</label> <input data-ng-model="entry.time_end" data-ng-change="calculate_time(\'time_end\')" data-ng-blur="format_time(\'time_end\'); revalidate_time()" data-ng-dblclick="add_current_time(\'time_end\')" data-ng-mask="time" data-ng-disabled="!time_is_editable()" data-ng-class="{\'has-error\' : errors.time_end}" tooltip="{{errors.time_end}}" tooltip-enable="errors.time_end" tooltip-class="tooltip-alert" tooltip-placement="bottom" placeholder="{{ time_is_editable() ? (\'time_entries.add.end_time_placeholder\' | translate) : \'--:--\' }}" type="text" title="{{ \'time_entries.add.end_time_label\' | translate }} {{ time_is_editable() ? \'\' : (\'time_entries.status.locked_prefix\' | translate) }}" maxlength="5" autocomplete="off"> </div> </div> <div class="row collapse entry-list-item-extras overtime" if-has-feature="OVERTIME"> <label> <input type="checkbox" data-ng-model="entry.has_overtime" data-ng-click="calculate_time(\'time_total\')" data-ng-disabled="!time_is_editable()" title="{{ \'time_entries.add.overtime_happened_tooltip\' | translate }}"> {{ \'time_entries.add.overtime_happened\' | translate }} </label> </div> <div data-ng-if="entry.has_overtime"> <div class="row collapse entry-list-item-extras overtime"> <div class="column-60"> <label> <!--                                    <input type="checkbox"--> <!--                                           data-ng-model="entry.has_overtime"--> <!--                                           data-ng-disabled="!time_is_editable()"--> <!--                                           title="Marque esse campo se houve hora extra"--> <!--                                    >--> {{ \'time_entries.add.overtime_hours\' | translate }} </label> </div> <div class="column-40" data-ng-if="entry.has_overtime"> <input data-ng-model="entry.overtime" data-ng-change="calculate_time(\'overtime\')" data-ng-blur="format_time(\'time_end\'); revalidate_time()" data-ng-mask="time" data-ng-disabled="!time_is_editable()" data-ng-class="{\'has-error\' : errors.overtime}" tooltip="{{errors.overtime}}" tooltip-enable="errors.overtime" tooltip-class="tooltip-alert" tooltip-placement="bottom" placeholder="0:00" type="text" title="{{ \'t
20ime_entries.add.total_overtime\' | translate }}" maxlength="5" autocomplete="off"> </div> </div> <div class="row collapse entry-list-item-extras overtime"> <div class="column-60"> <label> <!--                                <input type="checkbox"--> <!--                                       data-ng-model="entry.has_overtime"--> <!--                                       data-ng-disabled="!time_is_editable()"--> <!--                                       title="Marque esse campo se houve hora extra"--> <!--                                >--> {{ \'time_entries.add.regular_hours\' | translate }} </label> </div> <div class="column-40"> <input data-ng-model="entry.time_regular" data-ng-disabled="true" placeholder="0:00" type="text" title="{{ \'time_entries.add.total_regular_hours\' | translate }}" autocomplete="off"> </div> </div> </div> </div> </div> <div class="view-time-entry-edit--buttons-container"> <div> <!-- Botão salvar : início --> <button class="button button--blue-brand" data-training="entry-save" data-ng-click="save(false)" data-ng-disabled="saving" data-ng-if="!shouldShowStopwatchButton()"> {{ saving ? (\'time_entries.add.saving\' | translate) : (\'time_entries.add.save\' | translate) }} </button> <!-- Botão salvar : fim --> <!-- Salvar e iniciar cronômetro : início --> <button title="{{ \'time_entries.add.start_stopwatch\' | translate }}" class="button green" data-ng-click="save(true)" data-ng-disabled="saving" data-ng-if="shouldShowStopwatchButton()"> <span class="icon-play2"></span> <span>{{ saving ? (\'time_entries.add.starting_stopwatch\' | translate) : (\'time_entries.add.start_stopwatch\' | translate) }}</span> </button> <!-- Salvar e iniciar cronômetro : fim --> </div> <div> <button title="{{ \'time_entries.add.show_activity\' | translate }}" data-if-has-feature="TODOLIST" data-ng-click="toggleTodoVisibility()" class="button clean"> <span class="icon-check"></span> <span>{{ \'time_entries.common.activity\' | translate }}</span> </button> <!-- Botão para atribuir tarefa a terceiros : início --> <button title="{{ \'time_entries.add.register_for_others\' | translate }}" data-dropdown="dropdown-user-entry-{{entry.id}}" data-ng-click="onClickRegisterEntryForOthers()" data-ng-disabled="entry.stopwatch_active==\'1\'" data-ng-if="$permissionService.hasPrivilegesToTimeLogForOthersUsers()" class="button clean"> <span class="icon-user"></span> <span>{{ (entry.user_name || $profileService.getUserName()) | shortening: true}}</span> </button> <!-- Botão para atribuir tarefa a terceiros : fim --> <!-- Dropdown escolha de terceiros : início --> <div id="dropdown-user-entry-{{entry.id}}" style="max-width: 300px" data-dropdown-content class="f-dropdown content no-padding" if-has-feature="TIME_ENTRY_EDIT_OTHER_USERS"> <div style="padding: 10px;"> <select data-ng-model="entry.user_id" data-options-load="$userService.getUserOptions" data-options-load-trigger="focus" style="width: 270px" data-selectize="{\r\n                                    labelField: \'name\',\r\n                                    valueField: \'id\',\r\n                                    sortField: \'name\',\r\n                                    searchField: \'name\',\r\n                                    onChange: onChangeUser,\r\n                                    placeholder: (\'time_entries.add.choose_user_placeholder\' | translate)\r\n                                }"></select> <div class="details" style="margin-top: 10px;"> {{ \'time_entries.add.register_for_others_description\' | translate }} </div> </div> </div> <!-- Dropdown escolha de terceiros : fim --> <!--                <div data-button-date="entry.date_execution"--> <!--                     data-button-disabled="!time_is_editable()"--> <!--                     data-min-date="date_execution_min"--> <!--                     data-max-date="date_execution_max"--> <!--                     data-hide-clear-button="true">--> <!--                </div>--> <!-- Botão para escolher data de realização : início --> <button title="{{ \'time_entries.add.realization_date\' | translate }} {{ time_is_editable() ? \'\' : (\'time_entries.status.locked_prefix\' | translate) }}" data-dropdown="dropdown-date-entry-{{entry.id}}" class="button clean" data-ng-disabled="!time_is_editable()" data-ng-class="{\'has-error\' : errors.date_execution}" tooltip="{{errors.date_execution}}" tooltip-enable="errors.date_execution" tooltip-class="tooltip-alert"> <span class="icon-calendar4"></span> <span data-ng-if="entry.date_execution">{{ entry.date_execution | dateLong }}</span> </button> <!-- Botão para escolher data de realização : fim --> <!-- Dropdown escolha data de realização : início --> <div id="dropdown-date-entry-{{entry.id}}" data-dropdown-content class="f-dropdown content rabbiit-datepicker"> <div datepicker ng-model="entry.date_execution_object" show-weeks="false" max-mode="day" min-mode="day" min-date="date_execution_min" max-date="date_execution_max" on-datepicker-view-change="onDatepickerViewChange(activeDate, startingDay)" date-disabled="isDateExecutionDisabled({ date: date, mode: mode })"> </div> </div> <!-- Dropdown escolha data de realização : fim --> </div> </div> </div> </div> '),$templateCache.put("views/time-entries/entries-filter-modal.html",'<div class="entr
20ies-filter-modal"> <a class="icon-cross entries-filter-modal__close" data-ng-click="$dismiss()" data-tooltip="{{ \'common.cancel\' | translate }}" data-tooltip-append-to-body="true"></a> <div class="modal-body"> <div data-ng-include="\'views/time-entry-filters.html\'"></div> </div> </div> '),$templateCache.put("views/time-entries/entries-item.html",'<div class="view-time-entry-item"> <div class="view-time-entry-item--top-container"> <div class="view-time-entry-item--top-container__left-column"> <!--            <div>--> <div class="view-time-entry-item--user-container"> <div class="perfil-avatar" title="{{ \'time_entries.item.created_at_label\' | translate : { date: \'\', user: entry.user_name } }}"> {{entry.user_name | truncate: 1}} </div> <div> <div class="username">{{entry.user_name | shortening}}</div> </div> </div> <div class="view-time-entry-item--project-container entity-color-identity-row--accent-left" data-ng-if="entry.project_id" data-ng-style="entry.project_color | entityColorBorderLeft"> <span class="overflow-ellipsis" data-tooltip="{{entry.project_name}}" data-tooltip-ellipsis data-tooltip-append-to-body="true"> <span class="icon-book4"></span> <span data-ng-if="isInsideProject === true"> {{entry.project_name}} </span> <a data-ng-if="isInsideProject === false" data-app-href="#/projects/{{entry.project_id}}" class="light-blue-on-hover" title="{{ \'time_entries.item.open_project\' | translate }}"> {{entry.project_name}} </a> <span data-ng-if="entry.customer_id" class="view-time-entry-item--customer-container"> ({{entry.customer_name}}) </span> </span> </div> <div class="view-time-entry-item--task-container" data-ng-if="entry.task_id"> <span data-ng-if="entry.task_id" class="overflow-ellipsis" data-tooltip="{{entry.task_name}}" data-tooltip-append-to-body="true" data-tooltip-ellipsis> <span class="icon-ribbon"></span> {{entry.task_name}} </span> </div> <div class="view-time-entry-item--task-container" data-if-has-feature="BILLABLE_PROJECT"> <!--                    <span data-ng-if="$permissionService.hasPermissionToViewChargeRate() && entry.is_billable"--> <span data-ng-if="entry.rate_total !== null && entry.is_billable" data-tooltip-popup-delay="200" data-tooltip-placement="bottom" data-tooltip-append-to-body="true" tooltip-html="get_html_price(entry)">{{ entry.rate_total | moneyToRealPrivacy }} </span> </div> <div class="view-time-entry-item--task-container" data-ng-if="entry.todo_id"> <span data-ng-if="entry.todo_id" class="overflow-ellipsis" data-tooltip="{{entry.todo_name_path || entry.todo_name || (\'time_entries.item.activity_no_name\' | translate)}}" data-tooltip-append-to-body="true"> <span class="icon-check"></span> {{entry.todo_name || (\'time_entries.item.activity_no_name\' | translate)}} </span> </div> <div class="view-time-entry-item--task-container" data-ng-repeat="customField in $customFieldService.getActiveByEntity(\'time_entries\') | orderBy: \'name\'" data-ng-if="entry[\'custom_fields\'][customField.id]"> <span data-tooltip-html="\'\r\n                        {{customField.name}}<hr>\r\n                        {{entry[\'custom_fields\'][customField.id][\'enum_name\'] || entry[\'custom_fields\'][customField.id][\'value\']}}\r\n                        \'" data-tooltip-append-to-body="true"> <span class="icon-custom-field-{{customField.type}}"></span> {{entry[\'custom_fields\'][customField.id][\'enum_name\'] || entry[\'custom_fields\'][customField.id][\'value\']}} </span> </div> <!--            </div>--> </div> <!-- coluna direita - início --> <div class="view-time-entry-item--top-container__right-column"> <!--            <div class="row collapse">--> <!-- informações de hora e data - início --> <div> <div class="hours stopwatch-button-container" data-ng-show="entry.time_total"> <span data-ng-switch="entry.isHandleableStopwatch"> <!-- comando play/stop - início --> <span data-ng-switch-when="true" class="button-stopwatch" stopwatch-button title="{{ \'time_entries.item.continue\' | translate }}"> <span class="icon-play2"></span> </span> <!-- comando play/stop - fim --> <!-- sinalização de cronômetro ativo - início --> <span data-ng-switch-when="false" data-ng-if="entry.stopwatch_active==1" class="green-bg radius-full signal-stopwatch-active" title="{{ \'t
20ime_entries.item.stopwatch_user_active\' | translate }}"> </span> <!-- sinalização de cronômetro ativo - fim --> </span> <span class="stopwatch-display-paused"> <a data-ng-click="edit(entry)" title="{{ \'time_entries.item.edit_time_entry\' | translate }}"> {{ entry.time_total | durationFormat: \'default\' }} </a> </span> <span class="stopwatch-display"></span> </div> <div> <span class="view-time-entry-item--date-container" data-ng-if="entry.date_execution" title="{{ \'time_entries.item.realized_on\' | translate : { date: (entry.date_execution | dateFull) } }}"> {{ entry.date_execution | dateShort2 }} </span> <span data-ng-if="entry.stopwatch_active==1 || (entry.time_start && !entry.time_end)" class="view-time-entry-item--period-container"> <span title="{{ \'time_entries.item.started_at\' | translate : { time: (entry.time_start | time) } }}"> <span>{{ \'time_entries.item.started_at_label\' | translate : { time: (entry.time_start | time) } }}</span> </span> </span> <span data-ng-if="entry.stopwatch_active!=1" class="view-time-entry-item--period-container"> <span data-ng-if="entry.time_start && entry.time_end" title="{{ \'time_entries.item.realized_period\' | translate : { start: (entry.time_start | time), end: (entry.time_end | time) } }}"> <!--                        <span class="icon-time2 light-grey-color"></span>--> <span>{{ \'time_entries.item.realized_period_label\' | translate : { start: (entry.time_start | time), end: (entry.time_end | time) } }}</span> </span> <span data-ng-if="!entry.time_start && entry.time_end" title="{{ \'time_entries.item.finished_at\' | translate : { time: (entry.time_end | time) } }}"> <!--                        <span class="icon-time2 light-grey-color"></span>--> <span>{{ \'time_entries.item.finished_at_label\' | translate : { time: (entry.time_end | time) } }}</span> </span> </span> </div> </div> <!-- informações de hora e data - fim --> <div> <div> <span data-entry-is-locked-component data-entry="entry"></span> </div> <a title="{{ \'time_entries.item.options\' | translate }}" data-ng-if="!entry.is_locked || entry.permissions.can_modify_locked" data-dropdown="dropdown-time-entry-{{entry.id}}" class="icon-angle-down light-grey-color light-blue-on-hover"> </a> <div id="dropdown-time-entry-{{entry.id}}" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list dropdown-time-entry-actions" dropdown-close-on-click> <div class="dropdown-option option-button" data-ng-if="is_editable(entry)"> <a data-ng-click="edit(entry)" title="{{ \'time_entries.item.edit_tooltip\' | translate }}"> {{ \'time_entries.item.edit\' | translate }} </a> </div> <div class="dropdown-option option-button" data-ng-if="is_duplicatable(entry)"> <hr data-ng-if="is_editable(entry)"> <a data-ng-click="duplicate(entry)" title="{{ \'time_entries.item.duplicate\' | translate }}"> {{ \'time_entries.item.duplicate\' | translate }} </a> </div> <div class="dropdown-option option-button" data-ng-if="is_deletable(entry)"> <hr> <a data-ng-click="remove(entry)"> {{ \'time_entries.item.delete\' | translate }} </a> </div> <div class="dropdown-text" data-ng-if="entry.reasons_is_not_editable"> <span data-ng-bind-html="entry.reasons_is_not_editable"></span> </div> <div class="dropdown-text" data-ng-if="entry.reasons_is_not_deletable"> <hr> <div data-ng-bind-html="entry.reasons_is_not_deletable" style="padding-top: 10px"></div> </div> </div> </div> <!--            </div>--> </div> <!-- coluna direita - fim --> </div> <!--    <div class="row">--> <!--        <div class="column-75">--> <!--            <div class="view-time-entry-item&#45;&#45;user-container">--> <!--                <div class="perfil-avatar" title="Realizado por {{entry.user_name}}">{{entry.user_name | truncate: 1--> <!--                    }}</div>--> <!--                <div>--> <!--                    <div class="username">{{entry.user_name | shortening}}</div>--> <!--                </div>--> <!--            </div>--> <!--        </div>--> <!--        <div class="column-25">--> <!--            <div class="period-date" data-ng-if="entry.date_execution"--> <!--                 title="Realizado {{ entry.date_execution | dateFull }}">-->
20 <!--                <span class="icon-calendar4 light-grey-color"></span> {{ entry.date_execution | dateLong }}--> <!--            </div>--> <!--        </div>--> <!--    </div>--> <div class="view-time-entry-item--description-container" data-ng-if="entry.description"> <div class="view-time-entry-item--description" id="view-time-entry-item--description-{{entry.id}}" copy-to-clipboard-button data-ng-bind-html="entry.description | descriptionLinkify "> </div> <span copy-to-clipboard-button="view-time-entry-item--description-{{entry.id}}"></span> </div> <div class="view-time-entry-item--log-last-activity" data-tooltip-placement="bottom" data-tooltip-append-to-body="true" data-tooltip-html="get_html_log(entry)"> <span data-ng-if="!entry.date_changed"> {{ \'time_entries.item.created_date_entry\' | translate : { date: (entry.date_created | dateEntry) } }} <span data-ng-if="entry.created_by && entry.created_by != entry.user_id"> {{ (\'time_entries.item.by\' | translate) + (entry.created_by_user_name | shortening: true) }} </span> </span> <span data-ng-if="entry.date_changed"> {{ \'time_entries.item.changed_date_entry\' | translate : { date: (entry.date_changed | dateEntry) } }} <span data-ng-if="entry.changed_by && entry.changed_by != entry.user_id"> {{ (\'time_entries.item.by\' | translate) + (entry.changed_by_user_name | shortening: true) }} </span> </span> </div> </div> '),
21$templateCache.put("views/time-entries/entries-list.html",'<div class="time-entry-filter" data-ng-controller="EntriesFilterListController" data-ng-if="!entriesListEmbedMode"> <div class="time-entry-filter__buttons-container"> <div> <a class="time-entry-filter--button-options has-dropdown" data-dropdown="dropdown-time-entries-filter-list" data-ng-if="segmentFiltersVisible"> <span>{{ segmentFilterSelected.name }}</span> </a> </div> <div> <a class="time-entry-filter--button-options" data-ng-class="{ \'time-entry-filter--button-options__has-filters\': filterDescription.length > 0 }" data-ng-click="openFiltersModal()"> <span class="icon-filter"></span> <span>{{ \'time_entries.filter.title\' | translate }}</span> <span class="time-entry-filter--button-options__filter-description">{{filterDescription}}</span> </a> </div> </div> <div id="dropdown-time-entries-filter-list" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-title"> <span>{{ \'time_entries.filter.quick_filters\' | translate }}</span> </div> <div class="dropdown-option radio" data-ng-repeat="segment in segmentFilters | filter: { visible: true }"> <label data-ng-class="{ \'active\': segmentFilterSelected === segment }" data-ng-click="setSegmentFilter(segment)" data-dropdown-close-on-click>{{ segment.name }}</label> </div> </div> </div> <div class="list full task-list scroll-loader view-time-entries--list-container" data-infinite-scroll="loadMore()" data-infinite-scroll-disabled="loading_entries_list" data-infinite-scroll-distance="2" data-ng-attr-data-infinite-scroll-container="{{ timesheetEntriesScrollContainer || \'.view-home-layout--right-container\' }}" data-ng-controller="EntriesListController"> <div data-ng-if="time_entries.length == 0"> <div spinner-loading="loading_entries_list" message="{{ \'time_entries.list.searching\' | translate }}" style="margin-top: 60px;"></div> <app-empty-state data-ng-if="!loading_entries_list && entriesListEmbedMode" message="{{ \'timesheet.no_entries_day\' | translate }}"></app-empty-state> <app-empty-state style="margin-top: 50px" data-ng-if="!loading_entries_list && !entriesListEmbedMode" message="{{ \'time_entries.list.no_entries_found\' | translate }}"></app-empty-state> </div> <!-- lista de publicações - início --> <div data-ng-if="time_entries.length > 0" style="position: relative;"> <div class="entry-list-group" data-ng-repeat="group_time_entries in time_entries | orderBy : [\'date_execution\', \'-time_start\'] : true | groupBy : \'date_execution\'"> <!-- separador por agrupamento de publicações por data - início --> <div class="entry-list-group-separator"> <div class="row"> <div class="column-70"> <span title="{{ \'time_entries.list.created_at\' | translate : { date: (group_time_entries.group_name | dateLong) } }}"> {{ group_time_entries.group_name | dateTimeline }} </span> </div> <div class="column-30" style="text-align: right;">
21 <span title="{{ \'time_entries.list.total_hours_created_at\' | translate : { date: (group_time_entries.group_name | dateLong) } }}"> {{ subtotals[group_time_entries.group_name].total_time | durationFormat: \'default\' }} </span> </div> </div> </div> <!-- separador por agrupamento de publicações por data - fim --> <!-- item publicação - início --> <div class="entry-list-item" data-ng-repeat="entry in group_time_entries.items | orderBy : \'date_execution\' : true" data-ng-class="{\r\n                        \'editing-enable\':entry.editing,\r\n                        \'entry-list-item--locked\':entry.is_locked,\r\n                        \'entry-list-item--stopwatch-active\': entry.belongsToLoggedUser && entry.isStopwatchActive\r\n                     }" data-ng-dblclick="edit(entry)" id="entryitem{{entry.id}}"> <!-- modo de edição - início --> <div data-ng-if="entry.editing"> <div data-ng-include="\'views/time-entries/entries-add.html\'"></div> </div> <!-- modo de edição - fim --> <!-- modo de visualização - início --> <div data-ng-if="!entry.editing"> <div data-ng-include="\'views/time-entries/entries-item.html\'"></div> </div> <!-- modo de visualização - fim --> </div> <!-- item publicação - fim --> </div> <!-- botão de carregar mais publicações - início --> <div style="text-align: center;"> <button data-ng-disabled="loading_entries_list || no_more_entries" data-ng-click="loadMore()" style="margin-bottom: 50px; margin-top: 20px; padding: 3px 30px" class="button clean"> {{ loading_entries_list ? (\'time_entries.list.loading\' | translate) : ( no_more_entries ? (\'time_entries.list.no_more\' | translate) : (\'time_entries.list.load_more\' | translate) ) }} </button> </div> <!-- botão de carregar mais publicações - fim --> </div> <!-- lista de publicações - fim --> </div> '),$templateCache.put("views/time-entries/entries.html",'<div class="list full view-time-entries--general-container"> <div data-ng-if="(!isInsideProject || is_allowed_publish()) && !entriesListEmbedMode" style="padding-top: 5px;"> <div data-ng-include="\'views/time-entries/entries-add.html\'"></div> </div> <div class="timesheet-day-view__add-entry" data-ng-if="entriesListEmbedMode && canEditTimesheet() && !approvalViewMode && (!isInsideProject || is_allowed_publish())"> <button type="button" class="button button--blue-brand" data-ng-click="openAddTimeEntryModal()" data-ng-disabled="!canAddTimeEntryOnPresetDate() || loading"> <span class="icon-plus4"></span> {{ \'timesheet.add_entry\' | translate }} </button> </div> <div data-ng-show="isInsideProject && !is_allowed_publish()" style="padding: 20px;" class="center"> <span class="explanation radius">{{ \'time_entries.messages.cannot_create_project\' | translate }}</span> </div> <div data-ng-if="isInsideProject && is_project_template()" class="center"> <div class="view-time-entries--template-flag"> <span class="icon-paper-stack"></span> <span>{{ \'time_entries.project_labels.template_project\' | translate }}</span> </div> </div> <div data-ng-if="!isInsideProject || !is_project_template()"> <div data-ng-include="\'views/time-entries/entries-list.html\'"></div> </div> </div> '),$templateCache.put("views/time-entries/is-locked-component.html",'<span data-ng-if="entry.is_locked" class="entry-is-locked-component"> <span data-tooltip-html="\'<h3>{{ \'time_entries.status.locked_but_released\' | translate }}</h3> {{entry.locked_reason}}\'" data-tooltip-append-to-body="true" data-ng-if="entry.permissions.can_modify_locked" class="entry-is-locked-component--icon icon-unlock"></span> <span data-tooltip-html="\'<h3>{{ \'time_entries.status.is_locked\' | translate }}</h3> {{entry.locked_reason}}\'" data-tooltip-append-to-body="true" data-ng-if="!entry.permissions.can_modify_locked" class="entry-is-locked-component--icon icon-lock4"></span> </span> '),$templateCache.put("views/time-entries/resume-daily.html",'<div class="resume-daily-group" data-ng-controller="ResumeDailyController" style="position: relative;"> <style> #left-column .resume-daily-group { margin-top: 10px; }
21\r\n\t#left-column .resume-daily-group ul { padding-left: 2px; }\r\n\t#left-column .resume-daily-group ul li [class^="icon-"] { color: #77797B; margin-right: 2px; font-size: 13px;  }\r\n\t#left-column .resume-daily-group ul li .row { display: table; } </style> <!--<a class="beacon" style="right: 5px; top: -5px;"--> <!--data-ng-click="open_tip(\'tips_resume_daily\')"--> <!--data-ng-show="!$configService.configs.tips_resume_daily_done">--> <!--<div></div>--> <!--</a>--> <span class="title">Meu resumo de horas</span> <a data-ng-click="reload()" class="icon-loop" style="font-size: 18px; color: #ccc; position: relative; top: 3px;" title="Atualizar"></a> <div spinner-loading="loading_resume_daily && !resume_daily" style="margin-top: 25px; margin-bottom: 15px;"></div> <ul style="margin-top: 5px;"> <div class="row" style="padding-left: 9px;" data-ng-if="$settingsService.settings.integration_time_clock_active"> <div class="column-30" style="text-align: center">-</div> <div class="column-30" style="font-size: 13px;">Rabbiit</div> <div class="column-40 overflow-ellipsis" style="font-size: 13px; text-transform: capitalize">{{$settingsService.settings.integration_time_clock_active}}</div> </div> <li data-ng-repeat="resume in resume_daily | orderBy : \'date\' : true" style="display: block;"> <div class="row"> <div class="column-30"> <span class="icon-calendar4"></span> <span data-ng-class="{ bolder: resume.time_divergence_alert }">{{ resume.date | date : \'dd/MM\' }}</span> </div> <div class="column-30"> <span data-ng-class="{ bolder: resume.time_divergence_alert }">{{ resume.time_total && resume.time_total != \'00:00:00\' ? (resume.time_total | durationFormat: \'report\' ) : \'00:00\' }}</span> </div> <div class="column-30" data-ng-if="$settingsService.settings.integration_time_clock_active"> <span data-ng-class="{ bolder: resume.time_divergence_alert }">{{ resume.time_clock && resume.time_clock != \'00:00:00\' ? (resume.time_clock | durationFormat: \'report\' ) : \'00:00\' }}</span> <span data-ng-if="resume.time_divergence_alert" class="red-color" style="font-size: 13px; text-align: right;" title="\r\nDivergência de horas\r\nHoras trabalhadas: {{ resume.time_total | durationFormat: \'report\' }}\r\nHoras do ponto: {{ resume.time_clock | durationFormat: \'report\' }}\r\nDiferença de horas: {{ resume.time_diff | durationFormat: \'report\' }}\r\n\t\t\t\t"> <span class="icon-warning"></span> </span> </div> </div> </li> <li style="margin-left: 0"> <a class="create underline" app-href="#/reports/daily">Ver diário de horas</a> </li> </ul> </div> '),$templateCache.put("views/time-entries/time-entry-form-modal.html",'<div class="time-entry-form-modal"> <div class="modal-header"> <p class="title"> <span data-ng-if="isEditMode">{{ \'time_entries.add.edit_entry\' | translate }}</span> <span data-ng-if="!isEditMode">{{ \'time_entries.add.new_entry\' | translate }}</span> </p> <a class="icon-cross" data-ng-click="cancel()" data-tooltip="{{ \'common.cancel\' | translate }}" data-tooltip-append-to-body="true"></a> </div> <div class="modal-body"> <div data-ng-include="\'views/time-entries/entries-add.html\'"></div> </div> </div> '),$templateCache.put("views/todos/todo-edit.html",'<div class="view-todo-edit" id="modal-view-todo-edit" data-ng-class="{\'view-todo-edit--trashed\': todo.deleted_at}"> <div class="modal-header"> <div data-ng-if="todo.deleted_at" class="explanation explanation--important radius view-todo-edit--trash-message"> <div> {{ \'todos.edit.trashed_message\' | translate:{ date: (todo.deleted_at | dateEntry), user: (todo.deleted_by_user_name | shortening) } }} </div> <a class="button clean" data-ng-if="canRestoreTodos" data-ng-disabled="restoring" data-ng-click="restore()"> {{restoring? (\'todos.edit.restoring\' | translate): (\'todos.edit.restore\' | translate)}} </a> </div> <div class="view-todo-edit--header-commands"> <div class="view-todo-edit--header-commands-main"> <label class="element-todo-checkbox" data-ng-click="preventCompleteIfNotAllowed($event)"> <input type="checkbox" data-ng-disabled="!canCompleteTodo(todo)" data-ng-check data-ng-model="todo.is_completed" data-ng-change="saveCompletedStatus()"> <span>{{todo.is_completed ? (\'todos.edit.completed\' | translate) : (\'todos.edit.mark_as_completed\' | translate) }}</span> </label> <span class="view-todo-edit--time-actions" data-ng-if="canEditTodos && todo.id && todo.project_id && !todo.deleted_at"> <button type="button" class="button clean view-todo-edit--header-time-button" data-ng-click="openTodoAddTimeEntry($event, todo
21)"> <span class="icon-time2"></span> <span>{{ \'todos.log_hours_manually\' | translate }}</span> </button> <button type="button" class="button clean green view-todo-edit--header-time-button" data-ng-class="{\'view-todo-edit--header-time-button--running\': isTodoStopwatchActive(todo)}" data-ng-click="toggleTodoStopwatch($event, todo)"> <span data-ng-class="{\'icon-pause\': isTodoStopwatchActive(todo), \'icon-play3\': !isTodoStopwatchActive(todo)}"></span> <span data-ng-if="!isTodoStopwatchActive(todo)">{{ \'todos.start_stopwatch\' | translate }}</span> <span data-ng-if="isTodoStopwatchActive(todo)" stopwatch-display class="view-todo-edit--stopwatch-display"></span> </button> </span> </div> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="view-todo-edit--project-details"> <a data-ng-click="openProjectTodoList()">{{todo.project_name}}</a> <div data-ng-if="todo.ancestor_name_path">{{todo.ancestor_name_path}}</div> </div> <h1 contenteditable="{{canEditTodos}}" class="radius" data-ng-model="todo.name" data-ng-model-options="{ updateOn: \'blur\' }" data-ng-change="saveName()"></h1> </div> <div class="modal-body view-todo-edit__body"> <div class="view-todo-edit__main"> <div class="view-todo-edit--label-details"> <div class="view-todo-edit--label-details-column"> <div> <label>{{ \'todos.edit.list\' | translate }}</label> <a data-ng-if="canChangeTodoList()" data-dropdown="view-todo-edit--dropdown-change-list__todo-{{todo.id}}" data-ng-click="onOpenTodoLists()"> {{ getCurrentTodoListName() }} </a> <span data-ng-if="!canChangeTodoList()">{{ getCurrentTodoListName() }}</span> </div> <div> <label>{{ \'todos.edit.assignee\' | translate }}</label> <a data-ng-class="{ \'view-todo-edit--empty\' : !todo.user_id }" data-dropdown="view-todo-edit--dropdown-change-assignee__todo-{{todo.id}}" data-ng-click="onOpenProjectMembers()"> <span data-ng-if="todo.user_id" data-assigned-to="todo.user_name" data-assigned-to-photo-url="todo.user_profile_photo_url" data-assigned-to-size="xs"></span> <span data-ng-if="!todo.user_id">{{ \'todos.edit.empty\' | translate }}</span> </a> </div> <div> <label>{{ \'todos.edit.due_date\' | translate }}</label> <div data-due-date="todo.due_on" data-is-completed="todo.is_completed" data-editable="canEditTodos" data-on-change="saveDueDate"> </div> </div> <div> <label>{{ \'todos.tags.label\' | translate }}</label> <div data-todo-tag-picker data-variant="dropdown" data-ng-model="todo.tags" data-disabled="!canEditTodos" data-on-change="saveTodo()"></div> </div> <div data-ng-if="hasEstimateProgress()"> <label>{{ \'todos.edit.progress\' | translate }}</label> <div class="view-todo-edit--progress-value"> <span data-progress-bar data-progress-completed="todo.time_progress" data-progress-tooltip-title="{{ \'todos.edit.progress\' | translate }}" data-progress-tooltip-items="getProgressTooltipItems()"> </span> </div> </div> </div> <div class="view-todo-edit--label-details-column"> <div> <label>{{ \'todos.edit.estimate\' | translate }}</label> <a data-ng-class="{ \'view-todo-edit--empty\' : isDisplayedEstimateEmpty() }" data-dropdown="view-todo-edit--dropdown-change-estimate__todo-{{todo.id}}"> {{isDisplayedEstimateEmpty() ? (\'todos.edit.empty\' | translate) : (getDisplayedEstimate() | time: \'HH:MM\' )}} </a> </div> <div data-ng-if="hasSubtodoEstimate()"> <label>{{ \'todos.edit.estimate_total_with_subtodos\' | translate }}</label> <span>{{ getEstimateTotalWithSubtodos() | time: \'HH:MM\' }}</span> </div> <div> <label>{{ \'todos.edit.logged_hours\' | translate }}</label> <div class="view-todo-edit--logged-hours-row"> <a data-ng-if="canOpenTodoLoggedHoursModal(todo)" data-ng-click="onTodoLoggedHoursClick(todo, $event)"> {{todo.time_total | durationFormat: \'default\'}} </a> <span data-ng-if="isTimeEmpty(\'time_total\')" class="view-todo-edit--empty">{{ \'todos.edit.empty\' | translate }}</span> </div> </div> <div data-ng-if="hasSubtodoLoggedHours()"> <label>{{ \'todos.edit.logged_hours_with_subtodos\' | translate }}</label> <span>{{ getLoggedHoursTotalWithSubtodos() | durationFormat: \'default\' }}</span> </div> </div> </div> <div class="view-todo-edit--description-content"> <label>{{ \'todos.edit.description\' | translate }}</label> <div contenteditable="{{canEditTodos}}" class="radius" data-ng-model="todo.description" data-ng-model-options="{ updateOn: \'blur\' }" data-ng-change="saveContentEditable(\'description\')"></div> </div> <div class="view-todo-edit--subtodos report-list-sticky" data-ng-if="todo.id"> <label>{{ \'todos.edit.subtodos\' | translate }}</label> <table> <tbody todo-items-list data-todos="subtodos" data-parent-todo-id="todo.id" data-todo-list-id="todo.todo_list_id" data-project="project" data-can-edit-todos="canEditTodos" data-can-restore-todos="canRestoreTodos" data-nested-display="false" data-expandable-subtodos="true" data-expanded-subtodo-parent-ids="expandedSubtodoParentIds" data-subtodos-by-parent-id="subtodosByParentId" data-loading-subtodos-by-parent-id="loadingSubtodosByParentId" data-on-toggle-subtodos-expand="toggleSubtodosExpand(todo)" data-fetch-subtodos-for-parent="fetchSubtodosForParent(parentTodoId)" data-enable-move-between-lists="false" data-drag-handle-requires-list-manager="false" data-add-row-enabled="true" data-instance-id="edit-{{todo.id}}" data-on-todo-saved="onSubtodoSaved(todo)"> </tbody> </table> </div> <div data-ng-if="todo.id" entity-attachments data-entity-type="todo" data-entity-id="{{ todo.id }}" data-can-edit="canEditTodos"> </div> </div> <aside class="view-todo-edit__sidebar" data-ng-if="todo.id"> <div class="view-todo-edit__sidebar-tabs"> <nav data-app-tabs data-tabs="todoSidebarTabs" data-selected="todoSidebarPanel" data-nav-padding-left="0px" data-tab-margin-left="0px" data-tab-margin-right="
210px"> </nav> </div> <div class="view-todo-edit__sidebar-panel" data-ng-show="todoSidebarPanel === \'comments\'"> <div entity-comments-thread data-entity-type="todo" data-entity-id="{{ todo.id }}" data-can-edit="canCommentOnTodo" data-mention-candidates="projectMembers" data-layout="compact" data-hide-title="true"> </div> </div> <div class="view-todo-edit__sidebar-panel" data-ng-show="todoSidebarPanel === \'history\'"> <div entity-events-timeline entity-type="todo" entity-id="{{ todo.id }}" datetime-layout="stacked" data-hide-title="true" scroll-container=".view-todo-edit__sidebar-panel"> </div> </div> </aside> </div> <div data-ng-if="canEditTodos"> <div id="view-todo-edit--dropdown-change-estimate__todo-{{todo.id}}" class="view-todo-edit--dropdown-change-estimate__container f-dropdown" data-dropdown-content> <div> <label>{{ \'todos.edit.estimate_in_hours\' | translate }}</label> <div class="view-todo-edit--dropdown-change-estimate__input-row"> <input type="text" id="view-todo-edit--dropdown-change-estimate__input_estimate" placeholder="00:00" data-ng-model-options="{ updateOn: \'blur\' }" data-ng-change="saveTodo()" data-ng-model="todo.time_estimate" data-ng-mask="time_interval"> <button type="button" class="button clean" data-ng-click="cleanTimeEstimate()"> {{ \'todos.edit.clean\' | translate }} </button> </div> </div> <div class="view-todo-edit--dropdown-change-estimate__totals"> <div class="view-todo-edit--dropdown-change-estimate__total-row"> <span>{{ \'todos.edit.estimate_total_with_subtodos\' | translate }}</span> <span>{{ getEstimateTotalWithSubtodos() | time: \'HH:MM\' }}</span> </div> </div> </div> <!-- Dropdown escolha de terceiros : início --> <div id="view-todo-edit--dropdown-change-assignee__todo-{{todo.id}}" data-dropdown-content class="f-dropdown content view-todo-edit--dropdown-change-assignee__container"> <div> <input type="search" data-ng-model="search" placeholder="{{ \'todos.edit.assignee_search_placeholder\' | translate }}" autofocus> </div> <div class="view-todo-edit--dropdown-change-assignee__table"> <table> <tr data-ng-repeat="member in projectMembers | filter: search"> <td> <div class="user-list-item--identity"> <div data-user-avatar data-name="{{ member.user_name }}" data-photo-url="member.user_profile_photo_url" data-size="sm"> </div> <div> <div class="view-todo-edit--dropdown-change-assignee__user-name" data-ng-bind-html="member.user_name | highlight: search"></div> <div class="view-todo-edit--dropdown-change-assignee__teams" data-ng-if="member.teams && member.teams.length > 0"> <span data-ng-bind-html="member.teams | join: \'name\' | highlight: search"></span> </div> </div> </div> </td> <td> <div> <div data-ng-if="todo.user_id === member.user_id"> <span class="green-color">{{ \'todos.edit.assigned\' | translate }}</span> </div> <div data-ng-if="todo.user_id !== member.user_id"> <a class="button clean" data-ng-click="setAssignee(member)"> <span>{{ \'todos.edit.assign\' | translate }}</span> </a> </div> </div> </td> </tr> </table> </div> <hr> <div class="view-todo-edit--dropdown-change-due-date__buttons"> <button class="button clean" data-ng-click="cleanAssignee()"> {{ \'todos.edit.clean\' | translate }} </button> <span></span> <button class="button clean" data-ng-click="setAssigneeToMyself()"> {{ \'todos.edit.assign_to_self\' | translate }} </button> </div> </div> <div id="view-todo-edit--dropdown-change-list__todo-{{todo.id}}" data-dropdown-content class="f-dropdown content view-todo-edit--dropdown-change-assignee__container"> <div> <input type="search" data-ng-model="todoListSearch" placeholder="{{ \'todos.edit.list_search_placeholder\' | translate }}" autofocus> </div> <div class="view-todo-edit--dropdown-change-assignee__table"> <table> <tr data-ng-repeat="todoList in projectTodoLists | filter: matchesTodoListSearch"> <td> <div class="view-todo-edit--dropdown-change-assignee__user-name" data-ng-bind-html="getTodoListDisplayName(todoList) | highlight: todoListSearch"></div> </td> <td> <div data-ng-if="isCurrentTodoList(todoList)"> <span class="green-color">{{ \'todos.edit.selected\' | translate }}</span> </div> <div data-ng-if="!isCurrentTodoList(todoList)"> <a class="button clean" data-ng-click="setTodoList(todoList)" dropdown-close-on-click> <span>{{ \'todos.edit.select\' | translate }}</span> </a> </div> </td> </tr> </table> </div> </div> </div> </div> '),$templateCache.put("views/todos/todos-kanban.html",'<div data-if-has-not-feature="TODOLIST" data-feature-ads="TODOLIST"></div> <div data-if-has-feature="TODOLIST" data-ng-controller="TodosController" class="view-todos-kanban" data-ng-class="{\'view-todos--tras
21h-view\' : showTrashView }"> <h3 data-ng-if="titleTodoList">{{titleTodoList}}</h3> <div> <div data-ng-if="showTrashView"> <div class="explanation explanation--important radius" style="margin-top: 20px;"> <div> {{ \'todos.trash_notice\' | translate }} </div> </div> </div> <div class="view-todos-kanban--board" auto-height data-offset-top="true" data-top="80" data-padding="3"> <div class="view-todos-kanban--column" data-ng-repeat="todoList in todoLists | orderBy: \'position\' "> <div class="view-todos-kanban--list" data-ng-class="{\'view-todos-kanban--list--has-color\': todoList.color}" data-ng-style="todoList.color | entityColorKanbanColumnTint"> <span data-entity-color-swatch data-variant="bar-top" data-color="todoList.color"></span> <div class="view-todos-kanban--list-header"> <h1> <span data-ng-model="todoList.name" data-ng-keydown="onKeyDownTodoList($event)" data-ng-model-options="{ updateOn: \'blur\' }" data-ng-change="saveTodoList(todoList)" class="radius view-todos-kanban--list-name" contenteditable="{{canEditTodos}}"> </span> </h1> <a class="button clean" data-dropdown="dropdown-todolist-{{todoList.id}}"> <span class="icon-angle-down"></span> </a> <div data-ng-if="todoList.id" id="dropdown-todolist-{{todoList.id}}" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list view-todos--dropdown-todolist" dropdown-close-on-click> <div data-ng-if="canEditTodos"> <div class="dropdown-option option-button dropdown-sub-menu"> <a> <span>{{ \'todos.dropdown_list.create_list\' | translate }}</span> </a> <div data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-option option-button"> <a data-ng-click="addNewTodoListBefore(todoList)"> <span>{{ \'todos.dropdown_list.create_left\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="addNewTodoListAfter(todoList)"> <span>{{ \'todos.dropdown_list.create_right\' | translate }}</span> </a> </div> </div> </div> <div class="dropdown-option option-button dropdown-sub-menu"> <a> <span>{{ \'todos.dropdown_list.move_list\' | translate }}</span> </a> <div data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-option option-button"> <a data-ng-click="moveListToUp(todoList)"> <span>{{ \'todos.dropdown_list.move_left\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="moveListToDown(todoList)"> <span>{{ \'todos.dropdown_list.move_right\' | translate }}</span> </a> </div> </div> </div> <div data-entity-color-picker data-variant="submenu" data-palette-name="list" data-ng-model="todoList.color" data-on-change="saveTodoList(todoList)"></div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="deleteTodoList(todoList)" class="red-color-on-hover"> {{ \'todos.dropdown_list.delete_list\' | translate }} </a> </div> </div> <div data-ng-if="canRestoreTodos"> <div class="dropdown-option option-button"> <a data-ng-click="restoreTodoList(todoList)"> {{ \'todos.dropdown_list.restore_list\' | translate }} </a> </div> </div> </div> </div> <div class="view-todos-kanban--list-body" auto-height data-offset-top="true" data-top="50" data-padding="78"> <div data-ng-repeat="todo in todos | filter: { todo_list_id: todoList.id } | orderBy: \'position\'" class="view-todos-kanban--todo-item-container" data-todo-id="{{todo.id}}" data-drop="canEditTodos" jqyoui-droppable="kanbanDragDropConfigs.droppableSettings" data-jqyoui-options="kanbanDragDropConfigs.droppableOptions"> <div class="view-todos-kanban--todo-item-drop-box"></div> <div class="view-todos-kanban--todo-item-card draggable-todo-item" data-ng-click="openTodo(todo)" data-drag="activateManagerTodoLists && !todo.isEnabledTodoEditInline" jqyoui-draggable="kanbanDragDropConfigs.draggableSettings" data-jqyoui-options="kanbanDragDropConfigs.draggableOptions" data-ng-class="{\r\n                                    \'todo-is-completed\' : todo.is_completed,\r\n                                    \'view-todos-kanban--todo-item-card--has-color\': (todo.tags | entityTagHighlightColors).length\r\n                                 }"> <span data-entity-color-swatch data-variant="bar" data-colors="todo.tags"></span> <span contenteditable="{{canEditTodoContent(todo)}}
21" class="radius" data-ng-click="onClickTodoName($event, todo)" data-ng-model="todo.name" data-ng-keydown="onKeyDownTodo($event, todo)" data-ng-keyup="onKeyUpTodo($event)" data-ng-blur="onBlurTodoName(todo)" data-ng-paste="onPasteEnumOption($event)" data-ng-model-options="{ updateOn: \'blur\' }" data-ng-change="saveTodoName(todo)"></span> <div class="view-todos-kanban--label-details"> <span data-ng-if="todo.description"> <span class="icon-align-left" data-tooltip="{{ \'todos.edit.description\' | translate }}" data-tooltip-append-to-body="true"></span> </span> <span data-ng-if="todo.attachments_count > 0" class="view-todos--label-detail-badge"> <span class="icon-attachment2" style="font-size: 12px" data-tooltip="{{ \'todos.list.attachments_count\' | translate:{ count: todo.attachments_count } }}" data-tooltip-append-to-body="true"></span> <span data-ng-bind="todo.attachments_count"></span> </span> <span data-ng-if="todo.comments_count > 0" class="view-todos--label-detail-badge"> <span class="icon-speech-bubble" data-tooltip="{{ \'todos.list.comments_count\' | translate:{ count: todo.comments_count } }}" data-tooltip-append-to-body="true"></span> <span data-ng-bind="todo.comments_count"></span> </span> <span data-ng-if="todo.subtodos_count > 0" class="view-todos--label-detail-badge"> <span class="icon-alt" data-tooltip="{{ \'todos.list.subtodos_count\' | translate:{ count: todo.subtodos_count } }}" data-tooltip-append-to-body="true"></span> <span data-ng-bind="todo.subtodos_count"></span> </span> <span data-ng-if="todo.user_id" data-assigned-to="todo.user_name" data-assigned-to-photo-url="todo.user_profile_photo_url"></span> <span data-ng-if="todo.due_on" data-due-date="todo.due_on" data-is-completed="todo.is_completed"></span> <span class="view-todos-kanban--time-summary"> <span data-tooltip-append-to-body="true" data-tooltip-html="\'\r\n                                              {{ \'todos.edit.logged_hours\' | translate }}<hr>\r\n                                              {{isTimeEmpty(todo.time_total) ?  \'0 h\' : (todo.time_total | durationFormat: \'default\' : \'humanHideZero\')}}\'"> {{isTimeEmpty(todo.time_total) ? \'0 h\' : (todo.time_total | durationFormat: \'default\' : \'humanHideZero\')}} </span> <span class="view-todos--time-estimate-group" data-ng-if="todo.time_estimate || todo.subtodo_time_estimate_sum"> <span class="view-todos--time-estimate-separator" aria-hidden="true"></span> <span class="view-todos--time-estimate-value grey-color"> {{ (todo.time_estimate | timeSum: todo.subtodo_time_estimate_sum) | durationFormat: \'default\' }} </span> <span data-progress-bar data-progress-completed="todo.time_progress" data-progress-tooltip-title="{{ \'todos.edit.progress\' | translate }}" data-progress-tooltip-items="getTodoProgressTooltipItems(todo)"> </span> </span> </span> <span data-ng-if="todo.is_completed" data-tooltip="{{ \'todos.edit.completed\' | translate }}" data-tooltip-append-to-body="true" class="icon-check"></span> </div> <div class="view-todos-kanban--todo-item-card__edit-button"> <a class="button clean" data-ng-click="openTodoMenuDropdown($event, todo)" data-dropdown="dropdown-todoitem-{{todo.id}}"> </a> </div> </div> <div id="dropdown-todoitem-{{todo.id}}" data-dropdown-content data-dropdown-append-to-body="true" data-top="-2" data-left="30" class="f-dropdown dropdown-option-list view-todos--dropdown-todolist" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="openTodo(todo)"> <span>{{ \'todos.dropdown_todo.open_details\' | translate }}</span> <span class="dropdown-option--shortcut-key">Ctrl Enter</span> </a> </div> <div data-ng-if="canEditTodos || canCompleteTodo(todo)"> <hr> <div class="dropdown-option option-button" data-ng-if="canCompleteTodo(todo) && !todo.is_completed"> <a data-ng-click="toggleIsCompleted(todo)"> <span>{{ \'todos.dropdown_todo.mark_completed\' | translate }}</span> <span class="dropdown-option--shortcut-key">Alt C</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canCompleteTodo(todo) && todo.is_completed"> <a data-ng-click="toggleIsCompleted(todo)"> <span>{{ \'todos.dropdown_todo.mark_incomplete\' | translate }}</span> <span class="dropdown-option--shortcut-key">Alt C</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canEditTodos">
21 <a data-ng-click="moveTodoToPrevFocus($event, todo)"> <span>{{ \'todos.dropdown_todo.move_above\' | translate }}</span> <span class="dropdown-option--shortcut-key"> Ctrl <span class="icon-arrow-up"></span> </span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canEditTodos"> <a data-ng-click="moveTodoToNextFocus($event, todo)"> <span>{{ \'todos.dropdown_todo.move_below\' | translate }}</span> <span class="dropdown-option--shortcut-key"> Ctrl <span class="icon-arrow-down"></span> </span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canEditTodos"> <a data-ng-click="moveTodoToNextList(todo)"> <span>{{ \'todos.dropdown_todo.move_below_list\' | translate }}</span> <span class="dropdown-option--shortcut-key"> Ctrl <span class="icon-arrow-right"></span> </span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canEditTodos"> <a data-ng-click="moveTodoToPrevList(todo)"> <span>{{ \'todos.dropdown_todo.move_above_list\' | translate }}</span> <span class="dropdown-option--shortcut-key"> Ctrl <span class="icon-arrow-left"></span> </span> </a> </div> <div class="dropdown-option option-button dropdown-sub-menu" data-ng-if="canEditTodoContent(todo)"> <a> <span>{{ \'todos.tags.label\' | translate }}</span> </a> <div data-dropdown-content class="f-dropdown dropdown-option-list todo-tag-picker__submenu"> <div data-todo-tag-picker data-ng-model="todo.tags" data-disabled="!canEditTodoContent(todo)" data-on-change="saveTodo(todo)"></div> </div> </div> <hr data-ng-if="canEditTodos"> <div class="dropdown-option option-button" data-ng-if="canEditTodos"> <a data-ng-click="deleteTodo($event, todo)" class="red-color-on-hover"> <span>{{ \'todos.dropdown_todo.delete_todo\' | translate }}</span> <span class="dropdown-option--shortcut-key">Ctrl Del</span> </a> </div> </div> <div data-ng-if="canRestoreTodos"> <div class="dropdown-option option-button"> <a data-ng-click="restoreTodo(todo)"> {{ \'todos.dropdown_todo.restore_todo\' | translate }} </a> </div> </div> </div> </div> <div class="view-todos-kanban--todo-item-container-empty-for-drop-only" data-drop="canEditTodos" jqyoui-droppable="kanbanDragDropConfigs.droppableSettings" data-jqyoui-options="kanbanDragDropConfigs.droppableOptions"> <div class="view-todos-kanban--todo-item-drop-box"></div> <!-- add to-do to end of list--> </div> </div> <div class="view-todos-kanban--list-footer"> <div data-ng-if="activateManagerTodoLists" class="view-todos-kanban--add-todo-container" data-ng-click="newTodoOnBottom(todoList.id, $event)"> <a class="button clean"> <span class="icon-plus4"></span> <span>{{ \'todos.add_todo\' | translate }}</span> </a> </div> </div> </div> </div> <div class="view-todos-kanban--column"> <div> <div data-ng-if="activateManagerTodoLists" data-ng-click="addNewTodoListOnBottom()">
21 <a class="button clean view-todos-kanban--add-todo-list-button"> <span class="icon-plus4"></span> <span>{{ \'todos.kanban.add_column\' | translate }}</span> </a> </div> </div> </div> </div> </div> </div> '),
22$templateCache.put("views/todos/todos-trashed.html",'<div data-ng-controller="TodosTrashedController" class="view-todos"> <div> <h3>{{ \'todos.trashed_title\' | translate }}</h3> <div class="explanation explanation--important radius" style="margin-top: 20px;"> <div> {{ \'todos.trash_notice\' | translate }} </div> </div> <div data-spinner-loading="loading_todos" data-message="{{ \'todos.loading\' | translate }}" style="margin-top: 50px;"></div> <div data-ng-if="!loading_todos && todoLists.length == 0" class="center" style="padding: 50px 0;"> <span class="grey-color">{{ \'todos.trashed_empty\' | translate }}</span> </div> <div data-ng-if="!loading_todos && todoLists.length > 0"> <div class="report-list-sticky view-todos--todolist__todos"> <table> <tbody data-ng-repeat="todoList in todoLists | orderBy: \'position\' "> <tr class="view-todos--tr-todolist-item"> <td colspan="100"> <div class="view-todos--todolist-content"> <span class="draggable-todolist-item" data-ng-if="$permissionService.hasPrivilegesToEditProject(project)"> <!--                                           data-ng-if="has_project_edit_permission()">--> <a class="button clean" data-dropdown="dropdown-todolist-{{todoList.id}}"> <span class="icon-menu2"></span> </a> </span> <span class="view-todos--todolist-name"> <span data-ng-model="todoList.name" class="view-todos--todo-list-name radius" contenteditable="false"> </span> </span> <div data-ng-if="todoList.id" id="dropdown-todolist-{{todoList.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="restoreTodoList(todoList)"> {{ \'todos.dropdown_list.restore_only_list\' | translate }} </a> </div> </div> </div> </td> </tr> <tr data-ng-repeat="todo in todos | filter: { todo_list_id: todoList.id } | orderBy: \'position\'" class="view-todos--tr-todo-item"> <!-- Menu dropdown --> <td> <div class="view-todos--ui-draggable draggable-todo-item" data-ng-if="$permissionService.hasPrivilegesToEditProject(project)"> <!--                                     data-ng-if="has_project_edit_permission()">--> <a class="button clean" data-dropdown="dropdown-project-todo-{{todo.id}}"> <span class="icon-menu2"></span> </a> </div> <div id="dropdown-project-todo-{{todo.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button"> <a data-ng-click="restoreTodo(todo)"> {{ \'todos.dropdown_todo.restore_todo_item\' | translate }} </a> </div> </div> </td> <!-- Nome e descrição da tarefa --> <td> <input type="checkbox" data-ng-check data-ng-model="todo.is_completed" data-ng-disabled="true"> </td> <td> <span contenteditable="false" class="radius" data-ng-model="todo.name"></span> </td> <td> </td> </tr> </tbody> </table> </div> </div> </div> </div> '),$templateCache.put("views/todos/todos.html",'<div data-if-has-not-feature="TODOLIST" data-feature-ads="TODOLIST"></div> <div data-if-has-feature="TODOLIST" data-ng-controller="TodosController" class="view-todos" data-ng-class="{\'view-todos--trash-view\' : showTrashView }"> <div class="view-todos--header-container"> <div> <h3 data-ng-if="titleTodoList">{{titleTodoList}}</h3> <div class="button-group view-todos--header-add" data-ng-if="activateManagerTodoLists && !showTrashView"> <button class="button clean" data-ng-if="canEditTodos" data-ng-click="addActivityOnFirstListTop()" data-ng-disabled="!project.id"> <span class="icon-plus4" style="padding-right: 5px;"></span> <span>{{ \'todos.add_todo\' | translate }}</span> </button> <button class="button clean view-todos--header-add-caret" data-ng-if="canManageTodoLists" data-dropdown="dropdown-todos-header-add" data-ng-disabled="!project.id" title="{{ \'todos.add_todo\' | translate }}"> <span class="icon-angle-down"></span> </button> </div> <div id="dropdown-todos-header-add" data-dropdown-content class="f-dropdown dropdown-option-list" dropdown-close-on-click> <div class="dropdown-option option-button" data-ng-if="canEditTodos"> <a data-ng-click="addActivityOnFirstListTop()"> <span>{{ \'todos.add_todo\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="canManageTodoLists"> <a data-ng-click="addNewTodoListOnTop()"> <span>{{ \'todos.add_list\' | translate }}</span> </a> </div> </div> </div> <div class="view-todos--header-actions"> <div class="view-todos--filters" data-ng-if="filtersEnabled"> <button type="button" class="button clean view-todos--header-options" data-dropdown="dropdown-todos-header-options"> <span>{{ \'todos.options\' | translate }}</span> <span class="icon-angle-down"></span> </button> </div> <div id="dropdown-todos-header-options" data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-option checkbox"> <label> <input type="checkbox" data-ng-model="filters.hideCompleted" data-ng-change="changedHideCompleted()"> <span>{{ \'todos.hide_completed\' | translate }}</span> </label> </div> <div class="dropdown-option checkbox"> <label> <input type="checkbox" data-ng-model="filters.expandSubtodos" data-ng-change="changedExpandSubtodos()"> <span>{{ \'todos.expand_subtodos\' | translate }}</span> </label> </div> </div> <span data-button-export="export" data-preference-prefix="todo_list" data-formats="[\'xlsx\', \'pdf\']" data-enable-column-options="false"> </span> </div> </div> <div data-ng-if="showTrashView"> <div class="explanation explanation--important radius" style="margin-top: 20px;"> <div> {{ \'todos.trash_notice\' | translate }} </div> </div> </div> <div> <div data-ng-if="todoLists.length === 0"> <div data-spinner-loading="loadingTodos" data-message="{{ \'todos.loading\' | translate }}" style="margin-top: 50px;"></div> <div data-ng-if="!loadingTodos" class="center" style="padding: 100px 0 50px;"> <span class="grey-color"> {{ \'todos.empty_state\' | translate }} <div data-ng-if="!isProjectTodoView && !showTrashView"> <br> {{ \'todos.empty_state_project_instruction\' | translate }} </div> </span> </div> </div> <div data-ng-if="todoLists.length > 0" style="padding-top: 0px;"> <div class="report-list-sticky view-todos--todolist__todos" data-ng-class="{\'view-todos--reordering-lists\': isReorderingTodoLists}" data-infinite-scroll="loadMoreOnScroll()" data-infinite-scroll-disabled="infiniteScrollActive === false" data-infinite-scroll-distance="2" data-infinite-scroll-container=".view-home-layout--right-container"> <table> <tbody ng-repeat-start="todoList in todoLists | orderBy: [\'project_name\', \'position\']"> <tr class="view-todos--tr-todolist-item" data-drop="canEditTodos" jqyoui-droppable="todoListDragDropConfigs.droppableSettings" data-jqyoui-options="todoListDragDropConfigs.droppableOptions"> <td colspan="100"> <div class="view-todos--todolist-area-droppable"></div> <div class="view-todos--todolist-content"> <span data-ng-if="activateManagerTodoLists || canRestoreTodos" data-drag="activateManagerTodoLists" class="view-todos--ui-draggable draggable-todolist-item" jqyoui-draggable="todoListDragDropConfigs.draggableSettings" data-jqyoui-options="todoListDragDropConfigs.draggableOptions"> <a class="button clean" data-dropdown="dropdown-todolist-{{todoList.id}}"> <span class="icon-more_vert"></span> </a> <span class="dragging-description" data-ng-bind-html="todoList.name"></span> </span> <button type="button" class="button clean todo-items-list__expand-subtodos has-itens-below view-todos--expand-todolist" data-ng-if="shouldShowTodoListExpandToggle(todoList)" data-ng-checked="isTodoListExpanded(todoList)" data-ng-click="toggleTodoListExpand($event, todoList)" data-tooltip="{{ isTodoListExpanded(todoList) ? (\'todos.list.collapse_todo_list\' | translate) : (\'todos.list.expand_todo_list\' | translate) }}" data-tooltip-append-to-body="true"> </button> <span class="view-todos--todo-list-name"> <div data-ng-if="showProjectInline" class="view-todos--todo-list__project-name"> <a data-ng-click="openProjectTodoList(todoList)">{{todoList.project_name}}</a>
22 <span data-ng-bind-html="todoList.name || (\'todos.no_name_list\' | translate)"></span> </div> <span data-ng-if="!showProjectInline" data-ng-model="todoList.name" data-ng-keydown="onKeyDownTodoList($event)" data-ng-paste="onPasteEnumOption($event)" data-ng-model-options="{ updateOn: \'blur\' }" data-ng-change="saveTodoList(todoList)" class="radius" contenteditable="{{canEditTodos}}"> </span> </span> <div data-ng-if="todoList.id" id="dropdown-todolist-{{todoList.id}}" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list view-todos--dropdown-todolist" dropdown-close-on-click> <div data-ng-if="canEditTodos"> <div class="dropdown-option option-button dropdown-sub-menu"> <a> <span>{{ \'todos.dropdown_list.create_list\' | translate }}</span> </a> <div data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-option option-button"> <a data-ng-click="addNewTodoListBefore(todoList)"> <span>{{ \'todos.dropdown_list.create_above\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="addNewTodoListAfter(todoList)"> <span>{{ \'todos.dropdown_list.create_below\' | translate }}</span> </a> </div> </div> </div> <div class="dropdown-option option-button dropdown-sub-menu"> <a> <span>{{ \'todos.dropdown_list.move_list\' | translate }}</span> </a> <div data-dropdown-content class="f-dropdown dropdown-option-list"> <div class="dropdown-option option-button"> <a data-ng-click="moveListToUp(todoList)"> <span>{{ \'todos.dropdown_list.move_above\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="moveListToDown(todoList)"> <span>{{ \'todos.dropdown_list.move_below\' | translate }}</span> </a> </div> </div> </div> <div data-entity-color-picker data-variant="submenu" data-palette-name="list" data-ng-model="todoList.color" data-on-change="saveTodoList(todoList)"></div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="deleteTodoList(todoList)" class="red-color-on-hover"> {{ \'todos.dropdown_list.delete_list\' | translate }} </a> </div> </div> <div data-ng-if="canRestoreTodos"> <div class="dropdown-option option-button"> <a data-ng-click="restoreTodoList(todoList)"> {{ \'todos.dropdown_list.restore_list\' | translate }} </a> </div> </div> </div> </div> </td> </tr> </tbody> <tbody todo-items-list data-ng-if="isTodoListExpanded(todoList)" ng-repeat-end data-todos="todos" data-todo-list="todoList" data-project="project" data-can-edit-todos="canEditTodos" data-can-restore-todos="canRestoreTodos" data-nested-display="false" data-expandable-subtodos="true" data-expanded-subtodo-parent-ids="expandedSubtodoParentIds" data-subtodos-by-parent-id="subtodosByParentId" data-loading-subtodos-by-parent-id="loadingSubtodosByParentId" data-on-toggle-subtodos-expand="toggleSubtodosExpand(todo)" data-fetch-subtodos-for-parent="fetchSubtodosForParent(parentTodoId)" data-enable-move-between-lists="activateManagerTodoLists" data-activate-manager-todo-lists="activateManagerTodoLists" data-instance-id="list-{{todoList.id}}" data-move-todo-to-next-list="moveTodoToNextList(todo, waitSave)" data-move-todo-to-prev-list="moveTodoToPrevList(todo, waitSave)" data-on-todo-completed="handleTodoCompletedInMainList(todo)" data-on-todo-saved="handleSubtodoSavedInMainList(todo)"> </tbody> <tbody> <tr class="view-todos--tr-todolist-item" data-drop="true" jqyoui-droppable="todoListDragDropConfigs.droppableSettings" data-jqyoui-options="todoListDragDropConfigs.droppableOptions"> <td colspan="100"> <div class="view-todos--todolist-area-droppable"></div> </td> </tr> </tbody> </table> </div> </div> </div> <!--    </div>--> </div> '),$templateCache.put("views/training/training-library.html",'<div class="view radius content-register-edit training-library-view"> <div class="training-library-view__header"> <h1>{{ \'training.library_title\' | translate }}</h1> <p>{{ \'training.library_description\' | translate }}</p> <p> <a href="{{ helpCenterTrainingUrl }}" target="_blank" rel="noopener"> {{ \'training.help_center_link\' | translate }} </a> </p> </div> <div spinner-loading="loading" data-ng-if="loading"></div> <div class="training-library-view__tracks" data-ng-if="!loading"> <section data-ng-repeat="track in tracks track by track.name" class="training-library-view__track"> <h2>{{ track.name }}</h2> <div class="training-library-view__grid"> <article class="training-library-view__card" data-ng-repeat="module in track.modules track by module.id" data-ng-class="{ \'training-library-view__card--active\': selectedModule.id === module.id }"> <button type="button" class="training-library-view__card-button" data-ng-click="selectModule(module)"> <h3>{{ module.title }}</h3> <span class="steel-color">{{ module.route }}</span> </button> <div class="training-library-view__card-actions"> <button type="button" class="button clean" data-ng-click="startTour(module)"> {{ \'training.start_tour\' | translate }} </button> <a class="button clean" href="{{ module.help_url }}" target="_blank" rel="noopener">
22 {{ \'training.open_help_article\' | translate }} </a> </div> </article> </div> </section> </div> <div class="training-library-view__player" data-ng-if="selectedModule"> <h2>{{ selectedModule.title }}</h2> <div class="training-library-view__embed"> <iframe data-ng-src="{{ selectedModule.trustedEmbedUrl }}" title="{{ selectedModule.title }}" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> </div> </div> '),$templateCache.put("views/training/training-video-modal.html",'<div class="training-video-modal"> <div class="modal-header"> <h2>{{ module.title }}</h2> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body"> <div class="training-video-modal__embed"> <iframe data-ng-src="{{ trustedEmbedUrl }}" title="{{ module.title }}" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> <p> <a href="{{ module.help_url }}" target="_blank" rel="noopener"> {{ \'training.open_help_article\' | translate }} </a> </p> </div> </div> '),$templateCache.put("views/users/confirm-assign-everybody.html",'<div> <div> <span data-ng-bind-html="\'users.assigned.confirm_assign_everybody.content\' | translate:{ count: total_available, name: (user.name | shortening) }"></span> </div> <div class="explanation radius" style="margin-top: 30px; padding: 15px 20px;" data-ng-if="!user.auto_assign_new_users"> <div style="margin-bottom: 10px; font-size: 14px;"> {{ \'users.assigned.confirm_assign_everybody.explanation\' | translate:{ name: (user.name | shortening) } }} </div> <div> <label class="element-todo-checkbox"> <input type="checkbox" data-ng-check ng-model="form.auto_assign_new_users"> </label> <span style="font-size: 14px; font-weight: bolder">{{ \'users.assigned.confirm_assign_everybody.checkbox_label\' | translate }}</span> </div> </div> </div> '),$templateCache.put("views/users/user-profile-photo-modal.html",'<div class="user-profile-photo-modal"> <div class="modal-header user-profile-photo-modal--header"> <h4 class="user-profile-photo-modal--title">{{ \'users.edit.main.profile_photo_modal_title\' | translate }}</h4> <a class="icon-cross" data-ng-click="closeModal()" href=""></a> </div> <div class="modal-body user-profile-photo-modal--body"> <p class="title-description user-profile-photo-modal--formats"> {{ \'users.edit.main.profile_photo_formats_hint\' | translate }} </p> <div class="user-profile-photo-modal--preview-wrap"> <div data-ng-if="serverPreviewLoading" class="user-profile-photo-modal--loading"> {{ \'users.edit.main.profile_photo_preview_loading\' | translate }} </div> <p data-ng-if="!serverPreviewLoading && hasServerPhoto && !serverPreviewUrl && !localPreviewDataUrl" class="user-profile-photo-modal--unavailable title-description"> {{ \'users.edit.main.profile_photo_preview_unavailable\' | translate }} </p> <div data-ng-if="!serverPreviewLoading && showEmptyPlaceholder()" class="user-profile-photo-modal--empty"> {{ \'users.edit.main.profile_photo_modal_empty\' | translate }} </div> <img data-ng-if="!serverPreviewLoading && displayPreviewUrl()" data-ng-src="{{ displayPreviewUrl() }}" alt="{{ \'users.edit.main.profile_photo_label\' | translate }}"> </div> <div class="user-profile-photo-modal--remove-link-wrap" data-ng-show="hasServerPhoto"> <a href="" class="user-profile-photo-modal--remove-link" data-ng-class="{\'is-disabled\': uploading}" data-ng-click="$event.preventDefault(); !uploading && openRemoveConfirm()"> {{ \'users.edit.main.profile_photo_remove\' | translate }} </a> </div> </div> <div class="modal-footer user-profile-photo-modal--footer"> <div> <div> <input type="file" class="user-profile-photo-modal-file-input" accept="image/png,image/jpeg,image/jpg,.png,.jpg,.jpeg" onchange="angular.element(this).scope().onModalFileInputChange(this);"> <button type="button" class="button clean" data-ng-click="openFilePicker()" data-ng-disabled="uploading"> {{ \'users.edit.main.profile_photo_modal_choose_file\' | translate }} </button> </div> </div> <div class="user-profile-photo-modal--footer-right"> <button type="button" class="button button--blue-brand" data-ng-click="savePhoto()" data-ng-disabled="!pendingFile || uploading"> {{ uploading ? (\'users.edit.main.profile_photo_modal_saving\' | translate) : (\'users.edit.main.profile_photo_modal_save\' | translate) }} </button> </div> </div> </div> '),$templateCache.put("views/users/users-add-projects.html",'<style> .view-users-add-projects .modal-body {\r\n        padding-top: 5px;\r\n    }\r\n    .view-users-add-projects table {\r\n        margin-bottom: 0;\r\n    }\r\n    .view-users-add-projects .add-status {\r\n        font-weight: bolder;\r\n        font-size: 14px;\r\n        margin-right: 7px;\r\n    }\r\n    .view-users-add-projects .view-users-add-projects--project-details {\r\n        font-size: 12px;
22\r\n        /*color: var(--font-color-1-details);*/\r\n        /*color: var(--font-grey-color-default);*/\r\n        color: var(--color-steel);\r\n        margin-top: 5px;\r\n    }\r\n    .view-users-add-projects .view-users-add-projects--customer-name {\r\n        margin-top: 8px;\r\n    }\r\n    .view-users-add-projects .view-users-add-projects--button-add-all {\r\n        text-align: right;\r\n        margin-bottom: 20px;\r\n        display: block;\r\n    }\r\n    .view-users-add-projects .view-users-add-projects--button-add-all a {\r\n        font-size: 13px;\r\n        font-weight: bolder;\r\n    } </style> <div class="view-users-add-projects"> <div class="modal-header"> <h1>{{ \'users.projects.title\' | translate }}</h1> <div class="grey-color" style="margin-top: 5px; font-size: 13px; text-transform: none"> {{ \'users.projects.user_label\' | translate }} <strong>{{user.name | shortening}}</strong> </div> <a class="icon-cross" data-ng-click="close()"></a> </div> <div class="modal-body"> <div spinner-loading="loading" message="{{ \'users.projects.searching_projects\' | translate }}" style="margin-top: 40px; margin-bottom: 30px;"></div> <div data-ng-if="!loading"> <div data-ng-if="projects_available.length === 0" class="steel-color center bolder" style="padding: 30px 0; font-size: 13px;"> {{ \'users.projects.all_assigned\' | translate }} </div> <div class="list-minimal" data-ng-if="projects_available.length > 0">
22 <div class="view-users-add-projects--button-add-all"> <a class="link underline" data-ng-click="addAllProjects()"> {{ \'users.projects.assign_count\' | translate:{ count: (filter.search ? (\'users.projects.assign_selected\' | translate) : (\'users.projects.assign_all\' | translate)), total: projectsNotAddedFiltered.length } }} </a> </div> <table> <tr class="list-minimal--search__tr"> <td colspan="2"> <input type="search" data-ng-model="filter.search" data-ng-change="filterProjects()" placeholder="{{ \'users.projects.filter_placeholder\' | translate }}" autofocus> </td> </tr> <tr data-ng-repeat="project in projects_available | filter: filter.search"> <td> <div class="bolder" data-ng-bind-html="project.name | highlight: filter.search"></div> <div class="view-users-add-projects--project-details view-users-add-projects--customer-name" data-ng-bind-html="project.customer_name | highlight: filter.search"> </div> </td> <td style="text-align: right; width: 140px;"> <div data-ng-switch="project.add_status"> <div data-ng-switch-when="adding" class="add-status grey-color"> <span>{{ \'users.projects.status_adding\' | translate }}</span> </div> <div data-ng-switch-when="added" class="add-status grey-color"> <span class="green-color">{{ \'users.projects.status_added\' | translate }}</span> </div> <div data-ng-switch-default> <a class="button clean" data-ng-click="addProject(project)"> <span>{{ \'users.projects.button_assign\' | translate }}</span> </a> </div> </div> </td> </tr> </table> </div> </div> </div> <div class="modal-footer"> <div class="row"> <div class="column-70" style="text-align: left;"></div> <div class="column-30"> <button class="button clean" data-ng-click="close()">{{ \'users.projects.button_finish\' | translate }}</button> </div> </div> </div> </div> '),$templateCache.put("views/users/users-assigned-teams.html",'<div data-ng-controller="UsersAssignedTeamsController" class="view-u
22sers-assigned-teams"> <div class="modal--top-permission-note"> <span class="icon-lock_outline"></span> <span>{{ \'users.assigned.permission_note\' | translate }}</span> </div> <div data-users-teams-assignee-picker data-assignments="assignments" data-available="available" data-instance-id="{{ user.id || \'no-id\' }}" data-can-manage="$permissionService.hasPrivilegesToManageUserAssignments()" data-is-loading-assignments="isLoadingAssignments" data-is-loading-available="isLoadingAvailable" data-user="user" data-show-bulk-actions="true" data-show-auto-assign="true" data-on-load-available="loadAvailable()" data-on-add="addAssignee(assignee, schema)" data-on-remove="removeAssignee(assignee, schema)" data-on-remove-all="confirmRemoveEverybody()" data-on-assign-all="confirmAssignEverbody()" data-on-toggle-auto-assign="confirmToggleAutoAssignNewUsers()"> </div> </div> '),$templateCache.put("views/users/users-edit.html",'<div class="view-user-edit modal__with-tabs"> <div class="modal-header"> <div data-ng-if="user.id" class="view-u
22ser-edit--header-title"> <button type="button" class="view-user-edit--header-avatar-button" data-ng-class="{\'is-readonly\': !canManageProfilePhoto(user)}" data-ng-click="onHeaderAvatarClick()" data-tooltip="{{ canManageProfilePhoto(user) ? (\'users.edit.main.profile_photo_edit_button\' | translate) : \'\' }}" data-tooltip-append-to-body="true"> <div data-ng-if="profilePhotoPage.photoLoading" class="view-user-edit--header-avatar-loading"> </div> <div data-ng-if="!profilePhotoPage.photoLoading" data-user-avatar data-name="{{ user.name }}" data-photo-url="profilePhotoPage.photoUrl" data-size="md"> </div> </button> <div class="view-user-edit--header-identity"> <h1>{{user.name | shortening}}</h1> <div class="view-user-edit--header-meta"> <span class="view-user-edit--header-status flag flag-v2" data-ng-class="isUserActive() ? \'green-color\' : \'grey-color\'"> {{ (isUserActive() ? \'report.management_projects.active\' : \'report.management_projects.archived\') | translate }} </span> </div> </div> </div> <div data-ng-if="!user.id"> <h1>{{ \'users.edit.invite_user\' | translate }}</h1> <div>
22 <div class="view-user-edit--user-licenses-counter"> <a class="link-dashed" data-ng-click="gotoAccount()"> <span data-ng-if="$subscriptionService.getFreeUsersLimit() <= 0">{{ \'users.edit.no_license_available\' | translate }}</span> <span data-ng-if="$subscriptionService.getFreeUsersLimit() > 0">{{ \'users.edit.licenses_available\' | translate:{ limit: $subscriptionService.getFreeUsersLimit() } }}</span> </a> </div> </div> </div> <a class="icon-cross" data-ng-click="close()" data-tooltip="{{ \'users.edit.close_modal\' | translate }}" data-tooltip-append-to-body="true"></a> <div data-ng-if="user.id" class="view-user-edit--header-options"> <a title="{{ \'users.edit.header.options\' | translate }}" data-dropdown="dropdown-users-edit-{{user.id}}" class="icon-angle-down"> </a> <div id="dropdown-users-edit-{{user.id}}" data-dropdown-content class="f-dropdown dropdown-option-list" data-dropdown-close-on-click data-dropdown-append-to-body="false"> <div class="dropdown-option option-button" data-ng-if="canManageProfilePhoto(user)"> <a data-ng-click="openProfilePhotoModal()"> <span>{{ \'users.edit.main.profile_photo_edit_button\' | translate }}</span> </a> </div> <div class="dropdown-option option-button"> <a data-ng-click="changeTab(\'main\')"> <span>{{$permissionService.hasPrivilegesToEditAnyUsers() ? (\'report.management_users.edit\' | translate) : (\'report.management_users.view\' | translate) }} {{ \'report.management_users.title\' | translate | lowercase | shortening:true:1 }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="isUserActive()"> <a data-ng-click="archiveUserFromMenu()" data-ng-disabled="!canArchiveUserFromMenu()"> {{ \'report.management_users.archive\' | translate }} </a> </div> <div class="dropdown-option option-button" data-ng-if="!isUserActive()"> <a data-ng-click="activeUserFromMenu()" data-ng-disabled="!canArchiveUserFromMenu()"> {{ \'report.management_users.reactivate\' | translate }} </a> </div> <div class="dropdown-option option-button" data-ng-if="showSessionOverride"> <a data-ng-click="activeSessionOverrideFromMenu()"> <span>{{ \'report.management_users.access_as\' | translate:{name: (user.name|firstname)} }}</span> </a> </div> <div custom-fields-menu-modal data-entity="users" data-close="close" data-display="items"> </div> <div data-ng-if="$permissionService.hasPrivilegesToDeleteAnyUsers()"> <hr> <div class="dropdown-option option-button"> <a data-ng-click="removeUserFromMenu()" data-ng-disabled="isUserOwner()" class="red-color-on-hover"> {{ \'report.management_users.delete\' | translate }} </a> </div> </div> </div> </div> <nav data-app-tabs data-tabs="userEditTabs" data-selected="tabSelected"> </nav> </div> <div class="modal-body" data-on-click-enter="save()" data-spinner-loading-modal="isLoading"> <div data-ng-if="!isLoading"> <div data-ng-if="tabSelected === \'main\'">
22 <div class="view-user-edit--archived-banner" data-ng-if="user.id && !isUserActive()"> <p class="view-user-edit--archived-banner-text"> {{ \'users.edit.main.user_archived_banner\' | translate }} </p> <button type="button" class="button clean view-user-edit--archived-banner-action" data-ng-click="activeUserFromMenu()" data-ng-disabled="!canArchiveUserFromMenu()"> {{ \'report.management_users.reactivate\' | translate }} </button> </div> <div class="row"> <label>{{ \'users.edit.main.name\' | translate }}</label> <input type="text" data-ng-disabled="::!$permissionService.hasPrivilegesToEditUser(user)" data-ng-model="user.name" autofocus placeholder="{{ \'users.edit.main.name\' | translate }}"> </div> <div class="row"> <label>{{ \'users.edit.main.email\' | translate }}</label> <input type="email" data-ng-model="user.email" placeholder="{{ \'users.edit.main.email_placeholder\' | translate }}" data-ng-disabled="user.id" data-ng-model-options="{ debounce: 1000 }" data-ng-change="onInviteEmailChange()"> <sub class="view-user-edit--email-hint view-user-edit--email-hint_error" data-ng-if="!user.id && emailAvailability.validationError && emailAvailability.checkedEmail === (user.email || \'\').trim().toLowerCase()"> {{ emailAvailability.validationError }} </sub>
22 <sub class="view-user-edit--email-hint view-user-edit--email-hint_error" data-ng-if="!user.id && !emailAvailability.validationError && emailAvailability.hasActiveUser"> {{ \'users.edit.main.email_active_duplicate\' | translate }} </sub> <div class="view-user-edit--email-archived-banner" data-ng-if="showArchivedEmailNotice()"> <div class="view-user-edit--email-archived-banner-header"> <p class="view-user-edit--email-archived-banner-text"> <span data-ng-if="emailAvailability.archivedUsers.length === 1"> {{ \'users.edit.main.email_archived_list_intro.one\' | translate }} </span> <span data-ng-if="emailAvailability.archivedUsers.length !== 1"> {{ \'users.edit.main.email_archived_list_intro.other\' | translate:{ count: emailAvailability.archivedUsers.length } }} </span> </p> <button type="button" class="button clean view-user-edit--email-archived-banner-dismiss" data-ng-click="dismissArchivedEmailNotice()"> {{ \'users.edit.main.email_archived_dismiss\' | translate }} </button> </div> <div class="view-user-edit--email-archived-banner-actions"> <button type="button" class="button clean" data-ng-repeat="archivedUser in emailAvailability.archivedUsers track by archivedUser.id" data-ng-click="openArchivedUserFromInvite(archivedUser)"> {{ archivedUser.name }} </button> </div> </div> </div> <!--            <div class="row"--> <!--                 if-has-feature="ROLE_PERMISSIONS"--> <div class="row" style="margin-bottom: 10px;"> <label>{{ \'users.edit.main.permission\' | translate }}</label> <select data-ng-model="user.role" data-options="::roles" data-ng-disabled="::!$permissionService.hasPrivilegesToChangeUserPermissions(user)" data-selectize="{\r\n                                labelField: \'name\',\r\n                                valueField: \'id\',\r\n                                sortField: \'name\',\r\n                                searchField: \'name\',\r\n                                dropdownParent: \'body\',\r\n                                render: $permissionService.renderRoles,\r\n                                placeholder: $permissionService.getRoleName(\'regular\')\r\n                    }"></select> </div> <div class="row" style="margin-bottom: 10px;" data-ng-if="$permissionService.canDisplayUserManagerField()"> <label data-ng-if="!$subscriptionService.hasFeatureAccess(\'TIMESHEET_APPROVAL\')">{{ \'users.edit.main.manager\' | translate }}</label> <label data-ng-if="$subscriptionService.hasFeatureAccess(\'TIMESHEET_APPROVAL\')">{{ \'users.edit.main.manager_and_approver\' | translate }}</label> <select data-options-load="$userService.getUserManagerOptions" data-ng-disabled="::!$permissionService.hasPrivilegesToEditUser(user)" data-ng-model="user.manager_id" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'id\',\r\n                            sortField: \'name\',\r\n                            searchField: \'name\',\r\n                            placeholder: (\'users.edit.main.no_manager\' | translate),\r\n                            dropdownParent: \'body\'\r\n                        }"> </select> </div> <div class="row" data-ng-if="$settingsService.get(\'integration_time_clock_active\') === \'pontomais\'"> <label style="text-transform: capitalize;"> {{$settingsService.get(\'integration_time_clock_active\')}} </label> <select data-ng-model="user.time_clock_integration_active" data-options="timeClockIntegrationOptions" data-ng-disabled="::!$permissionService.hasPrivilegesToEditUser(user)" data-selectize="{\r\n                                dropdownParent: \'body\',\r\n                                labelField: \'name\',\r\n                                valueField: \'value\',\r\n                                placeholder: (\'users.edit.main.do_not_import\' | translate)\r\n                                }"> <!--                        <option value=0>Não importar</option>--> <!--                        <option value="1">Importar as horas diariamente</option>--> </select> </div> <!-- Inclui campos personalizados --> <div data-generate-custom-fields-form data-entity="users" data-model="user" data-errors="errors" data-revalidate="revalidate"></div> </div> <div data-ng-if="tabSelected === \'capacity\'"> <div class="row view-user-edit--work-days-content element-todo-checkbox"> <label> {{ \'users.edit.capacity.work_days\' | translate }} </label> <div> <label ng-repeat="weekday in weekdays"> <input type="checkbox" data-ng-check data-ng-disabled="::!$subscriptionService.hasFeatureAccess(\'USER_CAPACITY\')\r\n                                        || !$permissionService.hasPrivilegesToEditUser(user)" data-ng-checked="user.work_days.indexOf(weekday) !== -1" data-ng-click="toggleWorkDays(weekday)">
22 <span class="view-user-edit--work-days__weekday">{{weekday|moment: \'weekdayShortFromIndex\'}}</span> </label> </div> </div> <div class="row"> <div class="column-50"> <label> {{ \'users.edit.capacity.capacity_per_day\' | translate }} </label> <div class="row view-user-edit--capacity-content"> <div class="input-suffix-inside--container"> <input type="text" id="view-user-edit--capacity-content__input_rate" data-ng-mask="numberFormatted" data-ng-model="user.capacity_per_day_formatted" data-ng-change="onChangeCapacityPerDay()" maxlength="5" data-ng-disabled="::!$subscriptionService.hasFeatureAccess(\'USER_CAPACITY\')\r\n                                        || !$permissionService.hasPrivilegesToEditUser(user)" placeholder="0" class="center view-project-edit--capacity-content__input_rate"> <label class="input-suffix-inside--label-suffix" for="view-user-edit--capacity-content__input_rate"> {{ \'users.edit.capacity.hours_per_day\' | translate }}</label> </div> </div> </div> <div class="column-50"> <label>{{ \'users.edit.capacity.estimated_capacity\' | translate }}</label>
22 <span class="view-user-edit--weekly-capacity-calculated"> {{ \'users.edit.capacity.hours_per_week\' | translate:{ hours: (weekly_capacity | numericHuman:2) } }} </span> </div> </div> <div class="row view-user-edit--capacity-dates-content"> <div class="column-50"> <label>{{ \'users.edit.capacity.capacity_from\' | translate }}</label> <div data-button-date="user.work_start_at" data-button-disabled="::!$subscriptionService.hasFeatureAccess(\'USER_CAPACITY\')\r\n                                 || !$permissionService.hasPrivilegesToEditUser(user)"></div> </div> <div class="column-50"> <label>{{ \'users.edit.capacity.capacity_until\' | translate }}</label> <div data-button-date="user.work_end_at" data-button-disabled="::!$subscriptionService.hasFeatureAccess(\'USER_CAPACITY\')\r\n                                 || !$permissionService.hasPrivilegesToEditUser(user)"></div> </div> </div> <div class="row view-user-edit--capacity-calendar-content"> <div class="column-50"> <label>{{ \'users.edit.capacity.holiday_calendar\' | translate }}</label> <select data-ng-model="user.last_calendar_id" data-options-load="loadCalendars" data-ng-disabled="::!$subscriptionService.hasFeatureAccess(\'USER_CAPACITY\')\r\n                                    || !$permissionService.hasPrivilegesToEditUser(user)" data-selectize="{\r\n                                labelField: \'name\',\r\n                                valueField: \'id\',\r\n                                sortField: \'name\',\r\n                                searchField: \'name\',\r\n                                dropdownParent: \'body\',\r\n                                placeholder: (\'users.edit.capacity.no_calendar\' | translate),\r\n                                create: createCalendar,\r\n                                createFilter: $permissionService.hasPrivilegesToEditAccountSettings,\r\n                        }"></select> </div> <div class="column-50"> <label>{{ \'users.edit.capacity.off_days_vacation\' | translate }}</label> <button class="button clean view-user-edit--capacity-calendar-content__button button--append-flag-new-feature" data-ng-click="openAllocationModal()" data-ng-disabled="::!user.id ||\r\n                                !$subscriptionService.hasFeatureAccess(\'USER_CAPACITY\')\r\n                                    || !$permissionService.hasPrivilegesToEditUser(user)"> <span class="icon-calendar2"></span> {{ \'users.edit.capacity.edit_off_days_vacation\' | translate }} <span class="flag">{{ \'users.edit.capacity.new_flag\' | translate }}</span> </button> </div> </div> <div data-ng-if="::$subscriptionService.hasFeatureAccess(\'USER_CAPACITY\')"> <div class="row"> <div class="column-100"> <div data-historical-calendar-save-form data-model="user"> </div> </div> </div> <div class="row"> <div class="column-100" data-ng-if="user.last_calendar_start_at"> <div data-historical-calendar-list="{ user_id: user.id }" data-model="user"> </div> </div> </div> </div> <span data-flag-upgrade-required="USER_CAPACITY" data-show-long-description="true" data-custom-description="{{ \'users.edit.capacity.user_capacity_description\' | translate }}" style="margin-top: 30px"></span> </div> <div data-ng-if="tabSelected === \'rates\'"> <div data-ng-if="$permissionService.hasPrivilegesToEditUserDefaultBillingRates()"> <div class="row"> <label>{{ \'users.edit.rates.billable_default\' | translate }}</label>
22 <div class="view-user-edit--radio-is-billable-container"> <label> <input type="radio" data-ng-model="user.is_billable_default" data-ng-disabled="::!$subscriptionService.hasFeatureAccess(\'BILLABLE_BY_USER\')\r\n                                            || !$permissionService.hasPrivilegesToEditUserDefaultBillingRates()" ng-value="true"> <span>{{ \'users.edit.rates.billable\' | translate }}</span> </label> <label> <input type="radio" data-ng-model="user.is_billable_default" data-ng-disabled="::!$subscriptionService.hasFeatureAccess(\'BILLABLE_BY_USER\')\r\n                                            || !$permissionService.hasPrivilegesToEditUserDefaultBillingRates()" ng-value="false"> <span>{{ \'users.edit.rates.not_billable\' | translate }}</span> </label> </div> </div> <div class="row" data-ng-if="user.is_billable_default"> <div class="column-50"> <label> <span>{{ \'users.edit.rates.default_billable_rate\' | translate }}</span> </label> <div class="input-prefix-inside--container input-suffix-inside--container"> <label class="input-prefix-inside--label-prefix" for="view-user-edit--cost-content__input_billable_rate"> {{ \'\' | currencySymbol }}</label> <input type="text" id="view-user-edit--cost-content__input_billable_rate" data-ng-mask="money" data-ng-model="user.billable_rate_default_formatted" data-ng-disabled="::!$subscriptionService.hasFeatureAccess(\'BILLABLE_BY_USER\')\r\n                                            || !$permissionService.hasPrivilegesToEditUserDefaultBillingRates()" placeholder="{{0|moneyOnlyAmount}}" class="center view-project-edit--billing-content__input_rate"> <label class="input-suffix-inside--label-suffix" for="view-user-edit--cost-content__input_billable_rate">{{ \'users.edit.rates.per_hour\' | translate }}</label> </div> </div> </div> </div> <div data-ng-if="$permissionService.hasPrivilegesToEditUserCost()"> <div class="row"> <div class="column-50"> <div class="row view-user-edit--cost-content"> <label>{{ \'users.edit.rates.cost_rate\' | translate }}</label> <div> <div class="input-prefix-inside--container input-suffix-inside--container"> <label class="input-prefix-inside--label-prefix" for="view-user-edit--cost-content__input_rate"> {{ \'\' | currencySymbol }}</label> <input type="text" id="view-user-edit--cost-content__input_rate" data-ng-mask="money" data-ng-model="user.cost_rate_formatted" data-ng-disabled="::!$subscriptionService.hasFeatureAccess(\'USER_COST\')\r\n                                                    || !$permissionService.hasPrivilegesToEditUserCost()" placeholder="{{0|moneyOnlyAmount}}" class="center view-project-edit--billing-content__input_rate"> <label class="input-suffix-inside--label-suffix" for="view-user-edit--cost-content__input_rate">{{ \'users.edit.rates.per_hour\' | translate }}</label> </div> </div> </div> </div> </div>
22 <div class="view-user-edit--cost-content__form-rate-is-new"> <div data-historical-rate-save-form data-type="cost" data-rate-field="cost_rate" data-model="user"> </div> </div> <div data-ng-if="user.cost_rate_start_at" data-historical-rate-list="{\r\n                                user_id: user.id,\r\n                                type: \'cost\'\r\n                            }" data-rate-field="cost_rate" data-model="user"></div> </div> <span data-flag-upgrade-required="USER_COST" data-show-long-description="true" data-custom-description="{{ \'users.edit.rates.user_cost_description\' | translate }}" style="margin-top: 10px"></span> </div> <div data-ng-if="tabSelected === \'projects\'"> <div data-ng-if="!user.id" class="steel-color center bolder" style="padding: 30px 0; font-size: 13px;"> {{ \'users.edit.projects_tab.save_first\' | translate }} </div> <div data-ng-if="user.id" data-ng-include="\'views/users/users-projects.html\'"></div> </div> <div data-ng-if="tabSelected === \'users\'"> <div data-ng-if="!user.id" class="steel-color center bolder" style="padding: 30px 0; font-size: 13px;"> {{ \'users.edit.assigned_users.save_first\' | translate }} </div> <div data-ng-if="user.id" data-ng-include="\'views/users/users-assigned-teams.html\'"></div> </div> <div data-ng-if="tabSelected === \'permissions\'"> <div data-ng-include="\'views/users/users-permissions.html\'"></div> </div> </div> </div> <div class="modal-footer" data-ng-if="$permissionService.hasPrivilegesToEditUser(user)"> <div data-ng-if="!user.id"> <label class="checkbox-to-save-and-new"> <span>{{ \'users.edit.footer.invite_another\' | translate }}</span> <input type="checkbox" data-ng-model="options.save_and_new"> </label> </div> <div> <button data-ng-click="close()" class="button clean" style="margin-right: 5px;" data-ng-hide="saving"> {{ \'users.edit.footer.cancel\' | translate }} </button> <button data-ng-click="save()" data-ng-disabled="!user.name || saving || isInviteEmailCheckPending()" class="button button--blue-brand"> <span data-ng-if="user.id">{{ saving ? (\'users.edit.footer.saving_user\' | translate) : (\'users.edit.footer.save_user\' | translate) }}</span> <span data-ng-if="!user.id">{{ saving ? (\'users.edit.footer.saving_and_inviting\' | translate) : (\'users.edit.footer.send_invite\' | translate) }}</span> </button> </div> <div data-ng-if="!isValid()" class="has-error bolder" style="font-size: 12px; margin-top: 15px;"> {{ \'users.edit.footer.validation_error\' | translate }} </div> </div> </div> '),
23$templateCache.put("views/users/users-invite-bulk.html",'<div class="view-u
23ser-invite-bulk"> <div class="modal-header"> <div> <h1>{{ \'users.invite-bulk.title\' | translate }}</h1> <div> <div class="view-user-invite-bulk--user-licenses-counter"> <a class="link-dashed" data-ng-click="gotoAccount()"> <span data-ng-if="$subscriptionService.getFreeUsersLimit() <= 0">{{ \'users.invite-bulk.no_license_available\' | translate }}</span> <span data-ng-if="$subscriptionService.getFreeUsersLimit() > 0">{{ \'users.invite-bulk.licenses_available\' | translate:{ limit: $subscriptionService.getFreeUsersLimit() } }}</span> </a> </div> </div> </div> <a class="icon-cross" data-ng-click="close()" data-tooltip="{{ \'users.invite-bulk.close_modal\' | translate }}" data-tooltip-append-to-body="true"></a> </div> <div class="modal-body"> <div> <div users-invite-bulk-directive type="invite-bulk" on-inviting="onSavingUsers" on-finish="onSavedUsers"></div> </div> </div> <div class="modal-footer"> <div> <button data-ng-click="close()" class="button clean" style="margin-right: 5px;" data-ng-hide="saving"> {{ \'users.invite-bulk.cancel\' | translate }} </button> <button data-ng-click="save()" data-ng-disabled="saving" class="button button--blue-brand"> {{ saving ? (\'users.invite-bulk.inviting\' | translate) : (\'users.invite-bulk.invite_users\' | translate) }} </button> </div> </div> </div> '),$templateCache.put("views/users/users-permissions.html",'<div>
23 <div class="view-user-edit--permissions-container"> <div class="modal--top-permission-note"> <span class="icon-lock_outline"></span> <span data-ng-if="!user.owner">{{ \'users.permissions.admin_only_edit\' | translate }}</span> <span data-ng-if="user.owner">{{ \'users.permissions.owner_cannot_change\' | translate }}</span> </div> <span data-flag-upgrade-required="ROLE_PERMISSIONS" data-show-long-description="true" data-custom-description="{{ \'users.permissions.advanced_permissions\' | translate }}" style="margin-top: 20px"></span> <div class="row" style="margin-bottom: 10px;"> <label>{{ \'users.edit.main.permission\' | translate }}</label> <select data-ng-model="user.role" data-options="::roles" data-ng-disabled="::!$permissionService.hasPrivilegesToChangeUserPermissions(user)" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'id\',\r\n                            sortField: \'name\',\r\n                            searchField: \'name\',\r\n                            dropdownParent: \'body\',\r\n                            render: $permissionService.renderRoles,\r\n                            placeholder: roleRegularName\r\n                }"></select> </div>
23 <div class="view-user-edit--permissions-container__description" data-ng-if="selectedRole"> <div> <p> <b>{{ selectedRole.name }}</b> <span data-ng-if="selectedRole.description"> — {{ selectedRole.description }}</span> </p> <div data-ng-if="selectedRole.keypoints && selectedRole.keypoints.length"> <b data-ng-switch="selectedRole.id"> <!--                        <span data-ng-switch-when="admin">Administrador pode:</span>--> <span data-ng-switch-when="super">{{ \'users.permissions.super_default_can\' | translate }}</span> <span data-ng-switch-default>{{ \'users.permissions.role_can\' | translate:{role: selectedRole.name} }}</span> </b> <ul> <li data-ng-repeat="point in selectedRole.keypoints track by $index"> {{ point }} </li> </ul> </div> <div data-ng-if="selectedRole.exclusive && selectedRole.exclusive.length"> <b><span>{{ \'users.permissions.only_role_can\' | translate:{role: selectedRole.name} }}</span></b> <ul> <li data-ng-repeat="point in selectedRole.exclusive track by $index"> {{ point }} </li> </ul> </div> <div data-ng-if="user.owner"> <b>{{ \'users.permissions.only_owner_can\' | translate }}</b> <ul> <li>{{ \'users.permissions.manage_subscription\' | translate }}</li> <li>{{ \'users.permissions.delete_account\' | translate }}</li> </ul> </div> </div> <div data-ng-if="user.role === \'super\'"> <b>{{ \'users.permissions.additional_permissions\' | translate }}</b>
23 <div class="view-user-edit--permissions-container__additional-permissions element-todo-checkbox"> <div ng-repeat="(groupName, groupPermissions) in $permissionService.extraPermissionsGroups"> <p>{{ groupName }}</p> <div ng-repeat="permission in groupPermissions"> <label> <input type="checkbox" data-ng-check data-ng-disabled="::!$permissionService.hasPrivilegesToChangeUserPermissions(user)" data-ng-checked="user.permissions.indexOf(permission.key) !== -1" data-ng-click="togglePermission(permission.key)"> </label> <span>{{ permission.label }}</span> </div> </div> </div> </div> </div> </div> </div> '),$templateCache.put("views/users/users-projects.html",'<div data-ng-controller="UsersProjectsController" class="view-users-projects"> <div data-spinner-loading-modal="isLoadingProjects"> <div class="view-users-projects--header"> <div> <button class="button clean" data-ng-click="openAddProjects()"> <span class="icon-plus4"></span> <span>{{ \'users.projects.button_assign_projects\' | translate }}</span> </button> </div> <div> <button class="button clean" data-dropdown="view-user-projects--general-options"> <span>{{ \'users.projects.button_actions\' | translate }}</span> <span class="icon-angle-down"></span> </button> <div id="view-user-projects--general-options" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list" data-top="25" data-left="-160" dropdown-close-on-click> <div class="dropdown-title"> {{ \'users.projects.mass_edition\' | translate }} </div> <div class="dropdown-option option-button"> <a data-ng-click="removeAllProjects()"> <span>{{ \'users.projects.unassign_count\' | translate:{ count: (filter.search ? (\'users.projects.assign_selected\' | translate) : (\'users.projects.assign_all\' | translate)), total: projectsFiltered.length } }}</span> </a> </div> </div> </div> </div> <div> <div data-ng-if="projects.length == 0" class="steel-color center bolder" style="padding: 30px 0; font-size: 13px;"> <span class="steel-color">{{ \'users.projects.no_projects_assigned\' | translate }}</span> </div> <div class="list-minimal" data-ng-if="projects.length > 0" style="padding-top: 30px;"> <table> <tbody> <tr class="list-minimal--search__tr"> <td colspan="4"> <input type="search" data-ng-model="filter.search" data-ng-change="filterProjects()" placeholder="{{ \'users.projects.filter_projects_placeholder\' | translate }}" autofocus> </td> </tr> <tr data-ng-repeat="project in projectsFiltered" data-ng-class="{ \'permission-warning--show-flag\': project.is_manager && user.role === \'regular\' }"> <td>
23 <div class="view-users-projects--project-title" data-ng-bind-html="project.name | highlight: filter.search"></div> <div class="view-users-projects--project-details" data-ng-bind-html="project.customer_name | highlight: filter.search"></div> </td> <td class="center"> <div if-has-feature="ROLE_PERMISSIONS"> <span data-ng-if="project.is_manager" class="flag flag-project-manager-member" title="{{ \'users.projects.manager_title\' | translate }}">{{ \'users.projects.manager_flag\' | translate }}</span> <span data-ng-if="!project.is_manager" class="flag flag-project-regular-member" title="{{ \'users.projects.member_title\' | translate }}">{{ \'users.projects.member_flag\' | translate }}</span> <div class="permission-warning--hidden-flag"> <span> <strong>{{ \'users.projects.action_needed\' | translate }}</strong> {{ \'users.projects.limited_access_manager\' | translate }} </span> </div> </div> </td> <td style="text-align: right;"> <a data-ng-if="!project.current_user_can_manage" class="disabled steel-color red-color-on-hover light-grey-bgcolor-on-hover radius"> <span class="icon-lock_outline"></span> </a> <a data-ng-if="project.current_user_can_manage" class="steel-color light-blue-on-hover light-grey-bgcolor-on-hover radius" data-dropdown="view-user-projects--dropdown-project-{{project.id}}"> <span class="icon-angle-down"></span> </a> <div id="view-user-projects--dropdown-project-{{project.id}}" data-dropdown-content data-dropdown-append-to-body="true" class="f-dropdown dropdown-option-list" data-top="35" data-left="-200" dropdown-close-on-click> <div class="dropdown-option option-button" data-ng-if="!project.is_manager"> <a data-ng-click="promoteManager(project)" data-ng-disabled="user.role === \'regular\'"> <span>{{ \'users.projects.promote_manager\' | translate }}</span> </a> </div> <div class="dropdown-option option-button" data-ng-if="project.is_manager"> <a data-ng-click="revokeManager(project)"> <span>{{ \'users.projects.revoke_manager\' | translate }}</span> </a> </div> <hr> <div class="dropdown-option option-button"> <a data-ng-click="removeProject(project)" class="red-color-on-hover"> {{ \'users.projects.remove_user_from_project\' | translate }} </a> </div> </div> </td> </tr> </tbody> </table> <div data-ng-if="usersFiltered.length == 0" class="view-projects-tasks--empty-message"> {{ \'users.projects.user_not_found\' | translate }} <strong>{{filter.search}}</strong> </div> </div> </div> </div> </div> '),$templateCache.put("views/users/users-time-off.html",'<div class="view-u
23sers-time-off modal__with-tabs"> <div class="modal-header"> <div> <h1>{{user.name | shortening}}</h1> </div> <div> <a class="icon-cross" data-ng-click="$close()" data-tooltip="{{ \'common.modal.close_modal\' | translate }}" data-tooltip-append-to-body="true"></a> </div> <nav class="modal--tabs"> <a class="modal--tabs__active-tab"> {{ \'users.time_off.title\' | translate }} </a> </nav> </div> <div class="modal-body"> <div> <div class="row"> <div class="column-100"> <div class="radius date-frame"> <div class="move-date-container"> <a data-ng-click="move_previous_year()"> <span class="icon-angle-left"></span> </a> </div> <div class="date-display" style="font-weight: bold; font-size: 14px;"> <a data-ng-click="set_filter_year(filter_year - 1)" class="steel-color" style="margin-right: 10px; font-weight: normal;">{{ filter_year - 1 }}</a> <span>{{ \'users.time_off.filter_year\' | translate:{ year: filter_year } }}</span> <a data-ng-click="set_filter_year(filter_year + 1)" class="steel-color" style="margin-left: 10px; font-weight: normal;">{{ filter_year + 1 }}</a> </div> <div class="move-date-container"> <a data-ng-click="move_next_year()"> <span class="icon-angle-right"></span> </a> </div> </div> </div> </div> <div class="row" style="margin-top: 20px;"> <div class="column-40"> <label>{{ \'users.time_off.start\' | translate }}</label> <div data-button-date="newAllocation.start_date"></div> </div> <div class="column-40"> <label>{{ \'users.time_off.end\' | translate }}</label> <div data-button-date="newAllocation.end_date"></div> </div> <div class="column-20"> <label>{{ \'users.time_off.type\' | translate }}</label> <select data-ng-model="newAllocation.type" data-options="types" data-selectize="{\r\n                            labelField: \'name\',\r\n                            valueField: \'id\',\r\n                            searchField: \'name\',\r\n                            dropdownParent: \'body\'\r\n                    }"></select> </div> </div> <div class="row" style="margin-top: 10px;"> <div class="column-15"> <button class="button button--blue-brand full-width" data-ng-click="addAllocation()" data-ng-disabled="!newAllocation.start_date || isSaving"> {{isSaving ? (\'users.time_off.adding\' | translate) : (\'users.time_off.add\' | translate)}} </button> </div> </div> <!--            <div class="row">--> <!--                <div class="column-100">--> <!--                    <label>Descrição (opcional)</label>--> <!--                    <input type="text" data-ng-model="newAllocation.description" placeholder="Ex: Viagem, Descanso, etc">--> <!--                </div>--> <!--            </div>--> <div class="list-minimal" style="margin-top: 20px;"> <table> <thead> <tr> <th>{{ \'users.time_off.table.period\' | translate }}</th> <th>{{ \'users.time_off.table.type\' | translate }}</th> <th></th> </tr> </thead> <tbody> <tr data-ng-if="isLoading"> <td colspan="3" class="center steel-color" style="padding: 20px;"> {{ \'users.time_off.table.loading\' | translate }} </td> </tr> <tr data-ng-if="!isLoading" data-ng-repeat="allocation in allocations | orderBy:\'start_date\'"> <td> {{allocation.start_date | dateLong}} <span data-ng-if="allocation.end_date && allocation.end_date !== allocation.start_date"> {{ \'users.time_off.table.until\' | translate }} {{allocation.end_date | dateLong}} </span> <span class="steel-color" style="margin-left: 5px;"> ({{getDaysCount(allocation.start_date, allocation.end_date)}} {{getDaysCount(allocation.start_date, allocation.end_date) === 1 ? (\'users.time_off.table.day\' | translate) : (\'users.time_off.table.days\' | translate)}}) </span> </td> <td> <span class="flag flag-time-off--{{allocation.type}}" style="font-size: 11px;"> {{allocation.type === \'vacation\' ? (\'users.time_off.types.vacation\' | translate | uppercase) : (\'users.time_off.types.leave\' | translate | uppercase)}} </span> </td> <td class="align-right"> <a data-ng-click="deleteAllocation(allocation)" class="icon-trash2 red-color" title="{{ \'users.time_off.delete_confirm.confirm\' | translate }}"></a> </td> </tr> <tr data-ng-if="!isLoading && allocations.length === 0"> <td colspan="4" class="center steel-color" style="padding: 20px;"> {{ \'users.time_off.table.empty\' | translate:{ year: filter_year } }} </td> </tr> </tbody> </table> </div> <div class="row" data-ng-if="!isLoading && allocations.length > 0">
23 <div class="view-users-time-off--total-days-counter"> {{ \'users.time_off.total\' | translate }}: {{getTotalDaysCount()}} {{getTotalDaysCount() === 1 ? (\'users.time_off.table.day\' | translate) : (\'users.time_off.table.days\' | translate)}} </div> </div> </div> </div> <div class="modal-footer"> <button class="button clean" data-ng-click="$close()">{{ \'users.time_off.button_close\' | translate }}</button> </div> </div> '),$templateCache.put("views/design-system/modals/modal-with-tabs-demo.html",'<div class="design-system-modal-tabs-demo modal__with-tabs"> <div class="modal-header"> <h1>Exemplo de modal com abas</h1> <a class="icon-cross" data-ng-click="close()" title="Fechar"></a> <nav data-app-tabs data-tabs="demoModalTabs" data-selected="tabSelected"> </nav> </div> <div class="modal-body"> <div data-ng-if="tabSelected === \'main\'"> <div class="row"> <div class="column-50"> <label>Nome</label> <input type="text" data-ng-model="demoForm.name" autofocus="autofocus"> </div> <div class="column-50"> <label>Status</label> <select data-ng-model="demoForm.status"> <option value="active">Ativo</option> <option value="inactive">Inativo</option> </select> </div> </div> <div class="column-100" style="margin-top: 12px;"> <label>Descrição</label> <textarea data-ng-model="demoForm.description" style="max-width: 100%; min-height: 72px;"></textarea> </div> </div> <div data-ng-if="tabSelected === \'advanced\'"> <p style="margin-bottom: 16px; color: var(--font-color-1-details); font-size: 13px;"> Opções adicionais ficam em uma aba separada, como em modais de projeto, usuário ou campo customizado. </p> <label class="element-todo-checkbox"> <input type="checkbox" data-ng-model="demoForm.notify"> <span>Enviar notificação ao salvar</span> </label> <label class="element-todo-checkbox" style="display: block; margin-top: 8px;"> <input type="checkbox" data-ng-model="demoForm.audit"> <span>Registrar alteração no histórico</span> </label> </div> <div data-ng-if="tabSelected === \'history\'"> <ul style="margin: 0; padding-left: 18px; font-size: 13px; color: var(--font-color-1-details);"> <li style="margin-bottom: 8px;">04/06/2026 — Criado por Admin</li> <li style="margin-bottom: 8px;">03/06/2026 — Status alterado para Ativo</li> <li>01/06/2026 — Registro importado</li> </ul> </div> </div> <div class="modal-footer"> <button type="button" class="button clean" data-ng-click="close()">Cancelar</button> <button type="button" class="button button--blue-brand" data-ng-click="save()">Salvar</button> </div> </div> '),$templateCache.put("views/design-system/sections/alerts.html",'<div> <h2 class="design-system__section-title">Alertas</h2> <p class="design-system__section-desc"> Caixas de mensagem com <code>.alert-box</code> e variantes de cor. Panels seguem padrão similar. </p> <div class="design-system__block"> <h3 class="design-system__block-title">Variantes</h3> <div class="design-system__preview"> <div class="alert-box blue-color"> <strong>Info</strong> — mensagem informativa (.alert-box.blue-color) </div> <div class="alert-box green-color"> <strong>Sucesso</strong> — operação concluída (.alert-box.green-color) </div> <div class="alert-box red-color"> <strong>Erro</strong> — algo deu errado (.alert-box.red-color) </div> <div class="alert-box dark-orange-color"> <strong>Aviso</strong> — atenção necessária (.alert-box.dark-orange-color) </div> </div> <pre class="design-system__code">&lt;div class="alert-box red-color"&gt;\r\n  &lt;strong&gt;Erro&lt;/strong&gt; — descrição\r\n&lt;/div&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Panels</h3> <div class="design-system__preview"> <div class="panel panel-success">Panel success</div> <div class="panel panel-warning">Panel warning</div> <div class="panel panel-alert">Panel alert</div> </div> </div> </div> '),$templateCache.put("views/design-system/sections/buttons.html",'<div> <h2 class="design-system__section-title">Botões</h2> <p class="design-system__section-desc"> Botão primário: <code>.button.button--blue-brand</code> (recomendado). <code>.button</code> sozinho herda o mesmo estilo primário como fallback legado — prefira ser explícito. Secundário/neutro: <code>.button.clean</code>. Ícones e ações discretas: <code>.button.light-blue-on-hover</code>. </p> <div class="design-system__block"> <h3 class="design-system__block-title">Primários</h3> <div class="design-system__preview design-system__preview--row"> <button type="button" class="button button--blue-brand">Primário (blue-brand)</button> <button type="button" class="button button--blue-brand__white">Primário outline</button> <button type="button" class="button green">Green</button> <button type="button" class="button success">Success</button> </div> <pre class="design-system__code">&lt;button class="button button--blue-brand"&gt;Salvar&lt;/button&gt;\r\n&lt;button class="button clean"&gt;Cancelar&lt;/button&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Secundários e variantes</h3> <div class="design-system__preview design-system__preview--row"> <button type="button" class="button clean">Clean</button> <button type="button" class="button light-blue-on-hover"> <span class="icon-plus4"></span> light-blue-on-hover </button> <button type="button" class="button cancel">Cancel</button> <button type="button" class="button red">Red</button> </div> <pre class="design-system__code">&lt;button class="button clean"&gt;Cancelar&lt;/button&gt;\r\n&lt;a class="button light-blue-on-hover"&gt;&lt;span class="icon-plus4"&gt;&lt;/span&gt;&lt;/a&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Estados</h3> <div class="design-system__preview design-system__preview--row"> <button type="button" class="button button--blue-brand" disabled="disabled">Disabled primário</button> <button type="button" class="button clean" disabled="disabled">Disabled clean</button> <button type="button" class="button light-blue-on-hover" disabled="disabled">Disabled light-blue-on-hover</button> </div> <pre class="design-system__code">&lt;button class="button button--blue-brand" disabled&gt;...&lt;/button&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Tamanhos e grupos</h3> <div class="design-system__preview design-system__preview--row"> <button type="button" class="button button--blue-brand bigger">Bigger</button> <div class="button-group"> <button type="button" class="button clean">Esquerda</button> <button type="button" class="button clean">Direita</button> </div> </div> </div> <div class="design-system__block" id="ds-button-toggle"> <h3 class="design-system__block-title">buttonToggle</h3> <p class="design-system__section-desc"> Interruptor on/off via directive <code>data-button-toggle</code>. Usado em <code>automation-rules-settings.html</code>. </p> <div class="design-system__preview"> <div class="view-time-automation-rules-settings"> <div class="timesheet-automation-schedule-settings"> <div class="timesheet-automation-schedule-settings__status-card" data-ng-class="demoToggleActive ? \'is-active\' : \'is-inactive\'"> <div class="timesheet-automation-schedule-settings__status-card-content"> <span class="timesheet-automation-schedule-status-dot" data-ng-class="demoToggleActive ? \'is-active\' : \'is-inactive\'" aria-hidden="true"></span> <div class="timesheet-automation-schedule-settings__status-card-text"> <strong class="timesheet-automation-schedule-settings__status-title"> {{ demoToggleActive ? \'Automação ativa\' : \'Automação inativa\' }} </strong> <p class="title-description timesheet-automation-schedule-settings__status-description"> Quando ativa, a regra é executada no horário configurado. </p> </div> </div> <span data-button-toggle data-ng-model="demoToggleActive" data-title="Ativar automação"></span> </div> </div> </div> <p style="margin-top: 8px; font-size: 13px; color: #4c5e6d;"> Valor: <code>{{ demoToggleActive }}</code> </p> </div> <table class="design-system__api-table"> <thead> <tr> <th>Binding / Attr</th> <th>Tipo</th> <th>Descrição</th> </tr> </thead> <tbody> <tr><td><code>data-button-toggle</code></td><td>—</td><td>Directive (requer <code>ng-model</code> booleano)</td></tr> <tr><td><code>data-ng-model</code></td><td>=</td><td>Estado on/off</td></tr> <tr><td><code>data-title</code></td><td>@?</td><td>Tooltip do label</td></tr> <tr><td><code>data-aria-label</code></td><td>@?</td><td>Acessibilidade (fallback: title)</td></tr> <tr><td><code>data-disabled</code></td><td>=?</td><td>
23Desabilita o switch</td></tr> <tr><td><code>data-on-change</code></td><td>&amp;</td><td>Callback <code>({ value })</code></td></tr> </tbody> </table> <pre class="design-system__code">&lt;span data-button-toggle\r\n      data-ng-model="settings.active"\r\n      data-title="Ativar automação"&gt;&lt;/span&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Depreciados / removidos</h3> <p class="design-system__section-desc"> Não usar: <code>.button.light</code>, <code>.button.orange</code>, <code>.button</code> sem modificador em código novo. </p> </div> </div> '),$templateCache.put("views/design-system/sections/directives.html",'<div> <h2 class="design-system__section-title">Directives UI</h2> <p class="design-system__section-desc"> Componentes AngularJS reutilizáveis. Cada bloco inclui preview interativo e contrato de API. </p> <!-- inputNumberStepper --> <div class="design-system__block" id="ds-directive-input-number-stepper"> <h3 class="design-system__block-title">inputNumberStepper</h3> <div class="design-system__preview"> <div data-input-number-stepper="demoStepper" data-min="1" data-max="10" data-step="1" data-placeholder="0"></div> <p style="margin-top: 8px; font-size: 13px;">Valor: {{ demoStepper }}</p> </div> <table class="design-system__api-table"> <thead><tr><th>Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-input-number-stepper</code></td><td>=</td><td>Model numérico</td></tr> <tr><td><code>data-min</code></td><td>=</td><td>Valor mínimo (default 1)</td></tr> <tr><td><code>data-max</code></td><td>=</td><td>Valor máximo (opcional)</td></tr> <tr><td><code>data-step</code></td><td>@</td><td>Incremento (default 1)</td></tr> <tr><td><code>data-on-change</code></td><td>=</td><td>Callback ao alterar</td></tr> </tbody> </table> <pre class="design-system__code">&lt;div data-input-number-stepper="model"\r\n     data-min="1" data-max="10" data-step="1"&gt;&lt;/div&gt;</pre> </div> <!-- inputMoney --> <div class="design-system__block" id="ds-directive-input-money"> <div class="design-system__preview"> <div data-input-money="demoMoney"></div> <p style="margin-top: 8px; font-size: 13px;">Valor: {{ demoMoney || \'(vazio)\' }}</p> </div> <table class="design-system__api-table"> <thead><tr><th>Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-input-money</code></td><td>=</td><td>Model monetário</td></tr> <tr><td><code>data-prefix</code></td><td>@</td><td>Prefixo (default: símbolo moeda)</td></tr> <tr><td><code>data-suffix</code></td><td>@</td><td>Sufixo opcional</td></tr> <tr><td><code>data-on-change</code></td><td>=</td><td>Callback ao alterar</td></tr> <tr><td><code>data-required-feature</code></td><td>=</td><td>Feature flag para disable</td></tr> </tbody> </table> <pre class="design-system__code">&lt;div data-input-money="rate"&gt;&lt;/div&gt;</pre> </div> <!-- buttonDate --> <div class="design-system__block" id="ds-directive-button-date"> <h3 class="design-system__block-title">buttonDate</h3> <div class="design-system__preview"> <div data-button-date="demoDate"></div> <p style="margin-top: 8px; font-size: 13px;">Valor (YYYY-MM-DD): {{ demoDate }}</p> </div> <table class="design-system__api-table"> <thead><tr><th>Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-button-date</code></td><td>=</td><td>Data no formato YYYY-MM-DD</td></tr> <tr><td><code>data-button-disabled</code></td><td>=</td><td>Desabilita o botão</td></tr> <tr><td><code>data-min-date</code> / <code>data-max-date</code></td><td>=</td><td>Limites do datepicker</td></tr> <tr><td><code>data-hide-clear-button</code></td><td>@</td><td>Oculta botão limpar</td></tr> <tr><td><code>data-on-change</code></td><td>=</td><td>Callback ao alterar</td></tr> </tbody> </table> <pre class="design-system__code">&lt;div data-button-date="dateModel"\r\n     data-min-date="minDate" data-max-date="maxDate"&gt;&lt;/div&gt;</pre> </div> <!-- spinnerLoading --> <div class="design-system__block" id="ds-directive-spinner-loading"> <h3 class="design-system__block-title">spinnerLoading</h3> <div class="design-system__preview"> <button type="button" class="button clean" data-ng-click="toggleDemoSpinner()"> {{ demoSpinnerLoading ? \'Ocultar\' : \'Mostrar\' }} spinner </button> <div data-spinner-loading="demoSpinnerLoading" data-message="Carregando..." style="margin-top: 12px;"></div> </div> <table class="design-system__api-table"> <thead><tr><th>
23Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-spinner-loading</code></td><td>=</td><td>Boolean isLoading</td></tr> <tr><td><code>data-message</code></td><td>@</td><td>Mensagem abaixo do spinner</td></tr> </tbody> </table> <pre class="design-system__code">&lt;div data-spinner-loading="isLoading" data-message="Carregando..."&gt;&lt;/div&gt;</pre> </div> <!-- responsePopup --> <div class="design-system__block" id="ds-directive-response-popup"> <h3 class="design-system__block-title">responsePopup</h3> <div class="design-system__preview"> <button type="button" class="button button--blue-brand" data-ng-click="showDemoNotification()"> Disparar notificação </button> <p style="margin-top: 8px; font-size: 13px; color: #4c5e6d;"> Usa <code>ResponseService.setMessage()</code>. A directive <code>data-response-popup</code> fica no layout (app ou página do design system). </p> </div> <table class="design-system__api-table"> <thead><tr><th>API</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>ResponseService.setMessage(html)</code></td><td>Exibe toast com HTML</td></tr> <tr><td><code>data-response-popup</code></td><td>Directive no layout (já presente)</td></tr> </tbody> </table> </div> <!-- buttonToggleMulti --> <div class="design-system__block" id="ds-directive-button-toggle-multi"> <h3 class="design-system__block-title">buttonToggleMulti</h3> <div class="design-system__preview"> <div data-button-toggle-multi data-ng-model="demoToggleModel" data-options="demoToggleOptions"></div> <p style="margin-top: 8px; font-size: 13px;">Selecionados: {{ demoToggleModel | json }}</p> </div> <table class="design-system__api-table"> <thead><tr><th>Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-button-toggle-multi</code></td><td>=</td><td>ngModel (array de values)</td></tr> <tr><td><code>data-options</code></td><td>=</td><td>Array { value, name }</td></tr> <tr><td><code>data-max</code></td><td>=?</td><td>Limite de seleção</td></tr> <tr><td><code>data-on-change</code></td><td>=</td><td>Callback(selectedArray)</td></tr> </tbody> </table> <pre class="design-system__code">&lt;div data-button-toggle-multi\r\n     data-ng-model="selected"\r\n     data-options="optionsList"&gt;&lt;/div&gt;</pre> </div> <!-- buttonToggle --> <div class="design-system__block" id="ds-directive-button-toggle"> <h3 class="design-system__block-title">buttonToggle</h3> <p class="design-system__section-desc"> Switch on/off booleano. Ver também exemplo com status card na seção Botões. </p> <div class="design-system__preview design-system__preview--row"> <span data-button-toggle data-ng-model="demoToggleActive" data-title="Ativar"></span> <span style="font-size: 13px;">Valor: {{ demoToggleActive }}</span> </div> <table class="design-system__api-table"> <thead><tr><th>Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-button-toggle</code></td><td>—</td><td>Requer <code>ng-model</code> booleano</td></tr> <tr><td><code>data-title</code></td><td>@?</td><td>Tooltip</td></tr> <tr><td><code>data-disabled</code></td><td>=?</td><td>Desabilita o switch</td></tr> <tr><td><code>data-on-change</code></td><td>&amp;</td><td>Callback <code>({ value })</code></td></tr> </tbody> </table> <pre class="design-system__code">&lt;span data-button-toggle\r\n      data-ng-model="settings.active"\r\n      data-title="Ativar automação"&gt;&lt;/span&gt;</pre> </div> <!-- appTabs --> <div class="design-system__block" id="ds-directive-app-tabs"> <h3 class="design-system__block-title">appTabs</h3> <p class="design-system__section-desc"> Navegação por abas reutilizável (<code>directives-app-tabs.less</code>). Suporta contador por aba, <code>href</code> com <code>app-href</code>, <code>onSelect</code> customizado e margin-left configurável. </p> <div class="design-system__preview" style="margin-bottom: 16px;"> <p style="font-size: 12px; color: #4c5e6d; margin-bottom: 8px;">Em modal</p> <div class="design-system__modal-preview design-system__modal-preview--with-tabs"> <div class="modal__with-tabs"> <div class="modal-header"> <h1 style="margin: 20px 28px 10px;">Exemplo modal</h1> <nav data-app-tabs data-tabs="demoAppTabsModal" data-selected="demoAppTabSelectedModal"> </nav> </div> </div> </div> <p style="margin-top: 8px; font-size: 13px;">Selecionada: <code>{{ demoAppTabSelectedModal }}</code></p> </div> <div class="design-system__preview"> <p style="font-size: 12px; color: #4c5e6d; margin-bottom: 8px;">No header do projeto · tab-margin-left="25px"</p> <div class="view-project-header"> <div data-app-tabs data-tabs="demoAppTabsHeader" data-selected="demoAppTabSelectedHeader" data-tab-margin-left="25px"> </div> </div> <p style="margin-top: 8px; font-size: 13px;">Selecionada: <code>{{ demoAppTabSelectedHeader }}</code></p> </div> <table class="design-system__api-table" style="margin-top: 16px;"> <thead><tr><th>
23Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-tabs</code></td><td>=</td><td>Array de abas <code>{ id, label, counter?, counterTitle?, visible?, href?, onSelect? }</code></td></tr> <tr><td><code>data-selected</code></td><td>=</td><td>ID da aba ativa</td></tr> <tr><td><code>data-tab-margin-left</code></td><td>@?</td><td>Margin-left de cada aba</td></tr> <tr><td><code>data-nav-padding-left</code></td><td>@?</td><td>Padding-left do nav</td></tr> <tr><td><code>data-on-change</code></td><td>&amp;</td><td>Callback <code>({ tabId, tab })</code></td></tr> </tbody> </table> <pre class="design-system__code">&lt;nav data-app-tabs\r\n     data-tabs="userEditTabs"\r\n     data-selected="tabSelected"\r\n     data-tab-margin-left="20px"&gt;&lt;/nav&gt;</pre> </div> <!-- buttonExport --> <div class="design-system__block" id="ds-directive-button-export"> <h3 class="design-system__block-title">buttonExport</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Dropdown de exportação de relatórios. Clique no botão <strong>Exportar</strong> (ícone de download) para abrir as opções, escolha o formato e confirme. </p> <div class="design-system__preview"> <span data-button-export="demoExportMethod" data-preference-prefix="design_system_export" data-formats="[\'xlsx\', \'pdf\']" data-enable-column-options="true" data-extra-options="demoExportExtraOptions"></span> </div> <table class="design-system__api-table"> <thead><tr><th>Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-button-export</code></td><td>=</td><td>Função <code>exportMethod(options, responsePromise)</code></td></tr> <tr><td><code>data-preference-prefix</code></td><td>@</td><td>Prefixo de preferências salvas no prefsService</td></tr> <tr><td><code>data-formats</code></td><td>=?</td><td>Formatos visíveis (xlsx, pdf, csv, xlsx_to_print)</td></tr> <tr><td><code>data-enable-column-options</code></td><td>@</td><td>Exibir opções de colunas (default true)</td></tr> <tr><td><code>data-extra-options</code></td><td>=?</td><td>Ex.: <code>[\'opt_export_hide_filters\']</code></td></tr> </tbody> </table> <pre class="design-system__code">&lt;span data-button-export="export"\r\n      data-preference-prefix="todo_list"\r\n      data-formats="[\'xlsx\', \'pdf\']"\r\n      data-enable-column-options="false"&gt;&lt;/span&gt;\r\n\r\n$scope.export = function (exportOptions, promise) {\r\n    ReportModel.export(exportOptions, function (response) {\r\n        promise(response);\r\n    });\r\n};</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Exemplo real: <code>todos.html</code>. Formatos xlsx/csv exigem feature <code>CUSTOM_REPORTS</code>; pdf sempre habilitado. </p> </div> <!-- ngMask --> <div class="design-system__block" id="ds-directive-ng-mask"> <h3 class="design-system__block-title">ngMask</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Máscaras de input via <code>data-ng-mask</code>. Respeita <code>profile_number_format</code> nos tipos <code>money</code> e <code>numberFormatted</code>. </p> <div class="design-system__preview design-system__format-panel-grid"> <div> <label>cpf</label> <input type="text" data-ng-model="demoMaskCpf" data-ng-mask="cpf" placeholder="000.000.000-00"> </div> <div> <label>date</label> <input type="text" data-ng-model="demoMaskDate" data-ng-mask="date" placeholder="__/__/____"> </div> <div> <label>phone</label> <input type="text" data-ng-model="demoMaskPhone" data-ng-mask="phone"> </div> <div> <label>time</label> <input type="text" data-ng-model="demoMaskTime" data-ng-mask="time" placeholder="hh:mm"> </div> <div> <label>money</label> <input type="text" data-ng-model="demoMaskMoney" data-ng-mask="money"> </div> </div> <table class="design-system__api-table"> <thead><tr><th>data-ng-mask</th><th>Uso</th></tr></thead> <tbody> <tr><td><code>cpf</code>, <code>cnpj</code></td><td>Documentos BR</td></tr> <tr><td><code>date</code>, <code>month/year</code></td><td>Datas digitadas</td></tr> <tr><td><code>money</code>, <code>numberFormatted</code></td><td>Valores numéricos</td></tr> <tr><td><code>phone</code>, <code>
23time</code>, <code>time_interval</code></td><td>Telefone e horas</td></tr> <tr><td><code>credit-card</code>, <code>credit-card-exp</code></td><td>Checkout</td></tr> </tbody> </table> <pre class="design-system__code">&lt;input type="text" data-ng-model="model" data-ng-mask="cpf"&gt;</pre> </div> <!-- assignedTo --> <div class="design-system__block" id="ds-directive-assigned-to"> <h3 class="design-system__block-title">assignedTo</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Exibe responsável com avatar à esquerda do nome e tooltip. Arquivo: <code>assignee-to.js</code> (directive <code>assignedTo</code>). </p> <div class="design-system__preview design-system__preview--row"> <span data-assigned-to="demoAssigneeName" data-assigned-to-photo-url="demoAssigneePhotoUrl" data-assigned-to-size="sm"></span> <span data-assigned-to="demoAssigneeEmpty"></span> </div> <table class="design-system__api-table"> <thead><tr><th>Binding</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-assigned-to</code></td><td>Nome do usuário responsável</td></tr> <tr><td><code>data-assigned-to-photo-url</code></td><td>URL opcional da foto de perfil. Sem foto, mostra iniciais.</td></tr> <tr><td><code>data-assigned-to-size</code></td><td>Tamanho do avatar: <code>xs</code> (padrão), <code>sm</code>, <code>md</code>, <code>lg</code>.</td></tr> </tbody> </table> <pre class="design-system__code">&lt;span data-assigned-to="todo.user_name"\r\n      data-assigned-to-photo-url="todo.user_profile_photo_url"&gt;&lt;/span&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Exemplo real: <code>todos.html</code>, <code>todo-edit.html</code>. </p> </div> <!-- copyToClipboardButton --> <div class="design-system__block" id="ds-directive-copy-to-clipboard-button"> <h3 class="design-system__block-title">copyToClipboardButton</h3> <div class="design-system__preview design-system__preview--copy-clipboard"> <div id="design-system-copy-target" class="design-system__code" style="margin-bottom: 8px;"> Texto para copiar: REF-2026-0604 </div> <span data-copy-to-clipboard-button="design-system-copy-target"></span> </div> <table class="design-system__api-table"> <thead><tr><th>Attr</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-copy-to-clipboard-button</code></td><td>ID do elemento cujo innerText será copiado</td></tr> </tbody> </table> <pre class="design-system__code">&lt;div id="view-time-entry-item--description-{{entry.id}}"&gt;...&lt;/div&gt;\r\n&lt;span data-copy-to-clipboard-button="view-time-entry-item--description-{{entry.id}}"&gt;&lt;/span&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> No app, o botão fica oculto e aparece ao passar o mouse sobre o container do texto (ex.: <code>.view-time-entry-item--description-container:hover</code>). </p> </div> <!-- dueDate --> <div class="design-system__block" id="ds-directive-due-date"> <h3 class="design-system__block-title">dueDate</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Prazo com estados visuais: atrasado, hoje, amanhã. Usa filtro <code>dateCalendar</code> e tooltip. </p> <div class="design-system__preview design-system__preview--row"> <span data-due-date="demoDueDateLate" data-is-completed="false"></span> <span data-due-date="demoDueDateToday" data-is-completed="false"></span> <span data-due-date="demoDueDateTomorrow" data-is-completed="false"></span> <span data-due-date="demoDueDateFuture" data-is-completed="false"></span> <span data-due-date="demoDueDateLate" data-is-completed="true"></span> </div> <table class="design-system__api-table"> <thead><tr><th>Binding</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-due-date</code></td><td>Data YYYY-MM-DD</td></tr> <tr><td><code>data-is-completed</code></td><td>Suprime estados de atraso quando concluído</td></tr> </tbody> </table> <pre class="design-system__code">&lt;span data-due-date="todo.due_on"\r\n      data-is-completed="todo.is_completed"&gt;&lt;/span&gt;</pre> </div> <!-- entryIsLockedComponent --> <div class="design-system__block" id="ds-directive-entry-is-locked-component"> <h3 class="design-system__block-title">entryIsLockedComponent</h3> <div class="design-system__preview design-system__preview--row"> <span data-entry-is-locked-component data-entry="demoEntryLocked"></span> <span data-entry-is-locked-component data-entry="demoEntryLockedReleased"></span> </div> <table class="design-system__api-table"> <thead><tr><th>
23Binding</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-entry</code></td><td>Objeto entry com <code>is_locked</code>, <code>locked_reason</code>, <code>permissions.can_modify_locked</code></td></tr> </tbody> </table> <pre class="design-system__code">&lt;span data-entry-is-locked-component data-entry="entry"&gt;&lt;/span&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Ícone <code>icon-lock4</code> (bloqueado) ou <code>icon-unlock</code> (liberado para edição). </p> </div> <!-- generateCustomFieldsElement --> <div class="design-system__block" id="ds-directive-generate-custom-fields-element"> <h3 class="design-system__block-title">generateCustomFieldsElement</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Renderiza input conforme <code>customField.type</code>: text, date, enum, money, numeric, time. Combina várias directives deste catálogo. </p> <div class="design-system__preview"> <div data-ng-repeat="field in demoCustomFieldTypes" style="margin-bottom: 16px; max-width: 320px;"> <label>{{ field.name }} ({{ field.type }})</label> <div data-generate-custom-fields-element="field" data-model="demoCustomFieldsEntity" data-revalidate="demoRevalidate"></div> </div> </div> <table class="design-system__api-table"> <thead><tr><th>Binding / Attr</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-generate-custom-fields-element</code></td><td>Objeto customField</td></tr> <tr><td><code>data-model</code></td><td>Entidade com <code>custom_fields[id]</code></td></tr> <tr><td><code>data-revalidate</code></td><td>Callback ao alterar valor</td></tr> </tbody> </table> <pre class="design-system__code">&lt;div data-generate-custom-fields-element="customField"\r\n     data-model="project"\r\n     data-revalidate="validateForm"&gt;&lt;/div&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Tipo <code>enum</code> usa Selectize + EnumOptionService (requer opções cadastradas). Demo acima cobre text, date, money, numeric e time. </p> </div> <!-- progressBar --> <div class="design-system__block" id="ds-directive-progress-bar"> <h3 class="design-system__block-title">progressBar</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Barra de progresso percentual com label numérico. Usada em todos, projetos e relatórios (<code>todo-edit.html</code>, <code>report-summary-groups.html</code>) para exibir consumo de estimativa ou orçamento. Verde até 100%; acima disso entra em estado <code>progress-bar-over-budget</code> (vermelho). </p> <div class="design-system__preview"> <div class="design-system__progress-demo"> <div> <span class="design-system__progress-demo-label">35% (dentro)</span> <span data-progress-bar data-progress-completed="demoProgressLow" data-progress-tooltip-title="Estimativa" data-progress-tooltip-items="demoProgressTooltipItems"></span> </div> <div> <span class="design-system__progress-demo-label">72% (dentro)</span> <span data-progress-bar data-progress-completed="demoProgressWithin"></span> </div> <div> <span class="design-system__progress-demo-label">125% (excedido)</span> <span data-progress-bar data-progress-completed="demoProgressOver"></span> </div> </div> </div> <table class="design-system__api-table"> <thead><tr><th>Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-progress-bar</code></td><td>A</td><td>Directive attribute-only</td></tr> <tr><td><code>data-progress-completed</code></td><td>=</td><td>Percentual concluído (0–100+). Valores &lt; 1 viram 1% na barra.</td></tr> <tr><td><code>data-progress-tooltip-title</code></td><td>@</td><td>
23Título opcional do tooltip.</td></tr> <tr><td><code>data-progress-tooltip-items</code></td><td>expr</td><td>Lista opcional <code>{ label, value }</code> (propriedade ou getter). Sem itens, o tooltip não aparece.</td></tr> <tr><td><code>data-progress-tooltip-placement</code></td><td>@</td><td>Posição do tooltip: <code>top</code> (padrão) ou <code>bottom</code>.</td></tr> </tbody> </table> <pre class="design-system__code">&lt;span data-progress-bar\r\n      data-progress-completed="todo.time_progress"\r\n      data-progress-tooltip-title="{{ \'todos.edit.progress\' | translate }}"\r\n      data-progress-tooltip-items="getProgressTooltipItems()"&gt;&lt;/span&gt;</pre> </div> <!-- progressCapacityBar --> <div class="design-system__block" id="ds-directive-progress-capacity-bar"> <h3 class="design-system__block-title">progressCapacityBar</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Barra de capacidade do usuário com tooltip detalhado. Usada no relatório semanal (<code>report-weekly-v2.html</code>) por dia, semana, mês e total. Largura via <code>data-progress</code> no elemento; estados especiais para feriado/férias/afastamento e ausência de capacidade cadastrada. </p> <div class="design-system__preview"> <div class="design-system__progress-demo"> <div> <span class="design-system__progress-demo-label">72% consumido</span> <span data-progress-capacity-bar data-title="{{ demoCapacityWithin.title }}" data-progress="demoCapacityWithin.progress" data-consumed="demoCapacityWithin.consumed" data-remaining="demoCapacityWithin.remaining" data-total="demoCapacityWithin.total" data-exceed="demoCapacityWithin.exceed" data-status="demoCapacityWithin.status" class="progress-bar-exceed-warning"></span> </div> <div> <span class="design-system__progress-demo-label">118% excedido</span> <span data-progress-capacity-bar data-title="{{ demoCapacityExceed.title }}" data-progress="demoCapacityExceed.progress" data-consumed="demoCapacityExceed.consumed" data-remaining="demoCapacityExceed.remaining" data-total="demoCapacityExceed.total" data-exceed="demoCapacityExceed.exceed" data-status="demoCapacityExceed.status" class="progress-bar-exceed-warning"></span> </div> <div> <span class="design-system__progress-demo-label">Feriado</span> <span data-progress-capacity-bar data-title="{{ demoCapacityHoliday.title }}" data-progress="demoCapacityHoliday.progress" data-consumed="demoCapacityHoliday.consumed" data-remaining="demoCapacityHoliday.remaining" data-total="demoCapacityHoliday.total" data-exceed="demoCapacityHoliday.exceed" data-status="demoCapacityHoliday.status" class="progress-bar-exceed-warning"></span> </div> <div> <span class="design-system__progress-demo-label">Sem capacidade</span> <span data-progress-capacity-bar data-title="{{ demoCapacityNoCapacity.title }}" data-progress="demoCapacityNoCapacity.progress" data-consumed="demoCapacityNoCapacity.consumed" data-remaining="demoCapacityNoCapacity.remaining" data-total="demoCapacityNoCapacity.total" data-exceed="demoCapacityNoCapacity.exceed" data-status="demoCapacityNoCapacity.status" class="progress-bar-exceed-warning"></span> </div> </div> <p class="design-system__section-desc" style="margin-top: 12px; margin-bottom: 0;"> Passe o mouse sobre a barra para ver o tooltip com capacidade, consumido, livre e excedido. </p> </div> <table class="design-system__api-table"> <thead><tr><th>Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data-progress-capacity-bar</code></td><td>A</td><td>Directive attribute-only (<code>replace: true</code>)</td></tr> <tr><td><code>data-title</code></td><td>@</td><td>Título no tooltip</td></tr> <tr><td><code>data-progress</code></td><td>=</td><td>Percentual consumido da capacidade</td></tr> <tr><td><code>data-consumed</code> / <code>data-remaining</code></td><td>=</td><td>Objetos com <code>time</code> (HH:MM:SS)</td></tr> <tr><td><code>data-total</code> / <code>data-exceed</code></td><td>=</td><td>Objetos com <code>hours</code> e <code>time</code></td></tr> <tr><td><code>data-status</code></td><td>=</td><td><code>work_day</code>, <code>holiday</code>, <code>vacation</code>, <code>leave</code></td></tr> <tr><td><code>class="progress-bar-exceed-warning"</code></td><td>—</td><td>Tom laranja quando excede (relatório semanal)</td></tr> </tbody> </table> <pre class="design-system__code">&lt;span data-progress-capacity-bar\r\n      data-title="{{ dateItem.details.date | dateLong }}"\r\n      data-progress="dateItem.details.date_user_capacity_progress"\r\n      data-consumed="dateItem.details.date_user_capacity_consumed"\r\n      data-remaining="dateItem.details.date_user_capacity_remaining"\r\n      data-total="dateItem.details.date_user_capacity_total"\r\n      data-exceed="dateItem.details.date_user_capacity_exceed"\r\n      data-status="dateItem.details.date_user_capacity_context"\r\n      class="progress-bar-exceed-warning"&gt;&lt;/span&gt;</pre> </div> <!-- stopwatchDisplay --> <div class="design-system__block" id="ds-directive-stopwatch-display"> <h3 class="design-system__block-title">stopwatchDisplay</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Cronômetro ao vivo via plugin jQuery <code>stopwatch.js</code>. Sincroniza com <code>StopwatchService</code> e atualiza título da aba / badge do app. Usado na toolbar (<code>top-toolbar.html</code>) e em lançamentos de horas (<code>entries-item.html</code>, classe <code>.stopwatch-display</code>). </p> <div class="design-system__preview"> <button type="button" class="button clean" data-ng-click="toggleDemoStopwatch()"> {{ demoStopwatchActive ? \'Parar demo\' : \'Iniciar demo\' }} cronômetro </button> <div class="design-system__stopwatch-preview" data-ng-if="demoStopwatchActive"> <span stopwatch-display class="stopwatch-display"></span> </div> <p style="margin-top: 8px; font-size: 13px;" data-ng-if="!demoStopwatchActive"> Clique para simular um cronômetro ativo (base 01:23:45 + tempo decorrido). </p> </div> <table class="design-system__api-table"> <thead><tr><th>
23Binding / Attr</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>stopwatch-display</code></td><td>A</td><td>Directive attribute-only; sem template próprio</td></tr> <tr><td><code>data-stopwatch-display</code></td><td>=</td><td>Binding opcional (não usado nas views atuais)</td></tr> </tbody> </table> <pre class="design-system__code">&lt;!-- Toolbar --&gt;\r\n&lt;span data-ng-if="isStopwatchActive" stopwatch-display&gt;&lt;/span&gt;\r\n\r\n&lt;!-- Lançamento de horas --&gt;\r\n&lt;span class="stopwatch-display"&gt;&lt;/span&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Requer <code>StopwatchService.hasActive()</code>. Escuta o evento <code>stopwatch-service::changed-current-stopwatch</code> para iniciar/parar. </p> </div> <!-- ngGoogleCharts --> <div class="design-system__block" id="ds-directive-ng-google-charts"> <h3 class="design-system__block-title">ngGoogleCharts</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Componente base sobre Google Charts (<code>ChartWrapper</code>). No relatório <strong>Resumo por grupos</strong> (<code>report-summary-groups.html</code>) os gráficos usam directives de domínio — <code>summary-time-chart</code>, <code>financial-progress-chart</code>, <code>invoiced-column-chart</code>, <code>time-pie-chart</code> — que renderizam via <code>google-chart</code> (angular-google-chart). Use <code>ngGoogleCharts</code> quando precisar montar <code>dataTable</code> + <code>options</code> manualmente com o mesmo visual (cores <code>#2563EB</code> / <code>#60A5FA</code>, fonte Inter, legenda top/end). </p> <div class="design-system__preview"> <div class="design-system__preview--row" style="align-items: stretch; gap: 16px;"> <div class="ng-google-charts design-system__chart-preview"> <p style="font-size: 12px; color: #4c5e6d; margin: 0 0 8px;">ColumnChart (horas faturáveis)</p> <ng-google-charts data="demoSummaryColumnChart" data-ng-if="demoSummaryColumnChart" style="display: block; height: 280px;"></ng-google-charts> </div> <div class="ng-google-charts design-system__chart-preview" style="max-width: 320px;"> <p style="font-size: 12px; color: #4c5e6d; margin: 0 0 8px;">PieChart (distribuição)</p> <ng-google-charts data="demoTimePieChart" data-ng-if="demoTimePieChart" style="display: block; height: 280px;"></ng-google-charts> </div> </div> </div> <table class="design-system__api-table"> <thead><tr><th>Binding</th><th>Tipo</th><th>Descrição</th></tr></thead> <tbody> <tr><td><code>data</code></td><td>&lt;</td><td>Objeto com <code>chartType</code>, <code>dataTable</code> (Google DataTable) e <code>options</code></td></tr> </tbody> </table> <pre class="design-system__code">var chartData = {\r\n  chartType: \'ColumnChart\',\r\n  dataTable: dataTable,\r\n  options: {\r\n    colors: [\'#2563EB\', \'#60A5FA\'],\r\n    isStacked: true,\r\n    fontName: \'Inter\',\r\n    legend: { position: \'top\', alignment: \'end\' }\r\n  }\r\n};\r\n\r\n&lt;ng-google-charts data="chartData"&gt;&lt;/ng-google-charts&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Requer <code>google.charts</code> carregado no layout. O container precisa de altura definida (classe <code>.ng-google-charts</code> ou <code>style="height: …"</code>). </p> </div> </div> '),
24$templateCache.put("views/design-system/sections/flags.html",'<div> <h2 class="design-system__section-title">Flags / Badges</h2> <p class="design-system__section-desc"> Labels compactos para status, papéis e categorias. Base: <code>.flag</code> ou <code>.flag.flag-v2</code>. </p> <div class="design-system__block"> <h3 class="design-system__block-title">Base</h3> <div class="design-system__preview design-system__preview--row"> <span class="flag">Flag padrão</span> <span class="flag flag-v2">Flag v2</span> <span class="flag flag-v2 grey-color">Grey</span> <span class="flag flag-v2 green-color">Green</span> </div> <pre class="design-system__code">&lt;span class="flag flag-v2 green-color"&gt;Ativo&lt;/span&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Papéis e automação</h3> <div class="design-system__preview design-system__preview--row"> <span class="flag flag-project-manager-member">Manager</span> <span class="flag flag-project-regular-member">Membro</span>
24 <span class="flag flag-new-feature">Novo</span> <span class="flag flag-automation-current">Automação ativa</span> <span class="flag flag-automation-scheduled">Agendada</span> <span class="flag flag-automation-past">Passada</span> <span class="flag flag-automation-draft">Rascunho</span> </div> </div> <div class="design-system__block" id="ds-flag-permission"> <h3 class="design-system__block-title">flagPermission</h3> <p class="design-system__section-desc"> Exibe o nome traduzido do papel via <code>PermissionService.getRoleName()</code>. Usado em toolbar, relatórios e listagens de usuários. </p> <div class="design-system__preview design-system__preview--row"> <span data-flag-permission="admin" data-color="true"></span> <span data-flag-permission="super" data-color="true"></span> <span data-flag-permission="regular"></span> <span data-flag-permission="admin" data-flag-border="false" data-color="true"></span> </div> <p style="margin-top: 8px; font-size: 13px; color: #4c5e6d;"> Último item: <code>data-flag-border="false"</code> (sem classe <code>.flag</code>). </p> <table class="design-system__api-table"> <thead> <tr> <th>Attr</th> <th>Tipo</th> <th>Descrição</th> </tr> </thead> <tbody> <tr><td><code>data-flag-permission</code></td><td>@</td><td>ID do papel (<code>admin</code>, <code>super</code>, <code>regular</code>, …)</td></tr> <tr><td><code>data-color</code></td><td>@</td><td><code>"true"</code> aplica destaque azul em papéis privilegiados</td></tr> <tr><td><code>data-flag-border</code></td><td>@</td><td><code>"false"</code> omite a classe <code>.flag</code></td></tr> </tbody> </table> <pre class="design-system__code">&lt;span data-flag-permission="{{reportItem.details.user_role}}"\r\n      data-color="true"&gt;&lt;/span&gt;</pre> </div> <div class="design-system__block" id="ds-flag-upgrade-required"> <h3 class="design-system__block-title">flagUpgradeRequired</h3> <p class="design-system__section-desc"> Link de upgrade exibido quando o plano não inclui a feature. Some automaticamente se <code>$subscriptionService.hasFeatureAccess(feature)</code> for verdadeiro. Clique abre o modal de upgrade. </p> <div class="design-system__preview"> <div style="margin-bottom: 12px;"> <span data-flag-upgrade-required="{{ demoUpgradeFeature }}"></span> </div> <div style="margin-bottom: 12px;"> <span data-flag-upgrade-required="{{ demoUpgradeFeature }}" data-show-description="true"></span> </div> <div> <span data-flag-upgrade-required="{{ demoUpgradeFeature }}" data-show-long-description="true" data-custom-description="relatórios customizados"></span> </div> <p style="margin-top: 12px; font-size: 13px; color: #4c5e6d;"> Demo usa feature fictícia <code>DESIGN_SYSTEM_UPGRADE_DEMO</code> para sempre exibir o componente no catálogo. </p> </div> <table class="design-system__api-table"> <thead> <tr> <th>Attr</th> <th>Tipo</th> <th>Descrição</th> </tr> </thead> <tbody> <tr><td><code>data-flag-upgrade-required</code></td><td>@</td><td>Constante de feature (ex.: <code>CUSTOM_REPORTS</code>, <code>TEAMS</code>)</td></tr> <tr><td><code>data-show-description</code></td><td>=</td><td>Label curto: <strong>Upgrade</strong></td></tr> <tr><td><code>data-show-long-description</code></td><td>=</td><td>Label <strong>Upgrade agora</strong> + texto “para liberar …”</td></tr> <tr><td><code>data-custom-description</code></td><td>@</td><td>Descrição customizada (padrão: “essa funcionalidade”)</td></tr> </tbody> </table> <pre class="design-system__code">&lt;span data-flag-upgrade-required="CUSTOM_REPORTS"\r\n      data-show-long-description="true"\r\n      data-custom-description="{{ \'general_account_settings.reports.upgrade_description\' | translate }}"&gt;&lt;/span&gt;</pre> </div> </div> '),$templateCache.put("views/design-system/sections/forms.html",'<div> <h2 class="design-system__section-title">Formulários</h2> <p class="design-system__section-desc"> Inputs nativos com border-radius 5px. <strong>Selects devem usar Selectize</strong> (<code>data-selectize</code>). <strong>Checkboxes devem usar slim-check</strong> (<code>data-ng-check</code>). </p> <div class="design-system__block"> <h3 class="design-system__block-title">Campos básicos (input / textarea)</h3> <div class="design-system__preview"> <label>Nome</label> <input type="text" placeholder="Digite o nome" value="Exemplo"> <label style="margin-top: 12px;">Textarea</label> <textarea rows="3" placeholder="Descrição"></textarea> </div> <pre class="design-system__code">&lt;input type="text" placeholder="..."&gt;\r\n&lt;textarea rows="3" placeholder="..."&gt;&lt;/textarea&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Checkbox (slim-check + ngCheck)</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Assets: <code>vendor/slim-check/slim-check.css</code>, <code>scripts/vendor/jquery.slim-check.js</code>. A directive <code>ngCheck</code> aplica <code>.slimCheck()</code> e insere o <code>&lt;label&gt;</code> visual após o input. </p> <div class="design-system__preview"> <div class="element-todo-checkbox"> <label> <input type="checkbox" data-ng-check data-ng-model="demoCheckbox"> <span>Opção marcada</span> </label> </div> <div class="element-todo-checkbox" style="margin-top: 12px;"> <label> <input type="checkbox" data-ng-check data-ng-model="demoCheckbox" disabled="disabled"> <span>Desabilitado</span> </label> </div> </div> <pre class="design-system__code">&lt;div class="element-todo-checkbox"&gt;\r\n  &lt;label&gt;\r\n    &lt;input type="checkbox" data-ng-check data-ng-model="model"&gt;\r\n    &lt;span&gt;Label&lt;/span&gt;\r\n  &lt;/label&gt;\r\n&lt;/div&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;">
24 Variantes de ícone/tamanho: <code>.slim-check-expand-icon</code>, <code>.slim-check-width-12</code> (ver filtros e todos). </p> </div> <!-- Selectize: single + data-options --> <div class="design-system__block"> <h3 class="design-system__block-title">Selectize — single + data-options</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Padrão de preferências/perfil: lista estática no scope, campos <code>valueField</code>, <code>labelField</code>, <code>searchField</code>, <code>dropdownParent: \'body\'</code>. </p> <div class="design-system__preview"> <label>Idioma</label> <select data-ng-model="demoSelectLanguage" data-options="demoSelectLanguages" data-selectize="{\r\n                        valueField: \'id\',\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\'\r\n                    }"></select> </div> <pre class="design-system__code">&lt;select data-ng-model="model"\r\n        data-options="languages"\r\n        data-selectize="{\r\n            valueField: \'id\',\r\n            labelField: \'name\',\r\n            searchField: \'name\',\r\n            dropdownParent: \'body\'\r\n        }"&gt;&lt;/select&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Exemplos reais: <code>profile.html</code>, <code>users-time-off.html</code>. </p> </div> <!-- Selectize: placeholder + selectize-keep-default-width --> <div class="design-system__block"> <h3 class="design-system__block-title">Selectize — placeholder e largura</h3> <div class="design-system__preview"> <label>Intervalo</label> <select data-ng-model="demoSelectInterval" data-options="demoSelectIntervals" class="selectize-keep-default-width" data-selectize="{\r\n                        labelField: \'name\',\r\n                        valueField: \'type\',\r\n                        placeholder: \'Selecione o intervalo...\'\r\n                    }"></select> </div> <pre class="design-system__code">&lt;select class="selectize-keep-default-width"\r\n        data-options="interval_options"\r\n        data-selectize="{\r\n            labelField: \'name\',\r\n            valueField: \'type\',\r\n            placeholder: \'Selecione...\'\r\n        }"&gt;&lt;/select&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Exemplo real: filtros de data em <code>time-entry-filters.html</code>. </p> </div> <!-- Selectize: config no controller --> <div class="design-system__block"> <h3 class="design-system__block-title">Selectize — config no controller</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Quando a config é complexa (render, create, onChange), declare no controller e referencie via <code>data-selectize="projectSelectizeConfig"</code>. </p> <div class="design-system__preview"> <label>Projeto</label> <select data-ng-model="demoSelectFromConfig" data-options="demoSelectProjects" data-selectize="demoSelectizeConfig"></select> </div> <pre class="design-system__code">// controller\r\n$scope.projectSelectizeConfig = {\r\n    labelField: \'name\',\r\n    valueField: \'id\',\r\n    searchField: \'name\',\r\n    render: $scope.render_projects,\r\n    create: $scope.add_project,\r\n    onChange: $scope.onChangeProject,\r\n    placeholder: \'...\'\r\n};\r\n\r\n&lt;select data-ng-model="entry.project_id"\r\n        data-options="projects"\r\n        data-selectize="projectSelectizeConfig"&gt;&lt;/select&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Exemplo real: <code>entries-add.html</code> + <code>entries-add-controller.js</code>. </p> </div> <!-- Selectize: onChange inline --> <div class="design-system__block"> <h3 class="design-system__block-title">Selectize — onChange inline</h3> <div class="design-system__preview"> <label>Moeda (dispara onChange ao trocar)</label> <select data-ng-model="demoSelectLanguage" data-options="demoSelectLanguages" data-selectize="{\r\n                        valueField: \'id\',\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\',\r\n                        onChange: onDemoSelectChange\r\n                    }"></select> </div> <pre class="design-system__code">data-selectize="{\r\n    valueField: \'id\',\r\n    labelField: \'name\',\r\n    onChange: onChangeCurrency\r\n}"</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Exemplo real: <code>general-account-settings.html</code> (moeda). </p> </div> <!-- Selectize: render custom --> <div class="design-system__block"> <h3 class="design-system__block-title">Selectize — render customizado</h3> <div class="design-system__preview"> <label>Permissão</label> <select data-ng-model="demoSelectRole" data-options="demoSelectRoles" data-selectize="demoSelectRoleConfig"></select> </div> <pre class="design-system__code">data-selectize="{\r\n    labelField: \'name\',\r\n    valueField: \'id\',\r\n    dropdownParent: \'body\',\r\n    render: $permissionService.renderRoles\r\n}"</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Exemplos reais: <code>users-permissions.html</code>, <code>projects-edit-controller.js</code> (create customer), custom fields (<code>option_create</code>). </p> </div> <!-- Selectize: optionsLoad init --> <div class="design-system__block"> <h3 class="design-system__block-title">Selectize — optionsLoad (init)</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Carrega opções via função no scope. Default: <code>options-load-trigger="init"</code>. </p> <div class="design-system__preview"> <label>Calendário</label> <select data-ng-model="demoSelectAsync" data-options-load="loadDemoSelectAsync" data-selectize-key="demo-select-async" data-selectize="{\r\n                        labelField: \'name\',\r\n                        valueField: \'id\',\r\n                        searchField: \'name\',\r\n                        sortField: \'name\',\r\n                        dropdownParent: \'body\',\r\n                        placeholder: \'Selecione um calendário...\'\r\n                    }"></select> <button type="button" class="button clean" style="margin-top: 8px;" data-ng-click="reloadDemoSelectAsync()"> Recarregar (selectize:reload) </button> </div> <pre class="design-system__code">&lt;select data-ng-model="calendarId"\r\n        data-options-load="loadCalendars"\r\n        data-selectize="{ labelField: \'name\', valueField: \'id\', ... }"&gt;\r\n&lt;/select&gt;\r\n\r\n$scope.$broadcast(\'selectize:reload\', \'filter-projects\');</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Exemplos reais: <code>general-account-settings.html</code>, <code>users-edit.html</code> (manager). </p> </div> <!-- Selectize: optionsLoad focus + dependent --> <div class="design-system__block"> <h3 class="design-system__block-title">Selectize — optionsLoad no focus + dependência</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Tarefas dependem do projeto: carrega ao focar (<code>data-options-load-trigger="focus"</code>) e usa <code>data-selectize-key</code> para reload. </p> <pre class="design-system__code">&lt;select data-ng-model="entry.task_id"\r\n        data-options-load="loadProjectTasks"\r\n        data-options-load-trigger="focus"\r\n        data-ng-disabled="!entry.project_id"\r\n        data-selectize-key="options-project-tasks"\r\n        data-selectize="taskSelectizeConfig"&gt;&lt;/select&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Exemplo real: <code>entries-add.html</code>. </p> </div> <!-- Selectize: multi + optgroups --> <div class="design-system__block"> <h3 class="design-system__block-title">Selectize — multi-select (input)</h3> <p class="design-system__section-desc" style="margin-bottom: 12px;"> Multi usa <code>&lt;input&gt;</code> (não <code>&lt;select&gt;</code>). Plugin <code>remove_button</code>, botões "Selecionar todos" / "Limpar" automáticos. </p> <div class="design-system__preview"> <label>Usuários (multi)</label> <input data-ng-model="demoSelectMulti" data-options="demoSelectUsers" data-selectize="{\r\n                       labelField: \'name\',\r\n                       valueField: \'id\',\r\n                       searchField: \'name\',\r\n                       plugins: [\'remove_button\'],\r\n                       optgroups: [\r\n                           { active: 1, name: \'Ativos\' },\r\n                           { active: 0, name: \'Inativos\' }\r\n                       ],\r\n                       optgroupField: \'active\',\r\n                       optgroupLabelField: \'name\',\r\n                       optgroupValueField: \'id\',\r\n                       placeholder: \'Filtrar usuários...\'\r\n                   }"> </div> <pre class="design-system__code">&lt;input data-ng-model="filter.apiParams.user_id"\r\n       data-options-load="loadUsers"\r\n       data-options-load-trigger="focus"\r\n       data-selectize-key="filter-users"\r\n       data-selectize="{\r\n           labelField: \'name\',\r\n           valueField: \'id\',\r\n           plugins: [\'remove_button\'],\r\n           optgroups: [{ active: 1, name: \'Ativos\' }],\r\n           optgroupField: \'active\',\r\n           optgroupLabelField: \'name\',\r\n           optgroupValueField: \'id\',\r\n           placeholder: \'...\'\r\n       }"&gt;</pre> <p class="design-system__section-desc" style="margin-top: 8px;"> Exemplos reais: filtros de projetos/usuários/tarefas em <code>time-entry-filters.html</code>. </p> </div> <!-- Selectize: multi optgroups by customer --> <div class="design-system__block"> <h3 class="design-system__block-title">Selectize — multi com optgroup por cliente</h3> <div class="design-system__preview"> <label>Projetos por cliente</label> <input data-ng-model="demoSelectProjectsMulti" data-options="demoSelectProjectsGrouped" data-selectize="{\r\n                       labelField: \'name\',\r\n                       valueField: \'id\',\r\n                       searchField: \'name\',\r\n                       plugins: [\'remove_button\'],\r\n                       optgroups: [{ customer_id: \'\', customer_name: \'Sem cliente\' }],\r\n                       optgroupField: \'customer_id\',\r\n                       optgroupLabelField: \'customer_name\',\r\n                       optgroupValueField: \'customer_id\',\r\n                       placeholder: \'Filtrar por projeto...\'\r\n                   }"> </div> <pre class="design-system__code">optgroups: [\r\n    { customer_id: \'\', customer_name: \'Sem cliente\' }\r\n],\r\noptgroupField: \'customer_id\',\r\noptgroupLabelField: \'customer_name\',\r\noptgroupValueField: \'customer_id\'</pre> </div> <!-- Selectize: disabled + options-filters --> <div class="design-system__block"> <h3 class="design-system__block-title">Selectize — disabled e filtros internos</h3> <div class="design-system__preview"> <label>Desabilitado</label> <select data-ng-model="demoSelectDisabled" data-options="demoSelectLanguages" data-ng-disabled="demoSelectDisabledFlag" data-selectize="{\r\n                        valueField: \'id\',\r\n                        labelField: \'name\',\r\n                        searchField: \'name\',\r\n                        dropdownParent: \'body\'\r\n                    }"></select> </div> <table class="design-system__api-table" style="margin-top: 12px;"> <thead> <tr><th>Atributo</th><th>Uso</th></tr> </thead> <tbody> <tr> <td><code>data-ng-disabled</code></td> <td>Desabilita widget (ex.: tarefa sem projeto selecionado)</td> </tr> <tr> <td><code>data-options-filters</code></td> <td>Checkboxes dentro do dropdown para refinar carga (filtros de projetos)</td> </tr> <tr> <td><code>data-options-load-params</code></td> <td>Params extras passados à função de carga</td> </tr> <tr> <td><code>data-selectize-key</code></td> <td>Identificador para <code>$broadcast(\'selectize:reload\', key)</code></td> </tr> </tbody> </table> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Estados (input nativo)</h3> <div class="design-system__preview"> <input type="text" class="has-error" value="Campo com erro" placeholder="Erro"> <input type="text" disabled="disabled" value="Campo desabilitado" style="margin-top: 8px;"> </div> <pre class="design-system__code">&lt;input class="has-error" ...&gt;\r\n&lt;input disabled ...&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Assets Selectize</h3> <table class="design-system__api-table"> <thead> <tr><th>Arquivo</th><th>Função</th></tr> </thead> <tbody> <tr><td><code>scripts/vendor/selectize-0.12.1.js</code></td><td>Plugin jQuery base</td></tr> <tr><td><code>scripts/vendor/angular-selectize.js</code></td><td>Directive <code>selectize</code></td></tr> <tr><td><code>styles/vendor/selectize.css</code></td><td>Estilos base</td></tr> <tr><td><code>styles/vendor/selectize.custom.less</code></td><td>Customizações Rabbiit</td></tr> <tr><td><code>styles/vendor/selectize.modal.css</code></td><td>Dropdown em modais</td></tr> </tbody> </table> <p class="design-system__section-desc" style="margin-top: 8px;"> Não usar <code>&lt;select&gt;</code> nativo sem <code>data-selectize</code>. </p> </div> </div> '),$templateCache.put("views/design-system/sections/modals.html",'<div> <h2 class="design-system__section-title">Modais</h2> <p class="design-system__section-desc"> Modais Bootstrap com classes de tamanho. Padrão de header, body e footer. </p> <div class="design-system__block"> <h3 class="design-system__block-title">Estrutura padrão</h3> <div class="design-system__modal-preview"> <div class="modal-header"> <h1>Título do modal</h1> <div>
24Subtítulo opcional</div> </div> <div class="modal-body"> Conteúdo do modal. Formulários e textos ficam aqui. </div> <div class="modal-footer"> <button type="button" class="button clean">Cancelar</button> <button type="button" class="button button--blue-brand">Salvar</button> </div> </div> <pre class="design-system__code">&lt;div class="modal medium"&gt;\r\n  &lt;div class="modal-dialog"&gt;\r\n    &lt;div class="modal-content"&gt;\r\n      &lt;div class="modal-header"&gt;...&lt;/div&gt;\r\n      &lt;div class="modal-body"&gt;...&lt;/div&gt;\r\n      &lt;div class="modal-footer"&gt;...&lt;/div&gt;\r\n    &lt;/div&gt;\r\n  &lt;/div&gt;\r\n&lt;/div&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Modal com abas</h3> <p style="margin-bottom: 12px; font-size: 13px; color: #4c5e6d;"> Padrão usado em edição de projeto, usuário e campos customizados. Wrapper <code>.modal__with-tabs</code>, abas via directive <code>data-app-tabs</code> e conteúdo por aba com <code>data-ng-if</code>. </p> <div class="design-system__preview" style="margin-bottom: 16px;"> <button type="button" class="button button--blue-brand" data-ng-click="openModalWithTabsDemo()"> Abrir modal com abas </button> </div> <div class="design-system__modal-preview design-system__modal-preview--with-tabs"> <div class="modal__with-tabs"> <div class="modal-header"> <h1>Título do modal</h1> <nav data-app-tabs data-tabs="demoAppTabsModal" data-selected="demoAppTabSelectedModal"> </nav> </div> <div class="modal-body"> Conteúdo da aba ativa. Troque de aba no header para alternar seções do formulário. </div> <div class="modal-footer"> <button type="button" class="button clean">Cancelar</button> <button type="button" class="button button--blue-brand">Salvar</button> </div> </div> </div> <table class="design-system__api-table" style="margin-top: 16px;"> <thead> <tr> <th>Classe / elemento</th> <th>Uso</th> </tr> </thead> <tbody> <tr><td><code>.modal__with-tabs</code></td><td>Wrapper raiz do conteúdo do modal</td></tr> <tr><td><code>data-app-tabs</code></td><td>Directive de abas (ver Directives UI)</td></tr> <tr><td><code>.directives-app-tabs__item.is-active</code></td><td>Aba selecionada</td></tr> <tr><td><code>.directives-app-tabs__counter</code></td><td>Contador opcional na aba</td></tr> <tr><td><code>.modal-header--details</code></td><td>Subtítulo abaixo do título</td></tr> </tbody> </table> <pre class="design-system__code">&lt;nav data-app-tabs\r\n     data-tabs="userEditTabs"\r\n     data-selected="tabSelected"\r\n     data-tab-margin-left="20px"\r\n     data-nav-padding-left="10px"&gt;&lt;/nav&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Tamanhos disponíveis</h3> <table class="design-system__api-table"> <thead> <tr> <th>Classe no .modal</th> <th>Uso</th> </tr> </thead> <tbody> <tr><td><code>.tiny</code></td><td>Diálogos mínimos</td></tr> <tr><td><code>.small</code></td><td>Confirmações</td></tr> <tr><td><code>.medium</code> (padrão)</td><td>Formulários comuns</td></tr> <tr><td><code>.large-size</code></td><td>Conteúdo amplo</td></tr> <tr><td><code>.modal-size-800</code></td><td>Largura fixa 800px</td></tr> <tr><td><code>.modal-size-1200</code></td><td>Largura fixa 1200px</td></tr> </tbody> </table> </div> </div> '),$templateCache.put("views/design-system/sections/spacing-radius.html",'<div> <h2 class="design-system__section-title">Espaçamento e radius</h2> <p class="design-system__section-desc"> Escala base 4/8px. Radius alinhado com inputs (5px) e botões (10px). </p> <div class="design-system__block"> <h3 class="design-system__block-title">Espaçamento (--ds-space-*)</h3> <div class="design-system__preview"> <div class="design-system__spacing-row" data-ng-repeat="space in spacingTokens"> <code>{{ space.name }}</code> <div class="design-system__spacing-bar" data-ng-style="{\'width\': space.value}"></div> <span>{{ space.value }}</span> </div> </div> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Border radius (--ds-radius-*)</h3> <div class="design-system__preview design-system__preview--row"> <div> <div class="design-system__radius-item design-system__radius-item--sm"></div> <pre class="design-system__code">--ds-radius-sm (3px)</pre> </div> <div> <div class="design-system__radius-item design-system__radius-item--md"></div> <pre class="design-system__code">--ds-radius-md (5px)</pre> </div> <div> <div class="design-system__radius-item design-system__radius-item--lg"></div> <pre class="design-system__code">--ds-radius-lg (10px)</pre> </div> <div> <div class="design-system__radius-item design-system__radius-item--full"></div> <pre class="design-system__code">--ds-radius-full (50px)</pre> </div> </div> </div> </div> '),$templateCache.put("views/design-system/sections/tokens-colors.html",'<div> <h2 class="design-system__section-title">Cores / Tokens</h2> <p class="design-system__section-desc"> Tokens semânticos com prefixo <code>--ds-*</code> apontam para primitivos legados em <code>styles/app-colors.css</code>. Use os semânticos em código novo. </p> <div class="design-system__block" data-ng-repeat="group in colorGroups"> <h3 class="design-system__block-title">{{ group.name }}</h3> <div class="design-system__swatch-grid"> <div class="design-system__swatch" data-ng-repeat="token in group.tokens"> <div class="design-system__swatch-color" data-ng-style="{\'background-color\': \'var(\' + token.semantic + \')\'}"></div> <div class="design-system__swatch-info"> <code>{{ token.semantic }}</code> <span>{{ token.legacy }}</span> </div> </div> </div> </div> </div> '),$templateCache.put("views/design-system/sections/typography.html",'<div> <h2 class="design-system__section-title">Tipografia</h2> <p class="design-system__section-desc"> Fonte base: Inter (fallback Open Sans). Tokens em <code>--ds-font-size-*</code>. </p> <div class="design-system__block"> <h3 class="design-system__block-title">Headings</h3> <div class="design-system__preview"> <h1>Heading 1 — título de página</h1> <h2>Heading 2 — subtítulo</h2> <h3>Heading 3 — seção</h3> </div> <pre class="design-system__code">&lt;h1&gt;Heading 1&lt;/h1&gt;\r\n&lt;h2&gt;Heading 2&lt;/h2&gt;\r\n&lt;h3&gt;Heading 3&lt;/h3&gt;</pre> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Corpo e utilitários</h3> <div class="design-system__preview"> <p>Texto padrão do corpo (13px).</p> <p class="small">Texto small (classe .small).</p> <p class="legend">Legenda (.legend)</p> <p> <a class="link" href="#">Link padrão (.link)</a> &nbsp; <a class="link-dashed" href="#">Link tracejado (.link-dashed)</a> &nbsp; <a class="link-dotted" href="#">Link pontilhado (.link-dotted)</a> </p> </div> </div> <div class="design-system__block"> <h3 class="design-system__block-title">Tokens de tipografia</h3> <table class="design-system__api-table"> <thead> <tr> <th>Token</th> <th>Valor</th> <th>Uso</th> </tr> </thead> <tbody> <tr><td><code>--ds-font-size-xs</code></td><td>12px</td><td>Flags, labels pequenos</td></tr> <tr><td><code>--ds-font-size-sm</code></td><td>13px</td><td>Corpo, botões</td></tr> <tr><td><code>--ds-font-size-md</code></td><td>14px</td><td>Alertas</td></tr> <tr><td><code>--ds-font-size-lg</code></td><td>18px</td><td>Destaques</td></tr> <tr><td><code>--ds-font-size-xl</code></td><td>25px</td><td>H1</td></tr> </tbody> </table> </div> </div> '),$templateCache.put("views/reports/report-detailed/check-as-invoiced-modal.html",'<div> <div translate="report.detailed.invoiced_modal.title" data-translate-values="{\r\n        not: isInvoiced === 0 ? (\'report.detailed.invoiced_modal.not\'|translate) : \'\',\r\n        billable_total: (billableTotal|moneyToReal:true)\r\n    }"></div> <div style="margin-top: 20px"> {{ \'report.detailed.invoiced_modal.confirm_continue\' | translate }} </div> <div class="explanation explanation--with-icon-info radius" style="margin-top: 25px;"> {{ \'report.detailed.invoiced_modal.explanation\' | translate }} </div> </div> ')}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.