Allows the API to create a hidden query that will not be rendered to the user even if it is within a project context.pull/7033/head
parent
23f96ff07f
commit
e9cc09840d
@ -0,0 +1,49 @@ |
||||
#-- encoding: UTF-8 |
||||
#-- copyright |
||||
# OpenProject is a project management system. |
||||
# Copyright (C) 2012-2018 the OpenProject Foundation (OPF) |
||||
# |
||||
# This program is free software; you can redistribute it and/or |
||||
# modify it under the terms of the GNU General Public License version 3. |
||||
# |
||||
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||
# Copyright (C) 2006-2017 Jean-Philippe Lang |
||||
# Copyright (C) 2010-2013 the ChiliProject Team |
||||
# |
||||
# This program is free software; you can redistribute it and/or |
||||
# modify it under the terms of the GNU General Public License |
||||
# as published by the Free Software Foundation; either version 2 |
||||
# of the License, or (at your option) any later version. |
||||
# |
||||
# This program is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with this program; if not, write to the Free Software |
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||
# |
||||
# See docs/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
class Queries::Queries::Filters::HiddenFilter < Queries::Queries::Filters::QueryFilter |
||||
def self.key |
||||
:hidden |
||||
end |
||||
|
||||
def allowed_values |
||||
[ |
||||
[I18n.t(:general_text_yes), OpenProject::Database::DB_VALUE_TRUE], |
||||
[I18n.t(:general_text_no), OpenProject::Database::DB_VALUE_FALSE] |
||||
] |
||||
end |
||||
|
||||
def type |
||||
:list |
||||
end |
||||
|
||||
def type_strategy |
||||
@type_strategy ||= ::Queries::Filters::Strategies::BooleanList.new self |
||||
end |
||||
end |
@ -0,0 +1,5 @@ |
||||
class AddHiddenToQueries < ActiveRecord::Migration[5.2] |
||||
def change |
||||
add_column :queries, :hidden, :boolean, default: false |
||||
end |
||||
end |
@ -0,0 +1,26 @@ |
||||
require 'spec_helper' |
||||
|
||||
describe 'Visiting a hidden query', js: true do |
||||
let(:user) { FactoryBot.create :admin } |
||||
let(:project) { FactoryBot.create(:project) } |
||||
|
||||
let(:wp_table) { Pages::WorkPackagesTable.new(project) } |
||||
let(:highlighting) { ::Components::WorkPackages::Highlighting.new } |
||||
let!(:work_package) { FactoryBot.create :work_package, project: project } |
||||
|
||||
let!(:query) { FactoryBot.create(:query, name: 'my hidden query', user: user, project: project, hidden: true) } |
||||
|
||||
before do |
||||
login_as(user) |
||||
wp_table.visit! |
||||
end |
||||
|
||||
it 'does not render the hidden query' do |
||||
expect(page).to have_selector('.wp-query-menu--search-ul') |
||||
expect(page).to have_no_selector('.ui-menu-item', text: 'my hidden query') |
||||
|
||||
query.update(name: 'my visible query', hidden: false) |
||||
wp_table.visit! |
||||
expect(page).to have_selector('.ui-menu-item', text: 'my visible query') |
||||
end |
||||
end |
@ -0,0 +1,117 @@ |
||||
#-- encoding: UTF-8 |
||||
|
||||
#-- copyright |
||||
# OpenProject is a project management system. |
||||
# Copyright (C) 2012-2018 the OpenProject Foundation (OPF) |
||||
# |
||||
# This program is free software; you can redistribute it and/or |
||||
# modify it under the terms of the GNU General Public License version 3. |
||||
# |
||||
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||
# Copyright (C) 2006-2017 Jean-Philippe Lang |
||||
# Copyright (C) 2010-2013 the ChiliProject Team |
||||
# |
||||
# This program is free software; you can redistribute it and/or |
||||
# modify it under the terms of the GNU General Public License |
||||
# as published by the Free Software Foundation; either version 2 |
||||
# of the License, or (at your option) any later version. |
||||
# |
||||
# This program is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with this program; if not, write to the Free Software |
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||
# |
||||
# See docs/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require 'spec_helper' |
||||
|
||||
describe Queries::Queries::Filters::HiddenFilter, type: :model do |
||||
let(:instance) do |
||||
described_class.create!(name: 'hidden', context: nil, operator: operator, values: values) |
||||
end |
||||
|
||||
it_behaves_like 'basic query filter' do |
||||
let(:class_key) { :hidden } |
||||
let(:type) { :list } |
||||
end |
||||
|
||||
include_context 'filter tests' |
||||
let(:type) { :list } |
||||
|
||||
describe '#scope' do |
||||
context 'for "= t"' do |
||||
let(:operator) { '=' } |
||||
let(:values) { ['t'] } |
||||
|
||||
it 'is the same as handwriting the query' do |
||||
expected = Query.where(["queries.hidden IN (?)", values]) |
||||
|
||||
expect(instance.scope.to_sql).to eql expected.to_sql |
||||
end |
||||
end |
||||
|
||||
context 'for "= f"' do |
||||
let(:operator) { '=' } |
||||
let(:values) { ['f'] } |
||||
|
||||
it 'is the same as handwriting the query' do |
||||
sql = "queries.hidden IS NULL OR queries.hidden IN (?)" |
||||
expected = Query.where([sql, values]) |
||||
|
||||
expect(instance.scope.to_sql).to eql expected.to_sql |
||||
end |
||||
end |
||||
|
||||
context 'for "!"' do |
||||
let(:operator) { '!' } |
||||
let(:values) { ['f'] } |
||||
|
||||
it 'is the same as handwriting the query' do |
||||
expected = Query.where(["queries.hidden IN ('t')", values]) |
||||
|
||||
expect(instance.scope.to_sql).to eql expected.to_sql |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe '#valid?' do |
||||
let(:operator) { '=' } |
||||
|
||||
context 'for true value' do |
||||
let(:values) { ['t'] } |
||||
|
||||
it 'is valid' do |
||||
expect(instance).to be_valid |
||||
end |
||||
end |
||||
|
||||
context 'for false value' do |
||||
let(:values) { ['f'] } |
||||
|
||||
it 'is valid' do |
||||
expect(instance).to be_valid |
||||
end |
||||
end |
||||
|
||||
context 'for an invalid operator' do |
||||
let(:operator) { '*' } |
||||
|
||||
it 'is invalid' do |
||||
expect(instance).to be_invalid |
||||
end |
||||
end |
||||
|
||||
context 'for an invalid value' do |
||||
let(:values) { ['inexistent'] } |
||||
|
||||
it 'is invalid' do |
||||
expect(instance).to be_invalid |
||||
end |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue