### Navigation

- index
- modules
- toc
- next
- previous
- jmb.core 0.8.6 documentation »
- Django: aggiunte e standardizzazioni. »
- Javascript »

# 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 `AjaxParentModelAdmin` ha automaticamente definita una vista con name `<app_label>_<model_name>_json` che crea una `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 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

### Navigation

- index
- modules
- toc
- next
- previous
- jmb.core 0.8.6 documentation »
- Django: aggiunte e standardizzazioni. »
- Javascript »