mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-11-11 17:00:41 +08:00
Merge pull request #2449 from mlorb/ml-sci-4376
Add endpoints for lists of projects and experiments with filtering… [SCI-4376][SCI-4377]
This commit is contained in:
commit
9ee49eeaff
7 changed files with 185 additions and 9 deletions
|
|
@ -1,9 +1,11 @@
|
||||||
/* global dropdownSelector */
|
/* global I18n dropdownSelector */
|
||||||
/* eslint-disable no-param-reassign */
|
/* eslint-disable no-param-reassign */
|
||||||
|
|
||||||
var DasboardQuickStartWidget = (function() {
|
var DasboardQuickStartWidget = (function() {
|
||||||
var projectFilter = '#create-task-modal .project-filter';
|
var projectFilter = '#create-task-modal .project-filter';
|
||||||
var experimentFilter = '#create-task-modal .experiment-filter';
|
var experimentFilter = '#create-task-modal .experiment-filter';
|
||||||
|
var createTaskButton = '#create-task-modal .create-task-button';
|
||||||
|
var newProjectsVisibility = '#create-task-modal .new-projects-visibility';
|
||||||
|
|
||||||
function initNewTaskModal() {
|
function initNewTaskModal() {
|
||||||
$('.quick-start-widget .new-task').click(() => {
|
$('.quick-start-widget .new-task').click(() => {
|
||||||
|
|
@ -13,13 +15,84 @@ var DasboardQuickStartWidget = (function() {
|
||||||
dropdownSelector.init(projectFilter, {
|
dropdownSelector.init(projectFilter, {
|
||||||
singleSelect: true,
|
singleSelect: true,
|
||||||
closeOnSelect: true,
|
closeOnSelect: true,
|
||||||
selectAppearance: 'simple'
|
selectAppearance: 'simple',
|
||||||
|
optionLabel: (data) => {
|
||||||
|
if (data.value === 0) {
|
||||||
|
return `<i class="fas fa-plus"></i>
|
||||||
|
<span class="create-new">${I18n.t('dashboard.create_task_modal.filter_create_new')}</span>
|
||||||
|
<span>"${data.label}"</span>`;
|
||||||
|
}
|
||||||
|
return data.label;
|
||||||
|
},
|
||||||
|
onSelect: () => {
|
||||||
|
var selectedValue = dropdownSelector.getValues(projectFilter);
|
||||||
|
// Toggle project visibility button
|
||||||
|
if (selectedValue === '0') {
|
||||||
|
$(newProjectsVisibility).show();
|
||||||
|
} else {
|
||||||
|
$(newProjectsVisibility).hide();
|
||||||
|
}
|
||||||
|
// Enable/disable experiment filter
|
||||||
|
if (selectedValue >= 0) {
|
||||||
|
dropdownSelector.enableSelector(experimentFilter);
|
||||||
|
} else {
|
||||||
|
dropdownSelector.disableSelector(experimentFilter);
|
||||||
|
}
|
||||||
|
dropdownSelector.clearData(experimentFilter);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
dropdownSelector.init(experimentFilter, {
|
dropdownSelector.init(experimentFilter, {
|
||||||
singleSelect: true,
|
singleSelect: true,
|
||||||
closeOnSelect: true,
|
closeOnSelect: true,
|
||||||
selectAppearance: 'simple'
|
selectAppearance: 'simple',
|
||||||
|
optionLabel: (data) => {
|
||||||
|
if (data.value === 0) {
|
||||||
|
return `<i class="fas fa-plus"></i>
|
||||||
|
<span class="create-new">${I18n.t('dashboard.create_task_modal.filter_create_new')}</span>
|
||||||
|
<span>"${data.label}"</span>`;
|
||||||
|
}
|
||||||
|
return data.label;
|
||||||
|
},
|
||||||
|
ajaxParams: (params) => {
|
||||||
|
if (dropdownSelector.getValues(projectFilter) === '0') {
|
||||||
|
params.project = {
|
||||||
|
name: dropdownSelector.getData(projectFilter)[0].label,
|
||||||
|
visibility: $('input[name="projects-visibility-selector"]:checked').val()
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
params.project = { id: dropdownSelector.getValues(projectFilter) };
|
||||||
|
}
|
||||||
|
return params;
|
||||||
|
},
|
||||||
|
onSelect: () => {
|
||||||
|
var selectedValue = dropdownSelector.getValues(experimentFilter);
|
||||||
|
if (selectedValue >= 0) {
|
||||||
|
$(createTaskButton).removeAttr('disabled');
|
||||||
|
} else {
|
||||||
|
$(createTaskButton).attr('disabled', true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(createTaskButton).click(() => {
|
||||||
|
var params = {};
|
||||||
|
if (dropdownSelector.getValues(projectFilter) === '0') {
|
||||||
|
params.project = {
|
||||||
|
name: dropdownSelector.getData(projectFilter)[0].label,
|
||||||
|
visibility: $('input[name="projects-visibility-selector"]:checked').val()
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
params.project = { id: dropdownSelector.getValues(projectFilter) };
|
||||||
|
}
|
||||||
|
if (dropdownSelector.getValues(experimentFilter) === '0') {
|
||||||
|
params.experiment = { name: dropdownSelector.getData(experimentFilter)[0].label };
|
||||||
|
} else {
|
||||||
|
params.experiment = { id: dropdownSelector.getValues(experimentFilter) };
|
||||||
|
}
|
||||||
|
$.post($(createTaskButton).data('ajaxUrl'), params, function(data) {
|
||||||
|
window.location.href = data.my_module_path;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
// scss-lint:disable SelectorDepth QualifyingElement NestingDepth
|
||||||
|
|
||||||
#create-task-modal {
|
#create-task-modal {
|
||||||
.modal-dialog {
|
.modal-dialog {
|
||||||
width: 360px;
|
width: 360px;
|
||||||
|
|
@ -21,6 +23,56 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dropdown-selector-container {
|
||||||
|
.create-new {
|
||||||
|
padding: 0 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.down-arrow {
|
||||||
|
background-color: $color-white;
|
||||||
|
box-shadow: -4px 4px 0 $color-black;
|
||||||
|
display: inline-block;
|
||||||
|
height: 38px;
|
||||||
|
margin: 0 6px 24px 14px;
|
||||||
|
opacity: .2;
|
||||||
|
width: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.down-arrow::before {
|
||||||
|
border-bottom: 6px solid transparent;
|
||||||
|
border-left: 8px solid $color-black;
|
||||||
|
border-top: 6px solid transparent;
|
||||||
|
content: "";
|
||||||
|
height: 0;
|
||||||
|
left: 40px;
|
||||||
|
position: absolute;
|
||||||
|
top: 185px;
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-visibility-container {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-visibility-title {
|
||||||
|
@include font-small;
|
||||||
|
display: inline-block;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sci-toggles-group {
|
||||||
|
.sci-toggle-item {
|
||||||
|
width: 143px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sci-toggle-item-label {
|
||||||
|
margin-left: -143px;
|
||||||
|
width: 143px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.modal-footer {
|
.modal-footer {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
module Dashboard
|
module Dashboard
|
||||||
class QuickStartController < ApplicationController
|
class QuickStartController < ApplicationController
|
||||||
before_action :load_project, only: :create_task
|
include InputSanitizeHelper
|
||||||
|
|
||||||
|
before_action :load_project, only: %i(create_task experiment_filter)
|
||||||
before_action :load_experiment, only: :create_task
|
before_action :load_experiment, only: :create_task
|
||||||
before_action :check_task_create_permissions, only: :create_task
|
before_action :check_task_create_permissions, only: :create_task
|
||||||
|
|
||||||
|
|
@ -17,10 +19,34 @@ module Dashboard
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def project_filter
|
||||||
|
projects = current_team.projects.search(current_user, false, params[:query], 1, current_team).select(:id, :name)
|
||||||
|
projects = projects.map { |i| { value: i.id, label: escape_input(i.name) } }
|
||||||
|
if (projects.map { |i| i[:label] }.exclude? params[:query]) && params[:query].present?
|
||||||
|
projects = [{ value: 0, label: params[:query] }] + projects
|
||||||
|
end
|
||||||
|
render json: projects, status: :ok
|
||||||
|
end
|
||||||
|
|
||||||
|
def experiment_filter
|
||||||
|
if create_project_params.present? && params[:query].present?
|
||||||
|
experiments = [{ value: 0, label: params[:query] }]
|
||||||
|
elsif @project
|
||||||
|
experiments = @project.experiments
|
||||||
|
.search(current_user, false, params[:query], 1, current_team)
|
||||||
|
.select(:id, :name)
|
||||||
|
experiments = experiments.map { |i| { value: i.id, label: escape_input(i.name) } }
|
||||||
|
if (experiments.map { |i| i[:label] }.exclude? params[:query]) && params[:query].present?
|
||||||
|
experiments = [{ value: 0, label: params[:query] }] + experiments
|
||||||
|
end
|
||||||
|
end
|
||||||
|
render json: experiments || [], status: :ok
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def create_project_params
|
def create_project_params
|
||||||
params.require(:project).permit(:name)
|
params.require(:project).permit(:name, :visibility)
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_experiment_params
|
def create_experiment_params
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ class CreateProjectService
|
||||||
|
|
||||||
def call
|
def call
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
@params[:visibility] ||= 'hidden'
|
|
||||||
@params[:created_by] = @user
|
@params[:created_by] = @user
|
||||||
@params[:last_modified_by] = @user
|
@params[:last_modified_by] = @user
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,20 +14,40 @@
|
||||||
<div class="select-block">
|
<div class="select-block">
|
||||||
<label><%= t("dashboard.create_task_modal.project") %></label>
|
<label><%= t("dashboard.create_task_modal.project") %></label>
|
||||||
<select class="project-filter"
|
<select class="project-filter"
|
||||||
data-ajax-url=""
|
data-ajax-url="<%= dashboard_quick_start_project_filter_path %>"
|
||||||
data-placeholder="<%= t("dashboard.create_task_modal.project_placeholder") %>"></select>
|
data-placeholder="<%= t("dashboard.create_task_modal.project_placeholder") %>"></select>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="new-projects-visibility" style="display: none;">
|
||||||
|
<div class="down-arrow"></div>
|
||||||
|
<div class="project-visibility-container">
|
||||||
|
<div class="project-visibility-title"><%= t("dashboard.create_task_modal.project_visibility_label") %></div>
|
||||||
|
<div class="sci-toggles-group" data-toggle="buttons">
|
||||||
|
<input type="radio" name="projects-visibility-selector" class="sci-toggle-item" value="hidden" checked="checked">
|
||||||
|
<label class="sci-toggle-item-label">
|
||||||
|
<%= t("dashboard.create_task_modal.project_visibility_members") %>
|
||||||
|
</label>
|
||||||
|
<input type="radio" name="projects-visibility-selector" class="sci-toggle-item" value="visible">
|
||||||
|
<label class="sci-toggle-item-label">
|
||||||
|
<%= t("dashboard.create_task_modal.project_visibility_all") %>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="select-block">
|
<div class="select-block">
|
||||||
<label><%= t("dashboard.create_task_modal.experiment") %></label>
|
<label><%= t("dashboard.create_task_modal.experiment") %></label>
|
||||||
<select class="experiment-filter"
|
<select class="experiment-filter"
|
||||||
data-ajax-url=""
|
data-ajax-url="<%= dashboard_quick_start_experiment_filter_path %>"
|
||||||
data-disable-on-load="true"
|
data-disable-on-load="true"
|
||||||
data-disable-placeholder="<%= t("dashboard.create_task_modal.experiment_disabled_placeholder") %>"
|
data-disable-placeholder="<%= t("dashboard.create_task_modal.experiment_disabled_placeholder") %>"
|
||||||
data-placeholder="<%= t("dashboard.create_task_modal.experiment_placeholder") %>"></select>
|
data-placeholder="<%= t("dashboard.create_task_modal.experiment_placeholder") %>"></select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-primary" data-dismiss="modal" disabled>
|
<button type="button"
|
||||||
|
class="create-task-button btn btn-primary"
|
||||||
|
data-ajax-url="<%= dashboard_quick_start_create_task_path %>"
|
||||||
|
data-dismiss="modal"
|
||||||
|
disabled>
|
||||||
<%= t("dashboard.create_task_modal.create_task") %>
|
<%= t("dashboard.create_task_modal.create_task") %>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -52,8 +52,12 @@ en:
|
||||||
title: "Create a new Task"
|
title: "Create a new Task"
|
||||||
description: "Simply type in the fields bellow to find or create space for your new task to live in"
|
description: "Simply type in the fields bellow to find or create space for your new task to live in"
|
||||||
project: "Project"
|
project: "Project"
|
||||||
|
project_visibility_label: "Visible to"
|
||||||
|
project_visibility_members: "Project members"
|
||||||
|
project_visibility_all: "All team members"
|
||||||
experiment: "Experiment"
|
experiment: "Experiment"
|
||||||
project_placeholder: "Enter project name (New or Existing)"
|
project_placeholder: "Enter project name (New or Existing)"
|
||||||
experiment_placeholder: "Enter experiment name (New or Existing)"
|
experiment_placeholder: "Enter experiment name (New or Existing)"
|
||||||
experiment_disabled_placeholder: "Select Project to enable Experiments"
|
experiment_disabled_placeholder: "Select Project to enable Experiments"
|
||||||
|
filter_create_new: "Create"
|
||||||
create_task: "Create Task"
|
create_task: "Create Task"
|
||||||
|
|
|
||||||
|
|
@ -247,6 +247,8 @@ Rails.application.routes.draw do
|
||||||
end
|
end
|
||||||
|
|
||||||
namespace :quick_start, module: :dashboard, controller: :quick_start do
|
namespace :quick_start, module: :dashboard, controller: :quick_start do
|
||||||
|
get :project_filter
|
||||||
|
get :experiment_filter
|
||||||
post :create_task
|
post :create_task
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue