import { DateValue, IdObject, ParentsMap } from "./common.js"; import type EJSONType from "../../EJSONType.js"; import type { Answer } from "../Answer.js"; import type { Organization } from "../Organization.js"; import type { Project } from "../Project.js"; import type { User } from "../User.js"; type ObjectIDCtor = typeof EJSONType["ObjectID"]; type ObjectID = InstanceType; /** * Identifiant d'un Form (string 24 hex). Alias purement sémantique de `string` : * sert à lever l'ambiguïté dans `Record` — sans ce nom, on pourrait croire * qu'il s'agit d'un answerId ou autre. * * ⚠️ Ces formIds proviennent de la config costum (ex: `navigatorDesTierslieux`) * et ne correspondent **pas toujours** à des docs queriables via `api.form({id}).get()` — * il s'agit parfois de références internes au costum (templates, sous-forms, etc.). * À traiter comme un opaque token côté caller. */ export type FormId = string; /** * Forme JSON brute : Answer docs (MongoDB) groupés par formId. * Apparaît dans `result.answers` du payload `/costum/navigator/gettl` avant linkage. */ export type AnswerDocsByFormId = Record; /** * Forme normalisée : instances `Answer` groupées par formId. * Construite par `Organization/Project._transformServerData` à partir de `AnswerDocsByFormId`. */ export type AnswersByFormId = Record; export interface AnswerLinksBlock { answered: string[]; } export interface AnswerProjectRef { id?: string; type?: string; name?: string; } export interface AnswerItemJson { _id: IdObject; collection: "answers"; created?: DateValue; updated?: DateValue; user?: string; links?: AnswerLinksBlock; draft?: boolean; answers?: Record; context?: ParentsMap; form?: string; modified?: DateValue; voteCount?: Record; vote?: Record; project?: AnswerProjectRef; [key: string]: unknown; } /** * Raisons de refus d'édition côté backend, calculées par `coformAnswersById` * et présentes dans la réponse normalisée. Utilisé par les UI pour distinguer * les modes readonly/edit et afficher des messages contextuels. */ export type AnswerEditDeniedReason = "not_logged_in" | "not_owner" | "form_inactive" | "form_closed"; export interface AnswerItemNormalized { id: string; _id: ObjectID; collection: "answers"; created?: Date; updated?: Date; user?: string | User; links?: AnswerLinksBlock; draft?: boolean; finished?: boolean; answers?: Record; context?: ParentsMap | Record; form?: string; modified?: Date; voteCount?: Record; vote?: Record; project?: AnswerProjectRef; /** * L'utilisateur courant peut-il éditer cette réponse ? Calculé côté backend. * Présent par défaut, ou enrichi avec le contexte si `formId` est fourni. */ canEdit?: boolean; /** Raison si `canEdit === false`. `null` si `canEdit === true`. */ editDeniedReason?: AnswerEditDeniedReason | null; [key: string]: unknown; } export {};