mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-04 19:05:37 +08:00
Merge branch 'develop' into features/inventory-import-improvements
This commit is contained in:
commit
ace245c11f
10 changed files with 137 additions and 26 deletions
|
@ -342,7 +342,7 @@ function init() {
|
|||
init();
|
||||
|
||||
const viewMode = new URLSearchParams(window.location.search).get('view_mode');
|
||||
if (viewMode === 'archived') {
|
||||
if (['archived', 'locked', 'active'].includes(viewMode)) {
|
||||
setTimeout(() => {
|
||||
const notesContainerEl = document.getElementById('notes-container');
|
||||
window.wrapTables(notesContainerEl);
|
||||
|
|
|
@ -96,7 +96,7 @@ class RepositoriesController < ApplicationController
|
|||
end
|
||||
|
||||
def shareable_teams
|
||||
teams = current_user.teams - [@repository.team]
|
||||
teams = current_user.teams.order(:name) - [@repository.team]
|
||||
render json: teams, each_serializer: ShareableTeamSerializer, repository: @repository
|
||||
end
|
||||
|
||||
|
|
|
@ -37,6 +37,16 @@ const DEFAULT_FILTERS = [
|
|||
},
|
||||
{
|
||||
id: 4,
|
||||
column: {
|
||||
data_type: 'RepositoryRelationshipValue',
|
||||
id: 'relationships',
|
||||
name: I18n.t('repositories.table.relationships')
|
||||
},
|
||||
data: { operator: 'contains' },
|
||||
isBlank: true
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
column: {
|
||||
data_type: 'RepositoryDateTimeValue',
|
||||
id: 'added_on',
|
||||
|
@ -46,7 +56,7 @@ const DEFAULT_FILTERS = [
|
|||
isBlank: true
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
id: 6,
|
||||
column: {
|
||||
data_type: 'RepositoryUserValue',
|
||||
id: 'added_by',
|
||||
|
@ -63,6 +73,7 @@ window.initRepositoryFilter = () => {
|
|||
{ id: 'assigned', name: I18n.t('repositories.table.assigned_tasks'), data_type: 'RepositoryMyModuleValue' },
|
||||
{ id: 'row_id', name: I18n.t('repositories.table.id'), data_type: 'RepositoryTextValue' },
|
||||
{ id: 'row_name', name: I18n.t('repositories.table.row_name'), data_type: 'RepositoryTextValue' },
|
||||
{ id: 'relationships', name: I18n.t('repositories.table.relationships'), data_type: 'RepositoryRelationshipValue' },
|
||||
{ id: 'added_on', name: I18n.t('repositories.table.added_on'), data_type: 'RepositoryDateTimeValue' },
|
||||
{ id: 'added_by', name: I18n.t('repositories.table.added_by'), data_type: 'RepositoryUserValue' },
|
||||
{ id: 'archived_by', name: I18n.t('repositories.table.archived_by'), data_type: 'RepositoryUserValue' },
|
||||
|
@ -70,6 +81,7 @@ window.initRepositoryFilter = () => {
|
|||
];
|
||||
const app = createApp({
|
||||
data: () => ({
|
||||
open: false,
|
||||
filters: [],
|
||||
defaultFilters: DEFAULT_FILTERS,
|
||||
columns: [],
|
||||
|
@ -79,19 +91,29 @@ window.initRepositoryFilter = () => {
|
|||
filterName: null
|
||||
}),
|
||||
created() {
|
||||
this.dataTableElement = $($('#filterContainer').data('datatable-id'));
|
||||
$('#filtersDropdownButton').on('show.bs.dropdown', () => {
|
||||
this.open = true;
|
||||
this.dataTableElement = $($('#filterContainer').data('datatable-id'));
|
||||
|
||||
$.get($('#filterContainer').data('my-modules-url'), (data) => {
|
||||
this.my_modules = data.data;
|
||||
$.get($('#filterContainer').data('my-modules-url'), (data) => {
|
||||
this.my_modules = data.data;
|
||||
});
|
||||
|
||||
$.get($('#filterContainer').data('columns-url'), (data) => {
|
||||
const combinedColumns = data.response.concat(defaultColumns);
|
||||
this.columns = combinedColumns.sort((a, b) => (a.name > b.name ? 1 : -1));
|
||||
});
|
||||
|
||||
$.get($('#filterContainer').data('saved-filters-url'), (data) => {
|
||||
this.savedFilters = data.data;
|
||||
});
|
||||
|
||||
$('#filtersColumnsDropdown, #savedFiltersContainer').removeClass('open');
|
||||
});
|
||||
|
||||
$.get($('#filterContainer').data('columns-url'), (data) => {
|
||||
const combinedColumns = data.response.concat(defaultColumns);
|
||||
this.columns = combinedColumns.sort((a, b) => a.name > b.name ? 1 : -1);
|
||||
});
|
||||
|
||||
$.get($('#filterContainer').data('saved-filters-url'), (data) => {
|
||||
this.savedFilters = data.data;
|
||||
$('#filterContainer').on('click', (e) => {
|
||||
$('#filterContainer .dropdown-selector-container').removeClass('open');
|
||||
e.stopPropagation();
|
||||
});
|
||||
},
|
||||
computed: {
|
||||
|
@ -151,13 +173,4 @@ window.initRepositoryFilter = () => {
|
|||
app.config.globalProperties.i18n = window.I18n;
|
||||
app.config.globalProperties.dateFormat = $('#filterContainer').data('date-format');
|
||||
window.repositoryFilterObject = mountWithTurbolinks(app, '#filterContainer');
|
||||
|
||||
$('#filterContainer').on('click', (e) => {
|
||||
$('#filterContainer .dropdown-selector-container').removeClass('open')
|
||||
e.stopPropagation();
|
||||
});
|
||||
|
||||
$('#filtersDropdownButton').on('show.bs.dropdown', () => {
|
||||
$('#filtersColumnsDropdown, #savedFiltersContainer').removeClass('open');
|
||||
});
|
||||
};
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
<script>
|
||||
// filter types
|
||||
import RepositoryNonEmptyTextValue from './filters/repositoryNonEmptyTextValue.vue';
|
||||
import RepositoryRelationshipValue from './filters/repositoryRelationshipValue.vue';
|
||||
import RepositoryAssetValue from './filters/repositoryAssetValue.vue';
|
||||
import RepositoryTextValue from './filters/repositoryTextValue.vue';
|
||||
import RepositoryNumberValue from './filters/repositoryNumberValue.vue';
|
||||
|
@ -47,6 +48,7 @@ export default {
|
|||
components: {
|
||||
DropdownSelector,
|
||||
RepositoryNonEmptyTextValue,
|
||||
RepositoryRelationshipValue,
|
||||
RepositoryAssetValue,
|
||||
RepositoryTextValue,
|
||||
RepositoryNumberValue,
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
<template>
|
||||
<div class="filter-attributes">
|
||||
<div class="operator-selector">
|
||||
<DropdownSelector
|
||||
:disableSearch="true"
|
||||
:options="this.operators"
|
||||
:selectedValue="this.operator"
|
||||
:selectorId="`OperatorSelector${this.filter.id}`"
|
||||
:data-e2e="`e2e-DD-invInventoryFilterCO-option${this.filter.column.id}`"
|
||||
@dropdown:changed="($event) => { updateOperator($event); this.value = ''; }"
|
||||
/>
|
||||
</div>
|
||||
<div class="sci-input-container">
|
||||
<input
|
||||
class="sci-input-field"
|
||||
:class="{ invisible: operator !== 'contains' }"
|
||||
type="text"
|
||||
name="value"
|
||||
v-model="value"
|
||||
:data-e2e="`e2e-IF-invInventoryFilterCO-input${this.filter.column.id}`"
|
||||
:placeholder= "i18n.t('repositories.show.repository_filter.filters.types.RepositoryRelationshipValue.input_placeholder')"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import FilterMixin from '../mixins/filter.js';
|
||||
import DropdownSelector from '../../shared/legacy/dropdown_selector.vue';
|
||||
|
||||
export default {
|
||||
name: 'RepositoryRelationshipValue',
|
||||
mixins: [FilterMixin],
|
||||
data() {
|
||||
return {
|
||||
operators: [
|
||||
{ value: 'contains', label: this.i18n.t('repositories.show.repository_filter.filters.operators.contains') },
|
||||
{ value: 'contains_relationship', label: this.i18n.t('repositories.show.repository_filter.filters.operators.contains_relationship') },
|
||||
{ value: 'doesnt_contain_relationship', label: this.i18n.t('repositories.show.repository_filter.filters.operators.does_not_contain_relationship') }
|
||||
],
|
||||
operator: 'contains',
|
||||
value: ''
|
||||
};
|
||||
},
|
||||
components: {
|
||||
DropdownSelector
|
||||
},
|
||||
watch: {
|
||||
value() {
|
||||
this.parameters = { text: this.value };
|
||||
this.updateFilter();
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
isBlank() {
|
||||
return !this.operator || (this.operator === 'contains' && !this.value);
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -23,7 +23,7 @@
|
|||
"
|
||||
:no-options-placeholder="
|
||||
i18n.t(
|
||||
'my_modules.results.move_modal.no_options_placeholder'
|
||||
`my_modules.results.move_modal.${parent_type}.no_options_placeholder`
|
||||
)
|
||||
"
|
||||
/>
|
||||
|
|
|
@ -157,7 +157,7 @@ class AssetSerializer < ActiveModel::Serializer
|
|||
urls[:asset_checksum] = asset_checksum_path(object)
|
||||
end
|
||||
|
||||
urls[:wopi_action] = object.get_action_url(user, 'embedview') if wopi && can_manage_asset?(user, object)
|
||||
urls[:wopi_action] = object.get_action_url(user, 'embedview') if wopi && can_read_asset?(user, object)
|
||||
urls[:blob] = rails_blob_path(object.file, disposition: 'attachment') if object.file.attached?
|
||||
|
||||
urls
|
||||
|
|
|
@ -10,7 +10,7 @@ class RepositoryDatatableService
|
|||
include MyModulesHelper
|
||||
attr_reader :repository_rows, :all_count, :mappings
|
||||
|
||||
PREDEFINED_COLUMNS = %w(row_id row_name added_on added_by archived_on archived_by assigned).freeze
|
||||
PREDEFINED_COLUMNS = %w(row_id row_name added_on added_by archived_on archived_by assigned relationships).freeze
|
||||
|
||||
def initialize(repository, params, user, my_module = nil)
|
||||
@repository = repository
|
||||
|
@ -154,6 +154,8 @@ class RepositoryDatatableService
|
|||
build_row_id_filter_condition(repository_rows, filter_element_params)
|
||||
when 'row_name'
|
||||
build_name_filter_condition(repository_rows, filter_element_params)
|
||||
when 'relationships'
|
||||
build_relationship_filter_condition(repository_rows, filter_element_params)
|
||||
when 'added_on'
|
||||
build_added_on_filter_condition(repository_rows, filter_element_params)
|
||||
when 'added_by'
|
||||
|
@ -202,6 +204,32 @@ class RepositoryDatatableService
|
|||
end
|
||||
end
|
||||
|
||||
def build_relationship_filter_condition(repository_rows, filter_element_params)
|
||||
case filter_element_params[:operator]
|
||||
when 'contains'
|
||||
text = "%#{ActiveRecord::Base.sanitize_sql_like(filter_element_params.dig(:parameters, :text))}%"
|
||||
|
||||
repository_rows.where(
|
||||
id: repository_rows.left_outer_joins(:parent_repository_rows, :child_repository_rows)
|
||||
.where("trim_html_tags(child_repository_rows_repository_rows.name)::text ILIKE ? OR
|
||||
trim_html_tags(parent_repository_rows_repository_rows.name)::text ILIKE ? OR
|
||||
('#{RepositoryRow::ID_PREFIX}' ||
|
||||
child_repository_rows_repository_rows.id)::text ILIKE ? OR
|
||||
('#{RepositoryRow::ID_PREFIX}' ||
|
||||
parent_repository_rows_repository_rows.id)::text ILIKE ?",
|
||||
text, text, text, text).select(:id)
|
||||
)
|
||||
when 'contains_relationship'
|
||||
repository_rows = repository_rows.left_outer_joins(:parent_connections, :child_connections)
|
||||
repository_rows.where.not(parent_connections: { id: nil })
|
||||
.or(repository_rows.where.not(child_connections: { id: nil }))
|
||||
when 'doesnt_contain_relationship'
|
||||
repository_rows.where.missing(:parent_connections, :child_connections)
|
||||
else
|
||||
raise ArgumentError, 'Wrong operator for RepositoryRow Relationship!'
|
||||
end
|
||||
end
|
||||
|
||||
def build_added_on_filter_condition(repository_rows, filter_element_params)
|
||||
case filter_element_params[:operator]
|
||||
when 'today'
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
data-user-utc-offset="<%= ActiveSupport::TimeZone.find_tzinfo(current_user.time_zone).utc_offset %>"
|
||||
>
|
||||
<filter-container
|
||||
v-if="open"
|
||||
:columns.sync="columns"
|
||||
:my_modules.sync="my_modules"
|
||||
:default-filters="defaultFilters"
|
||||
|
|
|
@ -1344,7 +1344,10 @@ en:
|
|||
delete: "Delete"
|
||||
move_modal:
|
||||
search_placeholder: "Enter result name"
|
||||
no_options_placeholder: "No steps available to select"
|
||||
step:
|
||||
no_options_placeholder: "No steps available to select"
|
||||
result:
|
||||
no_options_placeholder: "No results available to select"
|
||||
delete_modal:
|
||||
title: "Delete result"
|
||||
description_1: "You’re about to delete the result. It might contain data you don’t want to lose. You won’t be able to get it back."
|
||||
|
@ -1995,6 +1998,8 @@ en:
|
|||
operators:
|
||||
contains: "Contains"
|
||||
does_not_contain: "Doesn’t contain"
|
||||
contains_relationship: "Contains relationships"
|
||||
does_not_contain_relationship: "Doesn’t contain relationships"
|
||||
equal_to: "Equal to"
|
||||
unequal_to: "Not equal to"
|
||||
greater_than: "Greater than"
|
||||
|
@ -2034,6 +2039,8 @@ en:
|
|||
input_placeholder: "Enter text"
|
||||
RepositoryTextValue:
|
||||
input_placeholder: "Enter %{name}"
|
||||
RepositoryRelationshipValue:
|
||||
input_placeholder: "Enter related item ID or name"
|
||||
RepositoryNumberValue:
|
||||
input_placeholder: "Enter %{name}"
|
||||
to_placeholder: "To"
|
||||
|
|
Loading…
Add table
Reference in a new issue