identity_card.ftl
1 <#--
2 Macro: identityCard
3 Renders a card UI for identity details.
4 @param identity The main data object containing the identity's details.
5 @param index The index of the current identity in the list.
6 @param merge Optional boolean parameter to conditionally render merge-related UI elements.
7 @param class Optional CSS classes for customization.
8 @param width Optional width for the card.
9 @returns A rendered identity card based on provided parameters.
10 -->
11 <#macro identityCard identity index family_name first_name birthdate merge=false class="" width="">
12 <#if index == 0>
13 <#assign firstIdentity = identity>
14 </#if>
15 <#assign familyNameAttr = identity.attributes?filter(a -> a.key == "family_name")?first!{}>
16 <#assign firstNameAttr = identity.attributes?filter(a -> a.key == "first_name")?first!{}>
17 <#assign emailAttr = identity.attributes?filter(a -> a.key == "email")?first!{}>
18 <#assign birthdateAttr = identity.attributes?filter(a -> a.key == "birthdate")?first!{}>
19 <div class="lutece-compare-item-container border-end p-3 position-relative <#if index=0>bg-primary-subtle border border-primary-subtle rounded-start-5<#else> border-top border-bottom</#if><#if !merge & index=0> border-2 border-end-dashed </#if><#if !merge && index!=0> border-dark-subtle<#elseif merge & index!=0> border-warning-subtle</#if> ${class}" style="<#if width!=''>width:${width}</#if>">
20 <div class="position-absolute start-50 translate-middle-x d-flex justify-content-center" style="top: -10px;">
21 <#if merge && index=0>
22 <div class="badge text-primary-emphasis bg-primary-subtle border border-primary rounded-5 px-2 py-1 mb-1 d-inline-block text-nowrap">
23 <i class="ti ti-check"></i> #i18n{identitymediation.resolve_duplicates.identityToKeep}
24 </div>
25 <#elseif merge && index!=0>
26 <div class="badge text-warning-emphasis bg-warning-subtle border border-warning rounded-5 px-2 py-1 mb-1 d-inline-block text-nowrap">
27 <i class="ti ti-arrow-badge-left"></i> #i18n{identitymediation.resolve_duplicates.identityToMerge}
28 </div>
29 </#if>
30 </div>
31 <div class="lutece-compare-item card p-0 rounded-5 shadow-xl mb-0">
32 <#if !merge>
33 <#if index == 0>
34 <button type="button" class="btn btn-warning" data-name="identity-cuid-${index}" data-cuid="${identity.customerId}">
35 #i18n{identitymediation.select_identities.selectedIdentity}
36 </button>
37 <#else>
38 <button type="button" class="btn btn-dark" data-name="identity-cuid-${index}" data-cuid="${identity.customerId}" disabled>
39 #i18n{identitymediation.select_identities.identityToProcess}
40 </button>
41 </#if>
42 </#if>
43 <div class="py-4 text-center">
44 <h3 class="px-2 text-truncate">
45 <#if familyNameAttr?? && familyNameAttr.value?? && familyNameAttr.value?has_content>
46 ${familyNameAttr.value}
47 </#if>
48 <#if firstNameAttr?? && firstNameAttr.value?? && firstNameAttr.value?has_content>
49 ${firstNameAttr.value}
50 </#if>
51 </h3>
52 <div class="d-flex flex-row justify-content-center align-items-center mt-2">
53 <div class="mr-2">
54 <#if identity.quality.quality?is_number>
55 <#assign qualityPercent=(identity.quality.quality * 100)?round>
56 <#if qualityPercent gt 79>
57 <@tag color="success" >#i18n{identitymediation.quality} : ${qualityPercent}%</@tag>
58 <#elseif qualityPercent gt 50 && qualityPercent lt 80>
59 <@tag color="warning">#i18n{identitymediation.quality} : ${qualityPercent}%</@tag>
60 <#else>
61 <@tag color="danger">#i18n{identitymediation.quality} : ${qualityPercent}%</@tag>
62 </#if>
63 <#else>
64 <@tag color="danger">-</@tag>
65 </#if>
66 </div>
67 <div>
68 <#if identity.monParisActive>
69 <@tag color="success" class="ms-2">MON PARIS</@tag>
70 <#else>
71 <@tag color="danger" class="ms-2 text-decoration-line-through">MON PARIS</@tag>
72 </#if>
73 </div>
74 </div>
75 <#if !merge>
76 <div class="mt-3">
77 <#if index!=0>
78 <a class="btn btn-outline-primary" href="jsp/admin/plugins/identitymediation/IdentityDuplicate.jsp?view_resolveDuplicates=&identity-cuid-1=${suspicious_identity.customerId}&identity-cuid-2=${identity.customerId}&cuid=${suspicious_identity.customerId}&code=${current_rule_code}&page=${current_page}&family_name=${family_name}&first_name=${first_name}&birthdate=${birthdate}">
79 <i class="ti ti-arrow-big-left-filled"></i> #i18n{identitymediation.select_identities.buttonMergeDuplicate}
80 </a>
81 <button type="button" class="btn btn-outline-danger" data-bs-toggle="modal"
82 data-bs-target="#exclude-modal-${identity.customerId}" >
83 #i18n{identitymediation.select_identities.buttonExcludeDuplicate} <i class="ti ti-arrow-big-right-filled"></i>
84 </button>
85 <#else>
86 <button type="button" class="btn btn-light invisible" disabled> </button>
87 </#if>
88 </div>
89 </#if>
90 </div>
91 <ul class="list-group list-group-flush rounded-bottom-5">
92 <#list service_contract.attributeDefinitions?filter(a -> a.attributeRight.readable) as readableAttr>
93 <li class="list-group-item d-flex justify-content-center align-items-center p-0 border-start-0 border-end-0" data-name="${readableAttr.name}" data-key="${readableAttr.keyName}" style="min-height:55px">
94 <div class="w-100 d-flex">
95 <#assign attributesList=identity.attributes?filter(a -> a.key == readableAttr.keyName)>
96 <#if index != 0>
97 <#assign firstIdentityAttr=firstIdentity.attributes?filter(a -> a.key == readableAttr.keyName)?first!{}>
98 </#if>
99 <#if attributesList?size gt 0>
100 <#list attributesList as attr>
101 <div class="flex-1 flex-grow-1 py-2 px-3 text-break">
102 <div class="opacity-50">
103 ${readableAttr.name}
104 </div>
105 <div class="fw-bold">
106 <h3 class="mb-0 fw-bold <#if index!=0 && ( !(firstIdentityAttr.value?has_content) || firstIdentityAttr.value?upper_case != attr.value?upper_case )>text-danger</#if>">
107 <#if attr.value?? && attr.value?has_content>
108 <#if attr.key == 'gender'>
109 <#if attr.value == '0'>
110 #i18n{identitymediation.select_identities.undefined}
111 <#elseif attr.value == '1'>
112 #i18n{identitymediation.select_identities.female}
113 <#elseif attr.value == '2'>
114 #i18n{identitymediation.select_identities.male}
115 <#else>
116 ${attr.value}
117 </#if>
118 <#else>
119 ${attr.value}
120 </#if>
121 <#else>
122 <span class="text-warning">Vide</span>
123 </#if>
124 </h3>
125 </div>
126 </div>
127 <div class="flex-1 border-start py-2 px-2 text-break" style="width:110px;min-width:110px;max-width:110px;">
128 <#if attr.certificationDate??>
129 <div class="text-center opacity-50">
130 ${attr.certificationDate?date}
131 </div>
132 </#if>
133 <#if attr.certifier??>
134 <div class="certifier text-truncate text-center w-100">
135 <span class="fw-medium">
136 ${attr.certifier}
137 </span>
138 </div>
139 </#if>
140 </div>
141 </#list>
142 <#else>
143 <div class="flex-1 flex-grow-1 py-2 px-3 text-break">
144 <div class="small-title">
145 ${readableAttr.name}
146 </div>
147 <h3 class="mb-0 fw-bold"><span class="text-warning">Inexistant</span></h3>
148 </div>
149 </#if>
150 </div>
151 </li>
152 </#list>
153 </ul>
154 </div>
155 </div>
156 <#if !merge & index!=0>
157 <div class="modal fade" id="exclude-modal-${identity.customerId}" tabindex="-1" aria-labelledby="excludeModalLabel-${identity.customerId}" aria-hidden="true">
158 <div class="modal-dialog rounded-5">
159 <div class="modal-content rounded-5">
160 <form class="form-inline container" action="jsp/admin/plugins/identitymediation/IdentityDuplicate.jsp">
161 <input type="hidden" name="code" value="${current_rule_code}" />
162 <input type="hidden" name="page" value="${current_page}" />
163 <input type="hidden" name="cuid" value="${suspicious_identity.customerId}" />
164 <input type="hidden" name="cuid_to_exclude" value="${identity.customerId}" />
165 <div class="modal-header border-0">
166 <h1 class="modal-title text-center w-100 p-4 pb-0" id="excludeModalLabel--${identity.customerId}">#i18n{identitymediation.resolve_duplicates.confirm}</h1>
167 <button type="button" class="btn btn-rounded border position-absolute end-0 me-3 top-0 mt-3" data-bs-dismiss="modal" aria-label="Close">x</button>
168 </div>
169 <div class="modal-body text-center border-0 pt-0">
170 ${identity.customerId}
171 #i18n{identitymediation.resolve_duplicates.confirmExclude}
172 </div>
173 <div class="modal-footer justify-content-center pb-4 pt-0 border-0">
174 <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">#i18n{identitymediation.resolve_duplicates.buttonCancel}</button>
175 <button class="btn btn-primary" name="action_excludeDuplicate">#i18n{identitymediation.resolve_duplicates.buttonExcludeDuplicate}</button>
176 </div>
177 </form>
178 </div>
179 </div>
180 </div>
181 </#if>
182 </#macro>