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>