Fix datatables state restore [SCI-2733]

This commit is contained in:
Oleksii Kriuchykhin 2018-10-12 15:15:43 +02:00
parent af02f29fb5
commit f221d71bbc
5 changed files with 26 additions and 19 deletions

View file

@ -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',

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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']