feat(digital-signatures): simplify form, add TIFF support, subcategories, download options

- Remove 'initials' type, expirationDate, legalStatus, usageNotes fields
- Add subcategory field with creatable input + 6 default categories
- Add TIFF upload support with client-side utif2 decode for preview
- Store original TIFF data separately for faithful downloads
- Add download dropdown: Original file, Word (.docx), PDF (.pdf)
- Group assets by subcategory in list view
- Add subcategory filter in search bar
- Install docx, jspdf, utif2 packages
- Closes 3.07
This commit is contained in:
AI Assistant
2026-02-28 00:18:29 +02:00
parent a0ec4aed3f
commit 7774a3b622
5 changed files with 1318 additions and 744 deletions
File diff suppressed because it is too large Load Diff
@@ -14,6 +14,7 @@ const PREFIX = "sig:";
export interface SignatureFilters {
search: string;
type: SignatureAssetType | "all";
subcategory: string; // "" means all
}
export function useSignatures() {
@@ -23,6 +24,7 @@ export function useSignatures() {
const [filters, setFilters] = useState<SignatureFilters>({
search: "",
type: "all",
subcategory: "",
});
const refresh = useCallback(async () => {
@@ -110,10 +112,14 @@ export function useSignatures() {
const filteredAssets = assets.filter((a) => {
if (filters.type !== "all" && a.type !== filters.type) return false;
if (filters.subcategory && a.subcategory !== filters.subcategory)
return false;
if (filters.search) {
const q = filters.search.toLowerCase();
return (
a.label.toLowerCase().includes(q) || a.owner.toLowerCase().includes(q)
a.label.toLowerCase().includes(q) ||
a.owner.toLowerCase().includes(q) ||
a.subcategory.toLowerCase().includes(q)
);
}
return true;
+20 -9
View File
@@ -1,7 +1,7 @@
import type { Visibility } from '@/core/module-registry/types';
import type { CompanyId } from '@/core/auth/types';
import type { Visibility } from "@/core/module-registry/types";
import type { CompanyId } from "@/core/auth/types";
export type SignatureAssetType = 'signature' | 'stamp' | 'initials';
export type SignatureAssetType = "signature" | "stamp";
/** Version history entry */
export interface AssetVersion {
@@ -11,19 +11,30 @@ export interface AssetVersion {
createdAt: string;
}
/** Default subcategory options (users can add more) */
export const DEFAULT_SUBCATEGORIES = [
"Colaboratori",
"Experți tehnici",
"Verificatori de proiect",
"Proiectanți",
"Diriginți de șantier",
"Responsabili tehnici",
] as const;
export interface SignatureAsset {
id: string;
label: string;
type: SignatureAssetType;
/** Preview image data URL (PNG/JPG — browsers can render this) */
imageUrl: string;
/** Original file data URL (for TIFF originals or same as imageUrl) */
originalFileData?: string;
/** Original file name for downloads */
originalFileName?: string;
owner: string;
company: CompanyId;
/** Expiration date (YYYY-MM-DD) */
expirationDate?: string;
/** Legal status description */
legalStatus: string;
/** Usage notes */
usageNotes: string;
/** Subcategory for grouping (e.g. "Colaboratori firma X") */
subcategory: string;
/** Version history */
versions: AssetVersion[];
tags: string[];