a
    Df                     @  s   d dl m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 d dlZd dlmZ d dlmZ ddlmZ dd	lmZ d
dlmZ erd dlmZ d dlmZ d dlmZ G dd deZdd Zej !e dS )    )annotationsN)defaultdict)TYPE_CHECKINGAnyCallableClassVarListMappingOptional)CustomJS)JupyterComm   )	lazy_load)Viewable   )	ModelPane)Document)Model)Commc                      s.  e Zd ZU dZejdddZejdddZejdddgdd	Z	ejd
g ddd	Z
dZded< ddiZded< g Zded< dZded< d: fdd	ZedddddZedd  Zd!d" Zd#d$ Z fd%d&Zd'd( fd)d*Zd;d'd+d+d,d-d. fd/d0Zd<d1d2d3d4d5d6Zd=d1d7d3d4d8d9Z  ZS )>EChartsa  
    ECharts panes allow rendering echarts.js dictionaries and pyecharts plots.

    Reference: https://panel.holoviz.org/reference/panes/ECharts.html

    :Example:

    >>> pn.extension('echarts')
    >>> ECharts(some_echart_dict_or_pyecharts_object, height=480, width=640)
    Nz\
        The Echarts object being wrapped. Can be an Echarts dictionary or a pyecharts chart)defaultdoca#  
        An optional dict of options passed to Echarts.setOption. Allows to fine-tune the rendering behavior.
        For example, you might want to use `options={ "replaceMerge": ['series'] })` when updating
        the `objects` with a value containing a smaller number of series.
        Zcanvassvgz/
       Whether to render as HTML canvas or SVG)r   Zobjectsr   r   )r   lightZdarkz 
       Theme to apply to plots.zClassVar[float | bool | None]priorityobjectdataz"ClassVar[Mapping[str, str | None]]_renamezClassVar[List[str]]_rerender_paramsTzClassVar[bool]_updatesc                   s0   t  j|fi | tdd | _tt| _d S )Nc                   S  s   t tS N)r   list r"   r"   _/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/pane/echarts.py<lambda>?       z"ECharts.__init__.<locals>.<lambda>)super__init__r   _py_callbacksr!   _js_callbacks)selfr   params	__class__r"   r#   r'   =   s    zECharts.__init__r   zfloat | bool | None)objreturnc                 K  s    t |trdS | |rdS d S )Nr   g?)
isinstancedictis_pyecharts)clsr.   r+   r"   r"   r#   appliesB   s
    

zECharts.appliesc                 C  s&   dt jv r"dd l}t||jjjS dS )N	pyechartsr   F)sysmodulesr5   r0   ZchartsZchartZChart)r3   r.   r5   r"   r"   r#   r2   J   s    
zECharts.is_pyechartsc                 C  sX   | j |ji }|d g D ]}|| q|jd u r8d S ||jg D ]}|| qFd S r    )r(   gettypequery)r*   event	callbackscbr"   r"   r#   _process_eventQ   s    

zECharts._process_eventc           	   	     sf   t t}| j D ]J\}}|D ]<\}}} fdd| D }|| |t||dd qqt|S )Nc                   s*   i | ]"\}} |j v r||j   d  qS )r   )_models).0nameviewablerefr"   r#   
<dictcomp>^   s   
z*ECharts._get_js_events.<locals>.<dictcomp>)codeargs)r:   callback)r   r!   r)   itemsappendr   r1   )	r*   rD   	js_eventsr;   specsr:   rF   rG   modelsr"   rC   r#   _get_js_eventsZ   s    
 zECharts._get_js_eventsc                   s   t  |}d|vr|S |d p"i }t|ts|j|j }}t|  |d< }| jsp|rpt	|
dd|d< | js|rt	|
dd|d< n||d< |drd|d< |S )	Nr   Zpx heightwidthZ
responsiveZstretch_bothZsizing_mode)r&   _process_param_changer0   r1   rQ   rP   jsonloadsdump_optionsintreplacer8   )r*   r+   propsr   whr,   r"   r#   rR   e   s    



zECharts._process_param_changer   )documentc                   s(   t  |}dd | j D |d< |S )Nc                 S  s   i | ]\}}|t |qS r"   r!   r@   r;   Zqueriesr"   r"   r#   rE   y   s   z+ECharts._get_properties.<locals>.<dictcomp>event_config)r&   _get_propertiesr(   rI   )r*   r[   rX   r,   r"   r#   r_   w   s
    
zECharts._get_propertieszOptional[Model]zOptional[Comm]r   )r   rootparentcommr/   c                   s>   t ddt|t|| _t ||||}| jd|||d |S )Npanel.models.echartsr   Zecharts_event)modelr   rb   )r   r0   r   Z_bokeh_modelr&   
_get_modelZ_register_events)r*   r   r`   ra   rb   rd   r,   r"   r#   re   ~   s    zECharts._get_modelstrr   z
str | None)r;   rH   r:   c                 C  sX   | j | | | dd | j  D }| j D ] \}\}}| i d|i|| q2dS )a  
        Register anevent handler which triggers when the specified event is triggered.

        Reference: https://apache.github.io/echarts-handbook/en/concepts/event/

        Arguments
        ---------
        event: str
            The name of the event to register a handler on, e.g. 'click'.
        callback: str | CustomJS
            The event handler to be executed when the event fires.
        query: str | None
            A query that determines when the event fires.
        c                 S  s   i | ]\}}|t |qS r"   r\   r]   r"   r"   r#   rE      r%   z$ECharts.on_event.<locals>.<dictcomp>r^   N)r(   rJ   rI   r?   _apply_update)r*   r;   rH   r:   r^   rD   rd   _r"   r"   r#   on_event   s    zECharts.on_eventzstr | CustomJSc           	      K  sP   | j | |||f | j D ]*\}\}}| |}| i d|i|| q dS )a  
        Register a Javascript event handler which triggers when the
        specified event is triggered. The callback can be a snippet
        of Javascript code or a bokeh CustomJS object making it possible
        to manipulate other models in response to an event.

        Reference: https://apache.github.io/echarts-handbook/en/concepts/event/

        Arguments
        ---------
        event: str
            The name of the event to register a handler on, e.g. 'click'.
        code: str
            The event handler to be executed when the event fires.
        query: str | None
            A query that determines when the event fires.
        args: Viewable
            A dictionary of Viewables to make available in the namespace
            of the object.
        rK   N)r)   rJ   r?   rI   rN   rg   )	r*   r;   rH   r:   rG   rD   rd   rh   rK   r"   r"   r#   js_on_event   s    
zECharts.js_on_event)N)NNN)N)N)__name__
__module____qualname____doc__param	Parameterr   optionsZObjectSelectorZrendererZthemer   __annotations__r   r   r   r'   classmethodr4   r2   r>   rN   rR   r_   re   ri   rj   __classcell__r"   r"   r,   r#   r      s.   

	  r   c                 C  sL   dt jvrd S |jd }| tD ]$}||jv r"|||j| d _q"d S )Nrc   idr   )r6   r7   rD   selectr   r?   rN   rK   )Z	root_viewZ
root_modelrD   Zpaner"   r"   r#   setup_js_callbacks   s    


rw   )"
__future__r   rS   r6   collectionsr   typingr   r   r   r   r   r	   r
   ro   Zbokeh.modelsr   Zpyviz_commsr   utilr   rB   r   baser   Zbokeh.documentr   Zbokeh.modelr   r   r   rw   Z_preprocessing_hooksrJ   r"   r"   r"   r#   <module>   s$   $ 