From 5a5f0585fb2415688dbaafb17adf09aab29aa79e Mon Sep 17 00:00:00 2001 From: Torsten Date: Sat, 3 Jun 2023 18:09:23 +0300 Subject: [PATCH] timeline wotking, renmed left column --- app/controllers/members_controller.rb | 2 +- app/controllers/timeline_controller.rb | 6 ++ app/helpers/members_helper.rb | 8 +-- app/helpers/timeline_helper.rb | 64 ++++++++++++++++++++ app/models/member.rb | 2 +- app/views/layouts/_mobile_menu.haml | 2 +- app/views/members/edit.html.haml | 4 +- app/views/members/timeline.haml | 9 --- app/views/pictures/_picture.haml | 2 +- app/views/timeline/index.haml | 20 ++++++ config/initializers/kaminari_config.rb | 2 +- config/routes.rb | 8 +-- db/migrate/20230603150133_fix_column_name.rb | 6 ++ db/schema.rb | 6 +- 14 files changed, 113 insertions(+), 28 deletions(-) create mode 100644 app/controllers/timeline_controller.rb create mode 100644 app/helpers/timeline_helper.rb delete mode 100644 app/views/members/timeline.haml create mode 100644 app/views/timeline/index.haml create mode 100644 db/migrate/20230603150133_fix_column_name.rb diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index e7f7f7e..65d5995 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -53,6 +53,6 @@ class MembersController < ApplicationController # Only allow a list of trusted parameters through. def member_params params.require(:member).permit(:name, :public, :bio , :picture, - :picture_cache , :arrived ,:left) + :picture_cache , :arriving ,:leaving) end end diff --git a/app/controllers/timeline_controller.rb b/app/controllers/timeline_controller.rb new file mode 100644 index 0000000..ce09ae3 --- /dev/null +++ b/app/controllers/timeline_controller.rb @@ -0,0 +1,6 @@ +class TimelineController < ApplicationController + + def index + @members = Member.visible_scope.where("leaving > ? " , Date.today).order(:arriving).page(1) + end +end diff --git a/app/helpers/members_helper.rb b/app/helpers/members_helper.rb index 54b1b31..2610e4b 100644 --- a/app/helpers/members_helper.rb +++ b/app/helpers/members_helper.rb @@ -18,9 +18,9 @@ module MembersHelper end end def stayed(member) - return "Not arrived" if member.arrived.blank? - text = member.arrived.to_s - return text + " not left" if member.left.blank? - text + " " + distance_of_time_in_words( member.left , member.arrived) + return "Not arrived" if member.arriving.blank? + text = member.arriving.to_s + return text + " not left" if member.leaving.blank? + text + " " + distance_of_time_in_words( member.leaving , member.arriving) end end diff --git a/app/helpers/timeline_helper.rb b/app/helpers/timeline_helper.rb new file mode 100644 index 0000000..b302386 --- /dev/null +++ b/app/helpers/timeline_helper.rb @@ -0,0 +1,64 @@ +module TimelineHelper + + def month_pixels + 300 + end + def day_pixels + month_pixels / 30 + end + def max_pixels + (month_pixels * 3 ) / day_pixels + end + def started_days(member) + return 0 unless member.arriving + return 0 if member.arriving < Date.today.at_beginning_of_month + distance = (member.arriving - Date.today.at_beginning_of_month).to_i + distance > max_pixels ? max_pixels : distance + end + def left_max + Date.today.at_beginning_of_month + 3.months + end + def stay_days(member) + return 0 unless member.leaving + start = member.arriving + start = Date.today.at_beginning_of_month if member.arriving < Date.today.at_beginning_of_month + distance = ( member.leaving - member.arriving ).to_i + distance > max_pixels ? max_pixels : distance + end + def weekly + data = {} + week = 0 + while( week < 13 ) do + data[ week ] = 0 + start_week = Date.today.at_beginning_of_month + week.weeks + end_week = Date.today.at_beginning_of_month + (week + 1).weeks + @members.each do |mem| + next unless mem.arriving + next unless mem.leaving + next if mem.arriving > start_week + next if mem.leaving < end_week + data[ week ] += 1 + end + week += 1 + end + puts data + data + end + def bg_for(week) + case week % 5 + when 0 + "bg-cyan-50" + when 1 + "bg-cyan-100" + when 2 + "bg-cyan-200" + when 3 + "bg-cyan-300" + when 4 + "bg-cyan-400" + end + end + def small_date(date) + date.strftime("%-d.%-m") + end +end diff --git a/app/models/member.rb b/app/models/member.rb index f37b14e..6df8ade 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -5,7 +5,7 @@ class Member < ApplicationRecord end def self.visible_scope - where.not(confirmed_at: nil).where.not(arrived: nil) + where.not(confirmed_at: nil).where.not(arriving: nil) end # Include default devise modules. Others available are: diff --git a/app/views/layouts/_mobile_menu.haml b/app/views/layouts/_mobile_menu.haml index d16ff01..1fe32ce 100644 --- a/app/views/layouts/_mobile_menu.haml +++ b/app/views/layouts/_mobile_menu.haml @@ -1,4 +1,4 @@ -#mobile-menu.absolute.top-0.left-0.w-full.hidden.z-10 +#mobile-menu.absolute.top-0.leaving-0.w-full.hidden.z-10 .p-5.bg-white.border.rounded.shadow-sm .flex.items-center.justify-between.mb-4 %div diff --git a/app/views/members/edit.html.haml b/app/views/members/edit.html.haml index 57da565..5fa6511 100644 --- a/app/views/members/edit.html.haml +++ b/app/views/members/edit.html.haml @@ -15,8 +15,8 @@ .text-red-700= f.error_notification = f.input :name .grid.grid-cols-2.gap-10 - = f.input :arrived - = f.input :left + = f.input :arriving + = f.input :leaving .flex.h-16.mt-2.col-span-2 = image_tag(@member.picture_url , class: "align-middle mr-4") if @member.picture? .w-full= f.input :picture , as: :file , diff --git a/app/views/members/timeline.haml b/app/views/members/timeline.haml deleted file mode 100644 index a67a8a3..0000000 --- a/app/views/members/timeline.haml +++ /dev/null @@ -1,9 +0,0 @@ -= paginate @members - -.flex.flex-col.mx-10 - - @members.each_with_index do |member , index| - .flex - .w-60= member.name - .mx-1= index + 1 - .mx-1= distance_of_time_in_words_to_now member.arrived - .name= member.left - member.arrived diff --git a/app/views/pictures/_picture.haml b/app/views/pictures/_picture.haml index 70f240d..e945b5f 100644 --- a/app/views/pictures/_picture.haml +++ b/app/views/pictures/_picture.haml @@ -9,5 +9,5 @@ "data-glightbox" => "title: #{picture.text}" } do = picture_for( picture , "absolute top-0 left-0 w-full h-full inset-0 object-cover hover:scale-105 ease-in duration-500") -unless picture.text.blank? - .absolute.bottom-0.left-0.right-0.px-4.pb-1.bg-gray-800.opacity-70.transition-colors.group-hover:bg-black.group-hover:opacity-100 + .absolute.bottom-0.leaving-0.right-0.px-4.pb-1.bg-gray-800.opacity-70.transition-colors.group-hover:bg-black.group-hover:opacity-100 .text-center.mt-2.text-white= picture.text diff --git a/app/views/timeline/index.haml b/app/views/timeline/index.haml new file mode 100644 index 0000000..6aaca05 --- /dev/null +++ b/app/views/timeline/index.haml @@ -0,0 +1,20 @@ += paginate @members +.flex.flex-col.mx-10 + .flex + .w-60 Weekly + - (0..12).each do |week| + %div{class: bg_for(week) , style: "width: #{7*day_pixels}px;"} + = (Date.today.at_beginning_of_month + week.weeks).day.to_s + "." + = (Date.today.at_beginning_of_month + week.weeks).month + .flex + .w-60 Weekly + - weekly.each do |week , amount| + %div{class: bg_for(week) , style: "width: #{7*day_pixels}px;"}= amount + - @members.each_with_index do |member , index| + .flex + .w-60= member.name + .bg-white{style: "width: #{day_pixels*started_days(member)}px;"} + .flex.inline.justify-between.bg-yellow-100{style: "width: #{day_pixels*stay_days(member)}px;"} + %div= small_date(member.arriving) + %div= small_date(member.leaving) + .name diff --git a/config/initializers/kaminari_config.rb b/config/initializers/kaminari_config.rb index 4ba6ee3..d3fbc29 100644 --- a/config/initializers/kaminari_config.rb +++ b/config/initializers/kaminari_config.rb @@ -5,7 +5,7 @@ Kaminari.configure do |config| # config.max_per_page = nil # config.window = 4 # config.outer_window = 0 - # config.left = 0 + # config.leaving = 0 # config.right = 0 # config.page_method_name = :page # config.param_name = :page diff --git a/config/routes.rb b/config/routes.rb index 71dba35..cee5a7d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,11 +7,9 @@ Rails.application.routes.draw do get "/members/edit_email" , to: "registrations#edit_email" end - resources :members do - collection do - get :timeline - end - end + get "timeline" , to: "timeline#index" + + resources :members mount Thredded::Engine => '/forum' diff --git a/db/migrate/20230603150133_fix_column_name.rb b/db/migrate/20230603150133_fix_column_name.rb new file mode 100644 index 0000000..a2afbe0 --- /dev/null +++ b/db/migrate/20230603150133_fix_column_name.rb @@ -0,0 +1,6 @@ +class FixColumnName < ActiveRecord::Migration[7.0] + def change + rename_column :members, :left, :leaving + rename_column :members, :arrived, :arriving + end +end diff --git a/db/schema.rb b/db/schema.rb index 3265ca5..1f3c54a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_01_25_172223) do +ActiveRecord::Schema[7.0].define(version: 2023_06_03_150133) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -42,8 +42,8 @@ ActiveRecord::Schema[7.0].define(version: 2023_01_25_172223) do t.datetime "confirmed_at" t.datetime "confirmation_sent_at" t.string "unconfirmed_email" - t.date "arrived" - t.date "left" + t.date "arriving" + t.date "leaving" t.index ["email"], name: "index_members_on_email", unique: true t.index ["reset_password_token"], name: "index_members_on_reset_password_token", unique: true end