diff --git a/app/assets/javascripts/navigation.js b/app/assets/javascripts/navigation.js index 8c7e77092..ee335fdce 100644 --- a/app/assets/javascripts/navigation.js +++ b/app/assets/javascripts/navigation.js @@ -80,8 +80,23 @@ } + function initGlobalSwitchForm() { + var teamSwitch = $('#team-switch'); + teamSwitch + .find('.dropdown-menu a') + .on('click', function(){ + $('#user_current_organization_id') + .val($(this).attr('data-id')); + + teamSwitch + .find('form') + .submit(); + }); + } + // init loadDropdownNotifications(); loadUnseenNotificationsNumber(); toggleNotificationBellPosition(); + initGlobalSwitchForm(); })(); diff --git a/app/assets/stylesheets/themes/scinote.scss b/app/assets/stylesheets/themes/scinote.scss index f80f78903..fd4050810 100644 --- a/app/assets/stylesheets/themes/scinote.scss +++ b/app/assets/stylesheets/themes/scinote.scss @@ -554,6 +554,35 @@ a[data-toggle="tooltip"] { } } +// Global team switch +#team-switch { + word-wrap: break-word; + + i { + margin-right: 5px; + } + + li { + display: block; + text-align: left; + word-wrap: break-word; + + &:hover { + background-color: $color-concrete; + } + + a { + color: $color-emperor; + display: block; + line-height: 1.6em; + padding: 3px 20px; + text-align: left; + text-decoration: none; + word-wrap: break-word; + } + } +} + /** Settings */ .nav-settings { margin-top: 15px; diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0a5765e62..7a9d21871 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -6,9 +6,10 @@ class ApplicationController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_action :authenticate_user! + helper_method :current_organization before_action :generate_intro_tutorial, if: :is_current_page_root? around_action :set_time_zone, if: :current_user - layout "main" + layout 'main' def forbidden render_403 @@ -19,7 +20,12 @@ class ApplicationController < ActionController::Base end def is_current_page_root? - controller_name == "projects" && action_name == "index" + controller_name == 'projects' && action_name == 'index' + end + + # Sets current organization for all controllers + def current_organization + Organization.find_by_id(current_user.current_organization_id) end protected diff --git a/app/controllers/experiments_controller.rb b/app/controllers/experiments_controller.rb index 99adbcf15..f181505da 100644 --- a/app/controllers/experiments_controller.rb +++ b/app/controllers/experiments_controller.rb @@ -1,5 +1,7 @@ class ExperimentsController < ApplicationController include PermissionHelper + include OrganizationsHelper + before_action :set_experiment, except: [:new, :create] before_action :set_project, @@ -55,6 +57,7 @@ class ExperimentsController < ApplicationController def canvas @project = @experiment.project + current_organization_switch(@project.organization) end def edit diff --git a/app/controllers/my_modules_controller.rb b/app/controllers/my_modules_controller.rb index 17c2fec7d..0fdd0b23d 100644 --- a/app/controllers/my_modules_controller.rb +++ b/app/controllers/my_modules_controller.rb @@ -1,5 +1,6 @@ class MyModulesController < ApplicationController include SampleActions + include OrganizationsHelper before_action :load_vars, only: [ :show, :edit, :update, :destroy, @@ -232,10 +233,14 @@ class MyModulesController < ApplicationController def protocols @protocol = @my_module.protocol + current_organization_switch(@protocol.organization) end def results - + current_organization_switch(@my_module + .experiment + .project + .organization) end def samples @@ -245,6 +250,10 @@ class MyModulesController < ApplicationController def archive @archived_results = @my_module.archived_results + current_organization_switch(@my_module + .experiment + .project + .organization) end # Submit actions diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index a9b04b088..bbd6ab229 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -1,6 +1,7 @@ class ProjectsController < ApplicationController include SampleActions include RenamingUtil + include OrganizationsHelper before_action :load_vars, only: [:show, :edit, :update, :notifications, :reports, @@ -23,10 +24,16 @@ class ProjectsController < ApplicationController DELETE_SAMPLES = I18n.t("samples.delete_samples") def index - @current_organization_id = params[:organization].to_i + if params[:organization] + current_organization_switch(Organization + .find_by_id(params[:organization])) + end + + @current_organization_id = current_organization.id @current_sort = params[:sort].to_s - @projects_by_orgs = current_user.projects_by_orgs( - @current_organization_id, @current_sort, @filter_by_archived) + @projects_by_orgs = current_user.projects_by_orgs(@current_organization_id, + @current_sort, + @filter_by_archived) @organizations = current_user.organizations # New project for create new project modal @@ -40,14 +47,14 @@ class ProjectsController < ApplicationController def new @project = Project.new - @organizations = current_user.organizations end def create @project = Project.new(project_params) - @project.created_by = current_user + @project.created_by = current_user @project.last_modified_by = current_user - if @project.save + if current_organization.id == project_params[:organization_id].to_i && + @project.save # Create user-project association up = UserProject.new( role: :owner, @@ -237,6 +244,7 @@ class ProjectsController < ApplicationController def show # This is the "info" view + current_organization_switch(@project.organization) end def notifications @@ -261,6 +269,7 @@ class ProjectsController < ApplicationController end def experiment_archive + current_organization_switch(@project.organization) end def samples_index diff --git a/app/controllers/protocols_controller.rb b/app/controllers/protocols_controller.rb index 29705c8ba..93cccf17c 100644 --- a/app/controllers/protocols_controller.rb +++ b/app/controllers/protocols_controller.rb @@ -741,9 +741,7 @@ class ProtocolsController < ApplicationController end def load_organization_and_type - @organizations = current_user.organizations.order(name: :asc) - @current_organization = @organizations.select{ |org| org.id == params[:organization].to_i }.first - @current_organization ||= @organizations.first + @current_organization = current_organization # :public, :private or :archive @type = (params[:type] || "public").to_sym end diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index 17ed7145c..cdfaf700f 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -1,4 +1,5 @@ class ReportsController < ApplicationController + include OrganizationsHelper # Ignore CSRF protection just for PDF generation (because it's # used via target='_blank') protect_from_forgery with: :exception, :except => :generate @@ -99,9 +100,10 @@ class ReportsController < ApplicationController def edit # cleans all the deleted report + current_organization_switch(@report.project.organization) @report.cleanup_report load_markdown - render "reports/new.html.erb" + render 'reports/new.html.erb' end # Updating existing report from the _save modal of the new page diff --git a/app/controllers/sample_my_modules_controller.rb b/app/controllers/sample_my_modules_controller.rb index 75568256c..f42b120ee 100644 --- a/app/controllers/sample_my_modules_controller.rb +++ b/app/controllers/sample_my_modules_controller.rb @@ -1,10 +1,15 @@ class SampleMyModulesController < ApplicationController + include OrganizationsHelper before_action :load_vars def index @number_of_samples = @my_module.number_of_samples @samples = @my_module.first_n_samples + current_organization_switch(@my_module + .experiment + .project + .organization) respond_to do |format| format.json { render :json => { diff --git a/app/controllers/samples_controller.rb b/app/controllers/samples_controller.rb index d90f99042..086d55c2e 100644 --- a/app/controllers/samples_controller.rb +++ b/app/controllers/samples_controller.rb @@ -279,7 +279,7 @@ class SamplesController < ApplicationController def load_vars @sample = Sample.find_by_id(params[:id]) - @organization = @sample.organization + @organization = current_organization unless @sample render_404 diff --git a/app/controllers/users/registrations_controller.rb b/app/controllers/users/registrations_controller.rb index e5ec05674..950ecfd44 100644 --- a/app/controllers/users/registrations_controller.rb +++ b/app/controllers/users/registrations_controller.rb @@ -158,6 +158,10 @@ class Users::RegistrationsController < Devise::RegistrationsController organization: @org, role: :admin ) + + # set current organization to new user + resource.current_organization_id = @org.id + resource.save end end diff --git a/app/controllers/users/settings_controller.rb b/app/controllers/users/settings_controller.rb index 57032dbc0..2d301d3d9 100644 --- a/app/controllers/users/settings_controller.rb +++ b/app/controllers/users/settings_controller.rb @@ -10,7 +10,8 @@ class Users::SettingsController < ApplicationController :organization_users_datatable, :tutorial, :reset_tutorial, - :notifications_settings + :notifications_settings, + :user_current_organization ] before_action :check_organization_permission, only: [ @@ -445,7 +446,8 @@ class Users::SettingsController < ApplicationController end def reset_tutorial - if @user.update(tutorial_status: 0) && params[:org][:id] + if @user.update(tutorial_status: 0) && params[:org][:id].present? + @user.update(current_organization_id: params[:org][:id]) cookies.delete :tutorial_data cookies.delete :current_tutorial_step cookies[:repeat_tutorial_org_id] = { @@ -491,6 +493,19 @@ class Users::SettingsController < ApplicationController end end + def user_current_organization + @user.current_organization_id = params[:user][:current_organization_id] + @changed_org = Organization.find_by_id(@user.current_organization_id) + if params[:user][:current_organization_id].present? && @user.save + flash[:success] = t('users.settings.changed_org_flash', + team: @changed_org.name) + redirect_to root_path + else + flash[:alert] = t('users.settings.changed_org_error_flash') + redirect_to :back + end + end + private def load_user diff --git a/app/helpers/organizations_helper.rb b/app/helpers/organizations_helper.rb index 24cc9a80e..2ffeaf09d 100644 --- a/app/helpers/organizations_helper.rb +++ b/app/helpers/organizations_helper.rb @@ -1,2 +1,18 @@ module OrganizationsHelper + # resets the current organization if needed + def current_organization_switch(org) + if org != current_organization + current_user.current_organization_id = org.id + current_user.save + end + end + + def truncate_organization_name(name, len = Constants::NAME_TRUNCATION_LENGTH) + if name.length > len + "".html_safe + else + name + end + end end diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 3bb3591be..ee40a4c92 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -6,4 +6,15 @@ module SearchHelper end experiments.uniq end + + def route_to_other_org(path, search_org, text) + if search_org != current_organization + link_to text, + path, + data: { confirm: t('users.settings.changed_org_in_search', + team: search_org.name) } + else + link_to text, path + end + end end diff --git a/app/utilities/users_generator.rb b/app/utilities/users_generator.rb index d3d8d02da..5c3c0ba3c 100644 --- a/app/utilities/users_generator.rb +++ b/app/utilities/users_generator.rb @@ -56,6 +56,10 @@ module UsersGenerator end end + # Assign user organization as user current organization + nu.current_organization_id = nu.organizations.first.id + nu.save! + nu.reload return nu end @@ -85,4 +89,4 @@ module UsersGenerator full_name.split(" ").collect{ |n| n.capitalize[0] }.join[0..3] end -end \ No newline at end of file +end diff --git a/app/views/projects/_new.html.erb b/app/views/projects/_new.html.erb index 3ed45746c..1f476b610 100644 --- a/app/views/projects/_new.html.erb +++ b/app/views/projects/_new.html.erb @@ -1,15 +1,7 @@
<%= form.text_field :name, label: t("projects.index.modal_new_project.name"), autofocus: true, placeholder: t("projects.index.modal_new_project.name_placeholder") %> -
-
- -
-
-
- <%= form.label t("projects.index.modal_new_project.organization") %> - <%= collection_select(:project, :organization_id, @organizations, :id, :name, {}, { :class => "form-control"} ) %> -
+ <%= hidden_field :project, :organization_id, value: current_organization.id %>
diff --git a/app/views/projects/index.html.erb b/app/views/projects/index.html.erb index cf0129a2c..e376decd4 100644 --- a/app/views/projects/index.html.erb +++ b/app/views/projects/index.html.erb @@ -77,27 +77,6 @@ <% end %> - - - +<% else %> + <% end %> -<% if @projects_by_orgs.length > 0 %> - <% @projects_by_orgs.each do |org, projects| %> - <%= render partial: "projects/index/org_projects", locals: {org: org, projects: projects} %> - <% end %> +<% if current_organization.projects.length > 0 %> + <%= render partial: "projects/index/org_projects", + locals: { org: current_organization, + projects: current_organization.projects } %> + <% end %> <%= javascript_include_tag "projects/index", "data-turbolinks-track" => true %> diff --git a/app/views/projects/index/_org_projects.html.erb b/app/views/projects/index/_org_projects.html.erb index e5ddb0496..7aab961a9 100644 --- a/app/views/projects/index/_org_projects.html.erb +++ b/app/views/projects/index/_org_projects.html.erb @@ -1,5 +1,3 @@ - -
<% projects.each_index do |i| project = projects[i] %>
diff --git a/app/views/protocols/_breadcrumbs.html.erb b/app/views/protocols/_breadcrumbs.html.erb index 99bff0afb..9891d4adc 100644 --- a/app/views/protocols/_breadcrumbs.html.erb +++ b/app/views/protocols/_breadcrumbs.html.erb @@ -1,20 +1,7 @@ \ No newline at end of file + diff --git a/app/views/protocols/index.html.erb b/app/views/protocols/index.html.erb index bbcbe57ab..ba14ede53 100644 --- a/app/views/protocols/index.html.erb +++ b/app/views/protocols/index.html.erb @@ -1,6 +1,6 @@ <% provide(:head_title, t("protocols.index.head_title")) %> -<% if @organizations.count > 0 %> +<% if current_organization %> <%= render partial: "protocols/breadcrumbs.html.erb", locals: { organizations: @organizations, current_organization: @current_organization, type: @type } %> + + <% if current_user.organizations.length > 1 %> + + <% end %> +