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 nellachangelist
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