diff --git a/modules/costs/app/components/time_entries/time_entry_form.rb b/modules/costs/app/components/time_entries/time_entry_form.rb index 43242765a043..44e6a9d44fca 100644 --- a/modules/costs/app/components/time_entries/time_entry_form.rb +++ b/modules/costs/app/components/time_entries/time_entry_form.rb @@ -117,10 +117,12 @@ def show_start_and_end_time_fields? end def activities + return [] if project.blank? + TimeEntryActivity.active_in_project(project) end - def user_autocompleter_filter_options + def user_completer_filter_options filters = [ { name: "type", operator: "=", values: %w[User Group] }, { name: "status", operator: "=", values: [Principal.statuses[:active], Principal.statuses[:invited]] } diff --git a/modules/costs/app/components/time_entries/time_entry_form_component.rb b/modules/costs/app/components/time_entries/time_entry_form_component.rb index 648b155980cc..0069b5b31869 100644 --- a/modules/costs/app/components/time_entries/time_entry_form_component.rb +++ b/modules/costs/app/components/time_entries/time_entry_form_component.rb @@ -53,13 +53,13 @@ def form_options if time_entry.persisted? base.merge({ - url: project_time_entry_path(project, time_entry), + url: time_entry_path(time_entry), method: :patch }) else base.merge({ - url: project_time_entries_path(project), + url: time_entries_path, method: :post }) end diff --git a/modules/costs/app/controllers/time_entries_controller.rb b/modules/costs/app/controllers/time_entries_controller.rb index a3a71d5f264a..2562415d637a 100644 --- a/modules/costs/app/controllers/time_entries_controller.rb +++ b/modules/costs/app/controllers/time_entries_controller.rb @@ -31,23 +31,30 @@ class TimeEntriesController < ApplicationController include OpTurbo::DialogStreamHelper before_action :require_login - before_action :find_project_by_project_id - authorization_checked! :dialog, :create, :update, :user_caption + authorization_checked! :dialog, :create, :update, :user_tz_caption, :time_entry_activities def dialog + if params[:project_id].present? + @project = begin + Project.visible.find(params[:project_id]) + rescue ActiveRecord::NotFound + nil + end + end + @work_package = WorkPackage.visible.find_by(id: params[:work_package_id]) if params[:work_package_id].present? @time_entry = if params[:time_entry_id] # TODO: Properly handle authorization TimeEntry.find_by(id: params[:time_entry_id]) else - TimeEntry.new(project: @project, user: User.current) + TimeEntry.new(project: @project, work_package: @work_package, user: User.current) end end - def user_caption + def user_tz_caption user = User.visible.find_by(id: params[:user_id]) caption = if user && user.time_zone != User.current.time_zone - I18n.t("notice_different_time_zones", tz: user.time_zone.name) + I18n.t("notice_different_time_zones", tz: helpers.friendly_timezone_name(user.time_zone)) else "" end @@ -58,10 +65,14 @@ def user_caption respond_with_turbo_streams end + def time_entry_activities + respond_with_turbo_streams + end + def create call = TimeEntries::CreateService .new(user: current_user) - .call(time_entry_params) + .call(permitted_params.time_entries) @time_entry = call.result @@ -80,7 +91,7 @@ def update call = TimeEntries::UpdateService .new(user: current_user, model: time_entry) - .call(time_entry_params) + .call(permitted_params.time_entries) @time_entry = call.result @@ -93,12 +104,4 @@ def update respond_with_turbo_streams end end - - private - - def time_entry_params - permitted_params.time_entries.merge( - project_id: @project.id - ) - end end diff --git a/modules/costs/app/helpers/time_entries_helper.rb b/modules/costs/app/helpers/time_entries_helper.rb new file mode 100644 index 000000000000..c81f79f96ad0 --- /dev/null +++ b/modules/costs/app/helpers/time_entries_helper.rb @@ -0,0 +1,36 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module TimeEntriesHelper + def friendly_timezone_name(time_zone) + tz_info = time_zone.tzinfo + friendly_name = ActiveSupport::TimeZone::MAPPING.key(tz_info.canonical_zone.name) + + "(UTC#{ActiveSupport::TimeZone.seconds_to_utc_offset(tz_info.base_utc_offset)}) #{friendly_name}" + end +end diff --git a/modules/costs/app/views/projects/time_entries/dialog.turbo_stream.erb b/modules/costs/app/views/time_entries/dialog.turbo_stream.erb similarity index 100% rename from modules/costs/app/views/projects/time_entries/dialog.turbo_stream.erb rename to modules/costs/app/views/time_entries/dialog.turbo_stream.erb diff --git a/modules/costs/config/routes.rb b/modules/costs/config/routes.rb index de104c706016..451daa5b046c 100644 --- a/modules/costs/config/routes.rb +++ b/modules/costs/config/routes.rb @@ -29,8 +29,8 @@ Rails.application.routes.draw do resources :time_entries, only: %i[create update] do get :dialog, on: :collection - get "users/:user_id/tz_caption", action: :user_caption, on: :collection - get "work_packages/:work_package_id/time_entry_activities", action: :change_activities_input, on: :collection + get "/users/:user_id/tz_caption", action: :user_tz_caption, on: :collection + get "/work_packages/:work_package_id/time_entry_activities", action: :change_activities_input, on: :collection end scope "projects/:project_id", as: "projects" do @@ -39,6 +39,8 @@ resources :hourly_rates, only: %i[show edit update] do post :set_rate, on: :member end + + get "/time_entries/dialog" => "time_entries#dialog" end scope "my" do @@ -49,8 +51,6 @@ namespace "settings" do resource :time_entry_activities, only: %i[show update] end - - get "/time_entries/dialog" => "time_entries#dialog" end scope "work_packages/:work_package_id", as: "work_packages" do diff --git a/modules/overviews/app/views/overviews/overviews/show.html.erb b/modules/overviews/app/views/overviews/overviews/show.html.erb index 54d027b60f25..8d9439bfb53f 100644 --- a/modules/overviews/app/views/overviews/overviews/show.html.erb +++ b/modules/overviews/app/views/overviews/overviews/show.html.erb @@ -74,13 +74,13 @@ end %> <%# TEMPORARY # %> <%- if Rails.env.development? %> <%= link_to "log time", - dialog_project_time_entries_path(@project), + projects_time_entries_dialog_path(@project), data: { controller: "async-dialog", test_selector: "toggle-log-time-dialog-button", } %> <%= link_to "edit log time", - dialog_project_time_entries_path(@project, time_entry_id: TimeEntry.first.id), + projects_time_entries_dialog_path(@project, time_entry_id: TimeEntry.first.id), data: { controller: "async-dialog", test_selector: "toggle-log-time-dialog-button",