From 556fe4a38d22fb06bbe24a548d2c316dda68a04b Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Fri, 22 Nov 2024 16:34:40 +0100 Subject: [PATCH] [#59572] fixed rendering of hierarchy values in wp table views - https://community.openproject.org/wp/59572 - use text display field (default) to also handle resources and represent them --- app/models/custom_value/hierarchy_strategy.rb | 2 ++ frontend/src/app/core/state/is-array-of.ts | 35 +++++++++++++++++++ .../field-types/text-display-field.module.ts | 16 +++++++++ 3 files changed, 53 insertions(+) create mode 100644 frontend/src/app/core/state/is-array-of.ts diff --git a/app/models/custom_value/hierarchy_strategy.rb b/app/models/custom_value/hierarchy_strategy.rb index 86d63d5145bb..2ce05be7336b 100644 --- a/app/models/custom_value/hierarchy_strategy.rb +++ b/app/models/custom_value/hierarchy_strategy.rb @@ -48,6 +48,8 @@ def ar_object(value) item = CustomField::Hierarchy::Item.find_by(id: value.to_s) if item.nil? "#{value} #{I18n.t(:label_not_found)}" + elsif item.short.present? + "#{item.label} (#{item.short})" else item.label end diff --git a/frontend/src/app/core/state/is-array-of.ts b/frontend/src/app/core/state/is-array-of.ts new file mode 100644 index 000000000000..77721cd4de10 --- /dev/null +++ b/frontend/src/app/core/state/is-array-of.ts @@ -0,0 +1,35 @@ +//-- copyright +// OpenProject is an open source project management software. +// Copyright (C) the OpenProject GmbH +// +// 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-2013 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 COPYRIGHT and LICENSE files for more details. +//++ + +export default function isArrayOf(array:unknown, type:new (...args:never[]) => T):array is T[] { + if (!Array.isArray(array)) { + return false; + } + + return array.every((item):item is T => item instanceof type); +} diff --git a/frontend/src/app/shared/components/fields/display/field-types/text-display-field.module.ts b/frontend/src/app/shared/components/fields/display/field-types/text-display-field.module.ts index a6dfcda0f327..869580282245 100644 --- a/frontend/src/app/shared/components/fields/display/field-types/text-display-field.module.ts +++ b/frontend/src/app/shared/components/fields/display/field-types/text-display-field.module.ts @@ -27,6 +27,22 @@ //++ import { DisplayField } from 'core-app/shared/components/fields/display/display-field.module'; +import { HalResource } from 'core-app/features/hal/resources/hal-resource'; +import isArrayOf from 'core-app/core/state/is-array-of'; export class TextDisplayField extends DisplayField { + public get valueString():string { + // render a text representation for the assigned attribute, independent of the attribute being a resource, + // an array of resources or a single text value. + + if (this.value instanceof HalResource) { + return this.value.name; + } + + if (isArrayOf(this.value, HalResource)) { + return this.value.map((r) => r.name).join(', '); + } + + return this.value as string; + } }