Add CRUD operations for Programming Groups

* Correct sorting in table
* Modify page when nested in exercises
* Fix links between pages
* Link from statistics page to programming_groups/index
* Link from submission page to programming_groups/<id>
* Allow filtering for exercise ID on ProgrammingGroup#index
* Add search fields for internal and external user id on pg/index
This commit is contained in:
kiragrammel
2023-09-14 16:56:36 +02:00
committed by Sebastian Serth
parent f1ca5da44d
commit 79ce069f68
23 changed files with 543 additions and 38 deletions

View File

@ -0,0 +1,16 @@
= form_for(@programming_group) do |f|
= render('shared/form_errors', object: @programming_group)
h3 = t('activerecord.attributes.programming_group.member')
.table-responsive
table.table class="#{@members.present? ? 'sortable' : ''}"
thead
tr
th = t('activerecord.attributes.exercise.selection')
th = t('navigation.sections.contributors')
= collection_check_boxes :programming_group, :programming_group_membership_ids, @members, :id, :id do |b|
tr
td = b.check_box class: 'form-check-input'
td = link_to_if(policy(b.object.user).show?, b.object.user.displayname, b.object.user)
.actions = render('shared/submit_button', f: f, object: @programming_group)

View File

@ -0,0 +1,3 @@
h1 = @programming_group
= render('form_edit')

View File

@ -0,0 +1,43 @@
- if params[:exercise_id].nil?
h1 = ProgrammingGroup.model_name.human(count: 2)
= render(layout: 'shared/form_filters') do |f|
.col-auto
= f.label(:exercise_id_eq, t('activerecord.attributes.programming_group.exercise'), class: 'visually-hidden form-label')
= f.collection_select(:exercise_id_eq, Exercise.with_programming_groups, :id, :title, class: 'form-control', prompt: t('activerecord.attributes.programming_group.exercise'))
.col-auto
= f.label(:programming_group_memberships_user_of_ExternalUser_type_id_eq, t('activerecord.attributes.programming_group.external_user_id'), class: 'visually-hidden form-label')
= f.search_field(:programming_group_memberships_user_of_ExternalUser_type_id_eq, class: 'form-control', placeholder: t('activerecord.attributes.programming_group.external_user_id'))
.col-auto
= f.label(:programming_group_memberships_user_of_InternalUser_type_id_eq, t('activerecord.attributes.programming_group.internal_user_id'), class: 'visually-hidden form-label')
= f.search_field(:programming_group_memberships_user_of_InternalUser_type_id_eq, class: 'form-control', placeholder: t('activerecord.attributes.programming_group.internal_user_id'))
- else
h1 = "#{ProgrammingGroup.model_name.human(count: 2)} for Exercise '#{@exercise.title}'"
.table-responsive
table.table.mt-4 class="#{@programming_groups.present? ? 'sortable' : ''}"
thead
tr
th.sortable_nosort = sort_link(@search, :id, t('activerecord.attributes.programming_group.name'))
- if params[:exercise_id].blank?
th.sorttable_nosort = sort_link(@search, :exercise_id, t('activerecord.attributes.programming_group.exercise'))
th = t('activerecord.attributes.programming_group.member')
th = t('activerecord.attributes.programming_group.member_count')
th.sorttable_nosort = sort_link(@search, :created_at, t('shared.created_at'))
th colspan=3 = t('shared.actions')
tbody
- if params[:exercise_id].nil?
- filtered_programming_groups = @programming_groups
- else
- filtered_programming_groups = @programming_groups.where(exercise_id: params[:exercise_id])
- filtered_programming_groups.each do |programming_group|
tr
td = link_to_if(policy(programming_group).show?, programming_group.displayname, programming_group)
- if params[:exercise_id].blank?
td = link_to_if(policy(programming_group.exercise).show?, programming_group.exercise.title, programming_group.exercise, 'data-turbolinks' => "false")
td == programming_group.users.map { |user| link_to_if(policy(user).show?, user.name, user) }.join(', ')
td = programming_group.users.size
td = l(programming_group.created_at, format: :short)
td = link_to(t('shared.show'), programming_group) if policy(programming_group).show?
td = link_to(t('shared.edit'), edit_programming_group_path(programming_group)) if policy(programming_group).edit?
td = link_to(t('shared.destroy'), programming_group, data: { confirm: t('shared.confirm_destroy') }, method: :delete) if policy(programming_group).destroy?
= render('shared/pagination', collection: @programming_groups)

View File

@ -0,0 +1,19 @@
h1
= @programming_group
- if policy(@programming_group).edit?
= render('shared/edit_button', object: @programming_group)
= row(label: 'activerecord.attributes.programming_group.name', value: @programming_group.displayname)
= row(label: 'activerecord.attributes.programming_group.exercise', value: link_to_if(policy(@programming_group.exercise).show?, @programming_group.exercise.title, @programming_group.exercise))
= row(label: 'activerecord.attributes.programming_group.member_count', value: @programming_group.users.size)
= row(label: 'shared.created_at', value: l(@programming_group.created_at, format: :short))
h2.mt-4 = t('activerecord.attributes.study_group.members')
.table-responsive
table.table class="#{@programming_group.users.present? ? 'sortable' : ''}"
thead
tr
th = t('navigation.sections.contributors')
- @programming_group.users.each do |user|
tr
td = link_to_if(policy(user).show?, user.displayname, user)