From f221d71bbc4a9f3db4e224455944c9efa42538f9 Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Fri, 12 Oct 2018 15:15:43 +0200 Subject: [PATCH] Fix datatables state restore [SCI-2733] --- app/assets/javascripts/projects/index.js | 1 + app/controllers/projects_controller.rb | 7 ++++--- app/models/team.rb | 16 ++++++++-------- app/models/user.rb | 1 + app/services/projects_overview_service.rb | 20 ++++++++++++-------- 5 files changed, 26 insertions(+), 19 deletions(-) diff --git a/app/assets/javascripts/projects/index.js b/app/assets/javascripts/projects/index.js index b790871fd..4356db1fd 100644 --- a/app/assets/javascripts/projects/index.js +++ b/app/assets/javascripts/projects/index.js @@ -525,6 +525,7 @@ TABLE = $(TABLE_ID).DataTable({ dom: "R<'row'<'col-sm-9-custom toolbar'l><'col-sm-3-custom'f>>tpi", stateSave: true, + stateDuration: 0, processing: true, serverSide: true, scrollY: '64vh', diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index f736af630..d0bed08f8 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -46,8 +46,8 @@ class ProjectsController < ApplicationController @project = Project.new view_state = current_team.current_view_state(current_user) - @current_filter = view_state.state['filter'] - @current_sort = view_state.state.dig('cards', 'sort') + @current_filter = view_state.state.dig('projects', 'filter') + @current_sort = view_state.state.dig('projects', 'cards', 'sort') load_projects_tree end end @@ -323,7 +323,8 @@ class ProjectsController < ApplicationController respond_to do |format| format.json do render json: { - state: current_team.current_view_state(current_user).state['table'] + state: current_team.current_view_state(current_user) + .state.dig('projects', 'table') } end end diff --git a/app/models/team.rb b/app/models/team.rb index 6d106a467..b30049c3c 100644 --- a/app/models/team.rb +++ b/app/models/team.rb @@ -47,14 +47,14 @@ class Team < ApplicationRecord end def default_view_state - { filter: 'active', - cards: { sort: 'new' }, - table: { - 'start': 0, - 'length': 10, - 'order' => [2, 'asc'], - 'time': Time.new.to_i - } } + { 'projects' => + { 'cards' => { 'sort' => 'new' }, + 'table' => + { 'time' => Time.now.to_i, + 'order' => [[2, 'asc']], + 'start' => 0, + 'length' => 10 }, + 'filter' => 'active' } } end def search_users(query = nil) diff --git a/app/models/user.rb b/app/models/user.rb index c124181ca..b80ab731e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -197,6 +197,7 @@ class User < ApplicationRecord has_many :notifications, through: :user_notifications has_many :zip_exports, inverse_of: :user, dependent: :destroy has_many :datatables_teams, class_name: '::Views::Datatables::DatatablesTeam' + has_many :view_states, dependent: :destroy # If other errors besides parameter "avatar" exist, # they will propagate to "avatar" also, so remove them diff --git a/app/services/projects_overview_service.rb b/app/services/projects_overview_service.rb index 321f61287..49a5756f9 100644 --- a/app/services/projects_overview_service.rb +++ b/app/services/projects_overview_service.rb @@ -6,14 +6,14 @@ class ProjectsOverviewService @user = user @params = params @view_state = @team.current_view_state(@user) - if @view_state.state['filter'] != @params[:filter] && + if @view_state.state.dig('projects', 'filter') != @params[:filter] && %w(active archived all).include?(@params[:filter]) - @view_state.state['filter'] = @params[:filter] + @view_state.state['projects']['filter'] = @params[:filter] end end def project_cards - cards_state = @view_state.state['cards'] + cards_state = @view_state.state.dig('projects', 'cards') records = fetch_records records = records.where(archived: true) if @params[:filter] == 'archived' records = records.where(archived: false) if @params[:filter] == 'active' @@ -21,7 +21,7 @@ class ProjectsOverviewService cards_state['sort'] != @params[:sort] && %w(new old atoz ztoa).include?(@params[:sort]) cards_state['sort'] = @params[:sort] - @view_state.state['cards'] = cards_state + @view_state.state['projects']['cards'] = cards_state end @view_state.save! if @view_state.changed? case cards_state['sort'] @@ -39,7 +39,7 @@ class ProjectsOverviewService end def projects_datatable - table_state = @view_state.state['table'] + table_state = @view_state.state.dig('projects', 'table') per_page = @params[:length] == '-1' ? 10 : @params[:length].to_i table_state['length'] = per_page if table_state['length'] != per_page page = @params[:start] ? (@params[:start].to_i / per_page) + 1 : 1 @@ -49,7 +49,10 @@ class ProjectsOverviewService search_value = @params.dig(:search, :value) records = search(records, search_value) if search_value.present? records = sort(records).page(page).per(per_page) - @view_state.save! if @view_state.changed? + if @view_state.changed? + @view_state.state['projects']['table']['time'] = Time.now.to_i + @view_state.save! + end records end @@ -136,7 +139,7 @@ class ProjectsOverviewService end def sort(records) - order_state = @view_state.state['table']['order'][0] + order_state = @view_state.state['projects']['table']['order'][0] order = @params[:order]&.values&.first if order dir = order[:dir] == 'desc' ? 'DESC' : 'ASC' @@ -146,7 +149,8 @@ class ProjectsOverviewService column_index = '1' end if order_state != [column_index.to_i, dir.downcase] - @view_state.state['table']['order'][0] = [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']