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>&nbsp;</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>