Une erreur s'est produite lors du traitement du modèle.
The following has evaluated to null or missing:
==> objectFound.values.bibliographicLevel  [in template "com.liferay.portal.template.freemarker_7.0.59_CLASS_LOADER_CONTEXT_FTL_garance.ftl" at line 458, column 84]

----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: @addToRelatedWithTypes (objectFound?h...  [in template "com.liferay.portal.template.freemarker_7.0.59_CLASS_LOADER_CONTEXT_FTL_garance.ftl" in function "getRelatedObjects" at line 458, column 33]
----
1<#assign 
2dlAppLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppLocalService") 
3dlURLHelper = serviceLocator.findService("com.liferay.document.library.util.DLURLHelper") 
4 
5objectEntryLocalService = serviceLocator.findService("com.liferay.object.service.ObjectEntryLocalService") 
6objectRelationshipLocalService = serviceLocator.findService("com.liferay.object.service.ObjectRelationshipLocalService") 
7objectDefinitionLocalService = serviceLocator.findService("com.liferay.object.service.ObjectDefinitionLocalService") 
8 
9/> 
10 
11<#assign searchUrl = (request.getParameter("searchUrl")?hasContent)?then("?searchUrl=" + request.getParameter("searchUrl")?url('UTF-8'), "")/> 
12<#assign summary = garance.getSummaryContent("Archive")> 
13 
14<#assign archiveID = ObjectEntry_objectEntryId.getData()?number 
15archiveEntry = objectEntryLocalService.fetchObjectEntry(archiveID?number) 
16archiveGroupID = archiveEntry.getGroupId() /> 
17 
18<#--------------------------------- Header --------------------------> 
19<#assign reproductionsRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveReproduction")> 
20<#assign reproductions = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, reproductionsRel.objectRelationshipId, archiveID, true, reproductionsRel.isReverse(), null, -1, -1 ) /> 
21 
22<#assign reproductionsImages = []> 
23<#assign reproductionsVideos = []> 
24<#if reproductions?hasContent> 
25    <#list reproductions as reproduction> 
26        <#if reproduction.values.reproductionNature?hasContent> 
27            <#if reproduction.values.reproductionNature == "PICTURE" && reproduction.values.media?string != "0"> 
28                <#assign reproductionsImages = reproductionsImages + [reproduction]> 
29            <#elseIf reproduction.values.reproductionNature == "VIDEO"> 
30                <#assign reproductionsVideos = reproductionsVideos + [reproduction]> 
31            </#if> 
32        </#if> 
33    </#list> 
34</#if> 
35 
36<#assign thumbnail = {}> 
37<#if reproductionsImages?hasContent && (reproductionsImages?first).values.media?string != "0"> 
38    <#assign thumbnail = reproductionsImages?first /> 
39</#if> 
40 
41<#assign showMedia = (reproductionsImages?hasContent || reproductionsVideos?hasContent)> 
42 
43<#--------------------------------- Identification --------------------------> 
44<#assign dimensionsRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveDimension")> 
45<#assign dimensions = objectEntryLocalService.getOneToManyObjectEntries(archiveGroupID, dimensionsRel.objectRelationshipId, archiveID, true, null, -1, -1 ) /> 
46 
47<#assign showIdentification = ( 
48.dataModel["ObjectRelationship#C_Thesaurus#institution_label"].getData()?hasContent 
49|| (ObjectField_productionDateStart.getData()?hasContent || ObjectField_productionDateStartPrecision.getData() == "sans date") 
50|| dimensions?hasContent 
51|| ObjectField_physicalDescription.getData()?hasContent)> 
52 
53<#--------------------------------- Contexte --------------------------> 
54<#assign creatorsFull = []> 
55<#assign creatorsRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveCreator")> 
56<#assign creators = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, creatorsRel.objectRelationshipId, archiveID, true, creatorsRel.isReverse(), null, -1, -1 ) /> 
57<#list creators as creator> 
58    <#assign creatorsFull = creatorsFull + [garance.getPersonneDisplayData(creator.objectEntryId)]> 
59</#list> 
60 
61<#assign creatorBiographiesRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveCreatorHistory")> 
62<#assign creatorBiographies = objectEntryLocalService.getOneToManyObjectEntries(archiveGroupID, creatorBiographiesRel.objectRelationshipId, archiveID, true, null, -1, -1 ) /> 
63 
64<#assign superParent = archiveEntry> 
65<#if archiveEntry.values.r_archiveChildren_c_archiveId != 0> 
66    <#assign superParent = objectEntryLocalService.fetchObjectEntry(archiveEntry.values.r_archiveChildren_c_archiveId?number)> 
67    <#assign foundParent = superParent> 
68    <#list 1..20 as i>  <#-- 100 = limite de sécurité --> 
69        <#if foundParent.values.r_archiveChildren_c_archiveId != 0> 
70            <#assign foundParent = objectEntryLocalService.fetchObjectEntry(foundParent.values.r_archiveChildren_c_archiveId?number)> 
71        <#else> 
72            <#assign superParent = foundParent> 
73            <#break> 
74        </#if> 
75    </#list> 
76</#if> 
77 
78<#assign childrenArchiveRel = objectRelationshipLocalService.getObjectRelationship(superParent.objectDefinitionId, "archiveChildren")> 
79<#assign partsArchiveRel = objectRelationshipLocalService.getObjectRelationship(superParent.objectDefinitionId, "archivePart")> 
80 
81<#assign hierarchy = garance.markCurrentArchivePath(garance.buildTree(superParent, archiveGroupID, childrenArchiveRel.objectRelationshipId, partsArchiveRel.objectRelationshipId), archiveID)> 
82 
83<#--------------------------------- Contenu et structure --------------------------> 
84 
85<#assign accrualsRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveAccrual")> 
86<#assign accruals = objectEntryLocalService.getOneToManyObjectEntries(archiveGroupID, accrualsRel.objectRelationshipId, archiveID, true, null, -1, -1 ) /> 
87 
88<#assign systemArrangementsRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveArrangement")> 
89<#assign systemArrangements = objectEntryLocalService.getOneToManyObjectEntries(archiveGroupID, systemArrangementsRel.objectRelationshipId, archiveID, true, null, -1, -1 ) /> 
90 
91<#assign authorsFull = []> 
92<#assign authorsRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveAuthor")> 
93<#assign authors = objectEntryLocalService.getOneToManyObjectEntries(archiveGroupID, authorsRel.objectRelationshipId, archiveID, true, null, -1, -1 ) /> 
94<#list authors as author> 
95    <#if author.values.r_archiveAuthorPersonne_c_transitionPersonneId?hasContent> 
96        <#assign authorsFull = authorsFull + [{ 
97        "personne": garance.getPersonneDisplayData(author.values.r_archiveAuthorPersonne_c_transitionPersonneId), 
98        "function": author.values.psoterCastFonction, 
99        "presume": author.values.creatorPresume 
100        }]> 
101    </#if> 
102</#list> 
103 
104<#assign classificationsRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveClassification")> 
105<#assign classifications = objectEntryLocalService.getOneToManyObjectEntries(archiveGroupID, classificationsRel.objectRelationshipId, archiveID, true, null, -1, -1 ) /> 
106 
107<#assign objectCatsRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveObjectCategory")> 
108<#assign objectCats = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, objectCatsRel.objectRelationshipId, archiveID, true, objectCatsRel.isReverse(), null, -1, -1 ) /> 
109 
110<#assign linkedFilmsFull = []> 
111<#assign linkedFilmsRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveLinkedFilms")> 
112<#assign linkedFilms = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, linkedFilmsRel.objectRelationshipId, archiveID, true, linkedFilmsRel.isReverse(), null, -1, -1 ) /> 
113<#list linkedFilms as linkedFilm> 
114    <#assign filmData = garance.getFilmDisplayData(linkedFilm)> 
115    <#if filmData?hasContent> 
116        <#assign linkedFilmsFull = linkedFilmsFull + [filmData]> 
117    </#if> 
118</#list> 
119 
120<#assign representedPersonnesRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveRepresentedPersonne")> 
121<#assign representedPersonnes = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, representedPersonnesRel.objectRelationshipId, archiveID, true, representedPersonnesRel.isReverse(), null, -1, -1 ) /> 
122 
123<#assign subjectPersonnesRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveSubjectPersonne")> 
124<#assign subjectPersonnes = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, subjectPersonnesRel.objectRelationshipId, archiveID, true, subjectPersonnesRel.isReverse(), null, -1, -1 ) /> 
125 
126<#assign themesRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveTheme")> 
127<#assign themes = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, themesRel.objectRelationshipId, archiveID, true, themesRel.isReverse(), null, -1, -1 ) /> 
128 
129<#assign representationsRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveRepresentation")> 
130<#assign representations = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, representationsRel.objectRelationshipId, archiveID, true, representationsRel.isReverse(), null, -1, -1 ) /> 
131 
132<#assign representationsSourceRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveRepresentationSource")> 
133<#assign representationsSource = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, representationsSourceRel.objectRelationshipId, archiveID, true, representationsSourceRel.isReverse(), null, -1, -1 ) /> 
134 
135<#assign stylesRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveStyle")> 
136<#assign styles = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, stylesRel.objectRelationshipId, archiveID, true, stylesRel.isReverse(), null, -1, -1 ) /> 
137 
138<#assign showContent = (ObjectField_contentDescription.getData()?hasContent 
139|| accruals?hasContent 
140|| systemArrangements?hasContent 
141|| authorsFull?hasContent 
142|| classifications?hasContent 
143|| objectCats?hasContent 
144|| linkedFilmsFull?hasContent 
145|| representedPersonnes?hasContent 
146|| subjectPersonnes?hasContent 
147|| themes?hasContent 
148|| representations?hasContent 
149|| representationsSource?hasContent 
150|| styles?hasContent 
151)> 
152 
153<#--------------------------------- Conditions d'accès et utilisation --------------------------> 
154 
155<#assign languesRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveLangue")> 
156<#assign langues = objectEntryLocalService.getManyToManyObjectEntries(archiveGroupID, languesRel.objectRelationshipId, archiveID, true, languesRel.isReverse(), null, -1, -1 ) /> 
157 
158<#--------------------------------- Consultation --------------------------> 
159 
160<#assign archiveConsultationRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveConsultation")> 
161<#assign archiveConsultation = objectEntryLocalService.getOneToManyObjectEntries(archiveGroupID, archiveConsultationRel.objectRelationshipId, archiveID, true, null, -1, -1 ) /> 
162<#assign archiveConsultation = archiveConsultation?filter(ac->ac.values.lieuDeConsultation != "Noncommunicable") /> 
163 
164<#assign showConsultation = (ObjectField_cote.getData()?hasContent 
165|| ObjectField_barcode.getData()?hasContent 
166|| archiveConsultation?hasContent 
167)> 
168 
169<#--------------------------------- Documents associés --------------------------> 
170 
171<#assign showDocuments = ObjectField_complementarySource.getData()?hasContent> 
172 
173<#--------------------------------- Collection --------------------------> 
174 
175<#assign relatedObjectTypesRel = objectRelationshipLocalService.getObjectRelationship(archiveEntry.objectDefinitionId, "archiveRelatedObjectTypes")> 
176<#assign relatedObjectTypes = objectEntryLocalService.getOneToManyObjectEntries(archiveGroupID, relatedObjectTypesRel.objectRelationshipId, archiveID, true, null, -1, -1 ) /> 
177<#assign relatedObjectsFull = garance.getRelatedObjects(relatedObjectTypes, archiveEntry, true)> 
178 
179<#assign showCollection = relatedObjectsFull?hasContent> 
180 
181<div class="notice notice--archive js-notice"> 
182    <div class="notice-header tw:text-white tw:pt-[3.375rem] tw:pb-[2.5rem] tw:relative tw:overflow-hidden 
183    tw:before:content-[''] tw:before:absolute tw:before:inset-0 tw:before:size-full tw:before:block tw:before:bg-text tw:before:opacity-90 
184    tw:xl:pt-[9.5rem]"> 
185        <div class="page-wrapper tw:z-0 tw:relative"> 
186            <#if request.getParameter("searchContext")?hasContent> 
187                <@garance.noticePagination request.getParameter("searchContext") archiveID /> 
188            </#if> 
189            <div class="tw:flex tw:gap-5 tw:items-start tw:flex-wrap tw:flex-col tw:z-0 
190            tw:md:flex-row tw:lg:flex-nowrap 
191            tw:xl:gap-[2.125rem]"> 
192                <div class="tw:order-2 tw:lg:order-1 tw:flex tw:flex-col tw:w-full tw:text-center 
193                    tw:md:w-fit tw:md:text-left"> 
194                    <#if ObjectField_titleComplete.getData()?hasContent> 
195                        <h1 class="tw:order-1 tw:text-prim tw:mb-[0.625rem]"> 
196                            ${[ObjectField_descriptionLevel.getData(), ObjectField_titleComplete.getData()]?filter(v->v?hasContent)?join(" - ")} 
197                        </h1> 
198                    </#if> 
199                    <#if !thumbnail?hasContent> 
200                        <p class="tw:order-0 tw:mb-5 tw:text-[0.75rem]/[1rem] tw:block tw:mx-auto tw:rounded-xs tw:w-fit tw:bg-[rgba(255,255,255,0.9)] tw:text-prim tw:uppercase tw:px-[0.625rem] tw:py-1 
201                                            tw:md:mx-0"> 
202                            Archive 
203                        </p> 
204                    </#if> 
205                </div> 
206                <#if thumbnail?hasContent> 
207                    <div class="tw:order-1 tw:lg:order-0 tw:w-full 
208                                    tw:md:w-fit"> 
209                        <div class="tw:m-auto tw:mx-auto tw:max-w-full tw:w-[15.625rem] tw:relative 
210                                        tw:md:mx-0"> 
211                            <p class="tw:absolute tw:top-[0.625rem] tw:left-[0.625rem] tw:text-[0.75rem]/[1rem] tw:block tw:rounded-xs tw:w-fit tw:bg-[rgba(255,255,255,0.9)] tw:text-prim tw:uppercase tw:px-[0.625rem] tw:py-1"> 
212                                Archive 
213                            </p> 
214                            <#assign fileEntryDesktop = dlAppLocalService.getFileEntry(thumbnail.values.media?number) /> 
215                            <#assign thumbnailURL = dlURLHelper.getPreviewURL(fileEntryDesktop, fileEntryDesktop.getFileVersion(), 
216                            null, "", 
217                            !fileEntryDesktop.getFileVersion().equals(fileEntryDesktop.getLatestFileVersion()), true) /> 
218 
219                            <figure class="tw:w-full"> 
220                                <source media="(min-width: 480px)" 
221                                        srcset="${thumbnailURL}"/> 
222                                <img class="tw:rounded-xs tw:object-cover tw:size-full" alt="" 
223                                     src="${thumbnailURL}"/> 
224                                <#if thumbnail.values.reproductionNotes?hasContent || thumbnail.values.reproductionCopyright?hasContent> 
225                                    <figcaption class="tw:ml-[0.625rem] tw:opacity-70 tw:text-[0.75rem]/[1rem] tw:font-medium tw:mt-[0.3125rem] 
226                                                    tw:md:ml-0"> 
227                                        ${[thumbnail.values.reproductionNotes, thumbnail.values.reproductionCopyright]?filter(v->v?hasContent)?join(" - ")} 
228                                    </figcaption> 
229                                </#if> 
230                            </figure> 
231                        </div> 
232                    </div> 
233                </#if> 
234                <@garance.noticeTools /> 
235            </div> 
236        </div> 
237    </div> 
238    <div class="notice-content"> 
239        <div class="tw:overflow-y-clip tw:py-10"> 
240            <div class="page-wrapper summary-ancres js-summary-ancres tw:group tw:fixed tw:w-full tw:overflow-hidden tw:h-fit tw:z-50 tw:top-[4.375rem] tw:bg-beige tw:max-lg:max-w-full! 
241                tw:lg:top-[6.875rem] tw:lg:h-0 tw:lg:overflow-visible tw:lg:sticky 
242                tw:xl:top-[8.85rem]"> 
243                <nav class="tw:bg-beige tw:lg:w-[14.25rem]" role="navigation" aria-labelledby="summary-title"> 
244                    <button id="summary-title" class="js-summary-btn tw:text-h3 tw:font-title tw:flex tw:justify-between tw:items-center tw:py-[0.625rem] tw:w-full tw:max-sm:px-[calc(2.5rem/2)] tw:focus:outline-offset-[-0.125rem] 
245                        tw:max-lg:px-[calc(5rem/2)] 
246                        tw:lg:hidden" aria-label="Ouvrir/Fermer le sommaire" aria-expanded="false" 
247                            aria-controls="summary-list"> 
248                        <span>Sommaire</span> 
249                        <span class="icon-chevron-down tw:text-prim tw:text-base tw:transition-all tw:outline-offset-[-0.125rem] 
250                        tw:group-[&.open]:rotate-180" aria-hidden="true"></span> 
251                    </button> 
252                    <div id="summary-list" class="tw:overflow-y-auto tw:bg-white tw:transition-all tw:max-sm:px-[calc(2.5rem/2)] 
253                    tw:max-lg:max-h-0 tw:max-lg:px-[calc(5rem/2)] tw:max-lg:max-w-full 
254                    tw:group-[&.open]:max-h-[calc(100vh-(4.375rem+3.125rem))] 
255                    tw:lg:max-h-[calc(100vh-12.5rem)] tw:lg:bg-transparent" tabindex="-1"> 
256                        <ul class="tw:border-sommaire-border tw:border-l-[0.125rem] tw:my-2"> 
257                            <#if showIdentification> 
258                                <li class="tw:py-1 tw:first:pt-0 tw:last:pb-0 tw:lg:py-[0.625rem]"> 
259                                    <a href="#identification" class="js-summary-ancres-link tw:border-l-[0.125rem] tw:border-transparent tw:block tw:py-1 tw:text-base/[1.75rem] tw:font-title tw:pl-[0.625rem] tw:relative tw:left-[-0.125rem] 
260                                tw:[&.is-active]:border-prim" tabindex="-1"> 
261                                        <span>${summary["IdentificationArchive"]?hasContent?then(summary["IdentificationArchive"], "Identification")}</span> 
262                                    </a> 
263                                </li> 
264                            </#if> 
265 
266                            <li class="tw:py-1 tw:first:pt-0 tw:last:pb-0 tw:lg:py-[0.625rem]"> 
267                                <a href="#contexte" class="js-summary-ancres-link tw:border-l-[0.125rem] tw:border-transparent tw:block tw:py-1 tw:text-base/[1.75rem] tw:font-title tw:pl-[0.625rem] tw:relative tw:left-[-0.125rem] 
268                                                            tw:[&.is-active]:border-prim" tabindex="-1"> 
269                                    <span>${summary["ContexteArchive"]?hasContent?then(summary["ContexteArchive"], "Contexte")}</span> 
270                                </a> 
271                            </li> 
272 
273                            <#if showContent> 
274                                <li class="tw:py-1 tw:first:pt-0 tw:last:pb-0 tw:lg:py-[0.625rem]"> 
275                                    <a href="#content-structure" class="js-summary-ancres-link tw:border-l-[0.125rem] tw:border-transparent tw:block tw:py-1 tw:text-base/[1.75rem] tw:font-title tw:pl-[0.625rem] tw:relative tw:left-[-0.125rem] 
276                                                            tw:[&.is-active]:border-prim" tabindex="-1"> 
277                                        <span>${summary["ContenuEtStructureArchive"]?hasContent?then(summary["ContenuEtStructureArchive"], "Contenu et structure")}</span> 
278                                    </a> 
279                                </li> 
280                            </#if> 
281 
282                            <li class="tw:py-1 tw:first:pt-0 tw:last:pb-0 tw:lg:py-[0.625rem]"> 
283                                <a href="#access" class="js-summary-ancres-link tw:border-l-[0.125rem] tw:border-transparent tw:block tw:py-1 tw:text-base/[1.75rem] tw:font-title tw:pl-[0.625rem] tw:relative tw:left-[-0.125rem] 
284                                                            tw:[&.is-active]:border-prim" tabindex="-1"> 
285                                    <span>${summary["ConditionsDaccesEtUtilisationArchive"]?hasContent?then(summary["ConditionsDaccesEtUtilisationArchive"], "Conditions d'accès et utilisation")}</span> 
286                                </a> 
287                            </li> 
288 
289                            <#if showConsultation> 
290                                <li class="tw:py-1 tw:first:pt-0 tw:last:pb-0 tw:lg:py-[0.625rem]"> 
291                                    <a href="#consultation" class="js-summary-ancres-link tw:border-l-[0.125rem] tw:border-transparent tw:block tw:py-1 tw:text-base/[1.75rem] tw:font-title tw:pl-[0.625rem] tw:relative tw:left-[-0.125rem] 
292                                                            tw:[&.is-active]:border-prim" tabindex="-1"> 
293                                        <span>${summary["ConsultationArchive"]?hasContent?then(summary["ConsultationArchive"], "Consultation")}</span> 
294                                    </a> 
295                                </li> 
296                            </#if> 
297 
298                            <#if showDocuments> 
299                                <li class="tw:py-1 tw:first:pt-0 tw:last:pb-0 tw:lg:py-[0.625rem]"> 
300                                    <a href="#document" class="js-summary-ancres-link tw:border-l-[0.125rem] tw:border-transparent tw:block tw:py-1 tw:text-base/[1.75rem] tw:font-title tw:pl-[0.625rem] tw:relative tw:left-[-0.125rem] 
301                                                            tw:[&.is-active]:border-prim" tabindex="-1"> 
302                                        <span>${summary["DocumentsAssociesArchive"]?hasContent?then(summary["DocumentsAssociesArchive"], "Documents associés")}</span> 
303                                    </a> 
304                                </li> 
305                            </#if> 
306                            <#if showMedia> 
307                                <li class="tw:py-1 tw:first:pt-0 tw:last:pb-0 tw:lg:py-[0.625rem]"> 
308                                    <a href="#ressources" class="js-summary-ancres-link tw:border-l-[0.125rem] tw:border-transparent tw:block tw:py-1 tw:text-base/[1.75rem] tw:font-title tw:pl-[0.625rem] tw:relative tw:left-[-0.125rem] 
309                                                            tw:[&.is-active]:border-prim" tabindex="-1"> 
310                                        <span>${summary["RessourcesMediaArchive"]?hasContent?then(summary["RessourcesMediaArchive"], "Ressources média")}</span> 
311                                    </a> 
312                                </li> 
313                            </#if> 
314                            <#if showCollection> 
315                                <li class="tw:py-1 tw:first:pt-0 tw:last:pb-0 tw:lg:py-[0.625rem]"> 
316                                    <a href="#collections" class="js-summary-ancres-link tw:border-l-[0.125rem] tw:border-transparent tw:block tw:py-1 tw:text-base/[1.75rem] tw:font-title tw:pl-[0.625rem] tw:relative tw:left-[-0.125rem] 
317                                                            tw:[&.is-active]:border-prim" tabindex="-1"> 
318                                        <span>${summary["CollectionsLieesArchive"]?hasContent?then(summary["CollectionsLieesArchive"], "Collections liées")}</span> 
319                                    </a> 
320                                </li> 
321                            </#if> 
322                        </ul> 
323                    </div> 
324                </nav> 
325            </div> 
326 
327            <#if showIdentification> 
328                <div id="identification" class="js-summary-content" tabindex="-1"></div> 
329                <div class="summary-content-wrapper page-wrapper tw:lg:pl-[16.75rem] tw:pb-10"> 
330                    <h2 class="tw:text-prim tw:mb-5">${summary["IdentificationArchive"]?hasContent?then(summary["IdentificationArchive"], "Identification")}</h2> 
331 
332                    <#if .dataModel["ObjectRelationship#C_Thesaurus#institution_label"].getData()?hasContent> 
333                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
334                            <span class="tw:font-bold tw:shrink-0">Institution :</span> 
335                            <span>${.dataModel["ObjectRelationship#C_Thesaurus#institution_label"].getData()}</span> 
336                        </p> 
337                    </#if> 
338 
339                    <#if ObjectField_productionDateStart.getData()?hasContent || ObjectField_productionDateStartPrecision.getData() == "sans date"> 
340                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
341                            <span class="tw:font-bold tw:shrink-0">Année :</span> 
342                            <#if ObjectField_productionDateStartPrecision.getData() == "sans date"> 
343                                <span>Sans date</span> 
344                            <#elseIf ObjectField_productionDateStart.getData()?hasContent> 
345                                <#assign dateStart = ObjectField_productionDateStart.getData()?datetime("dd/MM/yyyy HH:mm")?string("YYYY") + (getterUtil.getBoolean(ObjectField_anneeProdPresume.getData())?then("(Présumé)", ""))> 
346                                <#if ObjectField_productionDateStartPrecision.getData() == "entre" && ObjectField_productionDateEnd.getData()?hasContent> 
347                                    <#assign dateEnd = ObjectField_productionDateEnd.getData()?datetime("dd/MM/yyyy HH:mm")?string("YYYY") + (getterUtil.getBoolean(ObjectField_productionDateEndPrecision.getData())?then("(Présumé)", ""))> 
348                                    <span>Entre ${[dateStart, dateEnd]?join(" - ")}</span> 
349                                <#else> 
350                                    <#assign dateEnd = (ObjectField_productionDateEnd.getData()?hasContent)?then(ObjectField_productionDateEnd.getData()?datetime("dd/MM/yyyy HH:mm")?string("YYYY") + (getterUtil.getBoolean(ObjectField_productionDateEndPrecision.getData())?then("(Présumé)", "")), "")> 
351                                    <span>${[dateStart, dateEnd]?filter(d -> d?hasContent)?join(" - ")}</span> 
352                                </#if> 
353                            </#if> 
354                        </p> 
355                    </#if> 
356 
357                    <#if dimensions?hasContent> 
358                        <div class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
359                            <p id="dimensions-tlt" class="tw:leading-[1.375rem] tw:font-bold tw:shrink-0">Dimensions 
360                                :</p> 
361                            <ul aria-labelledby="dimensions-tlt"> 
362                                <#list dimensions as dimension> 
363                                    <li>${dimension.values.dimensionFree}</li> 
364                                </#list> 
365                            </ul> 
366                        </div> 
367                    </#if> 
368 
369                    <#if ObjectField_physicalDescription.getData()?hasContent> 
370                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
371                            <span class="tw:font-bold tw:shrink-0">Description physique :</span> 
372                            <span>${ObjectField_physicalDescription.getData()}</span> 
373                        </p> 
374                    </#if> 
375                </div> 
376            </#if> 
377 
378            <div id="contexte" class="js-summary-content" tabindex="-1"></div> 
379            <div class="summary-content-wrapper page-wrapper tw:lg:pl-[16.75rem] tw:py-10 
380                            tw:before:content-[''] tw:before:block tw:before:relative tw:before:top-[-2.5rem] tw:before:h-[0.0625rem] tw:before:w-full tw:before:ml-auto tw:before:bg-text tw:before:opacity-40"> 
381                <h2 class="tw:text-prim tw:mb-5">${summary["ContexteArchive"]?hasContent?then(summary["ContexteArchive"], "Contexte")}</h2> 
382 
383                <#if creatorsFull?hasContent> 
384                    <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
385                        <span class="tw:font-bold tw:shrink-0">Producteur :</span> 
386                        <span><#list creatorsFull as creator> 
387                            <#if creator.id?hasContent> 
388                                <a href="/l/${creator.id}${searchUrl}" 
389                                   class="tw:font-bold tw:transition-all tw:bg-linear-[currentcolor,currentcolor] tw:bg-no-repeat tw:bg-bottom-left tw:bg-size-[100%_0.0625rem] tw:hover:bg-size-[0_0.0625rem]"> 
390                                   ${creator.name} 
391                                </a> 
392                            <#else> 
393                                ${creator.name} 
394                            </#if><#if !creator?isLast> ; </#if></#list></span> 
395                    </p> 
396                </#if> 
397 
398                <#if creatorBiographies?hasContent> 
399                    <div class="tw:mb-10 tw:mt-5"> 
400                        <h3 class="tw:mb-[0.625rem]">Biographie</h3> 
401                        <div class="js-read-more" data-clamp-line="8" data-line-height="1.625"> 
402                            <#list creatorBiographies as biographie> 
403                                <div class="wysiwyg--notice tw:mb-[0.625rem]">${biographie.values.biography}</div> 
404                            </#list> 
405                        </div> 
406                        <button type="button" 
407                                class="tw:hidden tw:items-center tw:leading-[1.75rem] tw:mt-[0.625rem] tw:group tw:gap-[0.3125rem] tw:font-bold tw:transition-all tw:bg-linear-[currentcolor,currentcolor] tw:bg-no-repeat tw:bg-bottom-left tw:bg-size-[100%_0.125rem] tw:hover:bg-size-[0_0.125rem]"> 
408                            <span>Lire plus</span> 
409                            <span class="icon-chevron-down tw:inline-block tw:text-prim tw:text-base tw:transition-all tw:text-[0.875rem] tw:rotate-0 
410                                tw:group-hover:rotate-180 tw:group-data-[expanded=true]:rotate-180" aria-hidden="true"></span> 
411                        </button> 
412                    </div> 
413                </#if> 
414 
415                <#if ObjectField_objectHistoryNote.getData()?hasContent> 
416                    <div class="tw:mb-10"> 
417                        <div class="tw:mb-[0.625rem]"> 
418                            <h3 class="tw:mb-[0.625rem]">Historique de la conservation</h3> 
419                            <div class="js-read-more" data-clamp-line="8" data-line-height="1.625"> 
420                                <div class="wysiwyg--notice"> 
421                                    ${ObjectField_objectHistoryNote.getData()} 
422                                </div> 
423                            </div> 
424                            <button type="button" 
425                                    class="tw:hidden tw:items-center tw:leading-[1.75rem] tw:mt-[0.625rem] tw:group tw:gap-[0.3125rem] tw:font-bold tw:transition-all tw:bg-linear-[currentcolor,currentcolor] tw:bg-no-repeat tw:bg-bottom-left tw:bg-size-[100%_0.125rem] tw:hover:bg-size-[0_0.125rem]"> 
426                                <span>Lire plus</span> 
427                                <span class="icon-chevron-down tw:inline-block tw:text-prim tw:text-base tw:transition-all tw:text-[0.875rem] tw:rotate-0 
428                                tw:group-hover:rotate-180 tw:group-data-[expanded=true]:rotate-180" aria-hidden="true"></span> 
429                            </button> 
430                        </div> 
431                    </div> 
432                </#if> 
433 
434                <div class="tw:bg-white tw:p-10 tw:border-l-[0.25rem] tw:border-solid tw:border-prim tw:mt-5"> 
435                    <h3 class="tw:mb-5">Structure du fonds</h3> 
436                    <ul class="tree-root" data-archive-id="${archiveID}"> 
437                        <@garance.renderArchiveTree node=hierarchy archiveID=archiveID companyId=themeDisplay.getCompanyId()/> 
438                    </ul> 
439                </div> 
440            </div> 
441 
442            <#if showContent> 
443                <div id="content-structure" class="js-summary-content" tabindex="-1"></div> 
444                <div class="summary-content-wrapper page-wrapper tw:lg:pl-[16.75rem] tw:py-10 
445                            tw:before:content-[''] tw:before:block tw:before:relative tw:before:top-[-2.5rem] tw:before:h-[0.0625rem] tw:before:w-full tw:before:ml-auto tw:before:bg-text tw:before:opacity-40"> 
446                    <h2 class="tw:text-prim tw:mb-5">${summary["ContenuEtStructureArchive"]?hasContent?then(summary["ContenuEtStructureArchive"], "Contenu et structure")}</h2> 
447 
448                    <#if ObjectField_contentDescription.getData()?hasContent> 
449                        <div class="tw:flex tw:max-md:flex-col tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem] tw:[&_p]:leading-[1.375rem]!"> 
450                            <p class="tw:font-bold tw:shrink-0">Portée et contenu :</p> 
451                            <span class="tw:[&_p]:font-normal!">${ObjectField_contentDescription.getData()}</span> 
452                        </div> 
453                    </#if> 
454 
455                    <#if accruals?hasContent> 
456                        <#list accruals as accrual> 
457                            <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
458                                <span class="tw:font-bold tw:shrink-0">Accroissement :</span> 
459                                <span>${accrual.values.accruals}</span> 
460                            </p> 
461                        </#list> 
462                    </#if> 
463 
464                    <#if systemArrangements?hasContent> 
465                        <#list systemArrangements as systemArrangement> 
466                            <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
467                                <span class="tw:font-bold tw:shrink-0">Mode de classement :</span> 
468                                <span> 
469                                    <span class="js-read-more" data-clamp-line="5" data-line-height="1.375"> 
470                                        ${systemArrangement.values.arrangement} 
471                                    </span> 
472                                    <button type="button" 
473                                            class="tw:hidden tw:items-center tw:leading-[1.75rem] tw:mt-[0.625rem] tw:group tw:gap-[0.3125rem] tw:font-bold tw:transition-all tw:bg-linear-[currentcolor,currentcolor] tw:bg-no-repeat tw:bg-bottom-left tw:bg-size-[100%_0.125rem] tw:hover:bg-size-[0_0.125rem]"> 
474                                        <span>Lire plus</span> 
475                                        <span class="icon-chevron-down tw:inline-block tw:text-prim tw:text-base tw:transition-all tw:text-[0.875rem] tw:rotate-0 
476                                                            tw:group-hover:rotate-180 tw:group-data-[expanded=true]:rotate-180" aria-hidden="true"></span> 
477                                    </button> 
478                                </span> 
479                            </p> 
480                        </#list> 
481                    </#if> 
482 
483                    <#if authorsFull?hasContent> 
484                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
485                            <span class="tw:font-bold tw:shrink-0">Auteur(s) :</span> 
486                            <span><#list authorsFull as author> 
487                            <#if author.personne.id?hasContent> 
488                                    <a href="/l/${author.personne.id}${searchUrl}" 
489                                       class="tw:font-bold tw:group"> 
490                                   <span class="tw:transition-all tw:bg-linear-[currentcolor,currentcolor] tw:bg-no-repeat tw:bg-bottom-left tw:bg-size-[100%_0.0625rem] tw:group-hover:bg-size-[0_0.0625rem]">${author.personne.name}</span> 
491                                </a> 
492                                <#else> 
493                                    ${author.personne.name} 
494                                </#if><#if author.function?hasContent> (${garance.getPicklistItemName(author.function, "picklistArchiveAuthorFunction")})</#if><#if getterUtil.getBoolean(author.presume)> (Présumé)</#if><#if !author?isLast>, </#if></#list></span> 
495                        </p> 
496                    </#if> 
497 
498                    <#if classifications?hasContent> 
499                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
500                            <span class="tw:font-bold tw:shrink-0">Famille / Activité :</span> 
501                            <span> 
502                                <#list classifications as classification> 
503                                    ${[(classification.values.r_archiveClassificationTypeOfFile_c_thesaurusId != 0)?then(garance.getThesaurusByID(classification.values.r_archiveClassificationTypeOfFile_c_thesaurusId), ""), (classification.values.activityType?hasContent)?then(garance.getPicklistItemName(classification.values.activityType, "picklistArchiveActivityType"), "")]?filter(v->v?hasContent)?join(" / ")}<#if !classification?isLast>, </#if> 
504                                </#list> 
505                            </span> 
506                        </p> 
507                    </#if> 
508 
509                    <#if objectCats?hasContent> 
510                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
511                            <span class="tw:font-bold tw:shrink-0">Type de document :</span> 
512                            <span>${objectCats?map(oc-> oc.values.label)?join(", ")}</span> 
513                        </p> 
514                    </#if> 
515 
516                    <#if linkedFilmsFull?hasContent> 
517                        <div class="tw:flex tw:flex-col tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
518                            <p id="films-tlt" class="tw:leading-[1.375rem] tw:font-bold tw:shrink-0">Film(s) :</p> 
519                            <div class="wysiwyg js-list-expand"> 
520                                <ul aria-labelledby="films-tlt"> 
521                                    <#list linkedFilmsFull as linkedFilm> 
522                                        <li <#if (linkedFilm?index > 4)>class="tw:hidden"</#if>> 
523                                            <#if linkedFilm.id?hasContent> 
524                                                <a href="/l/${linkedFilm.id}${searchUrl}" 
525                                                   class="tw:font-bold! tw:transition-all tw:bg-linear-[currentcolor,currentcolor] tw:bg-no-repeat tw:bg-bottom-left tw:bg-size-[100%_0.125rem] tw:hover:bg-size-[0_0.125rem]"> 
526                                                    ${linkedFilm.title} 
527                                                </a> 
528                                            <#else> 
529                                                ${linkedFilm.title} 
530                                            </#if> 
531                                            <#if linkedFilm.reals?hasContent> - 
532                                                <#list linkedFilm.reals as real> 
533                                                    <#if real.id?hasContent> 
534                                                        <a class="tw:font-bold! tw:transition-all tw:bg-linear-[currentcolor,currentcolor] tw:bg-no-repeat tw:bg-bottom-left tw:bg-size-[100%_0.125rem] tw:hover:bg-size-[0_0.125rem]" 
535                                                           href="/l/${real.id}${searchUrl}"> 
536                                                            ${real.name} 
537                                                        </a> 
538                                                    <#else> 
539                                                        ${real.name} 
540                                                    </#if> 
541                                                    <#if !real?isLast>, </#if> 
542                                                </#list> 
543                                            </#if> 
544                                            <#if linkedFilm.year?hasContent> - ${linkedFilm.year}</#if> 
545                                        </li> 
546                                    </#list> 
547                                </ul> 
548                                <#if (linkedFilmsFull?size > 5)> 
549                                    <button type="button" 
550                                            class="js-expand tw:items-center tw:leading-[1.75rem] tw:group tw:flex tw:gap-[0.3125rem] tw:font-semibold tw:transition-all tw:bg-linear-[currentcolor,currentcolor] tw:bg-no-repeat tw:bg-bottom-left tw:bg-size-[100%_0.125rem] tw:hover:bg-size-[0_0.125rem]"> 
551                                        <span>Voir plus</span> 
552                                        <span class="icon-chevron-down tw:inline-block tw:text-prim tw:text-base tw:transition-all tw:text-[0.875rem] tw:rotate-0 
553                                        tw:group-hover:rotate-180 tw:group-data-[expanded=true]:rotate-180" aria-hidden="true"></span> 
554                                    </button> 
555                                </#if> 
556                            </div> 
557                        </div> 
558                    </#if> 
559 
560                    <#if representedPersonnes?hasContent> 
561                        <#assign representedPersonnes = representedPersonnes?map(rp -> garance.getPersonneDisplayData(rp.objectEntryId))> 
562                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
563                            <span class="tw:font-bold tw:shrink-0">Personne(s) représentée(s) :</span> 
564                            <span><#list representedPersonnes as rp><#if rp.id?hasContent> 
565                                    <a href="/l/${rp.id}${searchUrl}" 
566                                       class="tw:font-bold tw:transition-all tw:bg-linear-[currentcolor,currentcolor] tw:bg-no-repeat tw:bg-bottom-left tw:bg-size-[100%_0.0625rem] tw:hover:bg-size-[0_0.0625rem]"> 
567                                            ${rp.name} 
568                                        </a> 
569                                <#else>${rp.name}</#if><#if !rp?isLast>, </#if> 
570                               </#list></span> 
571                        </p> 
572                    </#if> 
573 
574                    <#if subjectPersonnes?hasContent> 
575                        <#assign subjectPersonnes = subjectPersonnes?map(sp -> garance.getPersonneDisplayData(sp.objectEntryId))> 
576                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
577                            <span class="tw:font-bold tw:shrink-0">Personne(s) sujet :</span> 
578                            <span><#list subjectPersonnes as sp><#if sp.id?hasContent> 
579                                    <a href="/l/${sp.id}${searchUrl}" 
580                                       class="tw:font-bold tw:transition-all tw:bg-linear-[currentcolor,currentcolor] tw:bg-no-repeat tw:bg-bottom-left tw:bg-size-[100%_0.0625rem] tw:hover:bg-size-[0_0.0625rem]"> 
581                                            ${sp.name} 
582                                        </a> 
583                                <#else>${sp.name}</#if><#if !sp?isLast>, </#if> 
584                               </#list></span> 
585                        </p> 
586                    </#if> 
587 
588                    <#if themes?hasContent> 
589                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
590                            <span class="tw:font-bold tw:shrink-0">Thème :</span> 
591                            <span>${themes?map(t->t.values.label)?join(", ")}</span> 
592                        </p> 
593                    </#if> 
594 
595                    <#if representations?hasContent> 
596                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
597                            <span class="tw:font-bold tw:shrink-0">Représentation :</span> 
598                            <span>${representations?map(r->r.values.label)?join(", ")}</span> 
599                        </p> 
600                    </#if> 
601 
602                    <#if representationsSource?hasContent> 
603                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
604                            <span class="tw:font-bold tw:shrink-0">Source de la représentation :</span> 
605                            <span>${representationsSource?map(rs->rs.values.label)?join(", ")}</span> 
606                        </p> 
607                    </#if> 
608 
609                    <#if styles?hasContent> 
610                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
611                            <span class="tw:font-bold tw:shrink-0">Époque/Style/Mouvement :</span> 
612                            <span>${styles?map(s->s.values.label)?join(", ")}</span> 
613                        </p> 
614                    </#if> 
615 
616                </div> 
617            </#if> 
618 
619            <div id="access" class="js-summary-content" tabindex="-1"></div> 
620            <div class="summary-content-wrapper page-wrapper tw:lg:pl-[16.75rem] tw:py-10 
621                        tw:before:content-[''] tw:before:block tw:before:relative tw:before:top-[-2.5rem] tw:before:h-[0.0625rem] tw:before:w-full tw:before:ml-auto tw:before:bg-text tw:before:opacity-40"> 
622                <h2 class="tw:text-prim tw:mb-5">${summary["ConditionsDaccesEtUtilisationArchive"]?hasContent?then(summary["ConditionsDaccesEtUtilisationArchive"], "Conditions d'accès et utilisation")}</h2> 
623                <div class="tw:bg-white tw:flex tw:items-center tw:p-5 tw:gap-[0.625rem] tw:w-fit tw:mb-[0.625rem]"> 
624                    <span class="icon-info tw:text-prim tw:text-base tw:text-[1.125rem]" aria-hidden="true"></span> 
625                    <p class="tw:font-bold tw:leading-[1.25rem]">Toute demande de reproduction est soumise à une 
626                        autorisation 
627                        préalable</p> 
628                </div> 
629 
630                <#if langues?hasContent> 
631                    <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
632                        <span class="tw:font-bold tw:shrink-0">Langue :</span> 
633                        <span>${langues?map(l->l.values.label)?join(", ")}</span> 
634                    </p> 
635                </#if> 
636 
637                <#if ObjectField_recommendationHandling.getData()?hasContent> 
638                    <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
639                        <span class="tw:font-bold tw:shrink-0">Précautions :</span> 
640                        <span>${ObjectField_recommendationHandling.getData()}</span> 
641                    </p> 
642                </#if> 
643            </div> 
644 
645            <#if showConsultation> 
646                <div id="consultation" class="js-summary-content" tabindex="-1"></div> 
647                <div class="summary-content-wrapper page-wrapper tw:lg:pl-[16.75rem] tw:py-10 
648                            tw:before:content-[''] tw:before:block tw:before:relative tw:before:top-[-2.5rem] tw:before:h-[0.0625rem] tw:before:w-full tw:before:ml-auto tw:before:bg-text tw:before:opacity-40"> 
649                    <h2 class="tw:text-prim tw:mb-5">${summary["ConsultationArchive"]?hasContent?then(summary["ConsultationArchive"], "Consultation")}</h2> 
650 
651                    <#if ObjectField_cote.getData()?hasContent> 
652                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
653                            <span class="tw:font-bold tw:shrink-0">Référence :</span> 
654                            <span>${ObjectField_cote.getData()}</span> 
655                        </p> 
656                    </#if> 
657 
658                    <#if ObjectField_barcode.getData()?hasContent> 
659                        <p class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
660                            <span class="tw:font-bold tw:shrink-0">Cote boîte :</span> 
661                            <span>${ObjectField_barcode.getData()}</span> 
662                        </p> 
663                    </#if> 
664 
665                    <#if archiveConsultation?hasContent> 
666                        <div class="tw:flex tw:max-md:flex-col tw:max-lg:flex-wrap tw:items-start tw:gap-[0.625rem] tw:text-notice tw:mb-[0.625rem]"> 
667                            <p id="consultation-tl" class="tw:leading-[1.375rem] tw:font-bold tw:shrink-0">Lieux de 
668                                consultation et conditions d'accès 
669                                :</p> 
670                            <ul aria-labelledby="consultation-tl"> 
671                                <#assign consultationFull = {}> 
672                                <#list archiveConsultation as consultation> 
673                                    <#assign lieu = consultation.values.lieuDeConsultation> 
674                                    <#assign acces = consultation.values.accesConditions> 
675                                    <#if consultationFull[lieu]??> 
676                                        <#if !(consultationFull[lieu]?seqContains(acces))> 
677                                            <#assign consultationFull = consultationFull + {lieu: consultationFull[lieu] + [acces]}> 
678                                        </#if> 
679                                    <#else> 
680                                        <#assign consultationFull = consultationFull + {lieu: [acces]}> 
681                                    </#if> 
682                                </#list> 
683                                <#list consultationFull as lieu, access> 
684                                    <li>${garance.getPicklistItemName(lieu, "picklistLieuDeConsultation")} - 
685                                        ${access?map(a -> garance.getPicklistItemName(a, "picklistAccesConditions"))?join(" - ")}</li> 
686                                </#list> 
687                            </ul> 
688                        </div> 
689                    </#if> 
690                </div> 
691            </#if> 
692 
693            <#if showDocuments> 
694                <div id="document" class="js-summary-content" tabindex="-1"></div> 
695                <div class="summary-content-wrapper page-wrapper tw:lg:pl-[16.75rem] tw:py-10 
696                            tw:before:content-[''] tw:before:block tw:before:relative tw:before:top-[-2.5rem] tw:before:h-[0.0625rem] tw:before:w-full tw:before:ml-auto tw:before:bg-text tw:before:opacity-40"> 
697                    <h2 class="tw:text-prim tw:mb-5">${summary["DocumentsAssociesArchive"]?hasContent?then(summary["DocumentsAssociesArchive"], "Documents associés")}</h2> 
698                    <p>${ObjectField_complementarySource.getData()}</p> 
699                </div> 
700            </#if> 
701        </div> 
702 
703        <#if showMedia> 
704            <#assign medias = []> 
705            <#if reproductionsVideos?hasContent> 
706                <#assign medias = medias + [{ 
707                "type": "video", 
708                "title": "Vidéos", 
709                "reproductions": reproductionsVideos 
710                }]> 
711            </#if> 
712            <#if reproductionsImages?hasContent> 
713                <#assign medias = medias + [{ 
714                "type": "image", 
715                "title": "Images", 
716                "reproductions": reproductionsImages 
717                }]> 
718            </#if> 
719            <div id="ressources" class="js-summary-content" tabindex="-1"></div> 
720            <div class="page-wrapper tw:py-10"> 
721                <h2 id="ressources-tl" 
722                    class="tw:text-prim tw:mb-5">${summary["RessourcesMediaArchive"]?hasContent?then(summary["RessourcesMediaArchive"], "Ressources média")}</h2> 
723                <@garance.displayMedia data=medias /> 
724            </div> 
725        </#if> 
726        <#if showCollection> 
727            <div id="collections" class="js-summary-content" tabindex="-1"></div> 
728            <div class="page-wrapper tw:py-10"> 
729                <h2 id="collections-tl" 
730                    class="tw:text-prim tw:mb-5">${summary["CollectionsLieesArchive"]?hasContent?then(summary["CollectionsLieesArchive"], "Collections liées")}</h2> 
731                <@garance.displayCollection relatedObjectsFull /> 
732            </div> 
733            <script type="module" async> 
734                import('photoswipe') 
735                import('photoswipe-lightbox') 
736            </script> 
737        </#if> 
738    </div> 
739</div> 
740 
741 
742<script> 
743    document.addEventListener('click', function (e) { 
744        const target = e.target; 
745 
746        const loadMoreBtn = target.closest('.js-load-more'); 
747        if (loadMoreBtn) { 
748            const nodeId = loadMoreBtn.getAttribute('data-node-id'); 
749            const nextOffset = loadMoreBtn.getAttribute('data-next-offset'); 
750            const rootTree = loadMoreBtn.closest('.tree-root'); 
751            const archiveId = rootTree ? rootTree.getAttribute('data-archive-id') : ''; 
752 
753            const container = loadMoreBtn.closest('.js-list-expand'); 
754            const listContainer = container.querySelector('.js-child-container'); 
755            const viewLessBtn = container.querySelector('.js-view-less'); 
756 
757            // Désactivation visuelle et technique du bouton 
758            loadMoreBtn.disabled = true; 
759            loadMoreBtn.style.opacity = '0.7'; 
760 
761            // spinner animé en Tailwind 
762            const spinnerHtml = ` 
763            <svg class="js-spinner tw:animate-spin tw:h-4 tw:w-4 tw:text-prim" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"> 
764                <circle class="tw:opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> 
765                <path class="tw:opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path> 
766            </svg> 
767        `; 
768            // On injecte le spinner à la fin du bouton (à côté de l'icône chevron) 
769            loadMoreBtn.insertAdjacentHTML('beforeend', spinnerHtml); 
770 
771            <#assign searchUrl = (request.getParameter("searchUrl")?hasContent)?then("?searchUrl=" + request.getParameter("searchUrl")?url('UTF-8'), "") /> 
772 
773            const url = "/o/notices-api/archiveTree?nodeId=" + nodeId + "&offset=" + nextOffset + "&archiveId=" 
774                + archiveId + "&archiveGroupID=" + ${archiveGroupID} + "&childrenArchiveRelId=" 
775                + ${childrenArchiveRel.objectRelationshipId} + "&partsArchiveRelId=" 
776                + ${partsArchiveRel.objectRelationshipId} + "&companyId=" + ${themeDisplay.getCompanyId()} 
777                + "&searchURL=${searchUrl}"; 
778 
779            fetch(url) 
780                .then(response => response.text()) 
781                .then(html => { 
782                    const tempDiv = document.createElement('div'); 
783                    tempDiv.innerHTML = html; 
784 
785                    const newItems = tempDiv.querySelectorAll(':scope > li'); 
786                    newItems.forEach(item => { 
787                        item.classList.add('js-ajax-loaded'); 
788                        listContainer.appendChild(item); 
789                        initAccordion(item); 
790                    }); 
791 
792                    // Permuter les boutons 
793                    loadMoreBtn.classList.add('tw:hidden'); 
794 
795                    // Nettoyage de l'état du bouton (au cas où il réapparaît suite au "Voir moins") 
796                    loadMoreBtn.disabled = false; 
797                    loadMoreBtn.style.opacity = '1'; 
798                    const spinner = loadMoreBtn.querySelector('.js-spinner'); 
799                    if (spinner) spinner.remove(); 
800 
801                    if (viewLessBtn) { 
802                        viewLessBtn.classList.remove('tw:hidden'); 
803
804                }) 
805                .catch(err => { 
806                    console.error('Erreur Ajax :', err); 
807 
808                    // En cas d'erreur, on remet le bouton dans son état initial et on enlève le spinner 
809                    loadMoreBtn.disabled = false; 
810                    loadMoreBtn.style.opacity = '1'; 
811                    const spinner = loadMoreBtn.querySelector('.js-spinner'); 
812                    if (spinner) spinner.remove(); 
813                }); 
814            return; 
815
816 
817        const viewLessBtn = target.closest('.js-view-less'); 
818        if (viewLessBtn) { 
819            const container = viewLessBtn.closest('.js-list-expand'); 
820            const listContainer = container.querySelector('.js-child-container'); 
821 
822            const toggleWrapper = viewLessBtn.closest('.js-toggle-wrapper'); 
823            const loadMoreBtn = toggleWrapper ? toggleWrapper.querySelector('.js-load-more') : null; 
824 
825            // Supprimer uniquement les éléments ajoutés dynamiquement en Ajax au niveau actuel 
826            // Utilisation de :scope pour s'assurer qu'on ne supprime pas par erreur les petits-enfants 
827            const dynamicItems = listContainer.querySelectorAll(':scope > .js-ajax-loaded'); 
828            dynamicItems.forEach(item => item.remove()); 
829 
830            viewLessBtn.classList.add('tw:hidden'); 
831            if (loadMoreBtn) { 
832                loadMoreBtn.classList.remove('tw:hidden'); 
833
834            return; 
835
836    }); 
837</script>