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:
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;
|
||||
|
||||
@@ -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[];
|
||||
|
||||
Reference in New Issue
Block a user