Implement Stage 3: Enhance content metadata and validation features

- Added entity metadata fields to the Tasks model, including entity_type, taxonomy, and cluster_role.
- Updated CandidateEngine to prioritize content relevance based on cluster mappings.
- Introduced metadata completeness scoring in ContentAnalyzer.
- Enhanced validation services to check for entity type and mapping completeness.
- Updated frontend components to display and validate new metadata fields.
- Implemented API endpoints for content validation and metadata persistence.
- Migrated existing data to populate new metadata fields for Tasks and Content.
This commit is contained in:
IGNY8 VPS (Salman)
2025-11-19 19:21:30 +00:00
parent 38f6026e73
commit bae9ea47d8
33 changed files with 2388 additions and 73 deletions

View File

@@ -5,6 +5,7 @@ interface InputProps {
type?: "text" | "number" | "email" | "password" | "date" | "time" | string;
id?: string;
name?: string;
label?: string;
placeholder?: string;
value?: string | number;
onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
@@ -16,12 +17,15 @@ interface InputProps {
success?: boolean;
error?: boolean;
hint?: string;
multiline?: boolean;
rows?: number;
}
const Input: FC<InputProps> = ({
type = "text",
id,
name,
label,
placeholder,
value,
onChange,
@@ -33,6 +37,8 @@ const Input: FC<InputProps> = ({
success = false,
error = false,
hint,
multiline = false,
rows = 3,
}) => {
let inputClasses = ` h-9 w-full rounded-lg border appearance-none px-3 py-2 text-sm shadow-theme-xs placeholder:text-gray-400 focus:outline-hidden focus:ring-3 dark:bg-gray-900 dark:text-white/90 dark:placeholder:text-white/30 ${className}`;
@@ -46,21 +52,44 @@ const Input: FC<InputProps> = ({
inputClasses += ` bg-transparent text-gray-800 border-gray-300 focus:border-brand-300 focus:ring-brand-500/20 dark:border-gray-700 dark:text-white/90 dark:focus:border-brand-800`;
}
const inputId = id || name || `input-${Math.random().toString(36).substr(2, 9)}`;
return (
<div className="relative">
<input
type={type}
id={id}
name={name}
placeholder={placeholder}
value={value}
onChange={onChange}
min={min}
max={max}
step={step}
disabled={disabled}
className={inputClasses}
/>
{label && (
<label
htmlFor={inputId}
className="block text-sm font-medium mb-2 text-gray-700 dark:text-gray-300"
>
{label}
</label>
)}
{multiline ? (
<textarea
id={inputId}
name={name}
placeholder={placeholder}
value={value as string}
onChange={onChange as any}
disabled={disabled}
rows={rows}
className={inputClasses.replace('h-9', '')}
/>
) : (
<input
type={type}
id={inputId}
name={name}
placeholder={placeholder}
value={value}
onChange={onChange}
min={min}
max={max}
step={step}
disabled={disabled}
className={inputClasses}
/>
)}
{hint && (
<p