spina-admin-journal 0.6.2 → 1.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/spina_admin_journal_manifest.js +5 -2
  3. data/app/assets/javascripts/spina/admin/journal/application.js +0 -0
  4. data/app/components/spina/admin/journal/affiliations_list_component.rb +32 -0
  5. data/app/components/spina/admin/journal/application_component.rb +11 -0
  6. data/app/components/spina/admin/journal/articles_list_component.rb +54 -0
  7. data/app/components/spina/admin/journal/authors_list_component.rb +37 -0
  8. data/app/components/spina/admin/journal/authorships_list_component.rb +45 -0
  9. data/app/components/spina/admin/journal/empty_list_component.html.haml +1 -0
  10. data/app/components/spina/admin/journal/empty_list_component.rb +14 -0
  11. data/app/components/spina/admin/journal/institutions_list_component.rb +32 -0
  12. data/app/components/spina/admin/journal/issues_list_component.rb +47 -0
  13. data/app/components/spina/admin/journal/licences_list_component.rb +32 -0
  14. data/app/components/spina/admin/journal/list_component.html.haml +10 -0
  15. data/app/components/spina/admin/journal/list_component.rb +22 -0
  16. data/app/components/spina/admin/journal/list_item_component.html.haml +17 -0
  17. data/app/components/spina/admin/journal/list_item_component.rb +23 -0
  18. data/app/components/spina/admin/journal/volumes_list_component.rb +34 -0
  19. data/app/controllers/spina/admin/journal/application_controller.rb +1 -1
  20. data/app/controllers/spina/admin/journal/articles_controller.rb +11 -23
  21. data/app/controllers/spina/admin/journal/authors_controller.rb +10 -24
  22. data/app/controllers/spina/admin/journal/institutions_controller.rb +6 -4
  23. data/app/controllers/spina/admin/journal/issues_controller.rb +12 -25
  24. data/app/controllers/spina/admin/journal/journals_controller.rb +2 -1
  25. data/app/controllers/spina/admin/journal/licences_controller.rb +6 -4
  26. data/app/controllers/spina/admin/journal/volumes_controller.rb +9 -20
  27. data/app/views/spina/admin/hooks/journal/_primary_navigation.html.haml +35 -26
  28. data/app/views/spina/admin/journal/articles/_form.html.haml +23 -24
  29. data/app/views/spina/admin/journal/articles/_form_authors.html.haml +1 -15
  30. data/app/views/spina/admin/journal/articles/_form_details.html.haml +27 -56
  31. data/app/views/spina/admin/journal/articles/index.html.haml +7 -17
  32. data/app/views/spina/admin/journal/authors/_form.html.haml +24 -24
  33. data/app/views/spina/admin/journal/authors/_form_affiliation.html.haml +8 -20
  34. data/app/views/spina/admin/journal/authors/_form_articles.html.haml +1 -18
  35. data/app/views/spina/admin/journal/authors/_form_details.html.haml +2 -6
  36. data/app/views/spina/admin/journal/authors/index.html.haml +7 -15
  37. data/app/views/spina/admin/journal/institutions/_form.html.haml +24 -24
  38. data/app/views/spina/admin/journal/institutions/_form_details.html.haml +2 -8
  39. data/app/views/spina/admin/journal/institutions/_form_view_affiliations.html.haml +1 -10
  40. data/app/views/spina/admin/journal/institutions/index.html.haml +7 -15
  41. data/app/views/spina/admin/journal/issues/_form.html.haml +23 -23
  42. data/app/views/spina/admin/journal/issues/_form_articles.html.haml +1 -14
  43. data/app/views/spina/admin/journal/issues/_form_details.html.haml +13 -28
  44. data/app/views/spina/admin/journal/issues/index.html.haml +7 -16
  45. data/app/views/spina/admin/journal/journals/_form.html.haml +22 -32
  46. data/app/views/spina/admin/journal/licences/_form.html.haml +19 -34
  47. data/app/views/spina/admin/journal/licences/index.html.haml +7 -16
  48. data/app/views/spina/admin/journal/volumes/_form.html.haml +25 -12
  49. data/app/views/spina/admin/journal/volumes/_form_details.html.haml +4 -10
  50. data/app/views/spina/admin/journal/volumes/_form_issues.html.haml +1 -13
  51. data/app/views/spina/admin/journal/volumes/index.html.haml +7 -16
  52. data/config/locales/en.yml +25 -3
  53. data/config/routes.rb +5 -5
  54. data/lib/spina/admin/journal/engine.rb +12 -0
  55. data/lib/spina/admin/journal/version.rb +1 -1
  56. data/lib/spina/admin/journal.rb +1 -0
  57. metadata +47 -65
  58. data/app/assets/javascripts/spina/admin/journal/application.es6 +0 -72
  59. data/app/views/layouts/spina/admin/journal/articles.html.haml +0 -10
  60. data/app/views/layouts/spina/admin/journal/authors.html.haml +0 -10
  61. data/app/views/layouts/spina/admin/journal/institutions.html.haml +0 -10
  62. data/app/views/layouts/spina/admin/journal/issues.html.haml +0 -10
  63. data/app/views/layouts/spina/admin/journal/journals.html.haml +0 -10
  64. data/app/views/layouts/spina/admin/journal/licences.html.haml +0 -10
  65. data/app/views/layouts/spina/admin/journal/volumes.html.haml +0 -10
  66. data/app/views/spina/admin/journal/affiliations/_affiliation.html.haml +0 -8
  67. data/app/views/spina/admin/journal/application/_empty_list.html.haml +0 -3
  68. data/app/views/spina/admin/journal/articles/_article.html.haml +0 -10
  69. data/app/views/spina/admin/journal/authors/_author.html.haml +0 -8
  70. data/app/views/spina/admin/journal/authorships/_authorship.html.haml +0 -9
  71. data/app/views/spina/admin/journal/institutions/_institution.html.haml +0 -9
  72. data/app/views/spina/admin/journal/issues/_issue.html.haml +0 -9
  73. data/app/views/spina/admin/journal/journals/index.html.haml +0 -27
  74. data/app/views/spina/admin/journal/licences/_licence.html.haml +0 -11
  75. data/app/views/spina/admin/journal/volumes/_volume.html.haml +0 -7
  76. data/vendor/assets/javascripts/spina/admin/journal/html5sortable.js +0 -1295
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: afadf6fe1f99997005bc61d4c3d31b6a1fd02ea35e400539a6e3f3806010910a
4
- data.tar.gz: 7a4375228d01fa343613e8978860ff64c4ba8b1d3232d439efc71e150cab6d93
3
+ metadata.gz: 6e696fd8633a8dc7ab2b57166808c7e989792307f0d3481a0eb5e73b0d05d175
4
+ data.tar.gz: bb15a7e5c115a2302e95f3224d85840dcfc6f46d8ec88b1c18bd67b4d0ba02b6
5
5
  SHA512:
6
- metadata.gz: 63d5deaf2bc734aafefcbd7ddb814f1593ab18ea6a3653beeadfede9ddb386579107f87147a78d036d9e95e5f1fd868f088a03352de57652b9a30afcc3a2fa58
7
- data.tar.gz: ad6606f902897fc5ffa29d00241c89c1c4cb68a666313e53bc21227e357dd06e760a9d7e011c7f6e1870b6f872327f4052ceacc77c63fbd5745d8ba10bda1800
6
+ metadata.gz: 0e1f1e24116d3955595ef1fc705f4e93a25028daeaac15b42a147d4cadeec0b2bb5c6176d4d9c98dbb104f66dd325a006a156eea6d8afab270cb096cb386772f
7
+ data.tar.gz: d6541162de0b4e925c3c6dda25ac08d4e5292c6f3b2c8ac4306f933000aee56dfbc8cbcd2ee0704a0499a5a512e1179d429b47cbe8a17ea205a47324eaf2c382
@@ -1,3 +1,6 @@
1
- //= link spina/admin/journal/application.js
2
1
  //= link spina/admin/journal/application.css
3
- //= link spina_manifest.js
2
+
3
+ //= link_directory ../javascripts/spina/admin/journal/controllers
4
+ //= link_directory ../javascripts/spina/admin/journal/libraries
5
+
6
+ //= link spina/admin/journal/application.js
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # A list of licences. Not sortable.
7
+ class AffiliationsListComponent < ListComponent
8
+ def initialize(affiliations:)
9
+ @affiliations = affiliations
10
+ end
11
+
12
+ def before_render
13
+ @list_items = generate_list_items(@affiliations)
14
+ end
15
+
16
+ def call
17
+ render ListComponent.new(list_items: @list_items, sortable: false)
18
+ end
19
+
20
+ private
21
+
22
+ def generate_list_items(affiliations)
23
+ affiliations.map do |affiliation|
24
+ { id: affiliation.id,
25
+ label: affiliation.reversed_name,
26
+ path: helpers.spina.edit_admin_journal_author_path(affiliation.author) }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # Base class for components.
7
+ class ApplicationComponent < Spina::ApplicationComponent
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # A list of articles. Articles should only be sortable if presented within the contex of an
7
+ # issue.
8
+ class ArticlesListComponent < ListComponent
9
+ attr_reader :sortable
10
+
11
+ def initialize(articles:, sortable: false)
12
+ @articles = articles
13
+ @sortable = sortable
14
+ end
15
+
16
+ def before_render
17
+ @list_items = generate_list_items(@articles)
18
+ end
19
+
20
+ def call
21
+ render ListComponent.new(list_items: @list_items,
22
+ sortable: sortable?,
23
+ sort_path: generate_sort_path)
24
+ end
25
+
26
+ def sortable?
27
+ sortable
28
+ end
29
+
30
+ private
31
+
32
+ def generate_list_items(articles)
33
+ articles.map do |article|
34
+ { id: article.id,
35
+ label: generate_label(article),
36
+ path: helpers.spina.edit_admin_journal_article_path(article.id) }
37
+ end
38
+ end
39
+
40
+ def generate_label(article) # rubocop:disable Metrics/AbcSize
41
+ t('spina.admin.journal.articles.article_number', volume_number: article.issue.volume.number, # rubocop:disable Style/StringConcatenation
42
+ issue_number: article.issue.number,
43
+ article_number: article.number
44
+ ) + ' | ' + t('spina.admin.journal.articles.title_author', title: article.title, # rubocop:disable Layout/MultilineMethodCallBraceLayout Layout/SpaceInsideParens
45
+ author: article.authorships.sorted_within_article.map { |authorship| authorship.affiliation.surname }.join(', ')) # rubocop:disable Layout/LineLength
46
+ end
47
+
48
+ def generate_sort_path
49
+ @articles.any? ? helpers.spina.sort_admin_journal_issues_path(@articles.first.issue.id) : ''
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # A list of authors. Not sortable.
7
+ class AuthorsListComponent < ListComponent
8
+ def initialize(authors:)
9
+ @authors = authors
10
+ end
11
+
12
+ def before_render
13
+ @list_items = generate_list_items(@authors)
14
+ end
15
+
16
+ def call
17
+ render ListComponent.new(list_items: @list_items, sortable: false)
18
+ end
19
+
20
+ private
21
+
22
+ def generate_list_items(authors)
23
+ authors.map do |author|
24
+ { id: author.id,
25
+ label: generate_label(author),
26
+ path: helpers.spina.edit_admin_journal_author_path(author) }
27
+ end
28
+ end
29
+
30
+ def generate_label(author)
31
+ t 'spina.admin.journal.authors.name_institution', name: author.primary_affiliation.name,
32
+ institution: author.primary_affiliation.institution.name
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # A list of authorships. Sortable when displayed in their corresponding article.
7
+ class AuthorshipsListComponent < ListComponent
8
+ attr_reader :sortable
9
+
10
+ def initialize(authorships:, sortable: false)
11
+ @authorships = authorships
12
+ @sortable = sortable
13
+ end
14
+
15
+ def before_render
16
+ @list_items = generate_list_items(@authorships)
17
+ end
18
+
19
+ def call
20
+ render ListComponent.new(list_items: @list_items,
21
+ sortable: sortable?,
22
+ sort_path: generate_sort_path)
23
+ end
24
+
25
+ def sortable?
26
+ sortable
27
+ end
28
+
29
+ private
30
+
31
+ def generate_list_items(authorships)
32
+ authorships.map do |authorship|
33
+ { id: authorship.id,
34
+ label: authorship.affiliation.reversed_name,
35
+ path: helpers.spina.edit_admin_journal_author_path(authorship.affiliation.author) }
36
+ end
37
+ end
38
+
39
+ def generate_sort_path
40
+ @authorships.any? ? helpers.spina.sort_admin_journal_authors_path(@authorships.first.article.id) : ''
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # Displays a message indicating that a {ListComponent} has no items.
7
+ class EmptyListComponent < ApplicationComponent
8
+ def initialize(message: t('spina.admin.journal.empty_list'))
9
+ @message = message
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # A list of institutions. Not sortable.
7
+ class InstitutionsListComponent < ListComponent
8
+ def initialize(institutions:)
9
+ @institutions = institutions
10
+ end
11
+
12
+ def before_render
13
+ @list_items = generate_list_items(@institutions)
14
+ end
15
+
16
+ def call
17
+ render ListComponent.new(list_items: @list_items, sortable: false)
18
+ end
19
+
20
+ private
21
+
22
+ def generate_list_items(institutions)
23
+ institutions.map do |institution|
24
+ { id: institution.id,
25
+ label: institution.name,
26
+ path: helpers.spina.edit_admin_journal_institution_path(institution.id) }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # A list of issues. Issues should only be sortable if presented within the contex of a
7
+ # volume.
8
+ class IssuesListComponent < ListComponent
9
+ attr_reader :sortable
10
+
11
+ def initialize(issues:, sortable: false)
12
+ @issues = issues
13
+ @sortable = sortable
14
+ end
15
+
16
+ def before_render
17
+ @list_items = generate_list_items(@issues)
18
+ end
19
+
20
+ def call
21
+ render ListComponent.new(list_items: @list_items,
22
+ sortable: sortable?,
23
+ sort_path: generate_sort_path)
24
+ end
25
+
26
+ def sortable?
27
+ sortable
28
+ end
29
+
30
+ private
31
+
32
+ def generate_list_items(issues)
33
+ issues.map do |issue|
34
+ { id: issue.id,
35
+ label: t('spina.admin.journal.issues.volume_issue', volume_number: issue.volume.number,
36
+ issue_number: issue.number),
37
+ path: helpers.spina.edit_admin_journal_issue_path(issue.id) }
38
+ end
39
+ end
40
+
41
+ def generate_sort_path
42
+ @issues.any? ? helpers.spina.sort_admin_journal_issues_path(@issues.first.volume.id) : ''
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # A list of licences. Not sortable.
7
+ class LicencesListComponent < ListComponent
8
+ def initialize(licences:)
9
+ @licences = licences
10
+ end
11
+
12
+ def before_render
13
+ @list_items = generate_list_items(@licences)
14
+ end
15
+
16
+ def call
17
+ render ListComponent.new(list_items: @list_items, sortable: false)
18
+ end
19
+
20
+ private
21
+
22
+ def generate_list_items(licences)
23
+ licences.map do |licence|
24
+ { id: licence.id,
25
+ label: licence.name,
26
+ path: helpers.spina.edit_admin_journal_licence_path(licence) }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,10 @@
1
+ - if sortable?
2
+ .ml-8.mt-8.text-gray-600.text-sm= t 'spina.admin.journal.sort_info'
3
+ .my-6.md:m-8.bg-white.md:rounded-lg.border-l-0.border-r-0.border.md:border-r.md:border-l.border-gray-200.border-b-0.shadow-sm{ data: { controller: 'sortable' } }
4
+ = form_with(url: @sort_path, data: { sortable_target: 'form' }) { |f| }
5
+ %ul{ data: { sortable_target: 'list' } }
6
+ - if @list_items.any?
7
+ - @list_items.each do |item|
8
+ = render Spina::Admin::Journal::ListItemComponent.new(id: item[:id], label: item[:label], path: item[:path], sortable: sortable?)
9
+ - else
10
+ = render Spina::Admin::Journal::EmptyListComponent.new
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # A generic implementation of a list, resembling Spina's page list.
7
+ class ListComponent < ApplicationComponent
8
+ attr_reader :sortable
9
+
10
+ def initialize(list_items:, sortable: false, sort_path: '')
11
+ @sortable = sortable
12
+ @list_items = list_items
13
+ @sort_path = sort_path
14
+ end
15
+
16
+ def sortable?
17
+ sortable
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ %li{data: { id: @id }}
2
+ .flex.items-center.border-gray-200.border-b.bg-opacity-50.w-full
3
+ - if sortable?
4
+ .p-4.text-gray-300.hover:text-gray-600.cursor-move{ data: { 'sortable-handle': true } }
5
+ = helpers.heroicon('menu-alt-4', style: :solid, class: 'w-4 h-4 -mr-4')
6
+
7
+ .flex-auto
8
+ .block.text-spina.font-medium.text-sm.p-4{class: 'hover:text-spina-dark' }
9
+ = link_to @path do
10
+ = @label
11
+
12
+ .flex-1
13
+
14
+ = link_to @path, class: 'btn btn-link mr-4' do
15
+ .flex.flex-nowrap.items-center.px-8.py-1
16
+ = helpers.heroicon 'pencil-alt', style: :outline, class: 'w-4 h-4'
17
+ .ml-2= t 'spina.admin.journal.edit'
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # A generic list item that is only intended to be called by {ListItemComponent}.
7
+ class ListItemComponent < ApplicationComponent
8
+ attr_reader :sortable
9
+
10
+ def initialize(id:, label:, path:, sortable: false)
11
+ @label = label
12
+ @id = id
13
+ @path = path
14
+ @sortable = sortable
15
+ end
16
+
17
+ def sortable?
18
+ sortable
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spina
4
+ module Admin
5
+ module Journal
6
+ # A sortable list of volumes.
7
+ class VolumesListComponent < ListComponent
8
+ def initialize(volumes:)
9
+ @volumes = volumes
10
+ end
11
+
12
+ def before_render
13
+ @list_items = generate_list_items(@volumes)
14
+ end
15
+
16
+ def call
17
+ render ListComponent.new(list_items: @list_items,
18
+ sortable: true,
19
+ sort_path: helpers.spina.sort_admin_journal_volumes_path(Journal.instance.id))
20
+ end
21
+
22
+ private
23
+
24
+ def generate_list_items(volumes)
25
+ volumes.map do |volume|
26
+ { id: volume.id,
27
+ label: t('spina.admin.journal.volumes.volume_number', number: volume.number),
28
+ path: helpers.spina.edit_admin_journal_volume_path(volume.id) }
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -9,7 +9,7 @@ module Spina
9
9
 
10
10
  add_flash_types :success
11
11
 
12
- layout :admin_layout, only: %i[new edit]
12
+ layout :admin_layout
13
13
 
14
14
  before_action :set_locale
15
15
 
@@ -41,23 +41,25 @@ module Spina
41
41
 
42
42
  def edit; end
43
43
 
44
- def create
44
+ def create # rubocop:disable Metrics/AbcSize
45
45
  @article = Article.new(article_params)
46
46
  sister_articles = Article.where(issue: @article.issue_id)
47
47
  @article.number = sister_articles.any? ? sister_articles.sorted_desc.first.number + 1 : 1
48
48
 
49
49
  if @article.save
50
- redirect_to admin_journal_articles_path, success: t('.saved')
50
+ redirect_to edit_admin_journal_article_path(@article), success: t('.saved')
51
51
  else
52
- render :new
52
+ flash.now[:alert] = t('.failed')
53
+ render :new, status: :unprocessable_entity
53
54
  end
54
55
  end
55
56
 
56
57
  def update
57
58
  if @article.update(article_params)
58
- redirect_to admin_journal_articles_path, success: t('.saved')
59
+ redirect_to edit_admin_journal_article_path(@article), success: t('.saved')
59
60
  else
60
- render :edit
61
+ flash.now[:alert] = t('.failed')
62
+ render :edit, status: :unprocessable_entity
61
63
  end
62
64
  end
63
65
 
@@ -71,15 +73,11 @@ module Spina
71
73
  end
72
74
 
73
75
  def sort
74
- ActiveRecord::Base.transaction do
75
- sort_params.each do |id, new_pos|
76
- Article.find(id.to_i).update_attribute(:number, new_pos.to_i) # rubocop:disable Rails/SkipsModelValidations
77
- end
78
- validate_sort_order
76
+ params[:ids].each.with_index do |id, index|
77
+ Article.where(id: id).update_all(number: index + 1) # rubocop:disable Rails/SkipsModelValidations
79
78
  end
80
- render json: { success: true, message: t('.sort_success') }
81
- rescue ActiveRecord::RecordInvalid
82
- render json: { success: false, message: t('.sort_error') }
79
+ flash.now[:info] = t('spina.pages.sorting_saved')
80
+ render_flash
83
81
  end
84
82
 
85
83
  private
@@ -88,16 +86,6 @@ module Spina
88
86
  params.require(:article).permit(PARAMS)
89
87
  end
90
88
 
91
- def sort_params
92
- params.require(:admin_journal_articles).require(:list).permit!
93
- end
94
-
95
- def validate_sort_order
96
- Article.where(issue_id: params[:issue_id]).each do |article|
97
- raise ActiveRecord::RecordInvalid if article.invalid?
98
- end
99
- end
100
-
101
89
  def set_breadcrumb
102
90
  add_breadcrumb Article.model_name.human(count: :many), admin_journal_articles_path
103
91
  end
@@ -24,17 +24,19 @@ module Spina
24
24
  def create
25
25
  @author = Author.new(modified_params)
26
26
  if @author.save
27
- redirect_to admin_journal_authors_path, success: t('.saved')
27
+ redirect_to edit_admin_journal_author_path(@author), success: t('.saved')
28
28
  else
29
- render :new
29
+ flash.now[:alert] = t('.failed')
30
+ render :new, status: :unprocessable_entity
30
31
  end
31
32
  end
32
33
 
33
34
  def update
34
35
  if @author.update(modified_params)
35
- redirect_to admin_journal_authors_path, success: t('.saved')
36
+ redirect_to edit_admin_journal_author_path(@author), success: t('.saved')
36
37
  else
37
- render :edit
38
+ flash.now[:alert] = t('.failed')
39
+ render :edit, status: :unprocessable_entity
38
40
  end
39
41
  end
40
42
 
@@ -48,17 +50,11 @@ module Spina
48
50
  end
49
51
 
50
52
  def sort
51
- ActiveRecord::Base.transaction do
52
- sort_params.each do |id, new_pos|
53
- # ignore uniqueness validation for now
54
- Authorship.find(id.to_i).update_attribute(:position, new_pos.to_i) # rubocop:disable Rails/SkipsModelValidations
55
- end
56
- # do validations after reordering is complete
57
- validate_sort_order
53
+ params[:ids].each.with_index do |id, index|
54
+ Authorship.where(id: id).update_all(position: index + 1) # rubocop:disable Rails/SkipsModelValidations
58
55
  end
59
- render json: { success: true, message: t('.sort_success') }
60
- rescue ActiveRecord::RecordInvalid
61
- render json: { success: false, message: t('.sort_error') }
56
+ flash.now[:info] = t('spina.pages.sorting_saved')
57
+ render_flash
62
58
  end
63
59
 
64
60
  private
@@ -80,10 +76,6 @@ module Spina
80
76
  new_params
81
77
  end
82
78
 
83
- def sort_params
84
- params.require(:admin_journal_authorships).require(:list).permit!
85
- end
86
-
87
79
  def set_breadcrumb
88
80
  add_breadcrumb Author.model_name.human(count: :many), admin_journal_authors_path
89
81
  end
@@ -96,12 +88,6 @@ module Spina
96
88
  @author = Author.find(params[:id])
97
89
  add_breadcrumb @author.primary_affiliation.name
98
90
  end
99
-
100
- def validate_sort_order
101
- Authorship.where(article_id: params[:article_id]).each do |authorship|
102
- raise ActiveRecord::RecordInvalid if authorship.invalid?
103
- end
104
- end
105
91
  end
106
92
  end
107
93
  end
@@ -24,17 +24,19 @@ module Spina
24
24
  @institution = Institution.new(institution_params)
25
25
 
26
26
  if @institution.save
27
- redirect_to admin_journal_institutions_path, success: t('.saved')
27
+ redirect_to edit_admin_journal_institution_path(@institution), success: t('.saved')
28
28
  else
29
- render :new
29
+ flash.now[:alert] = t('.failed')
30
+ render :new, status: :unprocessable_entity
30
31
  end
31
32
  end
32
33
 
33
34
  def update
34
35
  if @institution.update(institution_params)
35
- redirect_to admin_journal_institutions_path, success: t('.saved')
36
+ redirect_to edit_admin_journal_institution_path(@institution), success: t('.saved')
36
37
  else
37
- render :edit
38
+ flash.now[:alert] = t('.failed')
39
+ render :edit, status: :unprocessable_entity
38
40
  end
39
41
  end
40
42