123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- {#
- This file is part of the Sonata package.
- (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
- For the full copyright and license information, please view the LICENSE
- file that was distributed with this source code.
- #}
- {#
- This code manage the many-to-[one|many] association field popup
- #}
- {% autoescape false %}
- {% set associationadmin = sonata_admin.field_description.associationadmin %}
- <!-- edit many association -->
- <script type="text/javascript">
- {#
- handle link click in a list :
- - if the parent has an objectId defined then the related input get updated
- - if the parent has NO object then an ajax request is made to refresh the popup
- #}
- var field_dialog_form_list_link_{{ id }} = function(event) {
- initialize_popup_{{ id }}();
- event.preventDefault();
- event.stopPropagation();
- Admin.log('[{{ id }}|field_dialog_form_list_link] handle link click in a list');
- var element = jQuery(this).parents('#field_dialog_{{ id }} .sonata-ba-list-field');
- // the user does click on a row column
- if (element.length == 0) {
- // make a recursive call (ie: reset the filter)
- jQuery.ajax({
- type: 'GET',
- url: jQuery(this).attr('href'),
- success: function(html) {
- field_dialog_{{ id }}.html(html);
- }
- });
- return;
- }
- jQuery('#{{ id }}').val(element.attr('objectId'));
- jQuery('#{{ id }}').trigger('change');
- field_dialog_{{ id }}.dialog('close');
- }
- // handle the add link
- var field_dialog_form_list_{{ id }} = function(event) {
- initialize_popup_{{ id }}();
- event.preventDefault();
- event.stopPropagation();
- Admin.log('[{{ id }}|field_dialog_form_list] open the list modal');
- var a = jQuery(this);
- field_dialog_{{ id }}.html('');
- // retrieve the form element from the related admin generator
- jQuery.ajax({
- url: a.attr('href'),
- dataType: 'html',
- success: function(html) {
- Admin.log('[{{ id }}|field_dialog_form_list] retrieving the list content');
- // populate the popup container
- field_dialog_{{ id }}.html(html);
- Admin.add_filters(field_dialog_{{ id }});
- // capture the submit event to make an ajax call, ie : POST data to the
- // related create admin
- jQuery('a', field_dialog_{{ id }}).live('click', field_dialog_form_list_link_{{ id }});
- jQuery('form', field_dialog_{{ id }}).live('submit', function(event) {
- event.preventDefault();
- var form = jQuery(this);
- jQuery(form).ajaxSubmit({
- type: form.attr('method'),
- url: form.attr('action'),
- dataType: 'html',
- data: {_xml_http_request: true},
- success: function(html) {
- field_dialog_{{ id }}.html(html);
- }
- });
- });
- // open the dialog in modal mode
- field_dialog_{{ id }}.dialog({
- height: 'auto',
- width: 980,
- modal: true,
- resizable: true,
- title: '{{ associationadmin.label|trans({}, associationadmin.translationdomain) }}',
- close: function(event, ui) {
- // make sure we have a clean state
- jQuery('a', field_dialog_{{ id }}).die('click');
- jQuery('form', field_dialog_{{ id }}).die('submit');
- },
- zIndex: 9998
- });
- }
- });
- };
- // handle the add link
- var field_dialog_form_add_{{ id }} = function(event) {
- initialize_popup_{{ id }}();
- event.preventDefault();
- event.stopPropagation();
- var a = jQuery(this);
- field_dialog_{{ id }}.html('');
- Admin.log('[{{ id }}|field_dialog_form_add] add link action');
- // retrieve the form element from the related admin generator
- jQuery.ajax({
- url: a.attr('href'),
- dataType: 'html',
- success: function(html) {
- Admin.log('[{{ id }}|field_dialog_form_add] ajax success', field_dialog_{{ id }});
- // populate the popup container
- field_dialog_{{ id }}.html(html);
- // capture the submit event to make an ajax call, ie : POST data to the
- // related create admin
- jQuery('a', field_dialog_{{ id }}).live('click', field_dialog_form_action_{{ id }});
- jQuery('form', field_dialog_{{ id }}).live('submit', field_dialog_form_action_{{ id }});
- // open the dialog in modal mode
- field_dialog_{{ id }}.dialog({
- height: 'auto',
- width: 650,
- modal: true,
- autoOpen: true,
- resizable: true,
- title: '{{ associationadmin.label|trans({}, associationadmin.translationdomain) }}',
- close: function(event, ui) {
- Admin.log('[{{ id }}|field_dialog_form_add] dialog closed - removing `live` events');
- // make sure we have a clean state
- jQuery('a', field_dialog_{{ id }}).die('click');
- jQuery('form', field_dialog_{{ id }}).die('submit');
- },
- zIndex: 9998,
- });
- }
- });
- };
- // handle the post data
- var field_dialog_form_action_{{ id }} = function(event) {
- event.preventDefault();
- event.stopPropagation();
- Admin.log('[{{ id }}|field_dialog_form_action] action catch', this);
- initialize_popup_{{ id }}();
- var element = jQuery(this);
- if (this.nodeName == 'FORM') {
- var url = element.attr('action');
- var type = element.attr('method');
- } else if (this.nodeName == 'A') {
- var url = element.attr('href');
- var type = 'GET';
- } else {
- alert('unexpected element : @' + this.nodeName + '@');
- return;
- }
- if (element.hasClass('sonata-ba-action')) {
- Admin.log('[{{ id }}|field_dialog_form_action] reserved action stop catch all events');
- return;
- }
- var data = {
- _xml_http_request: true
- }
- var form = jQuery(this);
- Admin.log('[{{ id }}|field_dialog_form_action] execute ajax call');
- // the ajax post
- jQuery(form).ajaxSubmit({
- url: url,
- type: type,
- data: data,
- success: function(data) {
- Admin.log('[{{ id }}|field_dialog_form_action] ajax success');
- if (typeof data == 'string') {
- field_dialog_{{ id }}.html(data);
- return;
- };
- // if the crud action return ok, then the element has been added
- // so the widget container must be refresh with the last option available
- if (data.result == 'ok') {
- field_dialog_{{ id }}.dialog('close');
- {% if sonata_admin.field_description.options.edit == 'list' %}
- {#
- in this case we update the hidden input, and call the change event to
- retrieve the post information
- #}
- jQuery('#{{ id }}').val(data.objectId);
- jQuery('#{{ id }}').change();
- {% else %}
- // reload the form element
- jQuery('#field_widget_{{ id }}').closest('form').ajaxSubmit({
- url: '{{ url('sonata_admin_retrieve_form_element', {
- 'elementId': id,
- 'objectId': sonata_admin.admin.root.id(sonata_admin.admin.root.subject),
- 'uniqid': sonata_admin.admin.root.uniqid,
- 'code': sonata_admin.admin.root.code
- }) }}',
- data: {_xml_http_request: true },
- type: 'POST',
- success: function(html) {
- jQuery('#field_container_{{ id }}').replaceWith(html);
- jQuery('#{{ id }} option[value="' + data.objectId + '"]').attr('selected', 'selected');
- }
- });
- {% endif %}
- return;
- }
- // otherwise, display form error
- field_dialog_{{ id }}.html(html);
- Admin.add_pretty_errors(field_dialog_{{ id }});
- // reattach the event
- jQuery('form', field_dialog_{{ id }}).submit(field_dialog_form_action_{{ id }});
- }
- });
- return false;
- }
- var field_dialog_{{ id }} = false;
- function initialize_popup_{{ id }}() {
- // initialize component
- if (!field_dialog_{{ id }}) {
- field_dialog_{{ id }} = jQuery("#field_dialog_{{ id }}");
- // move the dialog as a child of the root element, nested form breaks html ...
- jQuery(document.body).append(field_dialog_{{ id }});
- Admin.log('[{{ id }}|field_dialog] move dialog container as a document child');
- }
- }
- {#
- This code is used to defined the "add" popup
- #}
- // this function initialize the popup
- // this can be only done this way has popup can be cascaded
- function start_field_dialog_form_add_{{ id }}(link) {
- // remove the html event
- link.onclick = null;
- initialize_popup_{{ id }}();
- // add the jQuery event to the a element
- jQuery(link)
- .click(field_dialog_form_add_{{ id }})
- .trigger('click')
- ;
- return false;
- }
- Admin.add_pretty_errors(field_dialog_{{ id }});
- {% if sonata_admin.field_description.options.edit == 'list' %}
- {#
- This code is used to defined the "list" popup
- #}
- // this function initialize the popup
- // this can be only done this way has popup can be cascaded
- function start_field_dialog_form_list_{{ id }}(link) {
- link.onclick = null;
- initialize_popup_{{ id }}();
- // add the jQuery event to the a element
- jQuery(link)
- .click(field_dialog_form_list_{{ id }})
- .trigger('click')
- ;
- return false;
- }
- function remove_selected_element_{{ id }}(link) {
- link.onclick = null;
- jQuery(link)
- .click(field_remove_element_{{ id}})
- .trigger('click')
- ;
- return false;
- }
- function field_remove_element_{{ id }}(event) {
- event.preventDefault();
- if (jQuery('#{{ id }} option').get(0)) {
- jQuery('#{{ id }}').attr('selectedIndex', '-1').children("option:selected").attr("selected", false);
- }
- jQuery('#{{ id }}').val('');
- jQuery('#{{ id }}').trigger('change');
- return false;
- }
- {#
- attach onchange event on the input
- #}
- // update the label
- jQuery('#{{ id }}').live('change', function(event) {
- Admin.log('[{{ id }}] update the label');
- jQuery('#field_widget_{{ id }}').html("<span><img src=\"{{ asset('bundles/sonataadmin/ajax-loader.gif') }}\" style=\"vertical-align: middle; margin-right: 10px\"/>{{ 'loading_information'|trans([], 'SonataAdminBundle') }}</span>");
- jQuery.ajax({
- type: 'GET',
- url: '{{ url('sonata_admin_short_object_information', {
- 'objectId': 'OBJECT_ID',
- 'uniqid': associationadmin.uniqid,
- 'code': associationadmin.code
- })}}'.replace('OBJECT_ID', jQuery(this).val()),
- success: function(html) {
- jQuery('#field_widget_{{ id }}').html(html);
- }
- });
- });
- {% endif %}
- </script>
- <!-- / edit many association -->
- {% endautoescape %}
|