This commit is contained in:
2025-11-14 02:35:17 +01:00
parent 6f4ff68062
commit a3c5494bf7
53 changed files with 269 additions and 340 deletions
@@ -9,6 +9,7 @@ import {
toIssuedTimestamp,
} from '../utils/date';
import { describeDocumentSummary } from './documentSummary';
import { isPlainObject } from '../utils/typeGuards';
type Identifier = string | number;
@@ -110,43 +111,33 @@ interface QuickAddEntry {
original: QuickAddOption | string;
}
const resolveOptionName = (source: unknown): string => {
const resolveOptionName = (source?: QuickAddOption | string | null): string => {
if (!source) {
return '';
}
if (typeof source === 'string') {
return source.trim();
if (isPlainObject(source)) {
const raw = source.name ?? source.label ?? '';
return `${raw}`.trim();
}
if (typeof source === 'object') {
const candidate = source as { name?: string; label?: string; trim?: () => string };
if (typeof candidate.name === 'string' && candidate.name.trim()) {
return candidate.name.trim();
}
if (typeof candidate.label === 'string' && candidate.label.trim()) {
return candidate.label.trim();
}
if (typeof candidate.trim === 'function') {
const viaTrim = candidate.trim();
if (typeof viaTrim === 'string' && viaTrim.trim()) {
return viaTrim.trim();
}
}
}
return '';
return `${source}`.trim();
};
const normalizeQuickAddOption = (option: QuickAddOption | string | null | undefined): QuickAddEntry | null => {
if (option == null) {
return null;
}
const isObject = typeof option === 'object';
const labelSource = isObject ? option.label ?? option.name ?? '' : option;
const label = typeof labelSource === 'string' ? labelSource.trim() : '';
const label = (() => {
if (isPlainObject(option)) {
const sourceLabel = option.label ?? option.name ?? '';
return `${sourceLabel}`.trim();
}
return `${option}`.trim();
})();
if (!label) {
return null;
}
return {
id: isObject && option.id ? option.id : label,
id: isPlainObject(option) && option.id ? option.id : label,
label,
original: option,
};
@@ -170,10 +161,7 @@ export const TagSection: React.FC<TagSectionProps> = ({
const handleSelect = useCallback(
(option: { label?: string; name?: string } | string | null) => {
if (!onAdd) return;
const labelSource = option && typeof option === 'object'
? option.label ?? option.name ?? ''
: option;
const label = typeof labelSource === 'string' ? labelSource.trim() : '';
const label = resolveOptionName(option as QuickAddOption | string | null);
if (!label) {
return;
}
@@ -372,13 +360,13 @@ export const CorrespondentSection: React.FC<CorrespondentSectionProps> = ({
if (!onAdd || !item) {
return;
}
const source = item.payload ?? item;
const source = (item.payload ?? item) as QuickAddOption | string | null;
const resolvedName = resolveOptionName(source);
if (!resolvedName) {
return;
}
const payload = (source && typeof source === 'object')
? { ...(source as Record<string, unknown>), name: resolvedName }
const payload = isPlainObject(source)
? { ...source, name: resolvedName }
: { id: null, name: resolvedName };
onAdd({ name: resolvedName, option: payload, input: null });
},