.. _show_in_popup:

================
Popup via iframe
================

Lo scopo è far aprire un popup, in jquery-ui chiamata dialog o modale
al click di un link, con un iframe con sorgente il link stesso.
Si può attivare su qualsiasi link della change_list
aggiungendo la classe iframe.
Il sistema aggiunge automaticamente il parametro _popup=1
la dimenensione della finestra per default è 1000x500.
questi parametri sono configurabili mettendoli come attributo del link

classi
=======

Nel creare il link possiamo usare le seguenti classi:

:iframe: forza il rendering in una modale, il sistema aggiunge
	 ``_popup=1``

:hjson: forza l'output come json. Viene aggiunto ``_json=1&_popup=1`` all'URL.

:refresh: 

    forza l'utilizzo del ``json`` per fare un refresh del dato anche
    quando si passi da un redirect di un oggetto *diverso*. Ad esempio
    nella ``changelist`` dei ticket, aggiungiamo un intervento e
    vogliamo che al salvataggio venga riletta la singola riga *del
    ticket*.  Aggiunge all'url ``_refresh=1``

    In questo caso deve essere implementato a mano il redirect
    all'interno della ``response_add``/``response_change``::

     if request.GET.get("_refresh"):
        return HttpResponseRedirect(
	    reverse('admin:ticket_ticket_json', args=[obj.ticket.pk])+"?_refresh=1")


La modifica del link viene fatta da jQuery all'interno della funzione
``jmb.core.js`` da ``iframe_hjson_link`` con ``on("click")`` in modo da
garantire che non sino applicati se decidiamo di aprire il link in una
finestra separata.

Ogni ModelAdmin che erediti da 
:class:`AjaxParentModelAdmin <jmb.core.admin.ajax_inlines.AjaxParentModelAdmin>` ha
automaticamente definita una vista con name ``<app_label>_<model_name>_json``
che crea una :class:`ChildrenChangeList <jmb.core.admin.ajax_inlines.ChildrenChangeList>`
composta di un solo oggetto e la renderizza 
come un normale elemento della change_list e poi la ritorna in un json
così composto::

   data_json = [{
          "pk": 9134, 
          "model": "Ticket", 
          "fields": "<tr class=\"row1\">...</tr>\n\n"
   } ]
   data_json[0].method = ""
   action = ''
   message = ''



Vedi libreria jmb completa :ref:`jmb.javascript` 

chiamata singola
================
Nel caso si voglia utilizzare la funzione singolarmente
si può utilizzare::

  jmb.show_in_popup(src, title, width=1000, height=500, callback = function(){})

* src -> sorgente dell iframe
* title -> titolo della modale
* width e height -> altezza e larghezza della modale
* callback -> funzione triggerata alla chiusura della modale
* ritorna l'apertura dell iframe nella modale (true)

esempio
=======

in admin.py::

  def get_add_assistance(self, obj):
	  return """
		 <a class='iframe hjson refresh' href='%(reverse_url)s?_popup=1&ticket=%(ticket_id)s'
		 </a>""" % {
			  'reverse_url': reverse('admin:ticket_ticketassistance_add'),
			  'ticket_id': obj.id
		 }

  get_add_assistance_.allow_tags = True

aggiungere nella change_list.html::

    <script>
        // classe predefinita a.iframe
        jmb.auto_popup(classe, callback)
    </script>

dipendenze
==========

* jQuery e jQuery ui
* popup.js e jmb.core.js
