import { DateValue, IdObject, ParentsMap } from "./common.js"; import type EJSONType from "../../EJSONType.js"; type ObjectIDCtor = typeof EJSONType["ObjectID"]; type ObjectID = InstanceType; export interface FormSubFormInputField { label?: string; placeholder?: string; info?: string; type?: string; position?: string; positions?: Record; width?: string; markdown?: boolean; uploader?: Record; rules?: { width?: { min: number; max: number; }; syntaxe?: { regexp: string; errormsg: string; }; [key: string]: unknown; }; [key: string]: unknown; } export interface FormSubFormInputs { name: string; info?: string; id: string; formParent: string; hasMultiEval?: boolean; inputs: Record; [key: string]: unknown; } /** * Bloc d'accès au Form — décrit qui peut répondre, quand, comment. * Renvoyé par `GET_COFORM_BY_ID` (cf. /survey/coform/getformbyid). */ export interface FormAccess { /** Si l'utilisateur courant peut répondre maintenant. */ canAnswer: boolean; /** Raison si `canAnswer` est false (ex: "not_logged_in", "form_closed"). */ reason?: string; /** État global du form (ex: "open", "closed", "pending"). */ formStatus?: string; /** Id de la réponse existante de l'user courant (s'il en a une). */ existingAnswerId?: string | null; /** Doc de la réponse existante (peut être enrichi). */ existingAnswer?: Record | null; /** Si le form requiert d'être connecté. */ requiresLogin?: boolean; /** Réponse temporaire (brouillon) autorisée. */ allowTemporary?: boolean; /** Réponse nécessite confirmation. */ withConfirmation?: boolean; /** Réservé aux membres uniquement. */ isOnlyMember?: boolean; /** Une seule réponse par personne. */ isOneAnswerPerPers?: boolean; /** Form actif (vs désactivé). */ isActive?: boolean; /** Fenêtres de dates (ouverture/fermeture, avec/sans confirmation). */ dates?: { start?: string | null; end?: string | null; startNoConfirmation?: string | null; endNoConfirmation?: string | null; }; /** Liste des champs restreints (non visibles selon le rôle). */ restrictedFields?: string[]; [key: string]: unknown; } /** * Forme JSON brute du Form telle que renvoyée par `GET_COFORM_BY_ID`. * * ⚠️ Le champ `collection` n'est PAS présent dans le payload backend natif * (PHDB::find renvoie le doc brut sans nom de table). Il doit être injecté * côté SDK par `Form.get()` pour cohérence avec les autres entités. */ export interface FormItemJson { _id: IdObject; id?: string; /** Injecté côté SDK (le backend ne le renvoie pas). */ collection?: "forms"; /** Nom du Form (ex: "Coworking", "Hébergement"). */ name?: string; /** Type du Form (ex: "coformgeneric", "template"). */ type: string; config?: Record | null; parent?: ParentsMap | null; subForms?: string[] | null; created?: DateValue; creator?: string; params?: Record | null; updated?: DateValue; inputs?: Record | null; /** Logique d'accès calculée côté backend pour l'user courant. */ access?: FormAccess; /** Champs réservés aux admins du lieu/projet. */ placeAdminOnlyFields?: string[]; /** Champs réservés aux membres du lieu/projet. */ placeMemberOnlyFields?: string[]; /** Si le grand public peut éditer une réponse partagée. */ publicCanEditSharedAnswer?: boolean; /** Path vers une question partagée (legacy / advanced usage). */ sharedQuestionPath?: Record | null; /** Utilise une image de bannière (présent surtout sur `type=template`). */ useBannerImg?: boolean; [key: string]: unknown; } export interface FormItemNormalized { id: string; _id: ObjectID; /** Injecté côté SDK (le backend ne le renvoie pas). */ collection?: "forms"; name?: string; type: string; config?: Record | null; parent?: ParentsMap | null; subForms?: string[] | null; created?: Date; creator?: string; params?: Record | null; updated?: Date; inputs?: Record | null; access?: FormAccess; placeAdminOnlyFields?: string[]; placeMemberOnlyFields?: string[]; publicCanEditSharedAnswer?: boolean; sharedQuestionPath?: Record | null; useBannerImg?: boolean; [key: string]: unknown; } /** * Une contribution individuelle à une table commune (commonTable) d'un coform. * Retournée par `Form.getCommonTableContributors()` (endpoint GET_COFORM_COMMONTABLE_CONTRIBUTORS). * Plusieurs entrées possibles pour un même `userId` (plusieurs solutions au même usage). */ export interface CoformCommonTableContributor { userId: string; userName?: string; userSlug?: string; criteriaId: string; /** Nom de la solution saisie. */ criteria: string; /** love | happySmile | neutral | sad | cry | "" */ happiness?: string; /** Note de 0 à 5. */ note?: number; comment?: string; fromAnswerId?: string; [k: string]: unknown; } export {};