vendor/sonata-project/admin-bundle/src/Resources/views/CRUD/Association/edit_many_script.html.twig line 305

Open in your IDE?
  1. {#
  2. This file is part of the Sonata package.
  3. (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  4. For the full copyright and license information, please view the LICENSE
  5. file that was distributed with this source code.
  6. #}
  7. {#
  8. This code manages the many-to-[one|many] association field popup
  9. #}
  10. {% autoescape false %}
  11. {% set associationadmin = sonata_admin.field_description.associationadmin %}
  12. <!-- edit many association -->
  13. <script type="text/javascript">
  14.     {#
  15.       handle link click in a list :
  16.         - if the parent has an objectId defined then the related input get updated
  17.         - if the parent has NO object then an ajax request is made to refresh the popup
  18.     #}
  19.     var field_dialog_form_list_link_{{ id }} = function(event) {
  20.         initialize_popup_{{ id }}();
  21.         var target = jQuery(this);
  22.         if (target.attr('href').length === 0 || target.attr('href') === '#') {
  23.             return;
  24.         }
  25.         event.preventDefault();
  26.         event.stopPropagation();
  27.         Admin.log('[{{ id }}|field_dialog_form_list_link] handle link click in a list');
  28.         var element = jQuery(this).parents('#field_dialog_{{ id }} .sonata-ba-list-field');
  29.         // the user does not click on a row column
  30.         if (element.length == 0) {
  31.             Admin.log('[{{ id }}|field_dialog_form_list_link] the user does not click on a row column, make ajax call to retrieve inner html');
  32.             // make a recursive call (ie: reset the filter)
  33.             jQuery.ajax({
  34.                 type: 'GET',
  35.                 url: jQuery(this).attr('href'),
  36.                 dataType: 'html',
  37.                 success: function(html) {
  38.                     Admin.log('[{{ id }}|field_dialog_form_list_link] callback success, attach valid js event');
  39.                     field_dialog_content_{{ id }}.html(html);
  40.                     field_dialog_form_list_handle_action_{{ id }}();
  41.                     Admin.shared_setup(field_dialog_{{ id }});
  42.                 }
  43.             });
  44.             return;
  45.         }
  46.         Admin.log('[{{ id }}|field_dialog_form_list_link] the user select one element, update input and hide the modal');
  47.         jQuery('#{{ id }}').val(element.attr('objectId'));
  48.         jQuery('#{{ id }}').trigger('change');
  49.         field_dialog_{{ id }}.modal('hide');
  50.     };
  51.     // this function handle action on the modal list when inside a selected list
  52.     var field_dialog_form_list_handle_action_{{ id }}  =  function() {
  53.         Admin.log('[{{ id }}|field_dialog_form_list_handle_action] attaching valid js event');
  54.         // capture the submit event to make an ajax call, ie : POST data to the
  55.         // related create admin
  56.         jQuery('a', field_dialog_{{ id }}).on('click', field_dialog_form_list_link_{{ id }});
  57.         jQuery('form', field_dialog_{{ id }}).on('submit', function(event) {
  58.             event.preventDefault();
  59.             var form = jQuery(this);
  60.             Admin.log('[{{ id }}|field_dialog_form_list_handle_action] catching submit event, sending ajax request');
  61.             jQuery(form).ajaxSubmit({
  62.                 type: form.attr('method'),
  63.                 url: form.attr('action'),
  64.                 dataType: 'html',
  65.                 data: {_xml_http_request: true},
  66.                 success: function(html) {
  67.                     Admin.log('[{{ id }}|field_dialog_form_list_handle_action] form submit success, restoring event');
  68.                     field_dialog_content_{{ id }}.html(html);
  69.                     field_dialog_form_list_handle_action_{{ id }}();
  70.                     Admin.shared_setup(field_dialog_{{ id }});
  71.                 }
  72.             });
  73.         });
  74.     };
  75.     // handle the list link
  76.     var field_dialog_form_list_{{ id }} = function(event) {
  77.         initialize_popup_{{ id }}();
  78.         event.preventDefault();
  79.         event.stopPropagation();
  80.         Admin.log('[{{ id }}|field_dialog_form_list] open the list modal');
  81.         var a = jQuery(this);
  82.         field_dialog_content_{{ id }}.html('');
  83.         // retrieve the form element from the related admin generator
  84.         jQuery.ajax({
  85.             url: a.attr('href'),
  86.             dataType: 'html',
  87.             success: function(html) {
  88.                 Admin.log('[{{ id }}|field_dialog_form_list] retrieving the list content');
  89.                 // populate the popup container
  90.                 field_dialog_content_{{ id }}.html(html);
  91.                 field_dialog_title_{{ id }}.html("{{ associationadmin.label|trans({}, associationadmin.translationdomain) }}");
  92.                 Admin.shared_setup(field_dialog_{{ id }});
  93.                 field_dialog_form_list_handle_action_{{ id }}();
  94.                 // open the dialog in modal mode
  95.                 field_dialog_{{ id }}.modal();
  96.                 Admin.setup_list_modal(field_dialog_{{ id }});
  97.             }
  98.         });
  99.     };
  100.     // handle the add link
  101.     var field_dialog_form_add_{{ id }} = function(event) {
  102.         initialize_popup_{{ id }}();
  103.         event.preventDefault();
  104.         event.stopPropagation();
  105.         var a = jQuery(this);
  106.         field_dialog_content_{{ id }}.html('');
  107.         Admin.log('[{{ id }}|field_dialog_form_add] add link action');
  108.         // retrieve the form element from the related admin generator
  109.         jQuery.ajax({
  110.             url: a.attr('href'),
  111.             dataType: 'html',
  112.             success: function(html) {
  113.                 Admin.log('[{{ id }}|field_dialog_form_add] ajax success', field_dialog_{{ id }});
  114.                 // populate the popup container
  115.                 field_dialog_content_{{ id }}.html(html);
  116.                 field_dialog_title_{{ id }}.html("{{ associationadmin.label|trans({}, associationadmin.translationdomain) }}");
  117.                 Admin.shared_setup(field_dialog_{{ id }});
  118.                 // capture the submit event to make an ajax call, ie : POST data to the
  119.                 // related create admin
  120.                 jQuery(document).on('click','#field_dialog_{{ id }} a', field_dialog_form_action_{{ id }});
  121.                 jQuery('form', field_dialog_{{ id }}).on('submit', field_dialog_form_action_{{ id }});
  122.                 // open the dialog in modal mode
  123.                 field_dialog_{{ id }}.modal();
  124.                 Admin.setup_list_modal(field_dialog_{{ id }});
  125.             }
  126.         });
  127.     };
  128.     // handle the edit link
  129.     var field_dialog_form_edit_{{ id }} = function(event) {
  130.         initialize_popup_{{ id }}();
  131.         event.preventDefault();
  132.         event.stopPropagation();
  133.         var a = jQuery(this);
  134.         field_dialog_content_{{ id }}.html('');
  135.         Admin.log('[{{ id }}|field_dialog_form_edit] edit link action');
  136.         // retrieve the form element from the related admin generator
  137.         jQuery.ajax({
  138.             url: a.attr('href'),
  139.             dataType: 'html',
  140.             success: function(html) {
  141.                 Admin.log('[{{ id }}|field_dialog_form_edit] ajax success', field_dialog_{{ id }});
  142.                 // populate the popup container
  143.                 field_dialog_content_{{ id }}.html(html);
  144.                 field_dialog_title_{{ id }}.html("{{ associationadmin.label|trans({}, associationadmin.translationdomain) }}");
  145.                 Admin.shared_setup(field_dialog_{{ id }});
  146.                 // capture the submit event to make an ajax call, ie : POST data to the
  147.                 // related create admin
  148.                 jQuery(document).on('click','#field_dialog_{{ id }} a', field_dialog_form_action_{{ id }});
  149.                 jQuery('form', field_dialog_{{ id }}).on('submit', field_dialog_form_action_{{ id }});
  150.                 // open the dialog in modal mode
  151.                 field_dialog_{{ id }}.modal();
  152.                 Admin.setup_list_modal(field_dialog_{{ id }});
  153.             }
  154.         });
  155.     };
  156.     // handle the post data
  157.     var field_dialog_form_action_{{ id }} = function(event) {
  158.         var element = jQuery(this);
  159.         // return if the link is an anchor inside the same page
  160.         if (
  161.             this.nodeName === 'A'
  162.             && (
  163.                 element.attr('href').length === 0
  164.                 || element.attr('href')[0] === '#'
  165.                 || element.attr('href').substr(0, 11) === 'javascript:'
  166.             )
  167.         ) {
  168.             Admin.log('[{{ id }}|field_dialog_form_action] element is an anchor or a script, skipping action', this);
  169.             return;
  170.         }
  171.         event.preventDefault();
  172.         event.stopPropagation();
  173.         Admin.log('[{{ id }}|field_dialog_form_action] action catch', this);
  174.         initialize_popup_{{ id }}();
  175.         if (this.nodeName == 'FORM') {
  176.             var url  = element.attr('action');
  177.             var type = element.attr('method');
  178.         } else if (this.nodeName == 'A') {
  179.             var url  = element.attr('href');
  180.             var type = 'GET';
  181.         } else {
  182.             alert('unexpected element : @' + this.nodeName + '@');
  183.             return;
  184.         }
  185.         if (element.hasClass('sonata-ba-action')) {
  186.             Admin.log('[{{ id }}|field_dialog_form_action] reserved action stop catch all events');
  187.             return;
  188.         }
  189.         var data = {
  190.             _xml_http_request: true
  191.         }
  192.         var form = jQuery(this);
  193.         Admin.log('[{{ id }}|field_dialog_form_action] execute ajax call');
  194.         // the ajax post
  195.         jQuery(form).ajaxSubmit({
  196.             url: url,
  197.             type: type,
  198.             data: data,
  199.             success: function(data) {
  200.                 Admin.log('[{{ id }}|field_dialog_form_action] ajax success');
  201.                 // if the crud action return ok, then the element has been added
  202.                 // so the widget container must be refresh with the last option available
  203.                 if (typeof data != 'string' && data.result == 'ok') {
  204.                     field_dialog_{{ id }}.modal('hide');
  205.                     {% if sonata_admin.edit == 'list' %}
  206.                         {#
  207.                            in this case we update the hidden input, and call the change event to
  208.                            retrieve the post information
  209.                         #}
  210.                         jQuery('#{{ id }}').val(data.objectId);
  211.                         jQuery('#{{ id }}').change();
  212.                     {% else %}
  213.                         // reload the form element
  214.                         jQuery('#field_widget_{{ id }}').closest('form').ajaxSubmit({
  215.                             url: '{{ path('sonata_admin_retrieve_form_element', {
  216.                                 'elementId': id,
  217.                                 'subclass':  sonata_admin.admin.getActiveSubclassCode(),
  218.                                 'objectId':  sonata_admin.admin.root.id(sonata_admin.admin.root.subject),
  219.                                 'uniqid':    sonata_admin.admin.root.uniqid,
  220.                                 'code':      sonata_admin.admin.root.code
  221.                             }) }}',
  222.                             data: {_xml_http_request: true },
  223.                             dataType: 'html',
  224.                             type: 'POST',
  225.                             success: function(html) {
  226.                                 jQuery('#field_container_{{ id }}').replaceWith(html);
  227.                                 var newElement = jQuery('#{{ id }} [value="' + data.objectId + '"]');
  228.                                 if (newElement.is("input")) {
  229.                                     newElement.attr('checked', 'checked');
  230.                                 } else {
  231.                                     newElement.attr('selected', 'selected');
  232.                                 }
  233.                                 jQuery('#field_container_{{ id }}').trigger('sonata-admin-append-form-element');
  234.                             }
  235.                         });
  236.                     {% endif %}
  237.                     return;
  238.                 }
  239.                 // otherwise, display form error
  240.                 field_dialog_content_{{ id }}.html(data);
  241.                 Admin.shared_setup(field_dialog_{{ id }});
  242.                 // reattach the event
  243.                 jQuery('form', field_dialog_{{ id }}).submit(field_dialog_form_action_{{ id }});
  244.             }
  245.         });
  246.         return false;
  247.     };
  248.     var field_dialog_{{ id }}         = false;
  249.     var field_dialog_content_{{ id }} = false;
  250.     var field_dialog_title_{{ id }}   = false;
  251.     function initialize_popup_{{ id }}() {
  252.         // initialize component
  253.         if (!field_dialog_{{ id }}) {
  254.             field_dialog_{{ id }}         = jQuery("#field_dialog_{{ id }}");
  255.             field_dialog_content_{{ id }} = jQuery(".modal-body", "#field_dialog_{{ id }}");
  256.             field_dialog_title_{{ id }}   = jQuery(".modal-title", "#field_dialog_{{ id }}");
  257.             // move the dialog as a child of the root element, nested form breaks html ...
  258.             jQuery(document.body).append(field_dialog_{{ id }});
  259.             Admin.log('[{{ id }}|field_dialog] move dialog container as a document child');
  260.         }
  261.     }
  262.     {#
  263.         This code is used to define the "add" popup
  264.     #}
  265.     // this function initializes the popup
  266.     // this can be only done this way as popup can be cascaded
  267.     function start_field_dialog_form_add_{{ id }}(link) {
  268.         // remove the html event
  269.         link.onclick = null;
  270.         initialize_popup_{{ id }}();
  271.         // add the jQuery event to the a element
  272.         jQuery(link)
  273.             .click(field_dialog_form_add_{{ id }})
  274.             .trigger('click')
  275.         ;
  276.         return false;
  277.     }
  278.     {#
  279.         This code is used to define the "edit" popup
  280.     #}
  281.     // this function initializes the popup
  282.     // this can only be done this way as popup can be cascaded
  283.     function start_field_dialog_form_edit_{{ id }}(link) {
  284.         // remove the html event
  285.         link.onclick = null;
  286.         initialize_popup_{{ id }}();
  287.         // add the jQuery event to the a element
  288.         jQuery(link)
  289.             .click(field_dialog_form_edit_{{ id }})
  290.             .trigger('click')
  291.         ;
  292.         return false;
  293.     }
  294.     if (field_dialog_{{ id }}) {
  295.         Admin.shared_setup(field_dialog_{{ id }});
  296.     }
  297.     {% if sonata_admin.edit == 'list' %}
  298.         {#
  299.             This code is used to defined the "list" popup
  300.         #}
  301.         // this function initializes the popup
  302.         // this can be only done this way as popup can be cascaded
  303.         function start_field_dialog_form_list_{{ id }}(link) {
  304.             link.onclick = null;
  305.             initialize_popup_{{ id }}();
  306.             // add the jQuery event to the a element
  307.             jQuery(link)
  308.                 .click(field_dialog_form_list_{{ id }})
  309.                 .trigger('click')
  310.             ;
  311.             return false;
  312.         }
  313.         function remove_selected_element_{{ id }}(link) {
  314.             link.onclick = null;
  315.             jQuery(link)
  316.                 .click(field_remove_element_{{ id }})
  317.                 .trigger('click')
  318.             ;
  319.             return false;
  320.         }
  321.         function field_remove_element_{{ id }}(event) {
  322.             event.preventDefault();
  323.             if (jQuery('#{{ id }} option').get(0)) {
  324.                 jQuery('#{{ id }}').attr('selectedIndex', '-1').children("option:selected").attr("selected", false);
  325.             }
  326.             jQuery('#{{ id }}').val('');
  327.             jQuery('#{{ id }}').trigger('change');
  328.             return false;
  329.         }
  330.         {#
  331.           attach onchange event on the input
  332.         #}
  333.         // update the label
  334.         jQuery('#{{ id }}').on('change', function(event) {
  335.             Admin.log('[{{ id }}|on:change] update the label');
  336.             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>");
  337.             jQuery.ajax({
  338.                 type: 'GET',
  339.                 url: '{{ path('sonata_admin_short_object_information', {
  340.                     'objectId': 'OBJECT_ID',
  341.                     'uniqid': associationadmin.uniqid,
  342.                     'code': associationadmin.code,
  343.                     'linkParameters': sonata_admin.field_description.options.link_parameters
  344.                 })}}'.replace('OBJECT_ID', jQuery(this).val()),
  345.                 dataType: 'html',
  346.                 success: function(html) {
  347.                     jQuery('#field_widget_{{ id }}').html(html);
  348.                 }
  349.             });
  350.             {% if btn_edit %}
  351.                 var edit_button_url = '{{
  352.                     associationadmin.generateUrl('edit', {'id' : 'OBJECT_ID'})
  353.                 }}'.replace('OBJECT_ID', jQuery(this).val());
  354.                 var edit_button_node = jQuery('#field_actions_{{ id }} a.btn-warning');
  355.                 if (jQuery(this).val()) {
  356.                     edit_button_node.removeClass('hidden').attr('href', edit_button_url);
  357.                 } else {
  358.                     edit_button_node.addClass('hidden');
  359.                 }
  360.             {% endif %}
  361.         });
  362.     {% endif %}
  363. </script>
  364. <!-- / edit many association -->
  365. {% endautoescape %}