mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-09-28 19:06:18 +08:00
81a9a7225b
* Add initial implementation of inventory stock management [SCI-6402]
* Add stock column type (#3786)
* Add stock column type
* Create new stock column [SCI-6410]
* Small fixed for stock column [SCI-6410]
* Add stock column validations [SCI-6410]
Co-authored-by: Anton <anton@scinote.net>
* Add stock table renders [SCI-6412] (#3787)
Co-authored-by: Anton <anton@scinote.net>
* Implemented stock management modal [SCI-6417] (#3788)
* Implement inventory stock management modal [SCI-6417]
* Add generalized validation mechanic, some bugfixes [SCI-6417]
* Fix permission check and method name in RepositoryStockValue [SCI-6417]
* Add stock and consumption to assigned items section [SCI-6434] (#3793)
* Added UPDATE_STOCK_CONSUMPTION to MyModule permissons [SCI-6418] (#3781)
* Fix invalid return in reports jobs [SCI-6409] (#3777)
* Added UPDATE_STOCK_CONSUMPTION to MyModule permissons [SCI-6418]
* Add current/new amount section to stock [SCI-6416] (#3791)
Co-authored-by: Anton <anton@scinote.net>
* Task stock consumption modal[SCI-6444][SCI-6445] (#3798)
Add main logic for consumption on task [SCI-6444]
Co-authored-by: Anton <anton@scinote.net>
* Add stock management columns to snapshots [SCI-6448]
* Handle stock management in full table views [SCI-6440]
* Implement stock management activities [SCI-6452] (#3810)
* Implement stock management activities [SCI-6452]
* PR code fixes [SCI-6452]
* Implement import for repository stock values [SCI-6461] (#3818)
* Add permissions checking to assigned items view on tasks [SCI-6435] (#3801)
* Add front-end validation for comments field [SCI-6464] (#3829)
Co-authored-by: Anton <anton@scinote.net>
* Add stock consumption to pdf and docx [SCI-6460] (#3816)
Co-authored-by: Anton <anton@scinote.net>
* Add support of repository snapshots to assigned items section [SCI-6439] (#3828)
* Change subject of Repository (#3838)
* Fixed full view assigned items modal stock consumption (#3846)
* Implement repository snapshots displaying on assigned items full view modal [SCI-6442] (#3862)
* Implement low stock threshold column [SCI-6555] (#3907)
* Stock column fixes [SCI-6455] (#3878)
* Fix issues with stock column management [SCI-6455]
* Refactor stock column in datatables [SCI-6455]
* Fix tests [SCI-6486] (#3913)
* Fix tests [SCI-6486]
* Fix rspec tests [SCI-6486]
Co-authored-by: Anton <anton@scinote.net>
* Implement basic logic for Date/DateTime/Stock reminders [SCI-6554] (#3911)
* Implement basic logic for Date/DateTime/Stock reminders [SCI-6554]
* Implement bell icon [SCI-6500]
* Refactor reminder cells scope [SCI-6554]
* Add red dot for date/datetime reminder [SCI-6499] (#3924)
Co-authored-by: Anton <anton@scinote.net>
* Add reminders to stock modal [SCI-6557] (#3917)
Co-authored-by: Anton <anton@scinote.net>
* Add flyout for repository reminders [SCI-6501] (#3926)
Co-authored-by: Anton <anton@scinote.net>
* Fix moving experiment [SCI-6602] (#3927)
* Update Rails to 6.1.4.7 [SCI-6615] (#3928)
* Task inventory activity for assigned item consumption [SCI-6453] (#3830)
* Add task inventory activity [SCI-6453]
* Apply user's time zone in advanced filters for time data type [SCI-6585] (#3930)
* Bump version to 1.24.2
* Implement hidden repository cell reminders [SCI-6504] (#3933)
* Low stock flyout reminders [SCI-6502] (#3932)
* Display low stock flyout reminder [SCI-6502]
* Display low stock flyout reminder [SCI-6502]
* Adapt showing stock reminders for every bell icon click [SCI-6502]
* Correct hound error [SCI-6502]
* Fix event registration for fetching reminder data [SCI-6502]
* Fix event registration for fetching reminder data [SCI-6502]
* Fix hound [SCI-6502]
* Remove not needed line [SCI-6502]
* Add reminder template [SCI-6502]
* Add clearing messages [SCI-6502]
* Displaying low stock warning [SCI-6497] (#3912)
* Low stock warning [SCI-6497
* Fix some bugs [SCI-6497]
* Fix to long line [SCI-6497]
* Clean not needed information in renderes [SCI-6497]
* Icon bell reminder for an assigned item on the task [SCI-6506] (#3929)
* Add bell icon on assigned task [SCI-6506]
* Add flyout and improve quering [SCI-6506]
* Refactor repository toolbar [SCI-6545] (#3943)
Co-authored-by: Anton <anton@scinote.net>
* Add datetime reminders to columns modal [SCI-6556] (#3934)
Co-authored-by: Anton <anton@scinote.net>
* Hide reminders for archived repositories [SCI-6609] (#3941)
* Hide reminders for archived repositories [SCI-6609]
* Always pass repository in datatable helper [SCI-6609]
* Handle locked stock consumption state [SCI-6608] (#3942)
* Change env variable name for s3 bucket region [SCI-6603] (#3944)
* Add last_transition_error column to tasks [SCI-6610] (#3949)
* Add microtransactions to stock consumptions [SCI-6626] (#3948)
Co-authored-by: Anton <anton@scinote.net>
* Date remidner flyout [SCI-6503] (#3937)
* Implement date reminder flyout [SCI-6503]
* Show only days left for date reminder [SCI-6503]
* Pluralize day in reminders [SCI-6503]
* Create partials for different reminders [SCI-6503]
* Unify css for reminder [SCI-6503]
* Add micro interactions for stock modal [SCI-6625] (#3947)
Co-authored-by: Anton <anton@scinote.net>
* Hide options to add New Tags for users without permissions on Task level [SCI-6573] (#3945)
* Bump lodash-es from 4.17.15 to 4.17.21 (#3939)
Bumps [lodash-es](https://github.com/lodash/lodash) from 4.17.15 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.21)
---
updated-dependencies:
- dependency-name: lodash-es
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Implement clearing hidden repository reminders [SCI-6507] (#3936)
* Add stock filters [SCI-6547] (#3938)
Co-authored-by: Anton <anton@scinote.net>
* Fix assign view for task repository [SCI-6648] (#3954)
Co-authored-by: Anton <anton@scinote.net>
* Add micro-interactions to reminders flyout [SCI-6627] (#3951)
Co-authored-by: Anton <anton@scinote.net>
* Improve error reporting in task status transition [SCI-6611] (#3952)
* Add ordering to global search results [SCI-6639] (#3960)
* Fix multiple stock bugs [SCI-6651] (#3959)
Co-authored-by: Anton <anton@scinote.net>
* Fix large previews for csv files [SCI-6619] (#3961)
* Add alias to cell sort query, to prevent join conflicts [SCI-6649] (#3953)
* Add alias to cell sort query, to prevent join conflicts [SCI-6649]
* Added value_type to join condition to make use of DB index [SCI-6649]
* Update front end validation for columns managment [SCI-6657] (#3962)
Co-authored-by: Anton <anton@scinote.net>
* Print protocol smart annotation and table improvements [SCI-6566] (#3925)
* Improve table printing in the print menu [SCI-6566]
* Open smart annotation in new tab for print view [SCI-6566]
* Unify naming of same parameter [SCI-6566]
* Fix typo [SCI-6566]
* Fix hound errors [SCI-6566]
* Add stock management toggling [SCI-6653] (#3967)
Co-authored-by: Anton <anton@scinote.net>
* Fix caching of an experiment card dropdown [SCI-6606] (#3963)
* Add stock consumption permission to user roles [SCI-6665] (#3966)
* Show archive icon only on archived projects in the header [SCI-6617] (#3965)
* Fix assigned items fullview modal [SCI-6664] (#3968)
* Implement hide all repository reminders button [SCI-6505] (#3940)
* Viewer role does not see any tasks in archived project [SCI-6616] (#3958)
* Fix viewer role not see any tasks in archived project [SCI-6616]
* Fix rollback for add read archive permission migration [SCI-6616]
* Stock modal bugs [SCI-6667] (#3970)
Co-authored-by: Anton <anton@scinote.net>
* Always use Tika text extractor in server mode [SCI-6658] (#3957)
* Implement stock consumption via the API [SCI-6642] (#3964)
* Implement stock consumption via the API [SCI-6642]
* Remove unnecessary attribute from InventoryItemSerializer [SCI-6642]
* Amend permission check, add nested transaction support to consume_stock method [SCI-6642]
* Toolbar fixes [SCI-6670] (#3973)
Co-authored-by: Anton <anton@scinote.net>
* Make stock column work properly with different orders [SCI-6677] (#3974)
* Fix filters loading for stock filter [SCI-6687] (#3975)
Co-authored-by: Anton <anton@scinote.net>
* Hide reminders and disable stock consumption for archived items [SCI-6689] (#3978)
* Fix red dot for datetime columns [SCI-6684] (#3977)
Co-authored-by: Anton <anton@scinote.net>
* Fix saving of inventory date time reminders saving [SCI-6672] (#3976)
* Bump puma from 5.6.2 to 5.6.4 (#3972)
Bumps [puma](https://github.com/puma/puma) from 5.6.2 to 5.6.4.
- [Release notes](https://github.com/puma/puma/releases)
- [Changelog](https://github.com/puma/puma/blob/master/History.md)
- [Commits](https://github.com/puma/puma/compare/v5.6.2...v5.6.4)
---
updated-dependencies:
- dependency-name: puma
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Don't load reminders if the stock feature is disabled [SCI-6673] (#3981)
* Don't load reminders if the stock feature is disabled [SCI-6673]
* Don't load reminders if the stock feature is disabled [SCI-6673]
* Unify stock management enabled check [6673]
* Update repository card view for stock [SCI-6685] (#3982)
Co-authored-by: Anton <anton@scinote.net>
* Disable stock managememnt for all tables in my module context [SCI-6692] (#3983)
* Implement failed snapshot pop-up on task screen [SCI-6612] (#3950)
* Implement failed snapshot pop-up on task screen [SCI-6612]
* Copy change [SCI-6612]
* Proper handling of snapshot transition error [SCI-6612]
* Move modal auto open logic to JS file [SCI-6612]
* Remove unnecessary .html_safe [SCI-6612]
* Fix assigning and consuming items [SCI-6686] (#3985)
* Repository toolbar CSS fixes [SCI-6676] (#3984)
Co-authored-by: Anton <anton@scinote.net>
* Add basic validation to reminder value to prevent integer overflow errors [SCI-6693] (#3986)
* Fix reminder dropdown on task screen [SCI-6678] (#3987)
Co-authored-by: Anton <anton@scinote.net>
* Fix inventory sorting with date time reminders [SCI-6683] (#3980)
* Fix css stock modal [SCI-6675] (#3989)
Co-authored-by: Anton <anton@scinote.net>
* Stock column management UX/UI fixes [SCI-6674] (#3979)
* Fix red dot for dates in repository [SCI-6696] (#3991)
Co-authored-by: Anton <anton@scinote.net>
* Added styling for failed snapshots in sidebar [SCI-6636] (#3990)
* Added styling for failed snapshots in sidebar [SCI-6636]
* Simplify markup for failed icon [SCI-6636]
* Turn off autocomplete for stock amount/reminder [SCI-6694] (#3988)
* Override error styling in stock column management [SCI-6674] (#3995)
* Fix repository full view tables without stock management [SCI-6703] (#3994)
* Add pagination to projects list [SCI-6655]
* Add reminder preset to date(time) reminders [SCI-6693] (#3996)
* Fix color on consumption link [SCI-6686] (#3992)
* Fix sorting by date time columns in inventories [SCI-6683] (#4002)
* Improve loading of the dashboard [SCI-6618] (#4001)
* Stock modal UX fixes [SCI-6714] (#3998)
Co-authored-by: Anton <anton@scinote.net>
* Fix css for stotck modal [SCI-6698] (#3999)
Co-authored-by: Anton <anton@scinote.net>
* API: add endpoint for updating of stock [SCI-6549] (#3955)
* Add test for Stock repository cell [SCI-6549]
* Create and update stock inventory cell [SCI-6549]
* Fix hound errors [SCI-6549]
* Fix ledger recording [SCI-6549]
* Fix api endpoint [SCI-6549]
* Fix hound [SCI-6549]
* Fix collapsing of assigned items tables [SCI-6705] (#4000)
* API: add endpoint for creating stock column [SCI-6550] (#3956)
* Add test for repositoty stock column api [SCI-6550]
* Create and update stock column [SCI-6550]
* Change stock unit [SCI-6550]
* Fix hound [SCI-6550]
* Fix on delete [SCI-6550]
* Fix houd [SCI-6550]
* Removed autofocus clear on open reminder flyout [SCI-6690] (#4003)
* Removed clear autofocus on open reminder flyout [SCI-6690]
* Fix hound [SCI-6690]
* Adding/changing stock consumption [SCI-6708] (#4005)
* Adding/changing stock consumption [SCI-6708]
* Fix hound [SCI-6708]
* Remove date red dots for snapshots [SCI-6715] (#4004)
Co-authored-by: Anton <anton@scinote.net>
* Add snapshot error message below task status [SCI-6614] (#4009)
* Add repository snapshot error modal [SCI-6613] (#3993)
* Bump nokogiri from 1.13.3 to 1.13.4 (#4008)
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.13.3 to 1.13.4.
- [Release notes](https://github.com/sparklemotion/nokogiri/releases)
- [Changelog](https://github.com/sparklemotion/nokogiri/blob/v1.13.4/CHANGELOG.md)
- [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.13.3...v1.13.4)
---
updated-dependencies:
- dependency-name: nokogiri
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Add pagination for experiments [SCI-6656]
* Fix sorting by time and time range columns [SCI-6683] (#4011)
* Bump moment from 2.24.0 to 2.29.2 (#4006)
Bumps [moment](https://github.com/moment/moment) from 2.24.0 to 2.29.2.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.24.0...2.29.2)
---
updated-dependencies:
- dependency-name: moment
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Align items in assigned item section [SCI-6707] (#4007)
* Add locking and unique index to repository row assigning [SCI-6591] (#3921)
* tmp (#3935)
* Revert "tmp (#3935)" (#4014)
This reverts commit 043086d55f
.
* Move cursor to end of value when focusing consumption amount [SCI-6727] (#4013)
* Fix removing stock reminder threshold [SCI-6724] (#4010)
* Stock small ux fixes [SCI-6714] (#4015)
Co-authored-by: Anton <anton@scinote.net>
* Add aibility to delete stock column [SCI-6723] (#4017)
Co-authored-by: Anton <anton@scinote.net>
* Fix red dot for date reminders [SCI-6696] (#4016)
Co-authored-by: Anton <anton@scinote.net>
* Change the way setting stock works [SCI-6730] (#4018)
* Fix error modal opening on successful snapshot [SCI-6726] (#4019)
* Refactor and fix display of stock warnings and stock consumption [SCI-6734] (#4021)
* Refactor and fix how stock consumption is displayed [SCI-6734]
* Refactor and fix display of stock warnings [SCI-6734]
* Fix stock consumption in reports [SCI-6735]
* Fix markup
* Focus authenticator code field [SCI-6716] (#4022)
* Hide reminders settings and red dots if stock is disabled [SCI-6673] (#4024)
* Fix decimals in stock consumption modal [SCI-6732]
* Add edit title for stock consumption modal [SCI-6731]
* Highlight negative stock in modal with red [SCI-6729]
* Stock management test [SCI-6420] (#3946)
* Initial test for stock management
* Repository stock values adding [does not work] SCI-6420
* Fix typos SCI-6420
* Fix test [SCI-6420]
* Test changes [SCI-6402]
* Remove locking test [SCI-6420]
* Remove lock [SCI-6420]
* Remove serializer [SCI-6420]
* Fix stock test and add ledger creation on consume [SCI-6420]
* Fix inviting users to team [SCI-6725] (#4026)
* Improve stock ledger records creation [SCI-6419]
* Fix stock modal add/remove value preset value [SCI-6740]
* API GET repository stock column output fix [SCI-6550] (#4030)
* Add include stock unit items to Stock column get [SCI-6550]
* Fix stock column test [SCI-6550]
* Fix hound [SCI-6550]
* Move list-type column includes to param, unify naming [SCI-6738] (#4036)
* Add default includes for inventory columns with lists [SCI-6738]
* Move list-type column includes to param, unify naming [SCI-6738]
* Fix snapshot consumption display [SCI-6734] (#4035)
* Fix decimal render function [SCI-6742] (#4037)
Co-authored-by: Anton <anton@scinote.net>
* Add comment to repository stock activities [SCI-6746]
* Fix default stock column default units selection [SCI-6744]
* Add negative validation for stock [SCI-6743]
* Highlight negative value in consumption modal [SCI-6741]
* Fix snapshot creation with stock consumption [SCI-6762]
* Update stock value without reloading the table [SCI-6745] (#4041)
* Allow tag creation on task level if you have permission [SCI-6573] (#4031)
* Enable team normal user to edit repository files [SCI-6765] (#4049)
* Add negative validation for treshold [SCI-6743]
* Copy fix [SCI-6762] (#4048)
* Add bell icon for negative stock [SCI-6770]
* Fix formatting of stock consumption on tasks [SCI-6737] (#4050)
* Fix duplicated inventories on tasks for export all [SCI-6776]
* Stock / stock consumption display fixes [SCI-6771] (#4054)
* Fix blank stock consumption representation in reports [SCI-6769]
* Upgrade Rails to 6.1.5.1
* Show last page message only after second page [SCI-6761]
* Small CSS fixes for repository [SCI-6767]
* Added validations for date(time) column reminder [SCI-6775] (#4063)
* Upgrade Ruby to 2.7.6
* Open repository on print view [SCI-6566] (#4055)
* Fix saving of new date time columns with reminders [SCI-6774] (#4068)
* Improve input field for adding new team [SCI-6155]
* Allow deleteion of stock columns when stock management is disabled [SCI-6800]
* Update default label template [SCI-6763] (#4064)
* Stock editing and reminder fixes [SCI-6803] (#4078)
* Fix stock editing after adding new value [SCI-6803]
* Don't load reminders for snapshots [SCI-6803]
* Improve loading time of canvas view/edit [SCI-6797]
* Fix stock consumption rounding [SCI-6807]
* Fix displaying of stock consumption units [SCI-6795]
* Fix task dropdown actions [SCI-6817]
* Fix archived tasks view [SCI-6822]
* Fix display of repository snapshot with stock consumption [SCI-6824]
* Fix duplicated counters on task card [SCI-6825]
* Bump version to 1.25.0
Co-authored-by: Oleksii Kriuchykhin <okriuchykhin@biosistemika.com>
Co-authored-by: aignatov-bio <47317017+aignatov-bio@users.noreply.github.com>
Co-authored-by: Anton <anton@scinote.net>
Co-authored-by: ajugo <andrej.jugovic7@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
440 lines
14 KiB
Ruby
440 lines
14 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ProjectsController < ApplicationController
|
|
include RenamingUtil
|
|
include TeamsHelper
|
|
include InputSanitizeHelper
|
|
include ProjectsHelper
|
|
include CardsViewHelper
|
|
include ExperimentsHelper
|
|
|
|
attr_reader :current_folder
|
|
helper_method :current_folder
|
|
|
|
before_action :switch_team_with_param, only: :index
|
|
before_action :load_vars, only: %i(show edit update notifications sidebar experiments_cards view_type)
|
|
before_action :load_current_folder, only: %i(index cards new show)
|
|
before_action :check_view_permissions, only: %i(show notifications sidebar experiments_cards view_type)
|
|
before_action :check_create_permissions, only: %i(new create)
|
|
before_action :check_manage_permissions, only: :edit
|
|
before_action :set_inline_name_editing, only: %i(show)
|
|
before_action :load_exp_sort_var, only: :show
|
|
before_action :reset_invalid_view_state, only: %i(index cards show)
|
|
before_action :set_folder_inline_name_editing, only: %i(index cards)
|
|
|
|
layout 'fluid'
|
|
|
|
def index
|
|
if current_team
|
|
view_state = current_team.current_view_state(current_user)
|
|
@current_sort = view_state.state.dig('projects', projects_view_mode, 'sort') || 'atoz'
|
|
@current_view_type = view_state.state.dig('projects', 'view_type')
|
|
end
|
|
end
|
|
|
|
def cards
|
|
overview_service = ProjectsOverviewService.new(current_team, current_user, current_folder, params)
|
|
title = params[:view_mode] == 'archived' ? t('projects.index.head_title_archived') : t('projects.index.head_title')
|
|
|
|
if filters_included?
|
|
render json: {
|
|
toolbar_html: render_to_string(partial: 'projects/index/toolbar.html.erb'),
|
|
filtered: true,
|
|
cards_html: render_to_string(
|
|
partial: 'projects/index/team_projects_grouped_by_folder.html.erb',
|
|
locals: { projects_by_folder: overview_service.grouped_by_folder_project_cards }
|
|
)
|
|
}
|
|
else
|
|
if current_folder
|
|
breadcrumbs_html = render_to_string(partial: 'projects/index/breadcrumbs.html.erb',
|
|
locals: { target_folder: current_folder, folder_page: true })
|
|
projects_cards_url = project_folder_cards_url(current_folder)
|
|
title = if @inline_editable_title_config.present?
|
|
render_to_string(partial: 'shared/inline_editing',
|
|
locals: {
|
|
initial_value: current_folder&.name,
|
|
config: @inline_editable_title_config
|
|
})
|
|
else
|
|
current_folder.name
|
|
end
|
|
else
|
|
breadcrumbs_html = ''
|
|
projects_cards_url = cards_projects_url
|
|
end
|
|
|
|
cards = Kaminari.paginate_array(overview_service.project_and_folder_cards)
|
|
.page(params[:page] || 1).per(Constants::DEFAULT_ELEMENTS_PER_PAGE)
|
|
|
|
render json: {
|
|
projects_cards_url: projects_cards_url,
|
|
breadcrumbs_html: breadcrumbs_html,
|
|
title: title,
|
|
next_page: cards.next_page,
|
|
toolbar_html: render_to_string(partial: 'projects/index/toolbar.html.erb'),
|
|
cards_html: render_to_string(
|
|
partial: 'projects/index/team_projects.html.erb',
|
|
locals: { cards: cards }
|
|
)
|
|
}
|
|
end
|
|
end
|
|
|
|
def sidebar
|
|
@current_sort = @project.current_view_state(current_user).state.dig('experiments', params[:view_mode], 'sort')
|
|
render json: {
|
|
html: render_to_string(
|
|
partial: 'shared/sidebar/experiments.html.erb', locals: {
|
|
project: @project,
|
|
view_mode: experiments_view_mode(@project)
|
|
}
|
|
)
|
|
}
|
|
end
|
|
|
|
def new
|
|
@project = current_team.projects.new(project_folder: current_folder)
|
|
respond_to do |format|
|
|
format.json do
|
|
render json: {
|
|
html: render_to_string(
|
|
partial: 'projects/index/modals/new_project.html.erb'
|
|
)
|
|
}
|
|
end
|
|
end
|
|
end
|
|
|
|
def create
|
|
@project = current_team.projects.new(project_params)
|
|
@project.created_by = current_user
|
|
@project.last_modified_by = current_user
|
|
if @project.save
|
|
# Create user-project association
|
|
user_project = UserProject.new(
|
|
role: :owner,
|
|
user: current_user,
|
|
project: @project
|
|
)
|
|
user_project.save
|
|
log_activity(:create_project)
|
|
|
|
message = t('projects.create.success_flash', name: escape_input(@project.name))
|
|
respond_to do |format|
|
|
format.json do
|
|
render json: { message: message }, status: :ok
|
|
end
|
|
end
|
|
else
|
|
respond_to do |format|
|
|
format.json do
|
|
render json: @project.errors, status: :unprocessable_entity
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def edit
|
|
render json: {
|
|
html: render_to_string(partial: 'projects/index/modals/edit_project_contents.html.erb',
|
|
locals: { project: @project })
|
|
|
|
}
|
|
end
|
|
|
|
def update
|
|
return_error = false
|
|
flash_error = t('projects.update.error_flash', name: escape_input(@project.name))
|
|
|
|
# Check archive permissions if archiving/restoring
|
|
if project_params.include? :archived
|
|
if (project_params[:archived] == 'true' &&
|
|
!can_archive_project?(@project)) ||
|
|
(project_params[:archived] == 'false' &&
|
|
!can_restore_project?(@project))
|
|
return_error = true
|
|
is_archive = project_params[:archived] == 'true' ? 'archive' : 'restore'
|
|
flash_error =
|
|
t("projects.#{is_archive}.error_flash", name: escape_input(@project.name))
|
|
end
|
|
elsif !can_manage_project?(@project)
|
|
render_403 && return
|
|
end
|
|
|
|
message_renamed = nil
|
|
message_visibility = nil
|
|
if (project_params.include? :name) &&
|
|
(project_params[:name] != @project.name)
|
|
message_renamed = true
|
|
end
|
|
if (project_params.include? :visibility) &&
|
|
(project_params[:visibility] != @project.visibility)
|
|
message_visibility = if project_params[:visibility] == 'visible'
|
|
t('projects.activity.visibility_visible')
|
|
else
|
|
t('projects.activity.visibility_hidden')
|
|
end
|
|
end
|
|
|
|
@project.last_modified_by = current_user
|
|
if !return_error && @project.update(project_params)
|
|
# Add activities if needed
|
|
|
|
log_activity(:change_project_visibility, @project, visibility: message_visibility) if message_visibility.present?
|
|
log_activity(:rename_project) if message_renamed.present?
|
|
log_activity(:archive_project) if project_params[:archived] == 'true'
|
|
log_activity(:restore_project) if project_params[:archived] == 'false'
|
|
|
|
flash_success = t('projects.update.success_flash', name: escape_input(@project.name))
|
|
if project_params[:archived] == 'true'
|
|
flash_success = t('projects.archive.success_flash', name: escape_input(@project.name))
|
|
elsif project_params[:archived] == 'false'
|
|
flash_success = t('projects.restore.success_flash', name: escape_input(@project.name))
|
|
end
|
|
respond_to do |format|
|
|
format.html do
|
|
# Redirect URL for archive view is different as for other views.
|
|
if project_params[:archived] == 'false'
|
|
# The project should be restored
|
|
unless @project.archived
|
|
@project.restore(current_user)
|
|
end
|
|
elsif @project.archived
|
|
# The project should be archived
|
|
@project.archive(current_user)
|
|
end
|
|
redirect_to projects_path
|
|
flash[:success] = flash_success
|
|
end
|
|
format.json do
|
|
render json: {
|
|
status: :ok,
|
|
message: flash_success
|
|
}
|
|
end
|
|
end
|
|
else
|
|
return_error = true
|
|
end
|
|
|
|
if return_error
|
|
respond_to do |format|
|
|
format.html do
|
|
flash[:error] = flash_error
|
|
# Redirect URL for archive view is different as for other views.
|
|
if URI(request.referer).path == projects_archive_path
|
|
redirect_to projects_archive_path
|
|
else
|
|
redirect_to projects_path
|
|
end
|
|
end
|
|
format.json do
|
|
render json: { message: flash_error, errors: @project.errors },
|
|
status: :unprocessable_entity
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def archive_group
|
|
projects = current_team.projects.active.where(id: params[:projects_ids])
|
|
counter = 0
|
|
projects.each do |project|
|
|
next unless can_archive_project?(project)
|
|
|
|
project.transaction do
|
|
project.archive!(current_user)
|
|
log_activity(:archive_project, project)
|
|
counter += 1
|
|
rescue StandardError => e
|
|
Rails.logger.error e.message
|
|
raise ActiveRecord::Rollback
|
|
end
|
|
end
|
|
if counter.positive?
|
|
render json: { message: t('projects.archive_group.success_flash', number: counter) }
|
|
else
|
|
render json: { message: t('projects.archive_group.error_flash') }, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
def restore_group
|
|
projects = current_team.projects.archived.where(id: params[:projects_ids])
|
|
counter = 0
|
|
projects.each do |project|
|
|
next unless can_restore_project?(project)
|
|
|
|
project.transaction do
|
|
project.restore!(current_user)
|
|
log_activity(:restore_project, project)
|
|
counter += 1
|
|
rescue StandardError => e
|
|
Rails.logger.error e.message
|
|
raise ActiveRecord::Rollback
|
|
end
|
|
end
|
|
if counter.positive?
|
|
render json: { message: t('projects.restore_group.success_flash', number: counter) }
|
|
else
|
|
render json: { message: t('projects.restore_group.error_flash') }, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
def show
|
|
# This is the "info" view
|
|
current_team_switch(@project.team)
|
|
|
|
view_state = @project.current_view_state(current_user)
|
|
@current_sort = view_state.state.dig('experiments', experiments_view_mode(@project), 'sort') || 'atoz'
|
|
@current_view_type = view_state.state.dig('experiments', 'view_type')
|
|
end
|
|
|
|
def experiments_cards
|
|
overview_service = ExperimentsOverviewService.new(@project, current_user, params)
|
|
cards = overview_service.experiments.page(params[:page] || 1).per(Constants::DEFAULT_ELEMENTS_PER_PAGE)
|
|
render json: {
|
|
next_page: cards.next_page,
|
|
cards_html: render_to_string(
|
|
partial: 'projects/show/experiments_list.html.erb',
|
|
locals: { cards: cards,
|
|
filters_included: filters_included? }
|
|
)
|
|
}
|
|
end
|
|
|
|
def notifications
|
|
@modules = @project
|
|
.assigned_modules(current_user)
|
|
.order(due_date: :desc)
|
|
respond_to do |format|
|
|
#format.html
|
|
format.json {
|
|
render :json => {
|
|
:html => render_to_string({
|
|
:partial => "notifications.html.erb"
|
|
})
|
|
}
|
|
}
|
|
end
|
|
end
|
|
|
|
def users_filter
|
|
users = current_team.users.search(false, params[:query]).map do |u|
|
|
{ value: u.id, label: sanitize_input(u.name), params: { avatar_url: avatar_path(u, :icon_small) } }
|
|
end
|
|
|
|
render json: users, status: :ok
|
|
end
|
|
|
|
def view_type
|
|
view_state = @project.current_view_state(current_user)
|
|
view_state.state['experiments']['view_type'] = view_type_params
|
|
view_state.save!
|
|
|
|
render json: { cards_view_type_class: cards_view_type_class(view_type_params) }, status: :ok
|
|
end
|
|
|
|
private
|
|
|
|
def project_params
|
|
params.require(:project)
|
|
.permit(
|
|
:name, :team_id, :visibility,
|
|
:archived, :project_folder_id,
|
|
:default_public_user_role_id
|
|
)
|
|
end
|
|
|
|
def view_type_params
|
|
params.require(:project).require(:view_type)
|
|
end
|
|
|
|
def load_vars
|
|
@project = Project.find_by(id: params[:id])
|
|
|
|
render_404 unless @project
|
|
end
|
|
|
|
def load_current_folder
|
|
if current_team && params[:project_folder_id].present?
|
|
@current_folder = current_team.project_folders.find_by(id: params[:project_folder_id])
|
|
elsif @project&.project_folder
|
|
@current_folder = @project&.project_folder
|
|
end
|
|
end
|
|
|
|
def check_view_permissions
|
|
render_403 unless can_read_project?(@project)
|
|
end
|
|
|
|
def check_create_permissions
|
|
render_403 unless can_create_projects?(current_team)
|
|
end
|
|
|
|
def check_manage_permissions
|
|
render_403 unless can_manage_project?(@project)
|
|
end
|
|
|
|
def set_inline_name_editing
|
|
return unless can_manage_project?(@project)
|
|
|
|
@inline_editable_title_config = {
|
|
name: 'title',
|
|
params_group: 'project',
|
|
item_id: @project.id,
|
|
field_to_udpate: 'name',
|
|
path_to_update: project_path(@project)
|
|
}
|
|
end
|
|
|
|
def set_folder_inline_name_editing
|
|
return if !can_update_team?(current_team) || @current_folder.nil?
|
|
|
|
@inline_editable_title_config = {
|
|
name: 'title',
|
|
params_group: 'project_folder',
|
|
item_id: @current_folder.id,
|
|
field_to_udpate: 'name',
|
|
path_to_update: project_folder_path(@current_folder)
|
|
}
|
|
end
|
|
|
|
def load_exp_sort_var
|
|
if params[:sort]
|
|
@project.experiments_order = params[:sort].to_s
|
|
@project.save
|
|
end
|
|
@current_sort = @project.experiments_order || 'new'
|
|
end
|
|
|
|
def filters_included?
|
|
%i(search created_on_from created_on_to updated_on_from updated_on_to members
|
|
archived_on_from archived_on_to folders_search)
|
|
.any? { |param_name| params.dig(param_name).present? }
|
|
end
|
|
|
|
def reset_invalid_view_state
|
|
view_state = if action_name == 'show'
|
|
@project.current_view_state(current_user)
|
|
else
|
|
current_team.current_view_state(current_user)
|
|
end
|
|
|
|
view_state.destroy unless view_state.valid?
|
|
end
|
|
|
|
def log_activity(type_of, project = nil, message_items = {})
|
|
project ||= @project
|
|
message_items = { project: project.id }.merge(message_items)
|
|
|
|
Activities::CreateActivityService
|
|
.call(activity_type: type_of,
|
|
owner: current_user,
|
|
subject: project,
|
|
team: project.team,
|
|
project: project,
|
|
message_items: message_items)
|
|
end
|
|
end
|