diff --git a/app/controllers/admin/ruling_timers_controller.rb b/app/controllers/admin/ruling_timers_controller.rb index ae6daf8..8c3f288 100644 --- a/app/controllers/admin/ruling_timers_controller.rb +++ b/app/controllers/admin/ruling_timers_controller.rb @@ -1,38 +1,105 @@ class Admin::RulingTimersController < OrbitMemberController include Admin::RulingTimersHelper - before_action :set_weekdays + before_action :check_permissions, :set_weekdays, :set_setting + before_action :set_projects , :only => [:project_management,:add_task,:edit_task] + before_action :set_tags, :only => [:index, :task_management, :project_management, :add_task,:edit_task] + def check_permissions + @is_manager = false + OrbitHelper.set_params(params,current_user) + access_level = OrbitHelper.user_access_level? + if (access_level.nil? || access_level == "user") + @setting = RulingTimerSetting.first + unless @setting.authorize?(current_user) + render_401 + end + else + @is_manager = true + end + end + def set_type_params + all_types = ["all_tasks","my_tasks","my_assisted_tasks","my_observed_tasks"] + type = params[:type] + if !all_types.include?(type) + if @is_manager + type = all_types[0] + else + type = all_types[1] + end + end + case type + when "all_tasks" + @tasks = @tasks + when "my_tasks" + @tasks = @tasks.where(:owner=>current_user) + when "my_assisted_tasks" + @tasks = @tasks.where(:helper_ids=>current_user.id.to_s) + when "my_observed_tasks" + @tasks = @tasks.where(:observer_ids=>current_user.id.to_s) + end + end def initialize super @app_title = "ruling_timer" end def index user = current_user - @ruling_timer_temp = RulingTimerTemp.where(:user=>user).first - @ruling_timer_history = [] - all_count = 0 - per = 10 - page = params[:page].to_i - if @ruling_timer_temp - @ruling_timer_history = RulingTimerHistory.where(:user=>user).desc(:created_at) - all_count += (1 + @ruling_timer_history.count) - if page <= 1 - @ruling_timer_history = @ruling_timer_history.page(0).per(per - 1) - else - @ruling_timer_history = @ruling_timer_history.limit(per).skip(per * page - 1) - @ruling_timer_temp = nil - end - end - @ruling_pager = RulingPager.new(:count=>all_count,:page=>page,:per=>per) + get_user_timer_data(user) end def timer_management @timer_temps = RulingTimerTemp.all.page(params[:page]).per(15) @active_users = @timer_temps.map{|t| t.user} end def task_management - @tasks = RulingTimerTask.all.page(params[:page]).per(10) + @tasks = RulingTimerTask.all.desc(:created_at).page(params[:page]).per(10) + set_type_params + end + def project_management end def work_history user = User.find(params[:id]) rescue nil + get_user_timer_data(user,true) + render "index" + end + def set_projects + @categories = current_user.approved_categories.select{|c| c.module_app_id == @module_app.id} rescue [] + @task = nil + @private_project_id = nil + if params[:action] == "edit_task" + @task = RulingTimerTask.find(params[:id]) + @private_project_id = RulingTimerProject.where(:is_private=>true,:creator=>@task.creator).pluck(:id).first #私人專案 + else + @private_project_id = RulingTimerProject.where(:is_private=>true,:creator=>current_user).pluck(:id).first #私人專案 + end + @projects = RulingTimerProject.any_of({:is_hidden=>false,:category_id.in=>@categories.collect(&:id)},{:id=>@private_project_id}).desc(:created_at) + if params[:action] == "project_management" + @projects = @projects.page(params[:page]).per(10) + else + @projects = @projects.to_a + if @private_project_id.nil? + @projects = [RulingTimerProject.new] + @projects + end + end + end + def get_user_timer_data(user, display_name = false) + time_now = DateTime.now.utc.new_offset("+8") + now_year_month = time_now.strftime("%Y/%m") + @start_year_month = params[:start_year_month].present? ? DateTime.parse(params[:start_year_month]).utc : time_now + @end_year_month = params[:end_year_month].present? ? DateTime.parse(params[:end_year_month]).utc : time_now + @all_year_months = [] + tmp = @start_year_month.clone + while tmp <= @end_year_month do + @all_year_months << tmp.strftime("%Y/%m") + tmp += 1.month + end + @all_year_months_data = @all_year_months.map do |ym| + tmp = RulingTimerTemp.where(:user=>user,:date=>/#{ym.sub("/","\\/")}/).first + all_infos = [] + if tmp + all_infos << {:date=>tmp.date.split(" ")[0],:seconds=>tmp.calc("work_times"),:work_time_str=>tmp.transform_second_to_time(tmp.all_work_times_seconds)} + end + all_infos += RulingTimerHistory.where(:user=>user,:date=>/#{ym.sub("/","\\/")}/).desc(:created_at).pluck(:date,:all_work_times_seconds,:work_time_str).map{|d,t,str| {:date=> d.split(" ")[0],:seconds=>t,:work_time_str=>str}} + [ym, all_infos.inject(0){|sum,h| sum + h[:seconds] } , all_infos] + end @ruling_timer_temp = RulingTimerTemp.where(:user=>user).first @ruling_timer_history = [] all_count = 0 @@ -49,8 +116,7 @@ class Admin::RulingTimersController < OrbitMemberController end end @ruling_pager = RulingPager.new(:count=>all_count,:page=>page,:per=>per) - @user_name = user.name - render "index" + @user_name = user.name if display_name end def edit_temp_timer @timer = RulingTimerTemp.find(params[:id]) rescue nil @@ -86,20 +152,36 @@ class Admin::RulingTimersController < OrbitMemberController redirect_to params[:referer_url] end def add_task - @task = RulingTimerTask.new - @users = User.all.where(:user_name.ne=>"rulingcom") + @no_comment_save_btn = true + @task = RulingTimerTask.new(:owner=>current_user,:ruling_timer_project_id=>@private_project_id) + if params[:project_id] + @task.ruling_timer_project_id = params[:project_id] + end + @project = @task.ruling_timer_project + @users = User.where(:member_profile_id.in=>MemberProfile.where(:role_ids.in=>@setting.role_ids).pluck(:id)) end def edit_task - @task = RulingTimerTask.find(params[:id]) - @users = User.all.where(:user_name.ne=>"rulingcom") + @no_comment_save_btn = true + @users = User.where(:member_profile_id.in=>MemberProfile.where(:role_ids.in=>@setting.role_ids).pluck(:id)) + @project = nil + if params[:project_id] + @project = RulingTimerProject.find(params[:project_id]) + else + @project = @task.ruling_timer_project + end end def create_task - @task = RulingTimerTask.create(task_params) + @task = RulingTimerTask.new(task_params) + @task.creator = current_user + @task.update_user_id = current_user.id + @task.save redirect_to params[:referer_url] end def update_task @task = RulingTimerTask.find(params[:id]) + @task.update_user_id = current_user.id @task.update_attributes(task_params) + @task.save redirect_to params[:referer_url] end def delete_task @@ -109,7 +191,12 @@ class Admin::RulingTimersController < OrbitMemberController end end def view_task - @task = RulingTimerTask.find(params[:id]) + @task = nil + if params[:type] == "sub_task" + @task = RulingTimerSubTask.find(params[:id]).ruling_timer_task + else + @task = RulingTimerTask.find(params[:id]) + end end def delete_history if params[:confirm_delete] @@ -131,6 +218,38 @@ class Admin::RulingTimersController < OrbitMemberController end @history = RulingTimerHistory.new(:user_id=>params[:id]) end + def add_project + @project = RulingTimerProject.new(:project_manager=>current_user) + @categories = current_user.approved_categories.select{|c| c.module_app_id == @module_app.id} rescue [] + @users = User.where(:member_profile_id.in=>MemberProfile.where(:role_ids.in=>@setting.role_ids).pluck(:id)) + end + def edit_project + @project = RulingTimerProject.find(params[:id]) + @categories = current_user.approved_categories.select{|c| c.module_app_id == @module_app.id} rescue [] + @users = User.where(:member_profile_id.in=>MemberProfile.where(:role_ids.in=>@setting.role_ids).pluck(:id)) + end + def create_project + @project = RulingTimerProject.new(project_params.merge({:creator=>current_user})) + @project.save + redirect_to params[:referer_url] + end + def update_project + @project = RulingTimerProject.find(params[:id]) + @project.update_attributes(project_params) + redirect_to params[:referer_url] + end + def delete_project + if params[:confirm_delete] + RulingTimerProject.where(:id=>params[:id]).destroy + render :json => {:success=>true} + end + end + def view_project + @project = RulingTimerProject.find(params[:id]) + @tasks = @project.ruling_timer_tasks.desc(:created_at).page(params[:page]).per(10) + set_type_params + render "task_management" + end def create_history @history_params = history_params user = User.find(@history_params[:user_id]) @@ -149,6 +268,72 @@ class Admin::RulingTimersController < OrbitMemberController end redirect_to params[:referer_url] end + def section_management + @project = RulingTimerProject.find(params[:id]) + @sections = @project.ruling_timer_sections.page(params[:page]).per(10) + if request.xhr? + render :partial => "sections_content" + end + end + def add_section + @section = RulingTimerSection.new(:ruling_timer_project_id=>params[:id]) + render :layout => false + end + def edit_section + @section = RulingTimerSection.find(params[:id]) + render :layout => false + end + def update_section + @section = RulingTimerSection.find(params[:id]) + @section.update_attributes(section_params) + render :json => {:success => true} + end + def create_section + @section = RulingTimerSection.create(section_params) + render :json => {:success => true} + end + def delete_section + if params[:confirm_delete] + RulingTimerSection.where(:id=>params[:id]).destroy + render :json => {:success=>true} + end + end + def save_comment + if params["task_id"] + @comment = nil + @task = RulingTimerTask.find(params["task_id"]) + i = 0 + if params["id"] + @comment = RulingTimerComment.where(:id=>params["id"]).first + end + if @comment.nil? + @comment = RulingTimerComment.new(:ruling_timer_task_id=>params["task_id"]) + i = @task.ruling_timer_comments.count + else + i = @task.ruling_timer_comments.find_index{|c| c.id.to_s == params["id"]} + end + @comment.content = params["content"] + @comment.save + html = nil + f = RulingFormHelper.new + f.fields_for :task,@task do |f| + f.fields_for :ruling_timer_comments, @comment do |f| + html = render_to_string(:partial=>"form_comment", :object => @comment ,:locals=>{:f=>f,:i=>i}) + end + end + render :json => {:success=>true,:id=>@comment.id.to_s, :html => html} + end + end + def delete_comment + if params["id"] + RulingTimerComment.where(:id=>params["id"]).destroy + end + puts params + render :json => {:success=>true} + end + def section_params + section_params = params.require(:ruling_timer_section).permit! + end def history_params history_params = params.require(:ruling_timer_history).permit! date = history_params[:date] @@ -169,8 +354,11 @@ class Admin::RulingTimersController < OrbitMemberController end def task_params task_params = params.require(:ruling_timer_task).permit! - task_params[:user_ids] = [] if task_params[:user_ids].nil? - task_params + end + def project_params + project_params = params.require(:ruling_timer_project).permit! + project_params[:all_user_ids] = [] if project_params[:all_user_ids].nil? + project_params end def timer_params if params[:type] == "temp" @@ -183,6 +371,26 @@ class Admin::RulingTimersController < OrbitMemberController @weekdays = ["sunday","monday","tuesday","wednesday","thursday","friday","saturday"] @weekdays.map!{|d| I18n.t("ruling_timer.week_days.#{d}")} end + def settings + @roles = Role.all + end + def update_setting + @setting.update_attributes(setting_params) + redirect_to settings_admin_ruling_timers_path and return + end + def set_setting + @module_app = ModuleApp.where(:key=>@app_title).first + @setting = RulingTimerSetting.first + if @setting.nil? + @setting = RulingTimerSetting.create + end + end + def set_tags + @tags = @module_app.tags + end + def setting_params + params.require(:ruling_timer_setting).permit! + end class RulingPager attr_accessor :count,:page,:per def initialize(attrs) @@ -202,4 +410,8 @@ class Admin::RulingTimersController < OrbitMemberController (self.count / self.per).ceil end end + class RulingFormHelper + include ActionView::Helpers::FormHelper + include ActionView::Context + end end \ No newline at end of file diff --git a/app/controllers/ruling_timers_controller.rb b/app/controllers/ruling_timers_controller.rb index 3cffa4f..168e963 100644 --- a/app/controllers/ruling_timers_controller.rb +++ b/app/controllers/ruling_timers_controller.rb @@ -30,7 +30,7 @@ class RulingTimersController < ApplicationController def add_task begin @ruling_timer_temp.tasks << params[:task] - task = RulingTimerTask.create(:task_name=>params[:task],:user_ids=>[current_user.id.to_s]) + task = RulingTimerTask.create(:task_name=>params[:task],:user_ids=>[current_user.id.to_s],:creator=>current_user,:owner=>current_user,:update_user_id=>current_user.id) sub_task = task.ruling_timer_sub_tasks.first @ruling_timer_temp.sub_task_ids << sub_task.id.to_s @ruling_timer_temp.save! diff --git a/app/models/ruling_timer_comment.rb b/app/models/ruling_timer_comment.rb new file mode 100644 index 0000000..786149d --- /dev/null +++ b/app/models/ruling_timer_comment.rb @@ -0,0 +1,56 @@ +class RulingTimerComment + include Mongoid::Document + include Mongoid::Timestamps + field :content, type: String, default: "" + belongs_to :uploader, :class_name=>"User", :foreign_key => :uploader_id #上傳者 + belongs_to :ruling_timer_task + has_many :ruling_timer_notifies, :autosave => true, :dependent => :destroy + before_create do + self.uploader_id = self.ruling_timer_task.update_user_id rescue nil + end + after_save do + all_user_ids = self.ruling_timer_task.get_all_user_ids rescue [] + ruling_timer_temps = RulingTimerTemp.where(:user_id.in=>all_user_ids).to_a + ruling_timer_temps.each do |temp| + notify = self.ruling_timer_notifies.where(:user=>temp.user).first + if notify.nil? + notify = self.ruling_timer_notifies.new(:type=>0,:user=>temp.user) + end + notify.is_hidden = false + notify.ruling_timer_task = self.ruling_timer_task + notify.update_user_id = self.uploader_id + notify.content = self.content + notify.save + end + end + def convert_datetime(time) + if time.class == Time + return time.to_datetime + elsif time.class == DateTime + return time + elsif time.class == String + return DateTime.parse(time) + else + return Time.at(time).to_datetime #time is seconds + end + end + def display_updated_at + update_time = convert_datetime(self.updated_at) + time_now = DateTime.now + formate_date1 = I18n.t("ruling_timer.formate_date1") + formate_date2 = I18n.t("ruling_timer.formate_date2") + formate_date3 = I18n.t("ruling_timer.formate_date3") + formate_date4 = I18n.t("ruling_timer.formate_date4") + diff = time_now.to_time - update_time.to_time + diff_time = Time.at(diff) + if diff < 3600 + diff_time.strftime(formate_date4).gsub(/0+(\d)/){|f| $1} + elsif diff < 86400 + diff_time.strftime(formate_date3) + elsif time_now.year == update_time.year + update_time.strftime(formate_date2).gsub(/am|pm/){|p| I18n.t("ruling_timer.#{p}")} + else + update_time.strftime(formate_date1).gsub(/am|pm/){|p| I18n.t("ruling_timer.#{p}")} + end + end +end \ No newline at end of file diff --git a/app/models/ruling_timer_file.rb b/app/models/ruling_timer_file.rb new file mode 100644 index 0000000..9968624 --- /dev/null +++ b/app/models/ruling_timer_file.rb @@ -0,0 +1,60 @@ +class RulingTimerFile + include Mongoid::Document + include Mongoid::Timestamps + mount_uploader :file, AssetUploader + field :time_offset, type: String, default: "+8" + field :description, type: String, default: "" + belongs_to :uploader, :class_name=>"User", :foreign_key => :uploader_id #上傳者 + belongs_to :ruling_timer_task + has_many :ruling_timer_notifies, :autosave => true, :dependent => :destroy + before_create do + self.uploader_id = self.ruling_timer_task.update_user_id rescue nil + end + after_save do + if self[:file].present? + all_user_ids = self.ruling_timer_task.get_all_user_ids rescue [] + ruling_timer_temps = RulingTimerTemp.where(:user_id.in=>all_user_ids).to_a + ruling_timer_temps.each do |temp| + notify = self.ruling_timer_notifies.where(:user=>temp.user).first + if notify.nil? + notify = self.ruling_timer_notifies.new(:type=>1,:user=>temp.user) + end + notify.is_hidden = false + notify.ruling_timer_task = self.ruling_timer_task + notify.update_user_id = self.uploader_id + notify.content = "#{self[:file]}" + notify.save + end + end + end + def convert_datetime(time) + if time.class == Time + return time.to_datetime + elsif time.class == DateTime + return time + elsif time.class == String + return DateTime.parse(time) + else + return Time.at(time).to_datetime #time is seconds + end + end + def display_updated_at + update_time = convert_datetime(self.updated_at) + time_now = DateTime.now + formate_date1 = I18n.t("ruling_timer.formate_date1") + formate_date2 = I18n.t("ruling_timer.formate_date2") + formate_date3 = I18n.t("ruling_timer.formate_date3") + formate_date4 = I18n.t("ruling_timer.formate_date4") + diff = time_now.to_time - update_time.to_time + diff_time = Time.at(diff) + if diff < 3600 + diff_time.strftime(formate_date4).gsub(/0+(\d)/){|f| $1} + elsif diff < 86400 + diff_time.strftime(formate_date3) + elsif time_now.year == update_time.year + update_time.strftime(formate_date2).gsub(/am|pm/){|p| I18n.t("ruling_timer.#{p}")} + else + update_time.strftime(formate_date1).gsub(/am|pm/){|p| I18n.t("ruling_timer.#{p}")} + end + end +end \ No newline at end of file diff --git a/app/models/ruling_timer_notify.rb b/app/models/ruling_timer_notify.rb new file mode 100644 index 0000000..4a7d5f5 --- /dev/null +++ b/app/models/ruling_timer_notify.rb @@ -0,0 +1,49 @@ +class RulingTimerNotify + include Mongoid::Document + include Mongoid::Timestamps + field :time_offset, type: String, default: "+8" + field :content, type: String, default: "" #store comment 、 file name 、 section name + field :type, type: Integer, default: 0 # 0 => comments, 1 => file, 2 => section(列表) + field :data # store section change or other data + field :is_hidden, type: Boolean, default: false + belongs_to :update_user, :class_name=>"User", :foreign_key => :update_user_id #更新提醒的使用者 + belongs_to :user + belongs_to :ruling_timer_task + belongs_to :ruling_timer_comment + belongs_to :ruling_timer_file + before_create do + if self.update_user_id.nil? + self.update_user_id = self.ruling_timer_task.update_user_id rescue nil + end + end + def convert_datetime(time) + if time.class == Time + return time.to_datetime + elsif time.class == DateTime + return time + elsif time.class == String + return DateTime.parse(time) + else + return Time.at(time).to_datetime #time is seconds + end + end + def display_updated_at + update_time = convert_datetime(self.updated_at) + time_now = DateTime.now + formate_date1 = I18n.t("ruling_timer.formate_date1") + formate_date2 = I18n.t("ruling_timer.formate_date2") + formate_date3 = I18n.t("ruling_timer.formate_date3") + formate_date4 = I18n.t("ruling_timer.formate_date4") + diff = time_now.to_time - update_time.to_time + diff_time = Time.at(diff) + if diff < 3600 + diff_time.strftime(formate_date4).gsub(/0+(\d)/){|f| $1} + elsif diff < 86400 + diff_time.strftime(formate_date3) + elsif time_now.year == update_time.year + update_time.strftime(formate_date2).gsub(/am|pm/){|p| I18n.t("ruling_timer.#{p}")} + else + update_time.strftime(formate_date1).gsub(/am|pm/){|p| I18n.t("ruling_timer.#{p}")} + end + end +end \ No newline at end of file diff --git a/app/models/ruling_timer_project.rb b/app/models/ruling_timer_project.rb new file mode 100644 index 0000000..6579aeb --- /dev/null +++ b/app/models/ruling_timer_project.rb @@ -0,0 +1,84 @@ +class RulingTimerProject + include Mongoid::Document + include Mongoid::Timestamps + include OrbitTag::Taggable + include OrbitCategory::Categorizable + field :project_no, type: String, default: "" + field :project_name, type: String, default: "" + field :objectives, type: String, default: "" #專案⽬標 + field :status, type: Integer, default: 0 # 0 =>規劃中, 1 => 已啟動, 2 => 已結案 + has_many :ruling_timer_tasks, :autosave => true + field :is_finished, type: Boolean, default: false + field :time_offset, type: String, default: "+8" + field :privacy, type: Integer, default: 0 #私密等級 0 => 所有團隊成員Open, 1 => 專案成員Project, 2 => 優先, 3 => 任務成員 Task + field :priority, type: Integer, default: 0 #優先度 0 => 無, 1 => 普通, 2 => 優先, 3 => 緊急 + belongs_to :creator , :class_name=>"User", :foreign_key => :creator_id #建立者 + belongs_to :project_manager , :class_name=>"User", :foreign_key => :project_manager_id #專案經理 + field :all_user_ids, type: Array, default: [] #專案成員 + field :is_hidden, type: Boolean, default: true + field :is_private, type: Boolean, default: true + field :task_count, type: Integer, default: 0 + field :sort_number, type: Integer, default: 0 + has_many :ruling_timer_sections, :autosave => true, :dependent => :destroy #任務列表 + after_initialize do |record| + unless record.new_record? + save_flag = false + if record.category_id.nil? + record.category_id = RulingTimerSetting.first.personal_category_id + save_flag = true + end + if record.project_manager_id.nil? + record.project_manager_id = record.creator_id + save_flag = true + end + record.save if save_flag + end + end + before_create do |record| + time_now = record.created_at || DateTime.now.utc.new_offset(record.time_offset) + today_start = DateTime.parse("#{time_now.strftime("%Y/%m/%d")} 00:00:00#{record.time_offset}").utc + today_end = DateTime.parse("#{(time_now + 1.day).strftime("%Y/%m/%d")} 00:00:00#{record.time_offset}").utc + today_project_count = record.class.where(:created_at.gte=>today_start,:created_at.lt=>today_end).count + record.project_no = "P"+time_now.strftime("%Y%m%d") + ("0000" + (today_project_count + 1).to_s)[-4..-1] + end + before_save do |record| + end + def all_users + User.where(:id.in=>self.all_user_ids) + end + def convert_datetime(time) + if time.class == Time + return time.to_datetime + elsif time.class == DateTime + return time + elsif time.class == String + return DateTime.parse(time) + else + return Time.at(time).to_datetime #time is seconds + end + end + def create_time + convert_datetime(self.created_at.utc).new_offset(self.time_offset).strftime("%Y/%m/%d %H:%m") + end + def users + User.where(:id.in=>self.user_ids) + end + def get_project_name + self.is_private ? I18n.t("ruling_timer.private_tasks") : self.project_name + end + def get_status + I18n.t("ruling_timer.status_opts.#{self.status}") + end + after_save do |record| + # if record.user_ids_changed? + # delete_user_ids = record.user_ids_was.to_a - record.user_ids.to_a + # add_user_ids = record.user_ids.to_a - record.user_ids_was.to_a + # delete_user_ids.each do |user| + # self.ruling_timer_sub_tasks.where(:user=>user).destroy + # end + # add_user_ids.each do |user| + # self.ruling_timer_sub_tasks.create(:user=>user,:task_name=>task_name) + # end + # end + end +end \ No newline at end of file diff --git a/app/models/ruling_timer_section.rb b/app/models/ruling_timer_section.rb new file mode 100644 index 0000000..a50f0f3 --- /dev/null +++ b/app/models/ruling_timer_section.rb @@ -0,0 +1,11 @@ +class RulingTimerSection + include Mongoid::Document + include Mongoid::Timestamps + field :section_name, type: String, default: "" + belongs_to :ruling_timer_project + has_many :ruling_timer_task + field :task_count, type: Integer, default: 0 + after_destroy do |record| + RulingTimerTask.where(:ruling_timer_section_id=>record.id).update_all(:ruling_timer_section_id=>nil) + end +end \ No newline at end of file diff --git a/app/models/ruling_timer_setting.rb b/app/models/ruling_timer_setting.rb new file mode 100644 index 0000000..5f87882 --- /dev/null +++ b/app/models/ruling_timer_setting.rb @@ -0,0 +1,12 @@ +class RulingTimerSetting + include Mongoid::Document + include Mongoid::Timestamps + field :role_ids, type: Array, default: [] + field :personal_category_id + def roles + Role.where(:id.in=>self.role_ids) + end + def authorize?(user) + return ((user.member_profile.role_ids.map{|id| id.to_s} & self.role_ids).count != 0) + end +end \ No newline at end of file diff --git a/app/models/ruling_timer_task.rb b/app/models/ruling_timer_task.rb index 281043b..11bc36f 100644 --- a/app/models/ruling_timer_task.rb +++ b/app/models/ruling_timer_task.rb @@ -1,13 +1,160 @@ class RulingTimerTask include Mongoid::Document include Mongoid::Timestamps + include OrbitTag::Taggable + field :ticket_no, type: String, default: "" field :task_name, type: String, default: "" has_many :ruling_timer_sub_tasks, :autosave => true, :dependent => :destroy - field :user_ids, type: Array, default: [] + field :user_ids, type: Array, default: [] #負責⼈、協助人 field :is_finished, type: Boolean, default: false + field :time_offset, type: String, default: "+8" + field :privacy, type: Integer, default: 0 #私密等級 0 => 所有團隊成員Open, 1 => 專案成員Project, 2 => 優先, 3 => 任務成員 Task + field :priority, type: Integer, default: 0 #優先度 0 => 無, 1 => 普通, 2 => 優先, 3 => 緊急 + belongs_to :creator , :class_name=>"User", :foreign_key => :creator_id #建立者 + belongs_to :owner , :class_name=>"User", :foreign_key => :owner_id #負責⼈ + belongs_to :ruling_timer_project + field :helper_ids, type: Array, default: [] #協助人 + field :observer_ids, type: Array, default: [] #觀察者 + field :details, type: String, default: "" + field :progress, type: Integer, default: 0 #進度 0 ~ 100 + field :update_user_id + has_many :ruling_timer_files, :autosave => true, :dependent => :destroy + accepts_nested_attributes_for :ruling_timer_files, :allow_destroy => true + has_many :ruling_timer_comments, :autosave => true, :dependent => :destroy + accepts_nested_attributes_for :ruling_timer_comments, :allow_destroy => true + belongs_to :ruling_timer_section + has_many :ruling_timer_notifies, :autosave => true, :dependent => :destroy + after_initialize do + unless self.new_record? + save_flag = false + if self.owner.nil? && self.user_ids.present? + self.owner_id = self.user_ids.first + save_flag = true + end + if self.creator.nil? && self.user_ids.present? + self.creator_id = self.user_ids.first + save_flag = true + end + if self.ruling_timer_project_id.nil? + project = RulingTimerProject.where(:creator=>self.creator).first + if project.nil? + project = RulingTimerProject.create(:created_at=>self.created_at,:creator=>self.creator,:time_offset=>self.time_offset) + end + self.ruling_timer_project = project + save_flag = true + end + self.save if save_flag + end + end + before_create do |record| + time_now = record.created_at || DateTime.now.utc.new_offset(record.time_offset) + today_start = DateTime.parse("#{time_now.strftime("%Y/%m/%d")} 00:00:00#{record.time_offset}").utc + today_end = DateTime.parse("#{(time_now + 1.day).strftime("%Y/%m/%d")} 00:00:00#{record.time_offset}").utc + today_task_count = record.class.where(:created_at.gte=>today_start,:created_at.lt=>today_end).count + record.ticket_no = "T"+time_now.strftime("%Y%m%d") + ("0000" + (today_task_count + 1).to_s)[-4..-1] + end + before_save do |record| + unless @already_save + record.user_ids = [record.owner_id.to_s] + record.helper_ids + record.user_ids = record.user_ids.select{|id| id.present?} + if self.ruling_timer_project_id == "private_task" + time_now = DateTime.now.utc + project = RulingTimerProject.where(:creator=>self.creator).first + if project.nil? + project = RulingTimerProject.create(:created_at=>time_now,:creator=>self.creator,:time_offset=>self.time_offset) + end + self.ruling_timer_project = project + end + end + end + after_save do + if self.ruling_timer_project_id_change && !@already_save + if self.ruling_timer_project_id_change[0] + old_project = RulingTimerProject.find(self.ruling_timer_project_id_change[0]) rescue nil + if old_project + old_project.task_count -= 1 + @already_save = true + old_project.save(:validate=>false) + end + end + new_project = self.ruling_timer_project + new_project.task_count += 1 + new_project.all_user_ids += self.get_all_user_ids + new_project.all_user_ids.uniq + @already_save = true + new_project.save(:validate=>false) + end + if self.ruling_timer_section_id_change && !@already_save + need_create_notify = true + if self.ruling_timer_section_id_change[0] + if self.ruling_timer_notifies.where(:type=>2,:data=>self.ruling_timer_section_id_change.reverse,:updated_at.lte=>DateTime.now - 1.hour).destroy != 0 + need_create_notify = false + end + old_section = RulingTimerSection.find(self.ruling_timer_section_id_change[0]) rescue nil + if old_section + old_section.task_count -= 1 if old_section.task_count > 0 + @already_save = true + old_section.save(:validate=>false) + end + end + new_section = self.ruling_timer_section + new_section.task_count += 1 + @already_save = true + new_section.save(:validate=>false) + if need_create_notify + all_user_ids = self.get_all_user_ids rescue [] + ruling_timer_temps = RulingTimerTemp.where(:user_id.in=>all_user_ids).to_a + ruling_timer_temps.each do |temp| + notify = self.ruling_timer_notifies.new(:type=>2,:user=>temp.user,:data=>self.ruling_timer_section_id_change) + notify.is_hidden = false + notify.ruling_timer_task = self.ruling_timer_task + notify.update_user_id = self.uploader_id + notify.content = self.content + notify.save + end + end + end + end + after_destroy do + @already_save = true + if self.ruling_timer_project + project = self.ruling_timer_project + project.task_count -= 1 + project.save(:validate=>false) + end + end + def get_all_user_ids + all_user_ids = [] + all_user_ids << self.owner_id.to_s if self.owner_id.present? + all_user_ids += (self.helper_ids + self.observer_ids) + all_user_ids.uniq + end + def helpers + User.where(:id.in=>self.helper_ids) + end + def observers + User.where(:id.in=>self.observer_ids) + end + def convert_datetime(time) + if time.class == Time + return time.to_datetime + elsif time.class == DateTime + return time + elsif time.class == String + return DateTime.parse(time) + else + return Time.at(time).to_datetime #time is seconds + end + end + def create_time + convert_datetime(self.created_at.utc).new_offset(self.time_offset).strftime("%Y/%m/%d %H:%m") + end def users User.where(:id.in=>self.user_ids) end + def get_priority + I18n.t("ruling_timer.priority_opts.#{self.priority}") + end after_save do |record| if record.user_ids_changed? delete_user_ids = record.user_ids_was.to_a - record.user_ids.to_a diff --git a/app/models/ruling_timer_temp.rb b/app/models/ruling_timer_temp.rb index 15864e9..3e50ea7 100644 --- a/app/models/ruling_timer_temp.rb +++ b/app/models/ruling_timer_temp.rb @@ -148,13 +148,10 @@ class RulingTimerTemp def check_and_store unless self.new_record? time_now = DateTime.now.utc - if time_now.new_offset(self.time_offset).strftime('%Y/%m/%d') != self.get_last_work_time.strftime('%Y/%m/%d') - self.stop - self.store - end date_str = time_now.new_offset(self.time_offset).strftime("%Y/%m/%d %w") if self.date != date_str - self.save + self.stop + self.store end end end @@ -207,6 +204,9 @@ class RulingTimerTemp if self.work_times.count % 2 == 1 self.work_times.push(time_now) end + if self.rest_times.count % 2 == 1 + self.rest_times.push(time_now) + end self.status = "stop" self.calc("work_times",false) self.work_time_str = transform_second_to_time(self.all_work_times_seconds) @@ -268,6 +268,19 @@ class RulingTimerTemp def getPaddedComp(comp) return ((comp.to_i < 10) ? ('0' + comp.to_s) : comp.to_s) end + def self.getPaddedComp(comp) + return ((comp.to_i < 10) ? ('0' + comp.to_s) : comp.to_s) + end + def self.transform_second_to_time(seconds) + seconds = 0 if seconds.nil? + hour = 3600 + minute = 60 + total_hour = getPaddedComp(seconds / hour) + rest_seconds = seconds % hour + total_minute = getPaddedComp(rest_seconds / minute) + total_second = getPaddedComp(rest_seconds % minute) + return (total_hour + ":" + total_minute + ":" + total_second) + end def transform_second_to_time(seconds) seconds = 0 if seconds.nil? hour = 3600 diff --git a/app/views/admin/ruling_timers/_form_comment.html.erb b/app/views/admin/ruling_timers/_form_comment.html.erb new file mode 100644 index 0000000..0161894 --- /dev/null +++ b/app/views/admin/ruling_timers/_form_comment.html.erb @@ -0,0 +1,42 @@ +
> +<% unless form_comment.new_record? %> +
+ <%= form_comment.uploader.name rescue "" %> + <%= form_comment.display_updated_at rescue "" %> +

<%= form_comment.content %>

+ <%= f.text_area :content, :class => "hide content_textarea", :placeholder => t("ruling_timer.comments"), :title => t("ruling_timer.comments") %> +
+<% end %> +
+ <% if form_comment.new_record? %> +
+ <%= @current_user.name rescue "" %> + <%= f.text_area :content, :class => "content_textarea", :placeholder => t("ruling_timer.comments"), :title => t("ruling_timer.comments") %> +
+ <% end %> + <% if form_comment.new_record? %> + + + + <% else %> + <% if @current_user.id == form_comment.uploader.id %> + + <% unless @no_comment_save_btn %> + "> + + + <% end %> + + <%= f.hidden_field :id %> + + <%= f.hidden_field :_destroy, :value => nil, :class => 'should_destroy' %> + + <% end %> + <% end %> + <% unless @no_comment_save_btn %> + "> + + + <% end %> +
+
\ No newline at end of file diff --git a/app/views/admin/ruling_timers/_form_file.html.erb b/app/views/admin/ruling_timers/_form_file.html.erb new file mode 100644 index 0000000..5b7d1ce --- /dev/null +++ b/app/views/admin/ruling_timers/_form_file.html.erb @@ -0,0 +1,43 @@ +<% if form_file.new_record? %> +
+<% else %> +
+ <% if form_file.file.blank? %> + <%= t(:no_file) %> + <% else %> + + <%= link_to content_tag(:i) + form_file.file_identifier, form_file.file.url, {:class => 'file-link file-type', :target => '_blank', :title => form_file.file_identifier} %> +
+ <%= form_file.display_updated_at %> (<%= form_file.uploader.name %>) +
+ <% end %> +<% end %> +
+ + + + <%= f.text_field :description, :class => "input-medium", placeholder: t(:description) %> + + + <% if form_file.new_record? %> + + + + <% else %> + + <%= f.hidden_field :id %> + + <%= f.hidden_field :_destroy, :value => nil, :class => 'should_destroy' %> + + <% end %> +
+
\ No newline at end of file diff --git a/app/views/admin/ruling_timers/_form_opts.html.erb b/app/views/admin/ruling_timers/_form_opts.html.erb new file mode 100644 index 0000000..64556cf --- /dev/null +++ b/app/views/admin/ruling_timers/_form_opts.html.erb @@ -0,0 +1,16 @@ + +<% base_name = defined?(base_name) ? base_name + "." : "" %> +
+ +
+ <% trans = t("#{base_name}#{field_name}_opts") %> + <% trans.each do |k,v| %> + + <% end %> +
+
\ No newline at end of file diff --git a/app/views/admin/ruling_timers/_index_statistic.html.erb b/app/views/admin/ruling_timers/_index_statistic.html.erb new file mode 100644 index 0000000..261e21a --- /dev/null +++ b/app/views/admin/ruling_timers/_index_statistic.html.erb @@ -0,0 +1,46 @@ +
+
+ <%= fields_for "date_pick" do |f| %> + <%= f.datetime_picker :start_year_month, {:picker_type=>"date",:format=>"yyyy/MM",:label=>t("ruling_timer.start_year_month"), :value => @start_year_month} %><%= f.datetime_picker :end_year_month, {:picker_type=>"date",:format=>"yyyy/MM",:label=>t("ruling_timer.end_year_month"), :value => @end_year_month} %> + <%= f.hidden_field_tag :type, "statistic" %> + <%= f.submit t('submit'), class: 'btn btn-primary' %> + <% end %> + +
+
+ +
+ <% all_count = @all_year_months_data.count %> + <% @all_year_months_data.each_with_index do |(year_month,total_seconds,all_infos), i| %> +

<%= year_month %>

+
<%= t("ruling_timer.total") %>: <%= RulingTimerTemp.transform_second_to_time(total_seconds) %>
+
+ + + + + + + <% all_infos.each do |info| %> + + + + + <% end %> + +
<%= t("ruling_timer.date") %><%= t("ruling_timer.work_time") %>
<%= info[:date] %><%= info[:work_time_str] %>
+
+ <% if i < all_count - 1 %> +
+ <% end %> + <% end %> +
\ No newline at end of file diff --git a/app/views/admin/ruling_timers/_index_table.html.erb b/app/views/admin/ruling_timers/_index_table.html.erb new file mode 100644 index 0000000..b08af12 --- /dev/null +++ b/app/views/admin/ruling_timers/_index_table.html.erb @@ -0,0 +1,78 @@ + + + + + + + + + + + <% if @ruling_timer_temp %> + <%= render :partial => "timer_work_row", :locals=>{:timer=>@ruling_timer_temp} %> + <% end %> + <% @ruling_timer_history.each do |timer_history| %> + <%= render :partial => "timer_work_row", :locals=>{:timer=>timer_history} %> + <% end %> + +
<%=t("ruling_timer.date")%><%=t("ruling_timer.summary")%><%=t("ruling_timer.work_time")%><%=t("action")%>
+<%= + content_tag :div, class: "bottomnav clearfix" do + content_tag(:div, paginate(@ruling_pager), class: "pagination pagination-centered") + + link_to(t("ruling_timer.add_history"),add_history_admin_ruling_timer_path(:id=>(params[:id].nil? ? "current_user" : params[:id])),:class=>"btn btn-primary pull-right") + end +%> + \ No newline at end of file diff --git a/app/views/admin/ruling_timers/_project_form.html.erb b/app/views/admin/ruling_timers/_project_form.html.erb new file mode 100644 index 0000000..fdba222 --- /dev/null +++ b/app/views/admin/ruling_timers/_project_form.html.erb @@ -0,0 +1,155 @@ +<% content_for :page_specific_css do %> + <%= stylesheet_link_tag "lib/main-forms" %> + <%= stylesheet_link_tag "lib/fileupload" %> + <%= stylesheet_link_tag "lib/main-list" %> + <%= stylesheet_link_tag "select2/select2" %> +<% end %> +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "select2/select2.min" %> +<% end %> + +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "lib/bootstrap-fileupload" %> + <%= javascript_include_tag "lib/bootstrap-datetimepicker" %> + <%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %> + <%= javascript_include_tag "lib/file-type" %> + <%= javascript_include_tag "lib/module-area" %> + <%= javascript_include_tag "form" %> +<% end %> +
+ +
+ <%= f.text_field :project_name, :required => "required" %> +
+
+
+ + +
+ <%= select_category(f, @module_app) %> +
+
+
+
+ + + <%= select_tags(f, @module_app) %> + +
+
+ +
+ <%= f.text_area :objectives %> +
+
+<%= render :partial => "form_opts", :locals => {:base_name=>"ruling_timer",:field_name=>"status",:f=>f} %> +<%= render :partial => "form_opts", :locals => {:base_name=>"ruling_timer",:field_name=>"privacy",:f=>f} %> +
+ +
+
+ <%= @selected_project_managers.join("\n").html_safe %> +
+
+ +
+
+
+ +
+
+ <%= @selected_all_users.join("\n").html_safe %> +
+
+ +
+
+ +
+ <%= f.hidden_field :is_hidden, :value => "0" %> + <%= f.hidden_field :is_private, :value => "0" %> + <%= f.hidden_field :time_offset, :id=>"task_timeoffset" %> + <% referer = request.referer rescue nil %> + <% referer = get_referer_url if referer.blank? || request.host != URI.parse(URI.encode(referer)).host %> + <%= f.submit t('submit'), class: 'btn btn-primary' %> + + <%= link_to t('cancel'), referer, :class=>"btn" %> +
+ \ No newline at end of file diff --git a/app/views/admin/ruling_timers/_role_card.html.erb b/app/views/admin/ruling_timers/_role_card.html.erb new file mode 100644 index 0000000..bd78d5c --- /dev/null +++ b/app/views/admin/ruling_timers/_role_card.html.erb @@ -0,0 +1,7 @@ +<% checked = false if defined?(checked).nil? %> +
  • + + <%= check_box_tag "#{@role_params_name}", (role.id rescue nil) , (checked ? true : false) , :id => "role_ids_#{(role.id rescue '')}"%> +
  • \ No newline at end of file diff --git a/app/views/admin/ruling_timers/_role_select_modal.html.erb b/app/views/admin/ruling_timers/_role_select_modal.html.erb new file mode 100644 index 0000000..8792c08 --- /dev/null +++ b/app/views/admin/ruling_timers/_role_select_modal.html.erb @@ -0,0 +1,61 @@ +<%= stylesheet_link_tag "member_select" %> +<%= stylesheet_link_tag "lib/checkbox-card" %> + + + \ No newline at end of file diff --git a/app/views/admin/ruling_timers/_section_form.html.erb b/app/views/admin/ruling_timers/_section_form.html.erb new file mode 100644 index 0000000..381aa87 --- /dev/null +++ b/app/views/admin/ruling_timers/_section_form.html.erb @@ -0,0 +1,18 @@ +<% content_for :page_specific_css do %> + <%= stylesheet_link_tag "lib/main-forms" %> +<% end %> +
    + +
    + <%= f.text_field :section_name, :required => "required" %> +
    +
    + +
    + <%= f.hidden_field :ruling_timer_project_id %> + <% if request.xhr? %> + <%= link_to t('submit'), "#", class: 'btn btn-primary modal_link', "data-target" => "#section-form", style: "color: #fff;" %> + <% else %> + <%= f.submit t('submit'), class: 'btn btn-primary modal-link', "data-target" => "#section-form" %> + <% end %> +
    \ No newline at end of file diff --git a/app/views/admin/ruling_timers/_sections_content.html.erb b/app/views/admin/ruling_timers/_sections_content.html.erb new file mode 100644 index 0000000..1b73a38 --- /dev/null +++ b/app/views/admin/ruling_timers/_sections_content.html.erb @@ -0,0 +1,10 @@ +<% @sections.each_with_index do |section,i| %> + + <%=section.section_name%> + <%=section.task_count %> + + <%=t("ruling_timer.edit_section")%> + <%=t("ruling_timer.delete_section")%> + + +<% end %> \ No newline at end of file diff --git a/app/views/admin/ruling_timers/_task_form.html.erb b/app/views/admin/ruling_timers/_task_form.html.erb index 8414b61..55c09d0 100644 --- a/app/views/admin/ruling_timers/_task_form.html.erb +++ b/app/views/admin/ruling_timers/_task_form.html.erb @@ -1,21 +1,190 @@ +<% @current_user = current_user %> +<% content_for :page_specific_css do %> + <%= stylesheet_link_tag "lib/main-forms" %> + <%= stylesheet_link_tag "lib/fileupload" %> + <%= stylesheet_link_tag "lib/main-list" %> + <%= stylesheet_link_tag "select2/select2" %> +<% end %> +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "select2/select2.min" %> +<% end %> + +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "lib/bootstrap-fileupload" %> + <%= javascript_include_tag "lib/bootstrap-datetimepicker" %> + <%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %> + <%= javascript_include_tag "lib/file-type" %> + <%= javascript_include_tag "lib/module-area" %> + <%= javascript_include_tag "form" %> +<% end %>
    - +
    - <%= f.text_field :task_name %> + <%= f.text_field :task_name, :required => "required" %>
    - +
    -
    - <%= @selected_users.join("\n").html_safe %> + <% if params[:project_id] %> + <%= @project.get_project_name %> + <% else %> + <%= f.select :ruling_timer_project_id, options_for_select(@projects.collect{|pj| [pj.get_project_name,(pj.new_record? ? "private_task" : pj.id.to_s)]},f.object.ruling_timer_project_id.to_s), {}, {:id=>"ruling_timer_project_id",:class=>"select2_selection_box"} %> + <% end %> +
    +
    +
    + +
    + <%= f.select :ruling_timer_section_id, options_for_select(@project.ruling_timer_sections.collect{|section| [section.section_name,section.id.to_s]},f.object.ruling_timer_section_id.to_s), {:include_blank => true}, {:id=>"ruling_timer_section_id",:class=>"select2_selection_box"} %> +
    +
    +
    + + + <%= select_tags(f, @module_app) %> + +
    +<%= render :partial => "form_opts", :locals => {:base_name=>"ruling_timer",:field_name=>"privacy",:f=>f} %> +<%= render :partial => "form_opts", :locals => {:base_name=>"ruling_timer",:field_name=>"priority",:f=>f} %> +
    + +
    +
    + <%= @selected_owners.join("\n").html_safe %>
    - + +
    +
    +
    + +
    +
    + <%= @selected_helpers.join("\n").html_safe %> +
    +
    + +
    +
    +
    + +
    +
    + <%= @selected_observers.join("\n").html_safe %> +
    +
    + +
    +
    +
    + +
    + <%=f.object.progress%>% +
    +
    +
    + +
    + <%= f.text_area :details, :class=>"ckeditor" %> +
    +
    + +
    + +
    +

    + <%= hidden_field_tag 'ruling_timer_comment_field_count', f.object.ruling_timer_comments.count %> + <%= t(:add) %> +

    + +
    +
    + + <% if f.object && !f.object.ruling_timer_comments.blank? %> +
    + <% f.object.ruling_timer_comments.desc(:created_at).each_with_index do |ruling_timer_comment, i| %> + <%= f.fields_for :ruling_timer_comments, ruling_timer_comment do |f| %> + <%= render :partial => 'form_comment', :object => ruling_timer_comment, :locals => {:f => f, :i => i} %> + <% end %> + <% end %> +
    +
    + <% end %> +
    +
    + +
    + +
    + + <% if f.object && !f.object.ruling_timer_files.blank? %> +
    + <% f.object.ruling_timer_files.each_with_index do |ruling_timer_file, i| %> + <%= f.fields_for :ruling_timer_files, ruling_timer_file do |f| %> + <%= render :partial => 'form_file', :object => ruling_timer_file, :locals => {:f => f, :i => i} %> + <% end %> + <% end %> +
    +
    + <% end %> + + +
    +
    +

    + <%= hidden_field_tag 'ruling_timer_file_field_count', f.object.ruling_timer_files.count %> + <%= t(:add) %> +

    +
    + <%= f.hidden_field :time_offset, :id=>"task_timeoffset" %> <% referer = request.referer rescue nil %> <% referer = get_referer_url if referer.blank? || request.host != URI.parse(URI.encode(referer)).host %> <%= f.submit t('submit'), class: 'btn btn-primary' %> @@ -23,9 +192,119 @@ <%= link_to t('cancel'), referer, :class=>"btn" %>
    \ No newline at end of file diff --git a/app/views/admin/ruling_timers/_task_table.html.erb b/app/views/admin/ruling_timers/_task_table.html.erb new file mode 100644 index 0000000..e34bc73 --- /dev/null +++ b/app/views/admin/ruling_timers/_task_table.html.erb @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + <% tasks.each_with_index do |task,i| %> + + + + + + + + + + + + <% end %> + +
    <%= t("ruling_timer.ticket_no") %><%= t("ruling_timer.priority") %><%= t("ruling_timer.project") %><%= t("ruling_timer.task_name") %><%= t(:tags) %><%= t("ruling_timer.owner") %><%= t("ruling_timer.progress") %><%= t("ruling_timer.task_status") %><%=t("action")%>
    <%=task.ticket_no%><%=task.get_priority%><%= task.ruling_timer_project.get_project_name rescue "" %><%=task.task_name%><%=task.owner.name rescue "" %><%=task.progress%>% + <% if task.user_ids %> + <% user_ids = task.user_ids + user_bson_ids = user_ids.map{|id| BSON::ObjectId(id)} + %> + <% users = User.find(user_ids).index_by(&:id).slice(*user_bson_ids).values %> + <% users.each do |user| %> + <% sub_task = task.ruling_timer_sub_tasks.where(:user=>user).first %> + <% next if sub_task.nil? %> + <% klass = (sub_task.status == 'working' ? 'fa-play' : (sub_task.status == 'finish' ? 'fa-flag-checkered' : 'fa-pause') rescue 'fa-pause') %> + <%=user.name%>( <%=sub_task.get_infos["work"] rescue "00:00:00" %> ) +
    + <% end %> + <% end %> +
    + <%=t("view")%> + <%=t("edit")%> + <%=t("ruling_timer.delete_task")%> +
    \ No newline at end of file diff --git a/app/views/admin/ruling_timers/_user_select_modal.html.erb b/app/views/admin/ruling_timers/_user_select_modal.html.erb index 6fbab17..d974a5a 100644 --- a/app/views/admin/ruling_timers/_user_select_modal.html.erb +++ b/app/views/admin/ruling_timers/_user_select_modal.html.erb @@ -8,7 +8,7 @@ height: 40px; } -