U
    TGhD                     @   s   d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ edZdZd	Zd
ZdZG dd dZdS )z1Create QGIS tooltip from Drag&Drop designer form.    N)Union)QgsAttributeEditorContainerQgsAttributeEditorElementQgsAttributeEditorFieldQgsAttributeEditorRelationQgsHstoreUtils
QgsProjectQgsRelationManagerQgsVectorLayer)QgsExternalResourceWidget)QDomDocumentLizmapz  zCopyright 2021, 3LizzGPL version 3zinfo@3liz.orgc                   @   sh  e Zd ZeeedddZeeedddZeeeeddd	Z	ed.e
eeeeeeedddZeeedddZeeedddZeeeeedddZeeeeeedddZeeeeedddZeeeef eedddZeeeeed d!d"Zeeeedd#d$Zeeeedd%d&Zeeeed'd(d)Zeed*d+d,Zd-S )/Tooltip)htmlreturnc                 C   s   d}| | S )NzJ<div class="container popup_lizmap_dd" style="width:100%;">
    {}
</div>
format)r   template r   7/var/www/lizmap/lizmap/plugins/lizmap_server/tooltip.pycreate_popup$   s    zTooltip.create_popup)datar   c                 C   s   dd |  D S )z' Remove None values in the dictionary. c                 S   s   i | ]\}}|d k	r||qS )Nr   ).0kvr   r   r   
<dictcomp>/   s       z'Tooltip.remove_none.<locals>.<dictcomp>)items)clsr   r   r   r   remove_none+   s    zTooltip.remove_none)namealiasr   c                 C   s   |r|n|}| dd}|S )N'   ’replace)r   r   r    fnamer   r   r   friendly_name1   s    zTooltip.friendly_nameF)layernodelevelheadersr   relation_managerbootstrap_5r   c           !   
   C   sj  t dt j}d}d}	t|trd| dkrd| }
|t 	 }|dt
|  7 }|t|
|7 }t|tr
| dk rtd|   d |S |  |  }| }t|| }| }| }| }t|}t|}|dkr|S |d	krt|||}|d
krRt |d sFtd|  | |S t||}|dkr||d }|  }|std|  | |S |! }|" }|#|}t$||||}|dkrt%||}|dkrt&||}|dt
|  7 }|t'|||7 }t|t(rn|)| | }|rN|t*|+ | |, 7 }n td|  d|+  d t|t-r^d}|. / rt0|. 1 2 }|}|dkrzd}|sd}|dt
 d|3d| | 7 }|r|r| d| }|r|s|}|	dt
 7 }	|3d| }|rP|	d| d| d|  d7 }	n |	d| d| d |  d!7 }	|4|	 |dkr|dt
|  d"| d 7 }|dt
|  d#|  d$ 7 }|dt
|  d% 7 }g }g }g }|d7 }|5 D ]}t6| ||||||}	|dkr ||	7 }qt|to6| dk} t|tsJ| rh|s\|4|	 n
|4|	 n
|4|	 q|dkr|r|d&7 }|d7|7 }|d'7 }|r|d(7 }|d7|7 }|d)7 }|d*7 }|d7|7 }|d'7 }|r^|d+7 }|d7|7 }|d'7 }nR|dkr,|dt
|  d, 7 }n2|dkr^|dt
|  d, 7 }|dt
|  d- 7 }||7 }|S ).Nz[^a-zA-Z0-9_]    
r   zLayer z# does not have a valid editor fieldHiddenZExternalResourceZValueRelationLayerz@Layer {} does not have a valid value relation layer for field {}ZRelationReferenceZRelationzDLayer {} does not have a valid relation reference layer for field {}ZValueMapDateTimez
The node 'z::zN' cannot be processed for the tooltip because the relation has not been found.   activez4<div id="popup_dd_[% $id %]_{}" class="tab-pane {}">_ z-<li class="nav-item"><button class="nav-link z;" data-bs-toggle="tab" data-bs-target="#popup_dd_[% $id %]_z">z</button></li>z<li class="z"><a href="#popup_dd_[% $id %]_z" data-toggle="tab">z	</a></li>z<fieldset class="z<legend>z	</legend>z<div>z
<div class="before-tabs">z
</div>z<ul class="nav nav-tabs">
z
</ul>z
<div class="tab-content">z
<div class="after-tabs"></div>z</fieldset>)8recompile
IGNORECASE
isinstancer   typer   toDomElementr   textSPACESr   _generate_text_labelr   idxLOGGERwarningidfieldsr&   r    editorWidgetSetupconfigr   _generate_field_view_generate_external_resourcer   instancemapLayerr   _generate_value_relationrelationreferencedLayerdisplayExpressionreferencedLayerIdresolveReferencedField_generate_relation_reference_generate_value_map_generate_date_generate_field_namer   init#_generate_attribute_editor_relationlabelreferencingLayerIdr   ZvisibilityExpressionenabled_generate_eval_visibilityr   
expressionsubappendchildren create_popup_node_item_from_formjoin)!r'   r(   r)   r*   r   r+   r,   ZregexahrX   r\   fieldr   r%   Zfield_widget_setupZwidget_typewidget_config
field_viewrM   Zreferenced_layerZdisplaylayer_id	parent_pkZ
visibilityZlvlr4   Zid_tabZbefore_tabsZcontent_tabsZ
after_tabsnZis_editor_elementr   r   r   r`   7   s&   





 
 



  
 	

       




z(Tooltip.create_popup_node_item_from_form)r   r   c                 C   s   d|  dS )N"r   )r   r   r   r   rH      s    zTooltip._generate_field_view)r\   r   c                 C   s   d|  dS )Nz[% if (z, '', 'hidden') %]r   )r\   r   r   r   r[      s    z!Tooltip._generate_eval_visibility)rX   relation_idreferencing_layer_idr   c                 C   sD   dt  d|  d }|dt  7 }|d||7 }|dt  d 7 }|S )zH Generate the div. LWC will manage to include children in the given div.r/   z<p><b>z</b></p>zu<div id="popup_relation_{0}" data-relation-id="{0}" data-referencing-layer-id="{1}" class="popup_lizmap_dd_relation">r7   )r?   r   )rX   rk   rl   resultr   r   r   rW     s     z+Tooltip._generate_attribute_editor_relation)r   rh   rg   display_expressionr   c                 C   s$   d| d|  d}d |||}|S )Nz
                    "" = attribute(@parent, 'z')
                z
                    aggregate(
                        layer:='{}',
                        aggregate:='concatenate',
                        expression:=to_string({}),
                        filter:={}
                    )r   )r   rh   rg   rn   r\   rf   r   r   r   rR     s    z$Tooltip._generate_relation_reference)r   r%   r\   r   c                 C   s   d | ||}|S )Nap  
                    [% CASE
                        WHEN "{0}" IS NOT NULL OR trim("{0}") != ''
                        THEN concat(
                            '<p>', '<b>{1}</b>',
                            '<div class="field">', {2}, '</div>',
                            '</p>'
                        )
                        ELSE ''
                    END %]r   )r   r%   r\   r>   r   r   r   rU   &  s    
zTooltip._generate_field_name)re   r   r   c                    s   t t ddd t| d trdt }| d D ]4}dt| kr, fdd| D }|| q,n:| d }|d krxdS |dr|d=  fd	d| D }t	|}d
| d| d}|S )N)valuer   c                 S   s   |  ddS )u)   Change ' to ’ for the HStore function. r!   r"   r#   )rp   r   r   r   escape_value:  s    z1Tooltip._generate_value_map.<locals>.escape_valuemapz<NULL>c                    s   i | ]\}} | |qS r   r   r   xyrq   r   r   r   B  s      z/Tooltip._generate_value_map.<locals>.<dictcomp>z''c                    s   i | ]\}} | |qS r   r   rs   rv   r   r   r   N  s      zE
                    map_get(
                        hstore_to_map('z%'),
                        replace("u%   ", '\'', '’')
                    ))
strr;   listdictkeysr   updategetr   Zbuild)re   r   valuesrowZrevertedZhstorerf   r   rv   r   rS   8  s(    

zTooltip._generate_value_map)re   r   r%   r   c                 C   sZ   | d }|t jkr d||}n6|t jkr8d||}n|t jkrNd|}ntd|S )NZDocumentViewerah  
                    concat(
                       '<a href="',
                       "{0}",
                       '" target="_blank">',
                       '
                       <img src="',
                       "{0}",
                       '" width="100%" title="{1}">',
                       '
                       </a>'
                    )a  
                    concat(
                       '<a href="',
                       "{0}",
                       '" target="_blank">
                       ',
                       '
                       <iframe src="',
                       "{0}",
                       '" width="100%" height="300" title="{1}"/>',
                       '
                       </a>'
                    )z
                    concat(
                        '<a href="',
                        "{0}",
                        '" target="_blank">',
                        base_file_name({0}),
                        '</a>'
                    )z Unknown external resource widget)r   Imager   ZWebZ	NoContent	Exception)re   r   r%   Zdviewrf   r   r   r   rI   Y  s"    
 
 

z#Tooltip._generate_external_resourcec                 C   s(   |  d}|sd}d| d| d}|S )NZdisplay_formatz
yyyy-MM-ddz;
                    format_date(
                        "z",
                        'z'
                    ))r|   )re   r   Zdate_formatrf   r   r   r   rT     s    
zTooltip._generate_datec                 C   sn   | d }d| d  d| d}|  dd }|rX|dd	}|d
d}|d| 7 }d|| d |}|S )Nr1   rj   ZKeyro   z')FilterExpressionr-   z@current_geometryzgeometry(@parent)zcurrent_value(zattribute(@parent, z AND z
                    aggregate(
                        layer:='{}',
                        aggregate:='concatenate',
                        expression:=to_string("{}"),
                        filter:={}
                    )Value)r|   stripr$   r   )re   r   Zvlidr\   Z
filter_exprf   r   r   r   rL     s    z Tooltip._generate_value_relation)rX   r\   r   c                 C   s   d|  d| d}|S )Nz 
                    <p><strong>z1</strong>
                    <div class="field">z4</div>
                    </p>
                    r   )rX   r\   r>   r   r   r   r@     s    zTooltip._generate_text_label)r   c                  C   s   d} | S )Na:  <style>
    div.popup_lizmap_dd {
        margin: 2px;
    }
    div.popup_lizmap_dd div {
        padding: 5px;
    }
    div.popup_lizmap_dd div.tab-content{
        border: 1px solid rgba(150,150,150,0.5);
    }
    div.popup_lizmap_dd ul.nav.nav-tabs li a {
        border: 1px solid rgba(150,150,150,0.5);
        border-bottom: none;
        color: grey;
    }
    div.popup_lizmap_dd ul.nav.nav-tabs li.active a {
        color: #333333;
    }
    div.popup_lizmap_dd div.tab-content div.tab-pane div {
        border: 1px solid rgba(150,150,150,0.5);
        border-radius: 5px;
        background-color: rgba(150,150,150,0.5);
    }
    div.popup_lizmap_dd div.tab-content div.tab-pane div.field,
    div.popup_lizmap_dd div.field,
    div.popup_lizmap_dd div.tab-content div.field {
        background-color: white;
        border: 1px solid white;
    }
    div.popup_lizmap_dd div.tab-content legend {
        font-weight: bold;
        font-size: 1em !important;
        color: #333333;
        border-bottom: none;
        margin-top: 15px !important;
    }

</style>
r   )cssr   r   r   r     s    &zTooltip.cssN)F)__name__
__module____qualname__staticmethodrw   r   classmethodry   r   r&   r
   r   intrx   r	   boolr`   rH   r[   rW   rR   rU   r   rS   rI   rT   rL   r@   r   r   r   r   r   r   "   s\     C 0r   )__doc__Zloggingr8   typingr   	qgis.corer   r   r   r   r   r   r	   r
   qgis.guir   qgis.PyQt.QtXmlr   Z	getLoggerrB   r?   __copyright____license__	__email__r   r   r   r   r   <module>   s   (

