@betterinternship/core 2.12.1 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/lib/broker/base.process.d.ts +2 -2
  2. package/dist/lib/broker/base.process.js +2 -2
  3. package/dist/lib/broker/base.task.d.ts +40 -40
  4. package/dist/lib/broker/broker.d.ts +28 -28
  5. package/dist/lib/broker/broker.js +111 -111
  6. package/dist/lib/email/email.d.ts +22 -22
  7. package/dist/lib/email/email.js +170 -170
  8. package/dist/lib/forms/constants/index.js +2 -2
  9. package/dist/lib/forms/form-metadata.d.ts +2 -0
  10. package/dist/lib/forms/form-metadata.js +2 -0
  11. package/dist/lib/forms/form-metadata.js.map +1 -1
  12. package/dist/lib/pdf-viewer/BasePdfViewer.d.ts +21 -0
  13. package/dist/lib/pdf-viewer/BasePdfViewer.js +42 -0
  14. package/dist/lib/pdf-viewer/BasePdfViewer.js.map +1 -0
  15. package/dist/lib/pdf-viewer/FormFillPdfViewer.d.ts +31 -0
  16. package/dist/lib/pdf-viewer/FormFillPdfViewer.js +107 -0
  17. package/dist/lib/pdf-viewer/FormFillPdfViewer.js.map +1 -0
  18. package/dist/lib/pdf-viewer/PdfPageOverlay.d.ts +20 -0
  19. package/dist/lib/pdf-viewer/PdfPageOverlay.js +221 -0
  20. package/dist/lib/pdf-viewer/PdfPageOverlay.js.map +1 -0
  21. package/dist/lib/pdf-viewer/form-previewer-model.d.ts +52 -0
  22. package/dist/lib/pdf-viewer/form-previewer-model.js +329 -0
  23. package/dist/lib/pdf-viewer/form-previewer-model.js.map +1 -0
  24. package/dist/lib/pdf-viewer/form-previewer-rendering.d.ts +55 -0
  25. package/dist/lib/pdf-viewer/form-previewer-rendering.js +317 -0
  26. package/dist/lib/pdf-viewer/form-previewer-rendering.js.map +1 -0
  27. package/dist/lib/pdf-viewer/index.d.ts +10 -0
  28. package/dist/lib/pdf-viewer/index.js +11 -0
  29. package/dist/lib/pdf-viewer/index.js.map +1 -0
  30. package/dist/lib/pdf-viewer/loader.d.ts +3 -0
  31. package/dist/lib/pdf-viewer/loader.js +5 -0
  32. package/dist/lib/pdf-viewer/loader.js.map +1 -0
  33. package/dist/lib/pdf-viewer/party-colors.d.ts +22 -0
  34. package/dist/lib/pdf-viewer/party-colors.js +20 -0
  35. package/dist/lib/pdf-viewer/party-colors.js.map +1 -0
  36. package/dist/lib/pdf-viewer/pdfjs.d.ts +4 -0
  37. package/dist/lib/pdf-viewer/pdfjs.js +21 -0
  38. package/dist/lib/pdf-viewer/pdfjs.js.map +1 -0
  39. package/dist/lib/pdf-viewer/use-pdf-document.d.ts +10 -0
  40. package/dist/lib/pdf-viewer/use-pdf-document.js +97 -0
  41. package/dist/lib/pdf-viewer/use-pdf-document.js.map +1 -0
  42. package/dist/lib/pdf-viewer/use-pdf-page-renderer.d.ts +6 -0
  43. package/dist/lib/pdf-viewer/use-pdf-page-renderer.js +60 -0
  44. package/dist/lib/pdf-viewer/use-pdf-page-renderer.js.map +1 -0
  45. package/dist/tsconfig.tsbuildinfo +1 -1
  46. package/package.json +14 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormFillPdfViewer.js","sourceRoot":"","sources":["../../../lib/pdf-viewer/FormFillPdfViewer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { PDFDocumentProxy } from "pdfjs-dist";
2
+ import type { PreviewField, OwnerMeta } from "./form-previewer-model.js";
3
+ type DefaultFieldVisibility = "all" | "mine";
4
+ interface PdfPageOverlayProps {
5
+ pdf: PDFDocumentProxy;
6
+ pageNumber: number;
7
+ scale: number;
8
+ fields: PreviewField[];
9
+ values: Record<string, string>;
10
+ onFieldClick?: (fieldName: string) => void;
11
+ animatingFieldId?: string | null;
12
+ selectedFieldId?: string;
13
+ ownerMetaByFieldId: Map<string, OwnerMeta>;
14
+ showOwnership: boolean;
15
+ fieldVisibility: DefaultFieldVisibility;
16
+ fieldErrors: Record<string, string>;
17
+ resolveDisplayValue: (field: PreviewField, rawValue: unknown) => string;
18
+ }
19
+ export declare const PdfPageOverlay: ({ pdf, pageNumber, scale, fields, values, onFieldClick, animatingFieldId, selectedFieldId, ownerMetaByFieldId, showOwnership, fieldVisibility, fieldErrors, resolveDisplayValue, }: PdfPageOverlayProps) => import("react").JSX.Element;
20
+ export {};
@@ -0,0 +1,221 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from "react";
4
+ import { getSignatureImageFieldKey, parseSignatureImageValue } from "@betterinternship/core/forms";
5
+ import { usePdfPageRenderer } from "./use-pdf-page-renderer.js";
6
+ import { resolvePreviewFont, fitNoWrapText, fitWrappedText, } from "./form-previewer-rendering.js";
7
+ import { normalizePreviewFieldKey } from "./form-previewer-model.js";
8
+ const SIGNATURE_IMAGE_OVERFLOW_SCALE = 1.8;
9
+ const getSignatureImageSrc = (signatureImage) => {
10
+ if (!signatureImage)
11
+ return "";
12
+ if (signatureImage.image.storage === "bucket") {
13
+ return signatureImage.image.signedUrl || signatureImage.image.publicUrl || "";
14
+ }
15
+ return signatureImage.image.dataUrl;
16
+ };
17
+ const getPreviewRawValue = (values, fieldKey) => {
18
+ const normalizedFieldName = normalizePreviewFieldKey(fieldKey);
19
+ return (values[fieldKey] ?? values[`${normalizedFieldName}:default`] ?? values[normalizedFieldName]);
20
+ };
21
+ export const PdfPageOverlay = ({ pdf, pageNumber, scale, fields, values, onFieldClick, animatingFieldId, selectedFieldId, ownerMetaByFieldId, showOwnership, fieldVisibility, fieldErrors, resolveDisplayValue, }) => {
22
+ const containerRef = useRef(null);
23
+ const { canvasRef, pageReady } = usePdfPageRenderer(pdf, pageNumber, scale);
24
+ const [forceRender, setForceRender] = useState(0);
25
+ const [activeTouchFieldId, setActiveTouchFieldId] = useState(null);
26
+ const [hoveredFieldId, setHoveredFieldId] = useState(null);
27
+ const [isTouchInteraction, setIsTouchInteraction] = useState(false);
28
+ const [clickedHighlightFieldId, setClickedHighlightFieldId] = useState(null);
29
+ useEffect(() => {
30
+ setForceRender((prev) => prev + 1);
31
+ }, [scale]);
32
+ useEffect(() => {
33
+ if (typeof window === "undefined" || !window.matchMedia)
34
+ return;
35
+ const media = window.matchMedia("(hover: none), (pointer: coarse)");
36
+ const update = () => setIsTouchInteraction(media.matches);
37
+ update();
38
+ media.addEventListener("change", update);
39
+ return () => media.removeEventListener("change", update);
40
+ }, []);
41
+ const pdfToDisplay = (pdfX, pdfY) => {
42
+ const canvas = canvasRef.current;
43
+ if (!canvas)
44
+ return null;
45
+ const displayX = pdfX * scale;
46
+ const displayY = pdfY * scale;
47
+ return {
48
+ displayX,
49
+ displayY,
50
+ };
51
+ };
52
+ return (_jsxs("div", { ref: containerRef, className: "relative mx-auto rounded bg-white shadow", style: {
53
+ width: "fit-content",
54
+ visibility: pageReady ? "visible" : "hidden",
55
+ }, children: [_jsx("canvas", { ref: canvasRef, className: "block" }), pageReady && (_jsx("div", { className: "absolute inset-0", onClick: () => {
56
+ if (isTouchInteraction)
57
+ setActiveTouchFieldId(null);
58
+ }, children: fields.map((field) => {
59
+ const x = field.x;
60
+ const y = field.y;
61
+ const w = field.w;
62
+ const h = field.h;
63
+ const fieldName = field.field;
64
+ if (w <= 0 || h <= 0) {
65
+ return null;
66
+ }
67
+ const displayPos = pdfToDisplay(x, y);
68
+ if (!displayPos) {
69
+ return null;
70
+ }
71
+ const widthPixels = w * scale;
72
+ const heightPixels = h * scale;
73
+ const ownerMeta = ownerMetaByFieldId.get(field.id) ??
74
+ {
75
+ ownerRoleId: "unknown",
76
+ ownerGroupId: "other",
77
+ ownerLabel: "Unassigned",
78
+ ownerColorHex: "#94a3b8",
79
+ isMine: false,
80
+ isKnownOwner: false,
81
+ };
82
+ const canRevealValue = !showOwnership || ownerMeta?.isMine || fieldVisibility === "all";
83
+ const rawValue = canRevealValue ? getPreviewRawValue(values, fieldName) : "";
84
+ const signatureImage = field.type === "signature"
85
+ ? parseSignatureImageValue(values[getSignatureImageFieldKey(fieldName)])
86
+ : null;
87
+ const signatureImageSrc = getSignatureImageSrc(signatureImage);
88
+ const valueStr = canRevealValue ? resolveDisplayValue(field, rawValue) : "";
89
+ const isFilled = !!signatureImage || valueStr.trim().length > 0;
90
+ const align_h = field.align_h ?? "left";
91
+ const align_v = field.align_v ?? "top";
92
+ const shouldWrap = field.wrap ?? true;
93
+ const fieldType = field.type ?? "text";
94
+ const resolvedFont = resolvePreviewFont(fieldType, field.font);
95
+ let fontSizeDoc;
96
+ let lineHeightDoc;
97
+ let displayLines = [];
98
+ const fitSafetyUnits = 2;
99
+ const fitMaxWidthDoc = Math.max(0, w - fitSafetyUnits);
100
+ const fitMaxHeightDoc = Math.max(0, h - fitSafetyUnits);
101
+ if (isFilled) {
102
+ if (shouldWrap) {
103
+ const fitted = fitWrappedText({
104
+ text: valueStr,
105
+ fontFamily: resolvedFont.canvasFamily,
106
+ maxWidth: fitMaxWidthDoc,
107
+ maxHeight: fitMaxHeightDoc,
108
+ startSize: field.size ?? 11,
109
+ lineHeightMult: 1.0,
110
+ });
111
+ fontSizeDoc = fitted.fontSize;
112
+ lineHeightDoc = fitted.lineHeight;
113
+ displayLines = fitted.lines || [];
114
+ }
115
+ else {
116
+ const defaultSize = fieldType === "signature" ? 25 : 11;
117
+ const fitted = fitNoWrapText({
118
+ text: valueStr,
119
+ fontFamily: resolvedFont.canvasFamily,
120
+ maxWidth: fitMaxWidthDoc,
121
+ maxHeight: fitMaxHeightDoc,
122
+ startSize: field.size ?? defaultSize,
123
+ });
124
+ fontSizeDoc = fitted.fontSize;
125
+ lineHeightDoc = fontSizeDoc * 1.0;
126
+ displayLines = [fitted.line];
127
+ }
128
+ }
129
+ else {
130
+ fontSizeDoc = field.size ?? (fieldType === "signature" ? 25 : 11);
131
+ lineHeightDoc = fontSizeDoc * 1.0;
132
+ }
133
+ const fontSize = fontSizeDoc * scale;
134
+ const lineHeight = lineHeightDoc * scale;
135
+ const isSelected = animatingFieldId === fieldName ||
136
+ selectedFieldId === fieldName ||
137
+ clickedHighlightFieldId === field.id;
138
+ const isClickable = !showOwnership || ownerMeta.isMine;
139
+ const hasFieldError = !!fieldErrors[fieldName];
140
+ const isOwnedField = showOwnership && ownerMeta.isMine;
141
+ const isOwnedFieldValid = isOwnedField && isFilled && !hasFieldError;
142
+ const ownedBorderColor = isOwnedFieldValid ? "#16a34a" : "#dc2626";
143
+ const borderColor = showOwnership
144
+ ? ownerMeta.isMine
145
+ ? ownedBorderColor
146
+ : "#d1d5db"
147
+ : "#d1d5db";
148
+ const ownedFillColor = isOwnedField
149
+ ? isOwnedFieldValid
150
+ ? "rgba(34, 197, 94, 0.2)"
151
+ : "rgba(239, 68, 68, 0.2)"
152
+ : "transparent";
153
+ const showNonOwnedTooltip = showOwnership &&
154
+ !ownerMeta.isMine &&
155
+ (hoveredFieldId === field.id ||
156
+ (isTouchInteraction && activeTouchFieldId === field.id));
157
+ return (_jsxs("div", { onMouseEnter: () => {
158
+ if (showOwnership && !ownerMeta.isMine)
159
+ setHoveredFieldId(field.id);
160
+ }, onMouseLeave: () => {
161
+ if (hoveredFieldId === field.id)
162
+ setHoveredFieldId(null);
163
+ }, onClick: (event) => {
164
+ event.stopPropagation();
165
+ if (showOwnership && isTouchInteraction) {
166
+ if (activeTouchFieldId !== field.id) {
167
+ setActiveTouchFieldId(field.id);
168
+ return;
169
+ }
170
+ setActiveTouchFieldId(null);
171
+ }
172
+ if (showOwnership) {
173
+ setClickedHighlightFieldId(field.id);
174
+ setTimeout(() => setClickedHighlightFieldId((prev) => (prev === field.id ? null : prev)), 550);
175
+ }
176
+ if (!isClickable)
177
+ return;
178
+ onFieldClick?.(fieldName);
179
+ }, className: `absolute text-black transition-all ${isClickable ? "cursor-pointer" : "cursor-default"}`, style: {
180
+ left: `${displayPos.displayX}px`,
181
+ top: `${displayPos.displayY}px`,
182
+ width: `${Math.max(widthPixels, 4)}px`,
183
+ height: `${Math.max(heightPixels, 4)}px`,
184
+ overflow: "visible",
185
+ display: "flex",
186
+ backgroundColor: ownedFillColor,
187
+ border: "none",
188
+ boxShadow: isSelected ? "0 0 0 2px #3b82f6" : undefined,
189
+ zIndex: showNonOwnedTooltip ? 30 : isSelected ? 20 : 10,
190
+ alignItems: align_v === "middle"
191
+ ? "center"
192
+ : align_v === "bottom"
193
+ ? "flex-end"
194
+ : "flex-start",
195
+ justifyContent: align_h === "center" ? "center" : align_h === "right" ? "flex-end" : "flex-start",
196
+ }, children: [signatureImageSrc ? (_jsx("div", { className: "pointer-events-none absolute top-1/2 left-1/2 flex items-center justify-center", style: {
197
+ width: `${Math.max(widthPixels * SIGNATURE_IMAGE_OVERFLOW_SCALE, 4)}px`,
198
+ height: `${Math.max(heightPixels * SIGNATURE_IMAGE_OVERFLOW_SCALE, 4)}px`,
199
+ transform: "translate(-50%, -50%)",
200
+ }, children: _jsx("img", { src: signatureImageSrc, alt: "Signature", className: "h-full w-full object-contain", draggable: false }) })) : isFilled ? (_jsx("div", { className: "text-black", style: {
201
+ fontSize: `${fontSize}px`,
202
+ lineHeight: `${lineHeight}px`,
203
+ overflow: "hidden",
204
+ whiteSpace: shouldWrap ? "pre" : "nowrap",
205
+ wordWrap: "normal",
206
+ overflowWrap: "normal",
207
+ width: "100%",
208
+ maxWidth: "100%",
209
+ maxHeight: "100%",
210
+ padding: "0px",
211
+ margin: "0px",
212
+ boxSizing: "border-box",
213
+ textAlign: align_h === "center" ? "center" : align_h,
214
+ fontFamily: resolvedFont.cssFamily,
215
+ fontWeight: resolvedFont.fontWeight,
216
+ color: "#000000",
217
+ }, children: displayLines.length > 0 ? displayLines.join("\n") : valueStr })) : null, showNonOwnedTooltip ? (_jsx(AssignedOwnerTooltip, { ownerLabel: ownerMeta.ownerLabel })) : null] }, field.id));
218
+ }) }, forceRender))] }));
219
+ };
220
+ const AssignedOwnerTooltip = ({ ownerLabel }) => (_jsx("div", { className: "pointer-events-none absolute -top-12 left-0 z-20 max-w-56 rounded border border-slate-200 bg-white px-2 py-1 text-xs text-slate-700 shadow-lg", children: _jsxs("span", { className: "break-words", children: ["Filled by ", _jsx("strong", { className: "text-slate-900", children: ownerLabel })] }) }));
221
+ //# sourceMappingURL=PdfPageOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdfPageOverlay.js","sourceRoot":"","sources":["../../../lib/pdf-viewer/PdfPageOverlay.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type IFormBlock, type IFormSigningParty } from "@betterinternship/core/forms";
2
+ export type PreviewFieldType = "text" | "signature" | "image";
3
+ type ValidatorRuleLike = {
4
+ kind?: string;
5
+ };
6
+ type ValidatorIrLike = {
7
+ rules?: ValidatorRuleLike[];
8
+ } | null;
9
+ export interface PreviewField {
10
+ id: string;
11
+ field: string;
12
+ label: string;
13
+ page: number;
14
+ x: number;
15
+ y: number;
16
+ w: number;
17
+ h: number;
18
+ size?: number;
19
+ wrap?: boolean;
20
+ align_h?: "left" | "center" | "right";
21
+ align_v?: "top" | "middle" | "bottom";
22
+ font?: string;
23
+ type?: PreviewFieldType;
24
+ signing_party_id?: string;
25
+ source?: string;
26
+ prefiller?: unknown;
27
+ validator_ir?: ValidatorIrLike;
28
+ required?: boolean;
29
+ }
30
+ export interface OwnerMeta {
31
+ ownerRoleId: string;
32
+ ownerGroupId: "company" | "university" | "student" | "witness" | "other";
33
+ ownerLabel: string;
34
+ ownerColorHex: string;
35
+ isMine: boolean;
36
+ isKnownOwner: boolean;
37
+ }
38
+ export type PreviewFieldLike = PreviewField | IFormBlock;
39
+ export declare function normalizePreviewFields(inputs: PreviewFieldLike[]): PreviewField[];
40
+ export declare function groupFieldsByPage(fields: PreviewField[]): Map<number, PreviewField[]>;
41
+ export declare const normalizePreviewFieldKey: (fieldKey: string) => string;
42
+ export declare const resolveAutoPreviewValue: (fieldKey: string, now?: Date) => string;
43
+ export declare const DEFAULT_PREVIEW_DUMMY_STUDENT_USER: Record<string, string>;
44
+ type PreviewPrefillMode = "live" | "dummy" | "none";
45
+ export declare const createPreviewDisplayValueResolver: ({ user, prefillMode, nowFactory, }: {
46
+ user?: Record<string, unknown> | null;
47
+ prefillMode?: PreviewPrefillMode;
48
+ nowFactory?: () => Date;
49
+ }) => (field: PreviewField, rawValue: unknown) => string;
50
+ export declare function isFieldRequired(field: PreviewField): boolean;
51
+ export declare function resolveOwnerMeta(field: PreviewField, signingParties: IFormSigningParty[], currentSigningPartyId?: string, useGroupColors?: boolean): OwnerMeta;
52
+ export {};
@@ -0,0 +1,329 @@
1
+ import { getPartyColorByIndex } from "./party-colors.js";
2
+ const MONTH_NAMES = [
3
+ "January",
4
+ "February",
5
+ "March",
6
+ "April",
7
+ "May",
8
+ "June",
9
+ "July",
10
+ "August",
11
+ "September",
12
+ "October",
13
+ "November",
14
+ "December",
15
+ ];
16
+ const isPreviewField = (input) => {
17
+ return "id" in input && "field" in input && !("block_type" in input);
18
+ };
19
+ export function normalizePreviewFields(inputs) {
20
+ const normalized = [];
21
+ for (const input of inputs) {
22
+ if (isPreviewField(input)) {
23
+ if (input.type === "image")
24
+ continue;
25
+ normalized.push(input);
26
+ continue;
27
+ }
28
+ const block = input;
29
+ const schema = block.field_schema ?? block.phantom_field_schema;
30
+ if (!schema?.field)
31
+ continue;
32
+ if (schema.type === "image")
33
+ continue;
34
+ const sizedSchema = schema;
35
+ const page = typeof sizedSchema.page === "number" ? sizedSchema.page : 1;
36
+ const x = typeof sizedSchema.x === "number" ? sizedSchema.x : 0;
37
+ const y = typeof sizedSchema.y === "number" ? sizedSchema.y : 0;
38
+ const w = typeof sizedSchema.w === "number" ? sizedSchema.w : 0;
39
+ const h = typeof sizedSchema.h === "number" ? sizedSchema.h : 0;
40
+ normalized.push({
41
+ id: block._id || `${schema.field}:${page}:${x}:${y}:${normalized.length}`,
42
+ field: schema.field,
43
+ label: schema.label || schema.field,
44
+ page,
45
+ x,
46
+ y,
47
+ w,
48
+ h,
49
+ size: sizedSchema.size,
50
+ wrap: sizedSchema.wrap,
51
+ align_h: sizedSchema.align_h,
52
+ align_v: sizedSchema.align_v,
53
+ font: sizedSchema.font,
54
+ type: sizedSchema.type,
55
+ signing_party_id: sizedSchema.signing_party_id ?? block.signing_party_id,
56
+ source: sizedSchema.source,
57
+ prefiller: sizedSchema.prefiller,
58
+ validator_ir: sizedSchema.validator_ir,
59
+ required: sizedSchema.required,
60
+ });
61
+ }
62
+ return normalized;
63
+ }
64
+ export function groupFieldsByPage(fields) {
65
+ const byPage = new Map();
66
+ for (const field of fields) {
67
+ const list = byPage.get(field.page) || [];
68
+ list.push(field);
69
+ byPage.set(field.page, list);
70
+ }
71
+ return byPage;
72
+ }
73
+ export const normalizePreviewFieldKey = (fieldKey) => {
74
+ const normalized = String(fieldKey ?? "").trim();
75
+ if (/^auto\.current-/i.test(normalized)) {
76
+ return normalized.replace(/:[^:]+$/i, "");
77
+ }
78
+ return normalized.replace(/:default$/i, "").replace(/:auto$/i, "");
79
+ };
80
+ const coerceAnyDate = (raw) => {
81
+ if (typeof raw === "number")
82
+ return raw > 0 ? raw : undefined;
83
+ if (typeof raw !== "string")
84
+ return undefined;
85
+ const s = raw.trim();
86
+ if (!s)
87
+ return undefined;
88
+ if (/^\d{6,}$/.test(s)) {
89
+ const n = Number(s);
90
+ return Number.isFinite(n) && n > 0 ? n : undefined;
91
+ }
92
+ const ms = Date.parse(s);
93
+ return Number.isFinite(ms) && ms > 0 ? ms : undefined;
94
+ };
95
+ const formatTimestampDateWithoutTime = (timestamp) => {
96
+ if (!timestamp)
97
+ return "-";
98
+ const date = new Date(timestamp);
99
+ return date.toLocaleDateString("en-PH", {
100
+ year: "numeric",
101
+ month: "long",
102
+ day: "numeric",
103
+ });
104
+ };
105
+ export const resolveAutoPreviewValue = (fieldKey, now = new Date()) => {
106
+ const normalized = normalizePreviewFieldKey(fieldKey).toLowerCase();
107
+ if (normalized === "auto.current-date")
108
+ return formatTimestampDateWithoutTime(now.getTime());
109
+ if (normalized === "auto.current-day")
110
+ return now.getDate().toString();
111
+ if (normalized === "auto.current-month")
112
+ return MONTH_NAMES[now.getMonth()] ?? "";
113
+ if (normalized === "auto.current-year")
114
+ return now.getFullYear().toString();
115
+ return "";
116
+ };
117
+ const formatPreviewDateValue = (field, rawValue) => {
118
+ const normalizedFieldKey = normalizePreviewFieldKey(field.field).toLowerCase();
119
+ if (normalizedFieldKey.startsWith("auto.current-date"))
120
+ return rawValue;
121
+ const parsed = coerceAnyDate(rawValue);
122
+ if (!parsed)
123
+ return rawValue;
124
+ return formatTimestampDateWithoutTime(parsed);
125
+ };
126
+ export const DEFAULT_PREVIEW_DUMMY_STUDENT_USER = {
127
+ first_name: "Test",
128
+ middle_name: "",
129
+ last_name: "Student",
130
+ name: "Test Student",
131
+ college: "Test College",
132
+ department: "Test Department",
133
+ university: "Test University",
134
+ phone_number: "+639171234567",
135
+ email: "test.student@example.com",
136
+ id_number: "12345678",
137
+ };
138
+ const toSafeScalarString = (value) => {
139
+ if (value == null)
140
+ return "";
141
+ if (typeof value === "string")
142
+ return value;
143
+ if (typeof value === "number" ||
144
+ typeof value === "boolean" ||
145
+ typeof value === "bigint" ||
146
+ typeof value === "symbol") {
147
+ return String(value);
148
+ }
149
+ if (value instanceof Date)
150
+ return String(value.getTime());
151
+ return "";
152
+ };
153
+ const getUserValueString = (user, key) => {
154
+ const value = user?.[key];
155
+ return toSafeScalarString(value).trim();
156
+ };
157
+ const inferNameParts = (user) => {
158
+ const firstName = getUserValueString(user, "first_name");
159
+ const middleName = getUserValueString(user, "middle_name");
160
+ const lastName = getUserValueString(user, "last_name");
161
+ const fullName = [firstName, middleName, lastName]
162
+ .filter(Boolean)
163
+ .join(" ")
164
+ .replace(/\s+/g, " ")
165
+ .trim();
166
+ if (firstName || middleName || lastName) {
167
+ return { firstName, middleName, lastName, fullName };
168
+ }
169
+ const singleName = getUserValueString(user, "name");
170
+ if (!singleName) {
171
+ return { firstName: "", middleName: "", lastName: "", fullName: "" };
172
+ }
173
+ const nameTokens = singleName.split(/\s+/).filter(Boolean);
174
+ return {
175
+ firstName: nameTokens[0] || "",
176
+ middleName: nameTokens.length > 2 ? nameTokens.slice(1, -1).join(" ") : "",
177
+ lastName: nameTokens.length > 1 ? nameTokens[nameTokens.length - 1] : "",
178
+ fullName: singleName,
179
+ };
180
+ };
181
+ const resolvePrefillValue = (field, user) => {
182
+ if (!user)
183
+ return "";
184
+ const { firstName, middleName, lastName, fullName } = inferNameParts(user);
185
+ const normalizedField = normalizePreviewFieldKey(field.field).toLowerCase();
186
+ const rawField = String(field.field ?? "").trim();
187
+ const normalizedFieldCaseSensitive = normalizePreviewFieldKey(rawField);
188
+ const directFieldCandidates = [
189
+ rawField,
190
+ normalizedFieldCaseSensitive,
191
+ `${normalizedFieldCaseSensitive}:default`,
192
+ normalizedFieldCaseSensitive.replace(/[.-]/g, "_"),
193
+ ];
194
+ for (const candidate of directFieldCandidates) {
195
+ const candidateValue = getUserValueString(user, candidate);
196
+ if (candidateValue)
197
+ return candidateValue;
198
+ }
199
+ const directMap = {
200
+ "student.school": getUserValueString(user, "college"),
201
+ "student.college": getUserValueString(user, "college"),
202
+ "student.department": getUserValueString(user, "department"),
203
+ "student.university": getUserValueString(user, "university"),
204
+ "student.first-name": firstName,
205
+ "student.middle-name": middleName,
206
+ "student.last-name": lastName,
207
+ "student.full-name": fullName,
208
+ "student-signature": fullName,
209
+ "student.phone-number": getUserValueString(user, "phone_number"),
210
+ "student.id-number": getUserValueString(user, "id_number"),
211
+ "student.email": getUserValueString(user, "email"),
212
+ };
213
+ const mapped = directMap[normalizedField];
214
+ if (mapped)
215
+ return mapped;
216
+ if (typeof field.prefiller === "function") {
217
+ try {
218
+ const prefiller = field.prefiller;
219
+ const value = prefiller({ user });
220
+ return toSafeScalarString(value).trim();
221
+ }
222
+ catch {
223
+ return "";
224
+ }
225
+ }
226
+ if (typeof field.prefiller === "string") {
227
+ const match = field.prefiller.match(/user\.([a-zA-Z0-9_]+)/);
228
+ if (match?.[1])
229
+ return getUserValueString(user, match[1]);
230
+ }
231
+ return "";
232
+ };
233
+ const resolveFallbackValue = ({ field, user, prefillMode, nowFactory, }) => {
234
+ const source = String(field.source ?? "").toLowerCase();
235
+ const normalizedField = normalizePreviewFieldKey(field.field).toLowerCase();
236
+ if (source === "auto" || normalizedField.startsWith("auto.current-")) {
237
+ return resolveAutoPreviewValue(field.field, nowFactory());
238
+ }
239
+ if (prefillMode === "none")
240
+ return "";
241
+ const shouldUsePrefill = source === "prefill" ||
242
+ normalizedField.startsWith("student.") ||
243
+ normalizedField === "student-signature";
244
+ if (!shouldUsePrefill)
245
+ return "";
246
+ const effectiveUser = prefillMode === "dummy" ? DEFAULT_PREVIEW_DUMMY_STUDENT_USER : user;
247
+ return resolvePrefillValue(field, effectiveUser);
248
+ };
249
+ export const createPreviewDisplayValueResolver = ({ user, prefillMode = "live", nowFactory = () => new Date(), }) => {
250
+ return (field, rawValue) => {
251
+ const rawString = Array.isArray(rawValue)
252
+ ? rawValue
253
+ .map((entry) => toSafeScalarString(entry))
254
+ .filter(Boolean)
255
+ .join(", ")
256
+ : rawValue == null
257
+ ? ""
258
+ : toSafeScalarString(rawValue);
259
+ if (rawString.trim())
260
+ return formatPreviewDateValue(field, rawString);
261
+ return resolveFallbackValue({
262
+ field,
263
+ user,
264
+ prefillMode,
265
+ nowFactory,
266
+ });
267
+ };
268
+ };
269
+ export function isFieldRequired(field) {
270
+ if (typeof field.required === "boolean")
271
+ return field.required;
272
+ const rules = field.validator_ir?.rules || [];
273
+ return rules.some((rule) => rule?.kind === "required");
274
+ }
275
+ function inferOwnerGroupId(title) {
276
+ const normalized = title.toLowerCase();
277
+ if (/(company|entity|employer|industry)/.test(normalized))
278
+ return "company";
279
+ if (/(university|school|college|faculty)/.test(normalized))
280
+ return "university";
281
+ if (/(student|intern|trainee)/.test(normalized))
282
+ return "student";
283
+ if (/witness/.test(normalized))
284
+ return "witness";
285
+ return "other";
286
+ }
287
+ function groupColorHex(groupId) {
288
+ switch (groupId) {
289
+ case "company":
290
+ return "#2563eb";
291
+ case "university":
292
+ return "#0f766e";
293
+ case "student":
294
+ return "#ca8a04";
295
+ case "witness":
296
+ return "#dc2626";
297
+ case "other":
298
+ default:
299
+ return "#64748b";
300
+ }
301
+ }
302
+ export function resolveOwnerMeta(field, signingParties, currentSigningPartyId, useGroupColors = false) {
303
+ const ownerRoleId = field.signing_party_id || "unknown";
304
+ const party = signingParties.find((candidate) => candidate._id === ownerRoleId);
305
+ if (!party) {
306
+ return {
307
+ ownerRoleId,
308
+ ownerGroupId: "other",
309
+ ownerLabel: "Unassigned",
310
+ ownerColorHex: "#94a3b8",
311
+ isMine: false,
312
+ isKnownOwner: false,
313
+ };
314
+ }
315
+ const isMine = !!currentSigningPartyId && party._id === currentSigningPartyId;
316
+ const ownerGroupId = inferOwnerGroupId(party.signatory_title || party._id);
317
+ const ownerColorHex = useGroupColors
318
+ ? groupColorHex(ownerGroupId)
319
+ : getPartyColorByIndex(Math.max(0, party.order - 1)).hex;
320
+ return {
321
+ ownerRoleId,
322
+ ownerGroupId,
323
+ ownerLabel: isMine ? "You" : party.signatory_title || party._id,
324
+ ownerColorHex,
325
+ isMine,
326
+ isKnownOwner: true,
327
+ };
328
+ }
329
+ //# sourceMappingURL=form-previewer-model.js.map