From afc6d12b49d92834ba6310321ab4d7442c238c08 Mon Sep 17 00:00:00 2001 From: Urban Rotnik Date: Wed, 25 Nov 2020 09:50:34 +0100 Subject: [PATCH 1/4] Project and folders sorting --- app/controllers/projects_controller.rb | 5 +--- app/services/projects_overview_service.rb | 28 +++++++++++++++++++ .../projects/index/_team_projects.html.erb | 14 +++++----- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index a7f451fac..8efebe552 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -40,10 +40,7 @@ class ProjectsController < ApplicationController render json: { html: render_to_string( partial: 'projects/index/team_projects.html.erb', - locals: { - projects: overview_service.project_cards, - project_folders: overview_service.project_folder_cards - } + locals: { cards: overview_service.project_and_folder_cards } ) } end diff --git a/app/services/projects_overview_service.rb b/app/services/projects_overview_service.rb index 8834c0a1e..badb5b376 100644 --- a/app/services/projects_overview_service.rb +++ b/app/services/projects_overview_service.rb @@ -41,6 +41,12 @@ class ProjectsOverviewService sort_records(filter_project_records(project_records)).group_by(&:project_folder) end + def project_and_folder_cards + cards = filter_project_records(fetch_project_records) + filter_project_folder_records(fetch_project_folder_records) + + mixed_sort_records(cards) + end + def projects_datatable table_state = @view_state.state.dig('projects', 'table') per_page = if @params[:length] && @params[:length] != '-1' @@ -149,6 +155,28 @@ class ProjectsOverviewService end end + def mixed_sort_records(records) + cards_state = @view_state.state.dig('projects', 'cards') + if @params[:sort] && cards_state['sort'] != @params[:sort] && %w(new old atoz ztoa).include?(@params[:sort]) + cards_state['sort'] = @params[:sort] + @view_state.state['projects']['cards'] = cards_state + end + @view_state.save! if @view_state.changed? + + case cards_state['sort'] + when 'new' + records.sort_by(&:created_at).reverse! + when 'old' + records.sort_by(&:created_at) + when 'atoz' + records.sort_by { |c| c.name.downcase } + when 'ztoa' + records.sort_by { |c| c.name.downcase }.reverse! + else + records + end + end + def fetch_dt_records projects = @team.projects.joins( 'LEFT OUTER JOIN user_projects ON user_projects.project_id = projects.id' diff --git a/app/views/projects/index/_team_projects.html.erb b/app/views/projects/index/_team_projects.html.erb index f17699ced..450d717cb 100644 --- a/app/views/projects/index/_team_projects.html.erb +++ b/app/views/projects/index/_team_projects.html.erb @@ -1,9 +1,9 @@ -<% projects.each do |project| %> - <% cache [current_user, project] do %> - <%= render partial: 'projects/index/project_card', locals: { project: project } %> +<% cards.each do |card| %> + <% cache [current_user, card] do %> + <% if card.is_a? Project %> + <%= render partial: 'projects/index/project_card', locals: { project: card } %> + <% else %> + <%= render partial: 'projects/index/folder_card', locals: { folder: card } %> + <% end %> <% end %> <% end %> - -<% project_folders.each do |folder| %> - <%= render partial: 'projects/index/folder_card', locals: { folder: folder } %> -<% end %> From 5717e37f2b77a69864cf75b7b5b661f59d882587 Mon Sep 17 00:00:00 2001 From: Urban Rotnik Date: Wed, 25 Nov 2020 11:45:45 +0100 Subject: [PATCH 2/4] Remove obsolete code, fix tests --- app/controllers/projects_controller.rb | 10 - app/services/projects_overview_service.rb | 42 --- spec/controllers/projects_controller_spec.rb | 16 +- .../projects_overview_service_spec.rb | 265 +----------------- 4 files changed, 2 insertions(+), 331 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 8efebe552..951bb5aad 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -46,16 +46,6 @@ class ProjectsController < ApplicationController end end - def index_dt - @draw = params[:draw].to_i - respond_to do |format| - format.json do - team = current_team || current_user.teams.first - @projects = ProjectsOverviewService.new(team, current_user, params).projects_datatable - end - end - end - def sidebar current_task ||= current_task || nil current_experiment ||= current_experiment || current_task&.experiment || nil diff --git a/app/services/projects_overview_service.rb b/app/services/projects_overview_service.rb index badb5b376..02cc358da 100644 --- a/app/services/projects_overview_service.rb +++ b/app/services/projects_overview_service.rb @@ -47,29 +47,6 @@ class ProjectsOverviewService mixed_sort_records(cards) end - def projects_datatable - table_state = @view_state.state.dig('projects', 'table') - per_page = if @params[:length] && @params[:length] != '-1' - @params[:length].to_i - else - 10 - end - if table_state['length'] != per_page - table_state['length'] = per_page - table_state['time'] = Time.now.to_i - @view_state.state['projects']['table'] = table_state - @view_state.save! - end - page = @params[:start] ? (@params[:start].to_i / per_page) + 1 : 1 - records = fetch_dt_records - records = records.where(archived: true) if @params[:filter] == 'archived' - records = records.where(archived: false) if @params[:filter] == 'active' - search_value = @params.dig(:search, :value) - records = search(records, search_value) if search_value.present? - records = sort(records).page(page).per(per_page) - records - end - private def fetch_project_records @@ -221,23 +198,4 @@ class ProjectsOverviewService '7' => 'task_count' } end - - def sort(records) - order_state = @view_state.state['projects']['table']['order'][0] - order = @params[:order]&.values&.first - if order - dir = order[:dir] == 'desc' ? 'DESC' : 'ASC' - column_index = order[:column] - else - dir = 'ASC' - column_index = '1' - end - if order_state != [column_index.to_i, dir.downcase] - @view_state.state['projects']['table']['order'][0] = - [column_index.to_i, dir.downcase] - end - sort_column = sortable_columns[column_index] - sort_column ||= sortable_columns['1'] - records.order("#{sort_column} #{dir}") - end end diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index 66d9900f3..ab9d6c6e1 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -12,7 +12,7 @@ describe ProjectsController, type: :controller do let!(:team) { create :team, created_by: user } let!(:user_team) { create :user_team, team: team, user: user } before do - @projects_overview = ProjectsOverviewService.new(team, user, params) + @projects_overview = ProjectsOverviewService.new(team, user, nil, params) end let!(:project_1) do @@ -73,20 +73,6 @@ describe ProjectsController, type: :controller do end end - describe '#index_dt' do - context 'in JSON format' do - let(:params) do - { start: 1, length: 2, order: { '0': { dir: 'ASC', column: '2' } } } - end - - it 'returns success response' do - get :index_dt, params: params, format: :json - expect(response).to have_http_status(:success) - expect(response.media_type).to eq 'application/json' - end - end - end - describe 'POST create' do context 'in JSON format' do let(:params) do diff --git a/spec/services/projects_overview_service_spec.rb b/spec/services/projects_overview_service_spec.rb index 5e5301716..d9c3dd41a 100644 --- a/spec/services/projects_overview_service_spec.rb +++ b/spec/services/projects_overview_service_spec.rb @@ -8,7 +8,7 @@ describe ProjectsOverviewService do let!(:user) { create :user } let!(:team) { create :team } before do - @projects_overview = ProjectsOverviewService.new(team, user, params) + @projects_overview = ProjectsOverviewService.new(team, user, nil, params) end let!(:project_1) do @@ -191,267 +191,4 @@ describe ProjectsOverviewService do end end end - - describe '#projects_datatable' do - let(:params) { {} } - - context 'with request parameters { {} }' do - it 'returns projects, sorted by ascending archivation attribute (active' \ - ' first), offset by 0, paginated by 10' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 10 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_2, project_4, project_5, - project_6) - projects1 = projects.reject(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 10 - end - end - - context "with request parameters { filter: 'active' }" do - let(:params) { super().merge(filter: 'active') } - - it 'returns active projects, sorted by ascending archivation ' \ - 'attribute (active first), offset by 0, paginated by 10' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 10 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_2, project_4, project_5, - project_6) - projects1 = projects.reject(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 10 - end - - context 'with request parameters { start: 15 }' do - let(:params) { super().merge(start: 15) } - - it 'returns active projects, sorted by ascending archivation ' \ - 'attribute (active first), offset by 15, paginated by 10' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 2 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_1, project_2, project_3, - project_4, project_5, project_6) - projects1 = projects.reject(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 2 - end - end - - context 'with request parameters { length: 5 }' do - let(:params) { super().merge(length: 5) } - - it 'returns active projects, sorted by ascending archivation ' \ - 'attribute (active first), offset by 0, paginated by 5' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 5 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_2, project_4, project_5, - project_6) - projects1 = projects.reject(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 5 - end - end - - context "with request parameters { order: { '0': { dir: 'asc' } } }" do - let(:params) { super().merge(order: { '0': { dir: 'asc' } }) } - - it 'returns active projects, sorted by ascending archivation ' \ - 'attribute (archived first), offset by 0, paginated by 10' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 10 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_2, project_4, project_5, - project_6) - projects1 = projects.reject(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 10 - end - end - - context "with request parameters { order: { '0': { dir: 'desc' } } }" do - let(:params) { super().merge(order: { '0': { dir: 'desc' } }) } - - it 'returns active projects, sorted by descending ' \ - 'archivation attribute (archived first), offset by 0, ' \ - 'paginated by 10' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 10 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_2, project_4, project_5, - project_6) - projects1 = projects.reject(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 10 - end - end - - context 'with request parameters { start: 13, length: 4 }' do - let(:params) { super().merge(start: 13, length: 4) } - - it 'returns active projects, sorted by ascending archivation ' \ - 'attribute (active first), offset by 13, paginated by 4' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 0 - expect(projects).not_to include(project_1, project_2, project_3, - project_4, project_5, project_6) - projects1 = projects.reject(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 0 - end - end - - context "with request parameters { start: 1, length: 2, " \ - "order: { '0': { dir: 'asc', column: '2' } } }" do - let(:params) do - super().merge(start: 1, length: 2, - order: { '0': { dir: 'asc', column: '2' } }) - end - - it 'returns archived projects, sorted by ascending name ' \ - 'attribute, offset by 1, paginated by 2' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 2 - expect(projects).to eq [project_3, project_1] - end - end - - context "with request parameters { start: 3, length: 12, " \ - "order: { '0': { dir: 'desc', column: '2' } } }" do - let(:params) do - super().merge(start: 3, length: 12, - order: { '0': { dir: 'desc', column: '2' } }) - end - - it 'returns archived projects, sorted by descending name ' \ - 'attribute, offset by 3, paginated by 12' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 12 - expect(projects.uniq.length).to eq projects.length - expect(projects).to eq [project_26, project_24, project_22, - project_20, project_18, project_16, - project_14, project_12, project_10, - project_8, project_1, project_3] - projects1 = projects.reject(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 12 - end - end - end - - context "with request parameters { filter: 'archived' }" do - let(:params) { super().merge(filter: 'archived') } - - it 'returns archived projects, sorted by ascending archivation ' \ - 'attribute (archived first), offset by 0, paginated by 10' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 10 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_1, project_3, project_6) - projects1 = projects.select(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 10 - end - - context 'with request parameters { start: 15 }' do - let(:params) { super().merge(start: 15) } - - it 'returns archived projects, sorted by ascending archivation ' \ - 'attribute (archived first), offset by 15, paginated by 10' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 3 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_1, project_2, project_3, - project_4, project_5, project_6) - projects1 = projects.select(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 3 - end - end - - context 'with request parameters { length: 5 }' do - let(:params) { super().merge(length: 5) } - - it 'returns archived projects, sorted by ascending archivation ' \ - 'attribute (archived first), offset by 0, paginated by 5' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 5 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_1, project_3, project_6) - projects1 = projects.select(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 5 - end - end - - context "with request parameters { order: { '0': { dir: 'asc' } } }" do - let(:params) { super().merge(order: { '0': { dir: 'asc' } }) } - - it 'returns archived projects, sorted by ascending archivation ' \ - 'attribute (archived first), offset by 0, paginated by 10' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 10 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_1, project_3, project_6) - projects1 = projects.select(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 10 - end - end - - context "with request parameters { order: { '0': { dir: 'desc' } } }" do - let(:params) { super().merge(order: { '0': { dir: 'desc' } }) } - - it 'returns archived projects, sorted by descending ' \ - 'archivation attribute (archived first), offset by 0, paginated by' \ - '10' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 10 - expect(projects.uniq.length).to eq projects.length - expect(projects).not_to include(project_1, project_3, project_6) - projects1 = projects.select(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 10 - end - end - - context 'with request parameters { start: 13, length: 4 }' do - let(:params) { super().merge(start: 13, length: 4) } - - it 'returns archived projects, sorted by ascending archivation ' \ - 'attribute (archived first), offset by 13, paginated by 4' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 1 - expect(projects).not_to include(project_1, project_2, project_3, - project_4, project_5, project_6) - projects1 = projects.select(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 1 - end - end - - context "with request parameters { start: 7, length: 6, " \ - "order: { '0': { dir: 'desc', column: '3' } } }" do - let(:params) do - super().merge(start: 7, length: 6, - order: { '0': { dir: 'desc', column: '3' } }) - end - - it 'returns archived projects, sorted by descending creation ' \ - 'time attribute, offset by 7, paginated by 6' do - projects = @projects_overview.projects_datatable - expect(projects.length).to eq 6 - expect(projects.uniq.length).to eq projects.length - expect(projects).to eq [project_13, project_11, project_9, - project_7, project_5, project_4] - projects1 = projects.select(&:archived?) - .select(&:visible?) - expect(projects1.length).to eq 6 - end - end - end - end end From e3f9087600ee5fc53e0d076157bd2fe51571e284 Mon Sep 17 00:00:00 2001 From: Urban Rotnik Date: Wed, 25 Nov 2020 19:33:12 +0100 Subject: [PATCH 3/4] Fix search --- app/services/projects_overview_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/projects_overview_service.rb b/app/services/projects_overview_service.rb index 02cc358da..cfd7d1027 100644 --- a/app/services/projects_overview_service.rb +++ b/app/services/projects_overview_service.rb @@ -101,12 +101,12 @@ class ProjectsOverviewService def filter_project_records(records) records = records.where(archived: true) if @params[:filter] == 'archived' records = records.where(archived: false) if @params[:filter] == 'active' - records = search_by_name(@user, @team, @params[:search]) if @params[:search].present? + records = Project.search_by_name(@user, @team, @params[:search]) if @params[:search].present? records end def filter_project_folder_records(records) - records = search_by_name(@user, @team, @params[:search]) if @params[:search].present? + records = ProjectFolder.search_by_name(@user, @team, @params[:search]) if @params[:search].present? records end From be49216e71f3f2021ef801dfd0fb05795e040b7c Mon Sep 17 00:00:00 2001 From: Urban Rotnik Date: Wed, 25 Nov 2020 20:02:45 +0100 Subject: [PATCH 4/4] Fix teams tests --- app/controllers/teams_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/teams_controller.rb b/app/controllers/teams_controller.rb index 6ccd9b20a..93a05f2f1 100644 --- a/app/controllers/teams_controller.rb +++ b/app/controllers/teams_controller.rb @@ -74,7 +74,7 @@ class TeamsController < ApplicationController @exp_projects = [] if export_projects_params[:project_ids] - @exp_projects = @team.project.where(id: export_projects_params[:project_ids]).to_a + @exp_projects = @team.projects.where(id: export_projects_params[:project_ids]).to_a end if export_projects_params[:project_folder_ids] folders = @team.project_folders.where(id: export_projects_params[:project_folder_ids])