mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-06 11:57:16 +08:00
Fix dropdown JS bug, fix folders_search, apply all new filters to search
SCI-5306
This commit is contained in:
parent
87ca79717c
commit
63a41b123d
4 changed files with 87 additions and 47 deletions
|
@ -28,10 +28,16 @@
|
||||||
var exportProjectsModalBody = null;
|
var exportProjectsModalBody = null;
|
||||||
var exportProjectsBtn = null;
|
var exportProjectsBtn = null;
|
||||||
var exportProjectsSubmit = null;
|
var exportProjectsSubmit = null;
|
||||||
|
|
||||||
var projectsViewSearch;
|
|
||||||
var projectsChanged = false;
|
var projectsChanged = false;
|
||||||
var projectsCurrentSort;
|
|
||||||
|
let projectsCurrentSort;
|
||||||
|
let projectsViewSearch;
|
||||||
|
let createdOnFromFilter;
|
||||||
|
let createdOnToFilter;
|
||||||
|
let membersFilter;
|
||||||
|
let lookInsideFolders;
|
||||||
|
let archivedOnFromFilter;
|
||||||
|
let archivedOnToFilter;
|
||||||
|
|
||||||
// Arrays with selected project and folder IDs shared between both views
|
// Arrays with selected project and folder IDs shared between both views
|
||||||
var selectedProjects = [];
|
var selectedProjects = [];
|
||||||
|
@ -483,7 +489,13 @@
|
||||||
data: {
|
data: {
|
||||||
filter: $('.projects-index').data('mode'),
|
filter: $('.projects-index').data('mode'),
|
||||||
sort: projectsCurrentSort,
|
sort: projectsCurrentSort,
|
||||||
search: projectsViewSearch
|
search: projectsViewSearch,
|
||||||
|
members: membersFilter,
|
||||||
|
created_on_from: createdOnFromFilter,
|
||||||
|
created_on_to: createdOnToFilter,
|
||||||
|
folders_search: lookInsideFolders,
|
||||||
|
archived_on_from: archivedOnFromFilter,
|
||||||
|
archived_on_to: archivedOnToFilter
|
||||||
},
|
},
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
$('#breadcrumbs-wrapper').html(data.breadcrumbs_html);
|
$('#breadcrumbs-wrapper').html(data.breadcrumbs_html);
|
||||||
|
@ -537,14 +549,14 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function initProjectsFilter() {
|
function initProjectsFilters() {
|
||||||
let $projectsFilter = $('.projects-index .projects-filters');
|
let $projectsFilter = $('.projects-index .projects-filters');
|
||||||
let $membersFilter = $('.members-filter', $projectsFilter);
|
let $membersFilter = $('.members-filter', $projectsFilter);
|
||||||
let $foldersCB = $('#folder_search', $projectsFilter);
|
let $foldersCB = $('#folder_search', $projectsFilter);
|
||||||
let $createdOnStartFilter = $('#createdOnStartDate', $projectsFilter);
|
let $createdOnFromFilter = $('#createdOnFromDate', $projectsFilter);
|
||||||
let $createdOnEndFilter = $('#createdOnEndDate', $projectsFilter);
|
let $createdOnToFilter = $('#createdOnToDate', $projectsFilter);
|
||||||
let $archivedOnStartFilter = $('#archivedOnStartDate', $projectsFilter);
|
let $archivedOnFromFilter = $('#archivedOnFromDate', $projectsFilter);
|
||||||
let $archivedOnEndFilter = $('#archivedOnEndDate', $projectsFilter);
|
let $archivedOnToFilter = $('#archivedOnToDate', $projectsFilter);
|
||||||
let $textFilter = $('#textSearchFilterInput', $projectsFilter);
|
let $textFilter = $('#textSearchFilterInput', $projectsFilter);
|
||||||
|
|
||||||
dropdownSelector.init($membersFilter, {
|
dropdownSelector.init($membersFilter, {
|
||||||
|
@ -629,9 +641,17 @@
|
||||||
console.error(error);
|
console.error(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
$('.projects-filters').dropdown('toggle');
|
$(e.target).closest('.dropdown').removeClass('open');
|
||||||
|
|
||||||
loadCardsView();
|
|
||||||
|
createdOnFromFilter = $createdOnFromFilter.val();
|
||||||
|
createdOnToFilter = $createdOnToFilter.val();
|
||||||
|
membersFilter = dropdownSelector.getValues($('.members-filter'));
|
||||||
|
lookInsideFolders = $foldersCB.prop('checked');
|
||||||
|
archivedOnFromFilter = $archivedOnFromFilter.val();
|
||||||
|
archivedOnToFilter = $archivedOnToFilter.val();
|
||||||
|
|
||||||
|
refreshCurrentView();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Clear filters
|
// Clear filters
|
||||||
|
@ -640,10 +660,10 @@
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
dropdownSelector.clearData($membersFilter);
|
dropdownSelector.clearData($membersFilter);
|
||||||
if ($createdOnStartFilter.data('DateTimePicker')) $createdOnStartFilter.data('DateTimePicker').clear();
|
if ($createdOnFromFilter.data('DateTimePicker')) $createdOnFromFilter.data('DateTimePicker').clear();
|
||||||
if ($createdOnEndFilter.data('DateTimePicker')) $createdOnEndFilter.data('DateTimePicker').clear();
|
if ($createdOnToFilter.data('DateTimePicker')) $createdOnToFilter.data('DateTimePicker').clear();
|
||||||
if ($archivedOnStartFilter.data('DateTimePicker')) $archivedOnStartFilter.data('DateTimePicker').clear();
|
if ($archivedOnFromFilter.data('DateTimePicker')) $archivedOnFromFilter.data('DateTimePicker').clear();
|
||||||
if ($archivedOnEndFilter.data('DateTimePicker')) $archivedOnEndFilter.data('DateTimePicker').clear();
|
if ($archivedOnToFilter.data('DateTimePicker')) $archivedOnToFilter.data('DateTimePicker').clear();
|
||||||
$foldersCB.prop('checked', false);
|
$foldersCB.prop('checked', false);
|
||||||
$textFilter.val('');
|
$textFilter.val('');
|
||||||
});
|
});
|
||||||
|
@ -665,5 +685,5 @@
|
||||||
initProjectsViewModeSwitch();
|
initProjectsViewModeSwitch();
|
||||||
initSorting();
|
initSorting();
|
||||||
loadCardsView();
|
loadCardsView();
|
||||||
initProjectsFilter();
|
initProjectsFilters();
|
||||||
}(window));
|
}(window));
|
||||||
|
|
|
@ -29,7 +29,7 @@ class ProjectsController < ApplicationController
|
||||||
def cards
|
def cards
|
||||||
overview_service = ProjectsOverviewService.new(current_team, current_user, @current_folder, params)
|
overview_service = ProjectsOverviewService.new(current_team, current_user, @current_folder, params)
|
||||||
|
|
||||||
if params[:search].present?
|
if filters_included?
|
||||||
render json: {
|
render json: {
|
||||||
cards_html: render_to_string(
|
cards_html: render_to_string(
|
||||||
partial: 'projects/index/team_projects_grouped_by_folder.html.erb',
|
partial: 'projects/index/team_projects_grouped_by_folder.html.erb',
|
||||||
|
@ -281,6 +281,11 @@ class ProjectsController < ApplicationController
|
||||||
@current_sort = 'new' if @current_sort.include?('arch') && action_name != 'experiment_archive'
|
@current_sort = 'new' if @current_sort.include?('arch') && action_name != 'experiment_archive'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def filters_included?
|
||||||
|
%i(search created_on_from created_on_to members archived_on_from archived_on_to folders_search)
|
||||||
|
.any? { |param_name| params.dig(param_name).present? }
|
||||||
|
end
|
||||||
|
|
||||||
def log_activity(type_of, message_items = {})
|
def log_activity(type_of, message_items = {})
|
||||||
message_items = { project: @project.id }.merge(message_items)
|
message_items = { project: @project.id }.merge(message_items)
|
||||||
|
|
||||||
|
|
|
@ -8,13 +8,28 @@ class ProjectsOverviewService
|
||||||
@params = params
|
@params = params
|
||||||
@view_state = @team.current_view_state(@user)
|
@view_state = @team.current_view_state(@user)
|
||||||
|
|
||||||
|
# Default state changed, reset invalid state
|
||||||
|
unless @view_state.valid?
|
||||||
|
@view_state.destroy
|
||||||
|
@view_state = @team.current_view_state(@user)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Update view_mode if changed
|
||||||
if @view_state.state.dig('projects', 'view_mode') != @params[:filter] &&
|
if @view_state.state.dig('projects', 'view_mode') != @params[:filter] &&
|
||||||
%w(active archived).include?(@params[:filter])
|
%w(active archived).include?(@params[:filter])
|
||||||
@view_state.state['projects']['view_mode'] = @params[:filter]
|
@view_state.state['projects']['view_mode'] = @params[:filter]
|
||||||
@view_state.save!
|
@view_state.save!
|
||||||
end
|
end
|
||||||
|
|
||||||
@view_mode = @view_state.state.dig('projects', 'view_mode')
|
@view_mode = @view_state.state.dig('projects', 'view_mode')
|
||||||
|
|
||||||
|
# Update sort if chanhed
|
||||||
|
@sort = @view_state.state.dig('projects', @view_mode, 'sort')
|
||||||
|
if @params[:sort] && @sort != @params[:sort] &&
|
||||||
|
%w(new old atoz ztoa archived_first archived_last).include?(@params[:sort])
|
||||||
|
@view_state.state['projects'].merge!(Hash[@view_mode, { 'sort': @params[:sort] }.stringify_keys])
|
||||||
|
@view_state.save!
|
||||||
|
@sort = @view_state.state.dig('projects', @view_mode, 'sort')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def project_cards
|
def project_cards
|
||||||
|
@ -35,13 +50,24 @@ class ProjectsOverviewService
|
||||||
|
|
||||||
def grouped_by_folder_project_cards
|
def grouped_by_folder_project_cards
|
||||||
project_records =
|
project_records =
|
||||||
if @current_folder.present?
|
if @current_folder
|
||||||
fetch_project_records.where(project_folder: ProjectFolder.inner_folders(@team, @current_folder))
|
folders = if @params[:folders_search] == 'true'
|
||||||
else
|
ProjectFolder.inner_folders(@team, @current_folder).or(ProjectFolder.where(id: @current_folder.id))
|
||||||
|
else
|
||||||
|
ProjectFolder.where(id: @current_folder.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
fetch_project_records.where(project_folder: folders)
|
||||||
|
elsif @params[:folders_search] == 'true'
|
||||||
|
folders = ProjectFolder.inner_folders(@team, nil).or(ProjectFolder.where(id: nil))
|
||||||
fetch_project_records
|
fetch_project_records
|
||||||
|
else
|
||||||
|
folders = ProjectFolder.where(id: nil)
|
||||||
|
fetch_project_records.where(project_folder: nil, team: @team)
|
||||||
end
|
end
|
||||||
|
|
||||||
project_records = sort_records(filter_project_records(project_records)).includes(:project_folder).to_a
|
project_records = sort_records(filter_project_records(project_records)).includes(:project_folder).to_a
|
||||||
folder_records = ProjectFolder.inner_folders(@team, @current_folder).includes(:parent_folder).to_a
|
folder_records = folders.includes(:parent_folder).to_a
|
||||||
|
|
||||||
sorted_results_by_folder = {}
|
sorted_results_by_folder = {}
|
||||||
build_folder_content(@current_folder, folder_records, project_records, sorted_results_by_folder)
|
build_folder_content(@current_folder, folder_records, project_records, sorted_results_by_folder)
|
||||||
|
@ -120,6 +146,14 @@ class ProjectsOverviewService
|
||||||
records = records.where(archived: true) if @params[:filter] == 'archived'
|
records = records.where(archived: true) if @params[:filter] == 'archived'
|
||||||
records = records.where(archived: false) if @params[:filter] == 'active'
|
records = records.where(archived: false) if @params[:filter] == 'active'
|
||||||
records = records.where_attributes_like('projects.name', @params[:search]) if @params[:search].present?
|
records = records.where_attributes_like('projects.name', @params[:search]) if @params[:search].present?
|
||||||
|
records = records.where_attributes_like('projects.name', @params[:search]) if @params[:search].present?
|
||||||
|
records = records.where('user_projects.user_id IN (?)', @params[:members]) if @params[:members]&.any?
|
||||||
|
records = records.where('projects.created_at > ?', @params[:created_on_from]) if @params[:created_on_from].present?
|
||||||
|
records = records.where('projects.created_at < ?', @params[:created_on_to]) if @params[:created_on_to].present?
|
||||||
|
records = records.where('projects.archived_on < ?', @params[:archived_on_to]) if @params[:archived_on_to].present?
|
||||||
|
if @params[:archived_on_from].present?
|
||||||
|
records = records.where('projects.archived_on > ?', @params[:archived_on_from])
|
||||||
|
end
|
||||||
records
|
records
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -131,14 +165,7 @@ class ProjectsOverviewService
|
||||||
end
|
end
|
||||||
|
|
||||||
def sort_records(records)
|
def sort_records(records)
|
||||||
cards_state = @view_state.state.dig('projects', 'cards')
|
case @sort
|
||||||
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'
|
when 'new'
|
||||||
records.order(created_at: :desc)
|
records.order(created_at: :desc)
|
||||||
when 'old'
|
when 'old'
|
||||||
|
@ -157,19 +184,7 @@ class ProjectsOverviewService
|
||||||
end
|
end
|
||||||
|
|
||||||
def mixed_sort_records(records)
|
def mixed_sort_records(records)
|
||||||
sort = @view_state.state.dig('projects', @view_mode, 'sort')
|
case @sort
|
||||||
|
|
||||||
if @params[:sort] && sort != @params[:sort] &&
|
|
||||||
%w(new old atoz ztoa archived_first archived_last).include?(@params[:sort])
|
|
||||||
@view_state.state['projects'].merge!(Hash[@view_mode, { 'sort': @params[:sort] }.stringify_keys])
|
|
||||||
end
|
|
||||||
|
|
||||||
if @view_state.changed?
|
|
||||||
@view_state.save!
|
|
||||||
sort = @view_state.state.dig('projects', @view_mode, 'sort')
|
|
||||||
end
|
|
||||||
|
|
||||||
case sort
|
|
||||||
when 'new'
|
when 'new'
|
||||||
records.sort_by(&:created_at).reverse!
|
records.sort_by(&:created_at).reverse!
|
||||||
when 'old'
|
when 'old'
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="datetime-picker-container" id="from-date">
|
<div class="datetime-picker-container" id="from-date">
|
||||||
<span class="fas fa-calendar-alt"></span>
|
<span class="fas fa-calendar-alt"></span>
|
||||||
<input id="createdOnStartDate"
|
<input id="createdOnFromDate"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
data-toggle='date-time-picker'
|
data-toggle='date-time-picker'
|
||||||
class="form-control calendar-input"
|
class="form-control calendar-input"
|
||||||
|
@ -50,7 +50,7 @@
|
||||||
|
|
||||||
<div class="datetime-picker-container" id="to-date">
|
<div class="datetime-picker-container" id="to-date">
|
||||||
<span class="fas fa-calendar-alt"></span>
|
<span class="fas fa-calendar-alt"></span>
|
||||||
<input id="createdOnEndDate"
|
<input id="createdOnToDate"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
data-toggle='date-time-picker'
|
data-toggle='date-time-picker'
|
||||||
class="form-control calendar-input"
|
class="form-control calendar-input"
|
||||||
|
@ -78,7 +78,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="datetime-picker-container" id="from-date">
|
<div class="datetime-picker-container" id="from-date">
|
||||||
<span class="fas fa-calendar-alt"></span>
|
<span class="fas fa-calendar-alt"></span>
|
||||||
<input id="archivedOnStartDate"
|
<input id="archivedOnFromDate"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
data-toggle='date-time-picker'
|
data-toggle='date-time-picker'
|
||||||
class="form-control calendar-input"
|
class="form-control calendar-input"
|
||||||
|
@ -94,7 +94,7 @@
|
||||||
|
|
||||||
<div class="datetime-picker-container" id="to-date">
|
<div class="datetime-picker-container" id="to-date">
|
||||||
<span class="fas fa-calendar-alt"></span>
|
<span class="fas fa-calendar-alt"></span>
|
||||||
<input id="archivedOnEndDate"
|
<input id="archivedOnToDate"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
data-toggle='date-time-picker'
|
data-toggle='date-time-picker'
|
||||||
class="form-control calendar-input"
|
class="form-control calendar-input"
|
||||||
|
|
Loading…
Add table
Reference in a new issue