Merge branch 'develop' into features/dashboard

This commit is contained in:
aignatov-bio 2020-02-19 10:29:50 +01:00
commit f11b051715
12 changed files with 108 additions and 135 deletions

View file

@ -443,9 +443,13 @@ var RepositoryDatatable = (function(global) {
sWidth: '1%', sWidth: '1%',
render: function(data, type, row) { render: function(data, type, row) {
let content = data; let content = data;
let icon = '<i class="repository-row-edit-icon fas fa-pencil-alt"></i>'; let icon;
if (!row.recordEditable) { if (!row.recordEditable) {
icon = `<i class="repository-row-lock-icon fas fa-lock" title="${I18n.t('repositories.table.locked_item')}"></i>`; icon = `<i class="repository-row-lock-icon fas fa-lock" title="${I18n.t('repositories.table.locked_item')}"></i>`;
} else if (EDITABLE) {
icon = '<i class="repository-row-edit-icon fas fa-pencil-alt"></i>';
} else {
icon = '';
} }
content = icon + content; content = icon + content;
return content; return content;

View file

@ -4,28 +4,29 @@
*/ */
/* global I18n _ */ /* global I18n _ */
(function(global) { (function() {
var STORAGE_TREE_KEY = 'scinote-sidebar-tree-collapsed-ids'; const SIDEBAR_ID = '#slide-panel';
const STORAGE_TREE_KEY = 'scinote-sidebar-tree-collapsed-ids';
/** /**
* Get all collapsed sidebar elements. * Get all collapsed sidebar elements.
* @return An array of sidebar element IDs. * @return An array of sidebar element IDs.
*/ */
global.sessionGetCollapsedSidebarElements = function() { function sessionGetCollapsedSidebarElements() {
var val = sessionStorage.getItem(STORAGE_TREE_KEY); var val = sessionStorage.getItem(STORAGE_TREE_KEY);
if (val === null) { if (val === null) {
val = '[]'; val = '[]';
sessionStorage.setItem(STORAGE_TREE_KEY, val); sessionStorage.setItem(STORAGE_TREE_KEY, val);
} }
return JSON.parse(val); return JSON.parse(val);
}; }
/** /**
* Collapse a specified element in the sidebar. * Collapse a specified element in the sidebar.
* @param id - The collapsed element's ID. * @param id - The collapsed element's ID.
*/ */
global.sessionCollapseSidebarElement = function(project, id) { function sessionCollapseSidebarElement(project, id) {
var ids = global.sessionGetCollapsedSidebarElements(); var ids = sessionGetCollapsedSidebarElements();
var item = _.findWhere(ids, { prid: project }); var item = _.findWhere(ids, { prid: project });
var collapsed = { prid: project, ids: [] }; var collapsed = { prid: project, ids: [] };
var storedProjects = _.pluck(ids, 'prid'); var storedProjects = _.pluck(ids, 'prid');
@ -39,34 +40,14 @@
ids.push(collapsed); ids.push(collapsed);
} }
sessionStorage.setItem(STORAGE_TREE_KEY, JSON.stringify(ids)); sessionStorage.setItem(STORAGE_TREE_KEY, JSON.stringify(ids));
};
/**
* Expand a specified element in the sidebar.
* @param id - The expanded element's ID.
*/
global.sessionExpandSidebarElement = function(project, id, elements) {
var ids = global.sessionGetCollapsedSidebarElements();
var item = _.findWhere(ids, { prid: project});
var index = -1;
if (item) {
index = _.indexOf(item.ids, id);
global.recalculateElementsPositions(ids, item, elements);
} }
if (index !== -1) {
item.ids.splice(index, 1);
sessionStorage.setItem(STORAGE_TREE_KEY, JSON.stringify(ids));
}
};
/** /**
* Recalculate the position of the elements after an experiment * Recalculate the position of the elements after an experiment
* is added or archived. * is added or archived.
*/ */
global.recalculateElementsPositions = function(ids, item, elements) { function recalculateElementsPositions(ids, item, elements) {
var diff; let diff;
if (item.eleNum > elements) { if (item.eleNum > elements) {
diff = item.eleNum - elements; diff = item.eleNum - elements;
@ -86,10 +67,30 @@
} }
} }
/**
* Expand a specified element in the sidebar.
* @param id - The expanded element's ID.
*/
function sessionExpandSidebarElement(project, id, elements) {
var ids = sessionGetCollapsedSidebarElements();
var item = _.findWhere(ids, { prid: project });
var index = -1;
if (item) {
index = _.indexOf(item.ids, id);
recalculateElementsPositions(ids, item, elements);
}
if (index !== -1) {
item.ids.splice(index, 1);
sessionStorage.setItem(STORAGE_TREE_KEY, JSON.stringify(ids));
}
}
/** /**
* Setup the sidebar collapsing & expanding functionality. * Setup the sidebar collapsing & expanding functionality.
*/ */
global.setupSidebarTree = function() { function setupSidebarTree() {
$('.tree a').click(function() { $('.tree a').click(function() {
var url = new URL($(this).attr('href')); var url = new URL($(this).attr('href'));
url.searchParams.set('scroll', $('.tree').scrollTop()); url.searchParams.set('scroll', $('.tree').scrollTop());
@ -122,7 +123,7 @@
// Make active current project/experiment/task // Make active current project/experiment/task
function activateCurrent() { function activateCurrent() {
var sidebar = $('#slide-panel'); var sidebar = $(SIDEBAR_ID);
var projectId = sidebar.data('current-project'); var projectId = sidebar.data('current-project');
var experimentId = sidebar.data('current-experiment'); var experimentId = sidebar.data('current-experiment');
var taskId = sidebar.data('current-task'); var taskId = sidebar.data('current-task');
@ -172,28 +173,24 @@
); );
// Get the session-stored elements // Get the session-stored elements
var collapsedIds = global.sessionGetCollapsedSidebarElements(); let collapsedIds = sessionGetCollapsedSidebarElements();
// Get the current project stored elements // Get the current project stored elements
var currentProjectIds = _.findWhere(collapsedIds, { prid: project }); let currentProjectIds = _.findWhere(collapsedIds, { prid: project });
if (currentProjectIds) { if (currentProjectIds) {
currentProjectIds.ids = _.filter(currentProjectIds.ids, currentProjectIds.ids = _.filter(currentProjectIds.ids, function(val) { return val !== null; }).join(', ');
function(val) {
return val !== null;
}).join(", ");
// Collapse session-stored elements // Collapse session-stored elements
_.each($('li.parent_li[data-parent="candidate"]'), function(el) { _.each($('li.parent_li[data-parent="candidate"]'), function(el) {
var id = $(el).data("toggle-id"); var id = $(el).data('toggle-id');
var li = $(".tree li.parent_li[data-toggle-id='" + id + "']"); var li = $(".tree li.parent_li[data-toggle-id='" + id + "']");
if( li.hasClass("active") || li.find(".active").length > 0){ if (li.hasClass('active') || li.find('.active').length > 0) {
// Always expand the active element // Always expand the active element
toggleLi(li, toggleLi(li,
false, false,
false); false);
} else if ( $.inArray( id.toString(), } else if ($.inArray(id.toString(), currentProjectIds.ids.split(', ')) !== -1) {
currentProjectIds.ids.split(", ")) !== -1 ) {
// Expande element // Expande element
toggleLi(li, toggleLi(li,
false, false,
@ -208,70 +205,54 @@
} else { } else {
// Collapse all // Collapse all
_.each($('li.parent_li[data-parent="candidate"]'), function(el) { _.each($('li.parent_li[data-parent="candidate"]'), function(el) {
var id = $(el).data("toggle-id"); var id = $(el).data('toggle-id');
var li = $(".tree li.parent_li[data-toggle-id='" + id + "']"); var li = $(".tree li.parent_li[data-toggle-id='" + id + "']");
if( li.hasClass("active") ){ if (li.hasClass('active') || li.find('.active').length > 0) {
// Always expand the active element // Always expand the active element
toggleLi(li, toggleLi(li, false, false);
false,
false);
sessionCollapseSidebarElement(project, id); sessionCollapseSidebarElement(project, id);
} else { } else {
// Element collapsed by default // Element collapsed by default
toggleLi(li, toggleLi(li, true, false);
true,
false);
} }
}); });
} }
// Add onclick callback to every triangle icon // Add onclick callback to every triangle icon
$(".tree li.parent_li ") $('.tree li.parent_li ').find('> span i').on('click', function(e) {
.find("> span i") let el = $(this).parent('span').parent('li.parent_li');
.on("click", function (e) {
var el = $(this)
.parent("span")
.parent("li.parent_li");
if (el.find(" > ul > li").is(":visible")) { if (el.find(' > ul > li').is(':visible')) {
toggleLi(el, true, true); toggleLi(el, true, true);
sessionExpandSidebarElement(project, sessionExpandSidebarElement(project, el.data('toggle-id'), $('[data-parent="candidate"]').length);
el.data("toggle-id"),
$('[data-parent="candidate"]').length );
} else { } else {
toggleLi(el, false, true); toggleLi(el, false, true);
sessionCollapseSidebarElement(project, el.data("toggle-id")); sessionCollapseSidebarElement(project, el.data('toggle-id'));
} }
e.stopPropagation(); e.stopPropagation();
return false; return false;
}); });
// Add bold style to all levels of selected element // Add bold style to all levels of selected element
$(".tree li.active ") $('.tree li.active ').parents('.parent_li[data-parent="candidate"]').find('> span a').css('font-weight', 'bold');
.parents('.parent_li[data-parent="candidate"]')
.find("> span a")
.css("font-weight", "bold");
// Add custom borders to tree links // Add custom borders to tree links
$(".tree li span.tree-link ").after("<div class='border-custom'></div>"); $('.tree li span.tree-link ').after("<div class='border-custom'></div>");
} }
// Resize the sidebar to accomodate to the page size // Resize the sidebar to accomodate to the page size
global.resizeSidebarContents = function() { function resizeSidebarContents() {
var tree = $("#sidebar-wrapper .tree"); var tree = $('#sidebar-wrapper .tree');
// Set vertical scrollbar on navigation tree // Set vertical scrollbar on navigation tree
if (tree.length && tree.length == 1) { if (tree.length && tree.length === 1) {
tree.css( tree.css('height', ($(window).height() - tree.position().top - 50) + 'px');
"height",
($(window).height() - tree.position().top - 50) + "px"
);
} }
} }
function scrollToSelectedItem() { function scrollToSelectedItem() {
$('#slide-panel .tree').scrollTo($('.tree').data('scroll')); $(`${SIDEBAR_ID} .tree`).scrollTo($('.tree').data('scroll'));
} }
// Initialize click listeners // Initialize click listeners

View file

@ -196,6 +196,14 @@ function filesSizeValidator(ev, fileInputs, fileTypeEnum) {
return filesSizeValid; return filesSizeValid;
} }
function numberMinMaxValidator(value, min, max) {
if(parseInt(value) < min || isNaN(value))
return min;
else if(parseInt(value) > max)
return max;
else return value;
}
/* /*
* Overriden in billing module for checking whether enough * Overriden in billing module for checking whether enough
* team space is free. * team space is free.

View file

@ -225,6 +225,12 @@
} }
} }
table[data-editable=false] {
.assign-counter-container {
margin-left: 30px !important;
}
}
&.editing { &.editing {
tbody { tbody {
tr:hover { tr:hover {

View file

@ -5,10 +5,18 @@
width: 100%; width: 100%;
} }
#notifications {
left: 0;
position: fixed;
top: 0;
width: 100%;
z-index: 1100;
.alert-floating { .alert-floating {
align-items: center; align-items: center;
display: flex; display: flex;
height: 52px; height: 52px;
opacity: 1;
padding: 9px; padding: 9px;
.fas { .fas {
@ -23,9 +31,12 @@
} }
.close { .close {
opacity: .3;
right: 10px;
top: 0; top: 0;
} }
} }
}
.alert:not(.alert-floating) { .alert:not(.alert-floating) {
color: $color-volcano; color: $color-volcano;

View file

@ -367,23 +367,6 @@
padding: 10px 0 10px 30px; padding: 10px 0 10px 30px;
} }
// Alert
.alert {
&.alert-hidden {
display: none;
}
a#hide-alert {
margin-left: 15px;
}
&.alert-floating {
position: fixed;
top: 50px;
z-index: 1000;
}
}
#content-wrapper { #content-wrapper {
margin-top: 50px; margin-top: 50px;
margin-left: 83px; margin-left: 83px;

View file

@ -12,10 +12,6 @@ body,
min-width: 320px; min-width: 320px;
} }
#content-wrapper .container #notifications {
margin-left: -15px;
}
// Word wrapping everywhere, except for table header of "datatables.js" // Word wrapping everywhere, except for table header of "datatables.js"
body, body,
table.dataTable td { table.dataTable td {
@ -1921,18 +1917,6 @@ a.disabled-with-click-events {
cursor: not-allowed; cursor: not-allowed;
} }
#alert-flash {
button {
margin-right: 400px;
}
@media(max-width:768px) {
button {
display: none;
}
}
}
.linkedin-signin-button { .linkedin-signin-button {
margin: 15px 0; margin: 15px 0;
} }

View file

@ -57,10 +57,8 @@
<%= render partial: "/system_notifications/system_notification_modal", locals: { notification: nil} %> <%= render partial: "/system_notifications/system_notification_modal", locals: { notification: nil} %>
<% end %> <% end %>
<% unless user_signed_in? %>
<%= render partial: 'shared/flash_alerts', <%= render partial: 'shared/flash_alerts',
locals: { flash: flash, notice: notice, alert: alert } %> locals: { flash: flash, notice: notice, alert: alert } %>
<% end %>
<%= render "shared/left_menu_bar" if user_signed_in? %> <%= render "shared/left_menu_bar" if user_signed_in? %>

View file

@ -1,7 +1,5 @@
<% content_for :content do %> <% content_for :content do %>
<div class="container-fluid" id="wrapper"> <div class="container-fluid" id="wrapper">
<%= render partial: 'shared/flash_alerts',
locals: { flash: flash, notice: notice, alert: alert } %>
<div id="sidebar-wrapper" class="<%= yield :sidebar_wrapper_class %>"> <div id="sidebar-wrapper" class="<%= yield :sidebar_wrapper_class %>">
<%= yield :sidebar %> <%= yield :sidebar %>
<div id="sidebar-arrow" <div id="sidebar-arrow"

View file

@ -1,9 +1,5 @@
<% content_for :content do %> <% content_for :content do %>
<div class="container <%= yield :container_class %>"> <div class="container <%= yield :container_class %>">
<% if user_signed_in? %>
<%= render partial: 'shared/flash_alerts',
locals: { flash: flash, notice: notice, alert: alert } %>
<% end %>
<%= yield %> <%= yield %>
</div> </div>
<% end %> <% end %>

View file

@ -5,7 +5,8 @@
<%= t('libraries.manange_modal_column.number_type.decimals_label') %> <%= t('libraries.manange_modal_column.number_type.decimals_label') %>
</label> </label>
<div class="col-sm-3"> <div class="col-sm-3">
<%= number_field_tag('decimals', selected_decimals, in: 0...Constants::REPOSITORY_NUMBER_TYPE_MAX_DECIMALS, <%= number_field_tag('decimals', selected_decimals, between: 0...Constants::REPOSITORY_NUMBER_TYPE_MAX_DECIMALS,
class: 'form-control') %> class: 'form-control',
oninput: "this.value = numberMinMaxValidator(this.value, 0, #{Constants::REPOSITORY_NUMBER_TYPE_MAX_DECIMALS})" ) %>
</div> </div>
</div> </div>

View file

@ -7,6 +7,9 @@ services:
- scinote_development_postgres:/var/lib/postgresql/data - scinote_development_postgres:/var/lib/postgresql/data
ports: ports:
- "5432:5432" - "5432:5432"
environment:
- "POSTGRES_USER=postgres"
- "POSTGRES_PASSWORD=mysecretpassword"
web: web:
build: build: