mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-10 05:46:47 +08:00
Merge pull request #2572 from okriuchykhin/ok_SCI_4629
Prevent the inventory items editing while snapshot is being created [SCI-4629]
This commit is contained in:
commit
afdd6fd149
21 changed files with 219 additions and 240 deletions
|
@ -127,7 +127,7 @@
|
||||||
.selectpicker({liveSearch: true})
|
.selectpicker({liveSearch: true})
|
||||||
.ajaxSelectPicker({
|
.ajaxSelectPicker({
|
||||||
ajax: {
|
ajax: {
|
||||||
url: '<%= Rails.application.routes.url_helpers.available_rows_path %>',
|
url: '<%= Rails.application.routes.url_helpers.available_rows_repositories_path %>',
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
data: function () {
|
data: function () {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
globals I18n _ SmartAnnotation FilePreviewModal animateSpinner Promise DataTableHelpers
|
globals I18n _ SmartAnnotation FilePreviewModal animateSpinner Promise DataTableHelpers
|
||||||
HelperModule animateLoading hideAssignUnasignModal RepositoryDatatableRowEditor
|
HelperModule animateLoading RepositoryDatatableRowEditor
|
||||||
initAssignedTasksDropdown
|
initAssignedTasksDropdown
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -15,7 +15,8 @@ var RepositoryDatatable = (function(global) {
|
||||||
var TABLE_WRAPPER_ID = '.repository-table';
|
var TABLE_WRAPPER_ID = '.repository-table';
|
||||||
var TABLE = null;
|
var TABLE = null;
|
||||||
var EDITABLE = false;
|
var EDITABLE = false;
|
||||||
var SELECT_ALL_SELECTOR = "#checkbox > input[name=select_all]"
|
var SELECT_ALL_SELECTOR = '#checkbox > input[name=select_all]';
|
||||||
|
const STATUS_POLLING_INTERVAL = 10000;
|
||||||
|
|
||||||
var rowsSelected = [];
|
var rowsSelected = [];
|
||||||
var rowsLocked = [];
|
var rowsLocked = [];
|
||||||
|
@ -266,6 +267,12 @@ var RepositoryDatatable = (function(global) {
|
||||||
if ($('#assigned').text().length === 0) {
|
if ($('#assigned').text().length === 0) {
|
||||||
TABLE.column(1).visible(false);
|
TABLE.column(1).visible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$.getJSON($(TABLE_ID).data('toolbar-url'), (data) => {
|
||||||
|
$('#toolbarButtonsDatatable').remove();
|
||||||
|
$(data.html).appendTo('div.toolbar');
|
||||||
|
});
|
||||||
|
|
||||||
TABLE.ajax.reload(null, false);
|
TABLE.ajax.reload(null, false);
|
||||||
changeToViewMode();
|
changeToViewMode();
|
||||||
SmartAnnotation.closePopup();
|
SmartAnnotation.closePopup();
|
||||||
|
@ -399,6 +406,18 @@ var RepositoryDatatable = (function(global) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function checkSnapshottingStatus() {
|
||||||
|
$.getJSON($(TABLE_ID).data('status-url'), (statusData) => {
|
||||||
|
if (statusData.snapshot_provisioning) {
|
||||||
|
setTimeout(() => { checkSnapshottingStatus(); }, STATUS_POLLING_INTERVAL);
|
||||||
|
} else {
|
||||||
|
EDITABLE = statusData.editable;
|
||||||
|
$('.repository-provisioning-notice').remove();
|
||||||
|
resetTableView();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function dataTableInit() {
|
function dataTableInit() {
|
||||||
viewAssigned = 'assigned';
|
viewAssigned = 'assigned';
|
||||||
TABLE = $(TABLE_ID).DataTable({
|
TABLE = $(TABLE_ID).DataTable({
|
||||||
|
@ -512,8 +531,10 @@ var RepositoryDatatable = (function(global) {
|
||||||
changeToViewMode();
|
changeToViewMode();
|
||||||
updateDataTableSelectAllCtrl();
|
updateDataTableSelectAllCtrl();
|
||||||
FilePreviewModal.init();
|
FilePreviewModal.init();
|
||||||
|
|
||||||
// Prevent row toggling when selecting user smart annotation link
|
// Prevent row toggling when selecting user smart annotation link
|
||||||
SmartAnnotation.preventPropagation('.atwho-user-popover');
|
SmartAnnotation.preventPropagation('.atwho-user-popover');
|
||||||
|
|
||||||
// Show number of selected rows near pages info
|
// Show number of selected rows near pages info
|
||||||
$('#repository-table_info').append('<span id="selected_info"></span>');
|
$('#repository-table_info').append('<span id="selected_info"></span>');
|
||||||
$('#selected_info').html(' (' + rowsSelected.length + ' entries selected)');
|
$('#selected_info').html(' (' + rowsSelected.length + ' entries selected)');
|
||||||
|
@ -547,15 +568,15 @@ var RepositoryDatatable = (function(global) {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
fnInitComplete: function() {
|
fnInitComplete: function() {
|
||||||
|
|
||||||
disableCheckboxToggleOnAssetDownload();
|
disableCheckboxToggleOnAssetDownload();
|
||||||
FilePreviewModal.init();
|
FilePreviewModal.init();
|
||||||
initHeaderTooltip();
|
initHeaderTooltip();
|
||||||
disableCheckboxToggleOnCheckboxPreview();
|
disableCheckboxToggleOnCheckboxPreview();
|
||||||
|
|
||||||
// Append button to inner toolbar in table
|
// Append buttons to inner toolbar in the table
|
||||||
$('div.toolbarButtonsDatatable').appendTo('div.toolbar');
|
$.getJSON($(TABLE_ID).data('toolbar-url'), (data) => {
|
||||||
$('div.toolbarButtonsDatatable').show();
|
$(data.html).appendTo('div.toolbar');
|
||||||
|
});
|
||||||
|
|
||||||
$('div.toolbar-filter-buttons').prependTo('div.filter-container');
|
$('div.toolbar-filter-buttons').prependTo('div.filter-container');
|
||||||
$('div.toolbar-filter-buttons').show();
|
$('div.toolbar-filter-buttons').show();
|
||||||
|
@ -564,12 +585,10 @@ var RepositoryDatatable = (function(global) {
|
||||||
$('div.toolbarButtons').appendTo('div.toolbar');
|
$('div.toolbarButtons').appendTo('div.toolbar');
|
||||||
$('div.toolbarButtons').show();
|
$('div.toolbarButtons').show();
|
||||||
|
|
||||||
if (EDITABLE) {
|
|
||||||
RepositoryDatatableRowEditor.initFormSubmitAction(TABLE);
|
RepositoryDatatableRowEditor.initFormSubmitAction(TABLE);
|
||||||
initItemEditIcon();
|
initItemEditIcon();
|
||||||
initSaveButton();
|
initSaveButton();
|
||||||
initCancelButton();
|
initCancelButton();
|
||||||
}
|
|
||||||
|
|
||||||
DataTableHelpers.initLengthApearance($(TABLE_ID).closest('.dataTables_wrapper'));
|
DataTableHelpers.initLengthApearance($(TABLE_ID).closest('.dataTables_wrapper'));
|
||||||
DataTableHelpers.initSearchField($(TABLE_ID).closest('.dataTables_wrapper'));
|
DataTableHelpers.initSearchField($(TABLE_ID).closest('.dataTables_wrapper'));
|
||||||
|
@ -664,28 +683,6 @@ var RepositoryDatatable = (function(global) {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
global.submitUnassignRepositoryRecord = function(option) {
|
|
||||||
animateSpinner();
|
|
||||||
$.ajax({
|
|
||||||
url: $('#unassignRepositoryRecordModal').data('unassign-url'),
|
|
||||||
type: 'POST',
|
|
||||||
dataType: 'json',
|
|
||||||
data: { selected_rows: rowsSelected, downstream: (option === 'downstream') },
|
|
||||||
success: function(data) {
|
|
||||||
hideAssignUnasignModal('#unassignRepositoryRecordModal');
|
|
||||||
HelperModule.flashAlertMsg(data.flash, 'success');
|
|
||||||
resetTableView();
|
|
||||||
clearRowSelection();
|
|
||||||
},
|
|
||||||
error: function(data) {
|
|
||||||
hideAssignUnasignModal('#unassignRepositoryRecordModal');
|
|
||||||
HelperModule.flashAlertMsg(data.responseJSON.flash, 'danger');
|
|
||||||
resetTableView();
|
|
||||||
clearRowSelection();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
global.onClickDeleteRecord = function() {
|
global.onClickDeleteRecord = function() {
|
||||||
animateSpinner();
|
animateSpinner();
|
||||||
$.ajax({
|
$.ajax({
|
||||||
|
@ -780,6 +777,9 @@ var RepositoryDatatable = (function(global) {
|
||||||
TABLE_ID = id;
|
TABLE_ID = id;
|
||||||
EDITABLE = $(TABLE_ID).data('editable');
|
EDITABLE = $(TABLE_ID).data('editable');
|
||||||
TABLE = dataTableInit();
|
TABLE = dataTableInit();
|
||||||
|
if ($(TABLE_ID).data('snapshot-provisioning')) {
|
||||||
|
setTimeout(() => { checkSnapshottingStatus(); }, STATUS_POLLING_INTERVAL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function destroy() {
|
function destroy() {
|
||||||
|
|
|
@ -21,9 +21,6 @@ var RepositoryColumns = (function() {
|
||||||
|
|
||||||
function reloadDataTablePartial() {
|
function reloadDataTablePartial() {
|
||||||
// Append buttons for inventory datatable
|
// Append buttons for inventory datatable
|
||||||
$('div.toolbarButtonsDatatable').appendTo('.repository-show');
|
|
||||||
$('div.toolbarButtonsDatatable').hide();
|
|
||||||
|
|
||||||
$('div.toolbar-filter-buttons').appendTo('.repository-show');
|
$('div.toolbar-filter-buttons').appendTo('.repository-show');
|
||||||
$('div.toolbar-filter-buttons').hide();
|
$('div.toolbar-filter-buttons').hide();
|
||||||
|
|
||||||
|
|
|
@ -116,6 +116,10 @@
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.repository-provisioning-notice {
|
||||||
|
color: $brand-info;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.dataTables_scroll {
|
.dataTables_scroll {
|
||||||
|
@ -350,7 +354,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.toolbarButtonsDatatable {
|
#toolbarButtonsDatatable {
|
||||||
.view-only-label {
|
.view-only-label {
|
||||||
opacity: .6;
|
opacity: .6;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,19 +8,14 @@ class RepositoriesController < ApplicationController
|
||||||
include TeamsHelper
|
include TeamsHelper
|
||||||
|
|
||||||
before_action :switch_team_with_param, only: :show
|
before_action :switch_team_with_param, only: :show
|
||||||
before_action :load_vars,
|
before_action :load_repository, except: %i(index create create_modal)
|
||||||
except: %i(index create create_modal parse_sheet)
|
before_action :load_repositories, only: %i(index show)
|
||||||
before_action :load_parent_vars, except:
|
|
||||||
%i(repository_table_index parse_sheet)
|
|
||||||
before_action :check_view_all_permissions, only: :index
|
before_action :check_view_all_permissions, only: :index
|
||||||
before_action :check_view_permissions, only: %i(load_table export_repository show)
|
before_action :check_view_permissions, except: %i(index create_modal create update destroy parse_sheet import_records)
|
||||||
before_action :check_manage_permissions, only:
|
before_action :check_manage_permissions, only: %i(destroy destroy_modal rename_modal update)
|
||||||
%i(destroy destroy_modal rename_modal update)
|
|
||||||
before_action :check_share_permissions, only: :share_modal
|
before_action :check_share_permissions, only: :share_modal
|
||||||
before_action :check_create_permissions, only:
|
before_action :check_create_permissions, only: %i(create_modal create)
|
||||||
%i(create_modal create)
|
before_action :check_copy_permissions, only: %i(copy_modal copy)
|
||||||
before_action :check_copy_permissions, only:
|
|
||||||
%i(copy_modal copy)
|
|
||||||
before_action :set_inline_name_editing, only: %i(show)
|
before_action :set_inline_name_editing, only: %i(show)
|
||||||
|
|
||||||
layout 'fluid'
|
layout 'fluid'
|
||||||
|
@ -34,6 +29,20 @@ class RepositoriesController < ApplicationController
|
||||||
@display_edit_button = can_create_repository_rows?(@repository)
|
@display_edit_button = can_create_repository_rows?(@repository)
|
||||||
@display_delete_button = can_delete_repository_rows?(@repository)
|
@display_delete_button = can_delete_repository_rows?(@repository)
|
||||||
@display_duplicate_button = can_create_repository_rows?(@repository)
|
@display_duplicate_button = can_create_repository_rows?(@repository)
|
||||||
|
@snapshot_provisioning = @repository.repository_snapshots.provisioning.any?
|
||||||
|
end
|
||||||
|
|
||||||
|
def table_toolbar
|
||||||
|
render json: {
|
||||||
|
html: render_to_string(partial: 'repositories/toolbar_buttons.html.erb')
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def status
|
||||||
|
render json: {
|
||||||
|
editable: can_manage_repository_rows?(@repository),
|
||||||
|
snapshot_provisioning: @repository.repository_snapshots.provisioning.any?
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_table
|
def load_table
|
||||||
|
@ -69,7 +78,7 @@ class RepositoriesController < ApplicationController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@repository = Repository.new(
|
@repository = Repository.new(
|
||||||
team: @team,
|
team: current_team,
|
||||||
created_by: current_user
|
created_by: current_user
|
||||||
)
|
)
|
||||||
@repository.assign_attributes(repository_params)
|
@repository.assign_attributes(repository_params)
|
||||||
|
@ -146,7 +155,7 @@ class RepositoriesController < ApplicationController
|
||||||
|
|
||||||
def copy_modal
|
def copy_modal
|
||||||
@tmp_repository = Repository.new(
|
@tmp_repository = Repository.new(
|
||||||
team: @team,
|
team: current_team,
|
||||||
created_by: current_user,
|
created_by: current_user,
|
||||||
name: @repository.name
|
name: @repository.name
|
||||||
)
|
)
|
||||||
|
@ -163,7 +172,7 @@ class RepositoriesController < ApplicationController
|
||||||
|
|
||||||
def copy
|
def copy
|
||||||
@tmp_repository = Repository.new(
|
@tmp_repository = Repository.new(
|
||||||
team: @team,
|
team: current_team,
|
||||||
created_by: current_user
|
created_by: current_user
|
||||||
)
|
)
|
||||||
@tmp_repository.assign_attributes(repository_params)
|
@tmp_repository.assign_attributes(repository_params)
|
||||||
|
@ -196,25 +205,15 @@ class RepositoriesController < ApplicationController
|
||||||
|
|
||||||
# AJAX actions
|
# AJAX actions
|
||||||
def repository_table_index
|
def repository_table_index
|
||||||
if @repository.nil? || !can_read_repository?(@repository)
|
|
||||||
render_403
|
|
||||||
else
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html
|
|
||||||
format.json do
|
format.json do
|
||||||
render json: ::RepositoryDatatable.new(view_context,
|
render json: ::RepositoryDatatable.new(view_context, @repository, nil, current_user)
|
||||||
@repository,
|
|
||||||
nil,
|
|
||||||
current_user)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse_sheet
|
def parse_sheet
|
||||||
repository = Repository.accessible_by_teams(current_team).find_by_id(import_params[:id])
|
render_403 unless can_create_repository_rows?(@repository)
|
||||||
|
|
||||||
render_403 unless can_create_repository_rows?(repository)
|
|
||||||
|
|
||||||
unless import_params[:file]
|
unless import_params[:file]
|
||||||
repository_response(t('teams.parse_sheet.errors.no_file_selected'))
|
repository_response(t('teams.parse_sheet.errors.no_file_selected'))
|
||||||
|
@ -223,7 +222,7 @@ class RepositoriesController < ApplicationController
|
||||||
begin
|
begin
|
||||||
parsed_file = ImportRepository::ParseRepository.new(
|
parsed_file = ImportRepository::ParseRepository.new(
|
||||||
file: import_params[:file],
|
file: import_params[:file],
|
||||||
repository: repository,
|
repository: @repository,
|
||||||
session: session
|
session: session
|
||||||
)
|
)
|
||||||
if parsed_file.too_large?
|
if parsed_file.too_large?
|
||||||
|
@ -330,16 +329,14 @@ class RepositoriesController < ApplicationController
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_vars
|
def load_repository
|
||||||
repository_id = params[:id] || params[:repository_id]
|
repository_id = params[:id] || params[:repository_id]
|
||||||
@repository = Repository.accessible_by_teams(current_team).find_by_id(repository_id)
|
@repository = Repository.accessible_by_teams(current_team).find_by(id: repository_id)
|
||||||
render_404 unless @repository
|
render_404 unless @repository
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_parent_vars
|
def load_repositories
|
||||||
@team = current_team
|
@repositories = Repository.accessible_by_teams(current_team).order('repositories.created_at ASC')
|
||||||
render_404 unless @team
|
|
||||||
@repositories = Repository.accessible_by_teams(@team).order('repositories.created_at ASC')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_inline_name_editing
|
def set_inline_name_editing
|
||||||
|
@ -356,7 +353,7 @@ class RepositoriesController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_view_all_permissions
|
def check_view_all_permissions
|
||||||
render_403 unless can_read_team?(@team)
|
render_403 unless can_read_team?(current_team)
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_view_permissions
|
def check_view_permissions
|
||||||
|
@ -364,11 +361,11 @@ class RepositoriesController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_create_permissions
|
def check_create_permissions
|
||||||
render_403 unless can_create_repositories?(@team)
|
render_403 unless can_create_repositories?(current_team)
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_copy_permissions
|
def check_copy_permissions
|
||||||
render_403 if !can_create_repositories?(@team) || @repository.shared_with?(current_team)
|
render_403 if !can_create_repositories?(current_team) || @repository.shared_with?(current_team)
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_manage_permissions
|
def check_manage_permissions
|
||||||
|
@ -407,7 +404,7 @@ class RepositoriesController < ApplicationController
|
||||||
.call(activity_type: type_of,
|
.call(activity_type: type_of,
|
||||||
owner: current_user,
|
owner: current_user,
|
||||||
subject: @repository,
|
subject: @repository,
|
||||||
team: @team,
|
team: current_team,
|
||||||
message_items: message_items)
|
message_items: message_items)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,18 +4,13 @@ class RepositoryRowsController < ApplicationController
|
||||||
include ApplicationHelper
|
include ApplicationHelper
|
||||||
include MyModulesHelper
|
include MyModulesHelper
|
||||||
|
|
||||||
before_action :load_info_modal_vars, only: %i(show assigned_task_list)
|
before_action :load_repository
|
||||||
before_action :load_vars, only: %i(edit update)
|
before_action :load_repository_row, only: %i(update show assigned_task_list)
|
||||||
before_action :load_repository,
|
before_action :check_read_permissions, except: %i(create update delete_records copy_records)
|
||||||
only: %i(create
|
before_action :check_snapshotting_status, only: %i(create update delete_records copy_records)
|
||||||
delete_records
|
|
||||||
index
|
|
||||||
copy_records
|
|
||||||
available_rows)
|
|
||||||
before_action :check_create_permissions, only: :create
|
before_action :check_create_permissions, only: :create
|
||||||
before_action :check_delete_permissions, only: :delete_records
|
before_action :check_delete_permissions, only: :delete_records
|
||||||
before_action :check_manage_permissions,
|
before_action :check_manage_permissions, only: %i(update copy_records)
|
||||||
only: %i(edit update copy_records)
|
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@draw = params[:draw].to_i
|
@draw = params[:draw].to_i
|
||||||
|
@ -54,6 +49,9 @@ class RepositoryRowsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
@assigned_modules = MyModuleRepositoryRow.eager_load(my_module: [{ experiment: :project }])
|
||||||
|
.where(repository_row: @repository_row)
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.json do
|
format.json do
|
||||||
render json: {
|
render json: {
|
||||||
|
@ -65,54 +63,26 @@ class RepositoryRowsController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
|
||||||
json = {
|
|
||||||
repository_row: {
|
|
||||||
name: escape_input(@record.name),
|
|
||||||
repository_cells: {},
|
|
||||||
repository_column_items: fetch_columns_list_items
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add custom cells ids as key (easier lookup on js side)
|
|
||||||
@record.repository_cells.each do |cell|
|
|
||||||
if cell.value_type == 'RepositoryAssetValue'
|
|
||||||
cell_value = cell.value.asset
|
|
||||||
else
|
|
||||||
cell_value = escape_input(cell.value.data)
|
|
||||||
end
|
|
||||||
|
|
||||||
json[:repository_row][:repository_cells][cell.repository_column_id] = {
|
|
||||||
repository_cell_id: cell.id,
|
|
||||||
cell_column_id: cell.repository_column.id, # needed for mappings
|
|
||||||
value: cell_value,
|
|
||||||
type: cell.value_type,
|
|
||||||
list_items: fetch_list_items(cell)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
respond_to do |format|
|
|
||||||
format.html
|
|
||||||
format.json { render json: json }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def update
|
def update
|
||||||
row_update = RepositoryRows::UpdateRepositoryRowService
|
row_update = RepositoryRows::UpdateRepositoryRowService
|
||||||
.call(repository_row: @record, user: current_user, params: update_params)
|
.call(repository_row: @repository_row, user: current_user, params: update_params)
|
||||||
|
|
||||||
if row_update.succeed?
|
if row_update.succeed?
|
||||||
if row_update.record_updated
|
if row_update.record_updated
|
||||||
log_activity(:edit_item_inventory, @record)
|
log_activity(:edit_item_inventory, @repository_row)
|
||||||
@record.repository_cells.where(value_type: 'RepositoryTextValue').each do |repository_cell|
|
@repository_row.repository_cells.where(value_type: 'RepositoryTextValue').each do |repository_cell|
|
||||||
record_annotation_notification(@record, repository_cell)
|
record_annotation_notification(@repository_row, repository_cell)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
render json: { id: @record.id, flash: t('repositories.update.success_flash',
|
render json: {
|
||||||
record: escape_input(@record.name),
|
id: @repository_row.id,
|
||||||
repository: escape_input(@repository.name)) },
|
flash: t(
|
||||||
status: :ok
|
'repositories.update.success_flash',
|
||||||
|
record: escape_input(@repository_row.name),
|
||||||
|
repository: escape_input(@repository.name)
|
||||||
|
)
|
||||||
|
}, status: :ok
|
||||||
else
|
else
|
||||||
render json: row_update.errors, status: :bad_request
|
render json: row_update.errors, status: :bad_request
|
||||||
end
|
end
|
||||||
|
@ -122,7 +92,7 @@ class RepositoryRowsController < ApplicationController
|
||||||
deleted_count = 0
|
deleted_count = 0
|
||||||
if selected_params
|
if selected_params
|
||||||
selected_params.each do |row_id|
|
selected_params.each do |row_id|
|
||||||
row = @repository.repository_rows.find_by_id(row_id)
|
row = @repository.repository_rows.find_by(id: row_id)
|
||||||
next unless row && can_manage_repository_rows?(@repository)
|
next unless row && can_manage_repository_rows?(@repository)
|
||||||
|
|
||||||
log_activity(:delete_item_inventory, row)
|
log_activity(:delete_item_inventory, row)
|
||||||
|
@ -196,33 +166,34 @@ class RepositoryRowsController < ApplicationController
|
||||||
include StringUtility
|
include StringUtility
|
||||||
AvailableRepositoryRow = Struct.new(:id, :name, :has_file_attached)
|
AvailableRepositoryRow = Struct.new(:id, :name, :has_file_attached)
|
||||||
|
|
||||||
def load_info_modal_vars
|
def load_repository
|
||||||
@repository_row = RepositoryRow.eager_load(:created_by, repository: [:team])
|
|
||||||
.find_by_id(params[:id])
|
|
||||||
@assigned_modules = MyModuleRepositoryRow.eager_load(
|
|
||||||
my_module: [{ experiment: :project }]
|
|
||||||
).where(repository_row: @repository_row)
|
|
||||||
render_404 and return unless @repository_row
|
|
||||||
render_403 unless can_read_repository?(@repository_row.repository)
|
|
||||||
end
|
|
||||||
|
|
||||||
def load_vars
|
|
||||||
@repository = Repository.accessible_by_teams(current_team)
|
@repository = Repository.accessible_by_teams(current_team)
|
||||||
.eager_load(:repository_columns)
|
.eager_load(:repository_columns)
|
||||||
.find_by_id(params[:repository_id])
|
.find_by(id: params[:repository_id])
|
||||||
|
render_404 unless @repository
|
||||||
@record = @repository.repository_rows
|
|
||||||
.eager_load(:repository_columns)
|
|
||||||
.find_by_id(params[:id])
|
|
||||||
render_404 unless @repository && @record
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_repository
|
def load_repository_row
|
||||||
@repository = Repository.accessible_by_teams(current_team).find_by_id(params[:repository_id])
|
@repository_row = @repository.repository_rows.eager_load(:repository_columns).find_by(id: params[:id])
|
||||||
render_404 unless @repository
|
render_404 unless @repository_row
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_read_permissions
|
||||||
render_403 unless can_read_repository?(@repository)
|
render_403 unless can_read_repository?(@repository)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check_snapshotting_status
|
||||||
|
return if @repository.repository_snapshots.provisioning.none?
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.json do
|
||||||
|
render json: {
|
||||||
|
flash: t('repositories.index.snapshot_provisioning_in_progress')
|
||||||
|
}, status: :unprocessable_entity
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def check_create_permissions
|
def check_create_permissions
|
||||||
render_403 unless can_create_repository_rows?(@repository)
|
render_403 unless can_create_repository_rows?(@repository)
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,24 +12,13 @@ module RepositoryDatatableHelper
|
||||||
'3': escape_input(record.name),
|
'3': escape_input(record.name),
|
||||||
'4': I18n.l(record.created_at, format: :full),
|
'4': I18n.l(record.created_at, format: :full),
|
||||||
'5': escape_input(record.created_by.full_name),
|
'5': escape_input(record.created_by.full_name),
|
||||||
'recordInfoUrl': Rails.application.routes.url_helpers
|
'recordInfoUrl': Rails.application.routes.url_helpers.repository_repository_row_path(repository, record)
|
||||||
.repository_row_path(record.id)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unless options[:view_mode]
|
unless options[:view_mode]
|
||||||
row.merge!(
|
row['recordUpdateUrl'] =
|
||||||
'recordEditUrl': Rails.application.routes.url_helpers
|
Rails.application.routes.url_helpers.repository_repository_row_path(repository, record)
|
||||||
.edit_repository_repository_row_path(
|
row['recordEditable'] = record.editable?
|
||||||
repository,
|
|
||||||
record.id
|
|
||||||
),
|
|
||||||
'recordUpdateUrl': Rails.application.routes.url_helpers
|
|
||||||
.repository_repository_row_path(
|
|
||||||
repository,
|
|
||||||
record.id
|
|
||||||
),
|
|
||||||
'recordEditable': record.editable?
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
row['0'] = record[:row_assigned] if options[:my_module]
|
row['0'] = record[:row_assigned] if options[:my_module]
|
||||||
|
@ -49,7 +38,7 @@ module RepositoryDatatableHelper
|
||||||
{
|
{
|
||||||
'DT_RowId': record.id,
|
'DT_RowId': record.id,
|
||||||
'1': escape_input(record.name),
|
'1': escape_input(record.name),
|
||||||
'recordInfoUrl': Rails.application.routes.url_helpers.repository_row_path(record.id)
|
'recordInfoUrl': Rails.application.routes.url_helpers.repository_repository_row_path(record.repository, record)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -62,7 +51,7 @@ module RepositoryDatatableHelper
|
||||||
'2': escape_input(record.name),
|
'2': escape_input(record.name),
|
||||||
'3': I18n.l(record.created_at, format: :full),
|
'3': I18n.l(record.created_at, format: :full),
|
||||||
'4': escape_input(record.created_by.full_name),
|
'4': escape_input(record.created_by.full_name),
|
||||||
'recordInfoUrl': Rails.application.routes.url_helpers.repository_row_path(record.id)
|
'recordInfoUrl': Rails.application.routes.url_helpers.repository_repository_row_path(record.repository, record)
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add custom columns
|
# Add custom columns
|
||||||
|
|
|
@ -12,6 +12,19 @@ Canaid::Permissions.register_for(RepositoryBase) do
|
||||||
end
|
end
|
||||||
|
|
||||||
Canaid::Permissions.register_for(Repository) do
|
Canaid::Permissions.register_for(Repository) do
|
||||||
|
# Should be no provisioning snapshots for repository for all the specified permissions
|
||||||
|
%i(manage_repository
|
||||||
|
create_repository_rows
|
||||||
|
manage_repository_rows
|
||||||
|
update_repository_rows
|
||||||
|
delete_repository_rows
|
||||||
|
create_repository_columns)
|
||||||
|
.each do |perm|
|
||||||
|
can perm do |_, repository|
|
||||||
|
repository.repository_snapshots.provisioning.none?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# repository: update, delete
|
# repository: update, delete
|
||||||
can :manage_repository do |user, repository|
|
can :manage_repository do |user, repository|
|
||||||
user.is_admin_of_team?(repository.team) unless repository.shared_with?(user.current_team)
|
user.is_admin_of_team?(repository.team) unless repository.shared_with?(user.current_team)
|
||||||
|
|
|
@ -4,6 +4,7 @@ Canaid::Permissions.register_for(RepositoryColumn) do
|
||||||
# repository: update/delete field
|
# repository: update/delete field
|
||||||
# Tested in scope of RepositoryPermissions spec
|
# Tested in scope of RepositoryPermissions spec
|
||||||
can :manage_repository_column do |user, repository_column|
|
can :manage_repository_column do |user, repository_column|
|
||||||
|
repository_column.repository.repository_snapshots.provisioning.none? &&
|
||||||
can_create_repository_columns?(user, repository_column.repository)
|
can_create_repository_columns?(user, repository_column.repository)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -25,7 +25,7 @@ module RepositoryColumns
|
||||||
def column_attributes
|
def column_attributes
|
||||||
@params[:repository_status_items_attributes]&.map do |m|
|
@params[:repository_status_items_attributes]&.map do |m|
|
||||||
# assign for new records only
|
# assign for new records only
|
||||||
m.merge!(repository_id: @repository.id, created_by_id: @user.id, last_modified_by_id: @user.id) unless m[:id]
|
m.merge!(created_by_id: @user.id, last_modified_by_id: @user.id) unless m[:id]
|
||||||
end
|
end
|
||||||
|
|
||||||
@params
|
@params
|
||||||
|
|
|
@ -48,7 +48,7 @@ module SmartAnnotations
|
||||||
repository_name = fetch_repository_name(object)
|
repository_name = fetch_repository_name(object)
|
||||||
return "<span class='sa-type'>" \
|
return "<span class='sa-type'>" \
|
||||||
"#{trim_repository_name(repository_name)}</span> " \
|
"#{trim_repository_name(repository_name)}</span> " \
|
||||||
"<a href='#{ROUTES.repository_row_path(object)}' " \
|
"<a href='#{ROUTES.repository_repository_row_path(object.repository, object)}' " \
|
||||||
"class='record-info-link'>#{object.name}</a>"
|
"class='record-info-link'>#{object.name}</a>"
|
||||||
end
|
end
|
||||||
"<span class='sa-type'>Inv</span> " \
|
"<span class='sa-type'>Inv</span> " \
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
<th id="row-name"><%= t("repositories.table.row_name") %></th>
|
<th id="row-name"><%= t("repositories.table.row_name") %></th>
|
||||||
<th id="added-on"><%= t("repositories.table.added_on") %></th>
|
<th id="added-on"><%= t("repositories.table.added_on") %></th>
|
||||||
<th id="added-by"><%= t("repositories.table.added_by") %></th>
|
<th id="added-by"><%= t("repositories.table.added_by") %></th>
|
||||||
<% @repository_snapshot.repository_columns.order(:id).each do |column| %>
|
<% @repository_snapshot.repository_columns.order(:parent_id).each do |column| %>
|
||||||
<th class="repository-column"
|
<th class="repository-column"
|
||||||
id="<%= column.id %>"
|
id="<%= column.id %>"
|
||||||
data-type="<%= column.data_type %>"
|
data-type="<%= column.data_type %>"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<div class="modal" id="create-repo-modal" tabindex="-1" role="dialog" aria-labelledby="create-repo-modal-label">
|
<div class="modal" id="create-repo-modal" tabindex="-1" role="dialog" aria-labelledby="create-repo-modal-label">
|
||||||
<%= bootstrap_form_for [@team, @repository], remote: :true do |f| %>
|
<%= bootstrap_form_for [current_team, @repository], remote: :true do |f| %>
|
||||||
<div class="modal-dialog" role="document">
|
<div class="modal-dialog" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
data-current-uri="<%= request.original_url %>"
|
data-current-uri="<%= request.original_url %>"
|
||||||
data-repository-id="<%= repository.id %>"
|
data-repository-id="<%= repository.id %>"
|
||||||
data-source="<%= repository_index_link %>"
|
data-source="<%= repository_index_link %>"
|
||||||
|
data-toolbar-url="<%= repository_table_toolbar_path(@repository) %>"
|
||||||
data-num-columns="<%= 6 + repository.repository_columns.count %>"
|
data-num-columns="<%= 6 + repository.repository_columns.count %>"
|
||||||
data-create-record="<%= repository_repository_rows_path(repository) %>"
|
data-create-record="<%= repository_repository_rows_path(repository) %>"
|
||||||
data-delete-record="<%= repository_delete_records_path(repository) %>"
|
data-delete-record="<%= repository_delete_records_path(repository) %>"
|
||||||
|
@ -19,7 +20,9 @@
|
||||||
data-columns-changed="<%= I18n.t('repositories.columns_changed') %>"
|
data-columns-changed="<%= I18n.t('repositories.columns_changed') %>"
|
||||||
data-default-order="<%= default_table_order_as_js_array %>"
|
data-default-order="<%= default_table_order_as_js_array %>"
|
||||||
data-default-table-columns="<%= default_table_columns %>"
|
data-default-table-columns="<%= default_table_columns %>"
|
||||||
data-editable="<%= can_manage_repository_rows?(repository) %>">
|
data-editable="<%= can_manage_repository_rows?(repository) %>"
|
||||||
|
data-snapshot-provisioning="<%= @snapshot_provisioning %>"
|
||||||
|
data-status-url="<%= repository_status_path(@repository) %>">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th id="checkbox">
|
<th id="checkbox">
|
||||||
|
|
55
app/views/repositories/_toolbar_buttons.html.erb
Normal file
55
app/views/repositories/_toolbar_buttons.html.erb
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
<div id="toolbarButtonsDatatable">
|
||||||
|
<% if @repository.repository_snapshots.provisioning.any? %>
|
||||||
|
<div class='repository-provisioning-notice'>
|
||||||
|
<i class="fas fa-info-circle"></i>
|
||||||
|
<%= t('repositories.index.snapshot_provisioning_in_progress') %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if can_create_repository_rows?(@repository) %>
|
||||||
|
<button type="button" class="btn btn-primary editAdd" id="addRepositoryRecord" onclick="onClickAddRecord()">
|
||||||
|
<span class="fas fa-plus"></span>
|
||||||
|
<span class="hidden-xs"><%= t("repositories.add_new_record") %></span>
|
||||||
|
</button>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if can_manage_repository_rows?(@repository) %>
|
||||||
|
<span id="editDeleteCopy" data-toggle="buttons" style="display:none">
|
||||||
|
<%if can_update_repository_rows?(@repository) %>
|
||||||
|
<button type="button" class="btn btn-light editAdd" id="editRepositoryRecord" onclick="onClickEdit()" disabled>
|
||||||
|
<span class="fas fa-pencil-alt"></span>
|
||||||
|
<span class="hidden-xs-custom"><%= t("repositories.edit_record") %></span>
|
||||||
|
</button>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if can_delete_repository_rows?(@repository) %>
|
||||||
|
<button type="button" class="btn btn-light"
|
||||||
|
id="deleteRepositoryRecordsButton" onclick="onClickDelete()" disabled>
|
||||||
|
<span class="fas fa-trash"></span>
|
||||||
|
<span class="hidden-xs-custom"><%= t'repositories.delete_record' %></span>
|
||||||
|
<%= submit_tag I18n.t('repositories.delete_record'), :class => "hidden delete_repository_records_submit" %>
|
||||||
|
</button>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if can_create_repository_rows?(@repository) %>
|
||||||
|
<button type="button" class="btn btn-light copyRow" id="copyRepositoryRecords" onclick="onClickCopyRepositoryRecords()" disabled>
|
||||||
|
<span class="fas fa-copy"></span>
|
||||||
|
<span class="hidden-xs-custom"><%= t("repositories.copy_record") %></span>
|
||||||
|
</button>
|
||||||
|
<%end%>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span id="saveCancel" data-toggle="buttons" style="display:none">
|
||||||
|
<button type="button" class="btn btn-success" id="saveRecord">
|
||||||
|
<span class="fas fa-save"></span>
|
||||||
|
<%= t("repositories.save_record") %>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn btn-light" id="cancelSave">
|
||||||
|
<span class="fas fa-times-circle"></span>
|
||||||
|
<%= t("repositories.cancel_save") %>
|
||||||
|
</button>
|
||||||
|
</span>
|
||||||
|
<% elsif @repository.shared_with?(current_team) %>
|
||||||
|
<p class="view-only-label"><%= t('repositories.index.view_only_permission_label') %></p>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
|
@ -108,57 +108,6 @@
|
||||||
<div class="toolbar-filter-buttons" style="display:none">
|
<div class="toolbar-filter-buttons" style="display:none">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="toolbarButtonsDatatable" style="display:none">
|
|
||||||
|
|
||||||
<% if can_create_repository_rows?(@repository) %>
|
|
||||||
<button type="button" class="btn btn-primary editAdd"
|
|
||||||
id="addRepositoryRecord" onclick="onClickAddRecord()">
|
|
||||||
<span class="fas fa-plus"></span>
|
|
||||||
<span class="hidden-xs"><%= t("repositories.add_new_record") %></span>
|
|
||||||
</button>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<% if can_manage_repository_rows?(@repository) %>
|
|
||||||
<span id="editDeleteCopy" data-toggle="buttons" style="display:none">
|
|
||||||
<%if @display_edit_button %>
|
|
||||||
<button type="button" class="btn btn-light editAdd" id="editRepositoryRecord" onclick="onClickEdit()" disabled>
|
|
||||||
<span class="fas fa-pencil-alt"></span>
|
|
||||||
<span class="hidden-xs-custom"><%= t("repositories.edit_record") %></span>
|
|
||||||
</button>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<%if @display_delete_button %>
|
|
||||||
<button type="button" class="btn btn-light"
|
|
||||||
id="deleteRepositoryRecordsButton" onclick="onClickDelete()" disabled>
|
|
||||||
<span class="fas fa-trash"></span>
|
|
||||||
<span class="hidden-xs-custom"><%= t'repositories.delete_record' %></span>
|
|
||||||
<%= submit_tag I18n.t('repositories.delete_record'), :class => "hidden delete_repository_records_submit" %>
|
|
||||||
</button>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<%if @display_duplicate_button %>
|
|
||||||
<button type="button" class="btn btn-light copyRow" id="copyRepositoryRecords" onclick="onClickCopyRepositoryRecords()" disabled>
|
|
||||||
<span class="fas fa-copy"></span>
|
|
||||||
<span class="hidden-xs-custom"><%= t("repositories.copy_record") %></span>
|
|
||||||
</button>
|
|
||||||
<%end%>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<span id="saveCancel" data-toggle="buttons" style="display:none">
|
|
||||||
<button type="button" class="btn btn-success" id="saveRecord">
|
|
||||||
<span class="fas fa-save"></span>
|
|
||||||
<%= t("repositories.save_record") %>
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-light" id="cancelSave">
|
|
||||||
<span class="fas fa-times-circle"></span>
|
|
||||||
<%= t("repositories.cancel_save") %>
|
|
||||||
</button>
|
|
||||||
</span>
|
|
||||||
<% elsif @repository.shared_with?(current_team) %>
|
|
||||||
<p class="view-only-label"><%= t('repositories.index.view_only_permission_label') %></p>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<%= render partial: "repositories/repository_table.html.erb",
|
<%= render partial: "repositories/repository_table.html.erb",
|
||||||
locals: {
|
locals: {
|
||||||
repository: @repository,
|
repository: @repository,
|
||||||
|
|
|
@ -1072,6 +1072,7 @@ en:
|
||||||
view_only_permission_label: "You have veiw-only permission"
|
view_only_permission_label: "You have veiw-only permission"
|
||||||
show_per_page: "Show %{number} per page"
|
show_per_page: "Show %{number} per page"
|
||||||
filter_inventory: "Filter inventory item"
|
filter_inventory: "Filter inventory item"
|
||||||
|
snapshot_provisioning_in_progress: 'Editing is disabled while a snapshot is being created. This will only take a moment.'
|
||||||
|
|
||||||
options_dropdown:
|
options_dropdown:
|
||||||
import_items: 'Import items'
|
import_items: 'Import items'
|
||||||
|
|
|
@ -632,13 +632,20 @@ Rails.application.routes.draw do
|
||||||
to: 'repository_columns#available_columns',
|
to: 'repository_columns#available_columns',
|
||||||
as: 'available_columns',
|
as: 'available_columns',
|
||||||
defaults: { format: 'json' }
|
defaults: { format: 'json' }
|
||||||
|
get :table_toolbar
|
||||||
|
get :status
|
||||||
|
|
||||||
resources :repository_columns, only: %i(create edit update destroy)
|
resources :repository_columns, only: %i(create edit update destroy)
|
||||||
resources :repository_rows, only: %i(create edit update) do
|
resources :repository_rows, only: %i(create show update) do
|
||||||
member do
|
member do
|
||||||
get :assigned_task_list
|
get :assigned_task_list
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
collection do
|
||||||
|
post 'available_rows', to: 'repository_rows#available_rows', defaults: { format: 'json' }
|
||||||
|
end
|
||||||
|
|
||||||
member do
|
member do
|
||||||
post 'parse_sheet', defaults: { format: 'json' }
|
post 'parse_sheet', defaults: { format: 'json' }
|
||||||
post 'import_records'
|
post 'import_records'
|
||||||
|
@ -667,13 +674,6 @@ Rails.application.routes.draw do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
post 'available_rows', to: 'repository_rows#available_rows',
|
|
||||||
defaults: { format: 'json' }
|
|
||||||
|
|
||||||
get 'repository_rows/:id', to: 'repository_rows#show',
|
|
||||||
as: :repository_row,
|
|
||||||
defaults: { format: 'json' }
|
|
||||||
|
|
||||||
get 'search' => 'search#index'
|
get 'search' => 'search#index'
|
||||||
get 'search/new' => 'search#new', as: :new_search
|
get 'search/new' => 'search#new', as: :new_search
|
||||||
|
|
||||||
|
|
|
@ -36,17 +36,17 @@ describe RepositoryRowsController, type: :controller do
|
||||||
|
|
||||||
describe '#show' do
|
describe '#show' do
|
||||||
it 'unsuccessful response with non existing id' do
|
it 'unsuccessful response with non existing id' do
|
||||||
get :show, format: :json, params: { id: -1 }
|
get :show, format: :json, params: { repository_id: repository.id, id: -1 }
|
||||||
expect(response).to have_http_status(:not_found)
|
expect(response).to have_http_status(:not_found)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'unsuccessful response with unpermitted id' do
|
it 'unsuccessful response with id from another repository' do
|
||||||
get :show, format: :json, params: { id: repository_row_two.id }
|
get :show, format: :json, params: { repository_id: repository.id, id: repository_row_two.id }
|
||||||
expect(response).to have_http_status(:forbidden)
|
expect(response).to have_http_status(:not_found)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'successful response' do
|
it 'successful response' do
|
||||||
get :show, format: :json, params: { id: repository_row.id }
|
get :show, format: :json, params: { repository_id: repository.id, id: repository_row.id }
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
"data": {
|
"data": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items":{
|
"items":{
|
||||||
"required": ["DT_RowId", "1", "2", "3", "4", "5", "recordEditUrl", "recordUpdateUrl", "recordInfoUrl"],
|
"required": ["DT_RowId", "1", "2", "3", "4", "5", "recordUpdateUrl", "recordInfoUrl"],
|
||||||
"properties": {
|
"properties": {
|
||||||
"DT_RowId": { "type": "integer" },
|
"DT_RowId": { "type": "integer" },
|
||||||
"1": { "type": "object" },
|
"1": { "type": "object" },
|
||||||
|
@ -16,7 +16,6 @@
|
||||||
"3": { "type": "string" },
|
"3": { "type": "string" },
|
||||||
"4": { "type": "string" },
|
"4": { "type": "string" },
|
||||||
"5": { "type": "string" },
|
"5": { "type": "string" },
|
||||||
"recordEditUrl": { "type": "string" },
|
|
||||||
"recordUpdateUrl": { "type": "string" },
|
"recordUpdateUrl": { "type": "string" },
|
||||||
"recordInfoUrl": { "type": "string" }
|
"recordInfoUrl": { "type": "string" }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue