From d718be587a9abc34f6a3b1f3463565284c0b7257 Mon Sep 17 00:00:00 2001 From: Anton Date: Mon, 17 Feb 2025 13:40:52 +0100 Subject: [PATCH] Add assigned items vue component [SCI-11561] --- .../javascripts/my_modules/repositories.js | 9 +- .../my_module_repositories_controller.rb | 24 ++- app/helpers/my_modules_helper.rb | 2 +- .../packs/vue/my_module_assigned_items.js | 13 ++ .../vue/my_module/assigned_items.vue | 129 +++++++++++++ .../assigned_items/renderers/name.vue | 21 ++ .../my_module/assigned_items/repository.vue | 180 ++++++++++++++++++ .../assigned_repository_serializer.rb | 48 +++++ app/views/my_modules/protocols.html.erb | 8 + .../_repositories_dropdown_list.html.erb | 2 +- config/routes.rb | 1 + config/webpack/webpack.config.js | 3 +- 12 files changed, 432 insertions(+), 8 deletions(-) create mode 100644 app/javascript/packs/vue/my_module_assigned_items.js create mode 100644 app/javascript/vue/my_module/assigned_items.vue create mode 100644 app/javascript/vue/my_module/assigned_items/renderers/name.vue create mode 100644 app/javascript/vue/my_module/assigned_items/repository.vue create mode 100644 app/serializers/assigned_repository_serializer.rb diff --git a/app/assets/javascripts/my_modules/repositories.js b/app/assets/javascripts/my_modules/repositories.js index b34d7630f..70b21671d 100644 --- a/app/assets/javascripts/my_modules/repositories.js +++ b/app/assets/javascripts/my_modules/repositories.js @@ -54,6 +54,10 @@ var MyModuleRepositories = (function() { } function reloadRepositoriesList(repositoryId, expand = false) { + + window.assignedItemsTable.$refs.assignedItems.loadAssingedRepositories(); + + /* var repositoriesContainer = $('#assigned-items-container'); $.get(repositoriesContainer.data('repositories-list-url'), function(result) { repositoriesContainer.html(result.html); @@ -64,6 +68,7 @@ var MyModuleRepositories = (function() { $('#assigned-repository-items-container-' + repositoryId).collapse('show'); } }); + */ } function tableColumns(tableContainer, skipCheckbox = false) { @@ -606,7 +611,7 @@ var MyModuleRepositories = (function() { } function initRepositoryFullView() { - $('#assigned-items-container').on('click', '.action-buttons .full-screen', function(e) { + $('#assignedItems').on('click', '.full-screen', function(e) { var repositoryNameObject = $(this).closest('.assigned-repository-caret') .find('.assigned-repository-title'); @@ -697,7 +702,7 @@ var MyModuleRepositories = (function() { } function initRepositoryAssignView() { - $('.repositories-dropdown-menu').on('click', '.repository', function(e) { + $('#assignedItems').on('click', '.repository-assign', function(e) { var assignUrlModal = $(this).data('assign-url-modal'); var updateUrlModal = $(this).data('update-url-modal'); FULL_VIEW_MODAL.modal('show'); diff --git a/app/controllers/my_module_repositories_controller.rb b/app/controllers/my_module_repositories_controller.rb index 668712b1d..15ff5cafd 100644 --- a/app/controllers/my_module_repositories_controller.rb +++ b/app/controllers/my_module_repositories_controller.rb @@ -4,9 +4,9 @@ class MyModuleRepositoriesController < ApplicationController include ApplicationHelper before_action :load_my_module, except: :assign_my_modules - before_action :load_repository, except: %i(repositories_dropdown_list repositories_list_html create) + before_action :load_repository, except: %i(repositories_dropdown_list repositories_list_html repositories_list create) before_action :check_my_module_view_permissions, except: %i(update consume_modal update_consumption assign_my_modules) - before_action :check_repository_view_permissions, except: %i(repositories_dropdown_list repositories_list_html create) + before_action :check_repository_view_permissions, except: %i(repositories_dropdown_list repositories_list_html repositories_list create) before_action :check_repository_row_consumption_permissions, only: %i(consume_modal update_consumption) before_action :check_assign_repository_records_permissions, only: %i(update create) before_action :load_my_modules, only: :assign_my_modules @@ -149,6 +149,11 @@ class MyModuleRepositoriesController < ApplicationController } end + def repositories_list + @assigned_repositories = @my_module.readable_live_and_snapshot_repositories_list(current_user) + render json: @assigned_repositories, each_serializer: AssignedRepositorySerializer, scope: {user: current_user, my_module: @my_module } + end + def full_view_table render json: { html: render_to_string( @@ -170,7 +175,20 @@ class MyModuleRepositoriesController < ApplicationController .having('COUNT(my_module_repository_rows.id) > 0 OR repositories.archived = FALSE') .order(:name) - render json: { html: render_to_string(partial: 'my_modules/repositories/repositories_dropdown_list') } + #render json: { html: render_to_string(partial: 'my_modules/repositories/repositories_dropdown_list') } + render json: { + repositories: @repositories.map do |repository| + { + id: repository.id, + name: repository.name, + rows_count: repository.rows_count, + shared: repository.shared_with?(current_team), + table_url: full_view_table_my_module_repository_path(@my_module, repository), + assign_url: assign_modal_my_module_repository_path(@my_module, repository), + update_url: update_modal_my_module_repository_path(@my_module, repository), + } + end + } end def export_repository diff --git a/app/helpers/my_modules_helper.rb b/app/helpers/my_modules_helper.rb index fecd5cb24..f42b1dd22 100644 --- a/app/helpers/my_modules_helper.rb +++ b/app/helpers/my_modules_helper.rb @@ -84,7 +84,7 @@ module MyModulesHelper date_time: l(repository.created_at, format: :full)) end - t('my_modules.repository.snapshots.simple_view.live_bottom_label') + I18n.t('my_modules.repository.snapshots.simple_view.live_bottom_label') end def assigned_repository_simple_view_name_column_id(repository) diff --git a/app/javascript/packs/vue/my_module_assigned_items.js b/app/javascript/packs/vue/my_module_assigned_items.js new file mode 100644 index 000000000..a183b480a --- /dev/null +++ b/app/javascript/packs/vue/my_module_assigned_items.js @@ -0,0 +1,13 @@ +import { createApp } from 'vue/dist/vue.esm-bundler.js'; +import PerfectScrollbar from 'vue3-perfect-scrollbar'; +import AssignedItems from '../../vue/my_module/assigned_items.vue'; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; + +const app = createApp(); +app.component('AssignedItems', AssignedItems); +app.config.globalProperties.i18n = window.I18n; +app.use(PerfectScrollbar); + +window.assignedItemsTable = mountWithTurbolinks(app, '#assignedItems', () => { + delete window.assignedItemsTable; +}); diff --git a/app/javascript/vue/my_module/assigned_items.vue b/app/javascript/vue/my_module/assigned_items.vue new file mode 100644 index 000000000..dc4fcf480 --- /dev/null +++ b/app/javascript/vue/my_module/assigned_items.vue @@ -0,0 +1,129 @@ + + + diff --git a/app/javascript/vue/my_module/assigned_items/renderers/name.vue b/app/javascript/vue/my_module/assigned_items/renderers/name.vue new file mode 100644 index 000000000..3d6b5df3a --- /dev/null +++ b/app/javascript/vue/my_module/assigned_items/renderers/name.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/javascript/vue/my_module/assigned_items/repository.vue b/app/javascript/vue/my_module/assigned_items/repository.vue new file mode 100644 index 000000000..8c0c93e4b --- /dev/null +++ b/app/javascript/vue/my_module/assigned_items/repository.vue @@ -0,0 +1,180 @@ + + diff --git a/app/serializers/assigned_repository_serializer.rb b/app/serializers/assigned_repository_serializer.rb new file mode 100644 index 000000000..6e644f7f0 --- /dev/null +++ b/app/serializers/assigned_repository_serializer.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +class AssignedRepositorySerializer < ActiveModel::Serializer + include Canaid::Helpers::PermissionsHelper + include Rails.application.routes.url_helpers + include MyModulesHelper + + attributes :id, :name + + attribute :assigned_rows_count do + object['assigned_rows_count'] + end + + attribute :is_snapshot do + object.is_a?(RepositorySnapshot) + end + + attribute :has_stock do + object.has_stock_management? + end + + attribute :has_stock_consumption do + object.has_stock_consumption? + end + + attribute :can_manage_consumption do + can_update_my_module_stock_consumption?(scope[:user], scope[:my_module]) + end + + attribute :stock_column_name do + object.repository_stock_column.name if object.has_stock_management? + end + + attribute :footer_label do + assigned_repository_simple_view_footer_label(object) + end + + attribute :name_column_id do + assigned_repository_simple_view_name_column_id(object) + end + + attribute :urls do + { + full_view: assigned_repository_full_view_table_path(scope[:my_module], object), + assigned_rows: assigned_repository_simple_view_index_path(scope[:my_module], object) + } + end +end diff --git a/app/views/my_modules/protocols.html.erb b/app/views/my_modules/protocols.html.erb index 1c4f48527..a0564ea17 100644 --- a/app/views/my_modules/protocols.html.erb +++ b/app/views/my_modules/protocols.html.erb @@ -79,6 +79,13 @@ <%= render partial: "my_module_notes" %> +
+ +