1{# itop-portal-base/portal/src/views/bricks/object/mode_create.html.twig #} 2{# Object brick create layout #} 3 4{% set tIsModal = (tIsModal is defined and tIsModal == true) ? true : false %} 5{% set sFormId = (form.id is defined and form.id is not null) ? form.id : 'object_form' %} 6{% set sFormIdSanitized = sFormId|replace({'-': ''}) %} 7{% set sFormDisplayModeClass = (form.display_mode is defined and form.display_mode is not null) ? 'form_' ~ form.display_mode : '' %} 8{% set sFormObjectStateClass = (form.object_state is defined and form.object_state is not null) ? 'form_object_state_' ~ form.object_state : '' %} 9 10<form id="{{ sFormId }}" class="{{ sFormDisplayModeClass }} {{ sFormObjectStateClass }}" method="POST" action="{{ form.renderer.GetEndpoint()|raw }}" 11 {% if sMode is defined and sMode is not null %}data-form-mode="{{ sMode }}"{% endif %} 12 {% if form.object_class is defined and form.object_class is not null %}data-object-class="{{ form.object_class }}"{% endif %} 13 {% if form.object_id is defined and form.object_id is not null %}data-object-id="{{ form.object_id }}"{% endif %} 14 {% if form.object_state is defined and form.object_state is not null %}data-object-state="{{ form.object_state }}"{% endif %}> 15 <input type="hidden" name="transaction_id" value="{{ form.transaction_id }}" /> 16 <div class="form_alerts"> 17 {% block pFormAlerts %} 18 <div class="alert alert-success" role="alert" style="display: none;"></div> 19 <div class="alert alert-warning" role="alert" style="display: none;"></div> 20 <div class="alert alert-error alert-danger" role="alert" style="display: none;"></div> 21 {% endblock %} 22 </div> 23 <div class="form_fields"> 24 {% block pFormFields %} 25 {{ form.renderer.GetBaseLayout()|raw }} 26 {% endblock %} 27 </div> 28 <div class="form_buttons"> 29 {% block pFormButtons %} 30 {# Misc. buttons #} 31 {% if form.buttons is defined and (form.buttons.actions is defined or form.buttons.links is defined) %} 32 <div class="form_btn_misc"> 33 {% include 'itop-portal-base/portal/src/views/bricks/object/plugins_buttons.html.twig' with {'aButtons': form.buttons} %} 34 </div> 35 {% endif %} 36 {# Transition buttons #} 37 {% if form.buttons is defined and form.buttons.transitions is defined and form.buttons.transitions|length > 0 %} 38 <div class="form_btn_transitions"> 39 {% for sStimulusCode, sStimulusLabel in form.buttons.transitions %} 40 <button class="btn btn-primary form_btn_transition" type="submit" name="stimulus_code" value="{{ sStimulusCode }}">{{ sStimulusLabel }}</button> 41 {% endfor %} 42 </div> 43 {% endif %} 44 <div class="form_btn_regular"> 45 {# If form has editable fields, we display cancel / submit buttons #} 46 {% if form.editable_fields_count is defined and form.editable_fields_count > 0 %} 47 <button class="btn btn-default form_btn_cancel" type="button" value="cancel" title="{{ 'Portal:Button:Cancel'|dict_s }}" data-dismiss="modal"> 48 <span class="glyphicon glyphicon-remove"></span> 49 {{ 'Portal:Button:Cancel'|dict_s }} 50 </button> 51 {% if form.buttons.submit is defined %} 52 <button class="btn btn-primary form_btn_submit" type="submit" value="submit" title="{{ form.buttons.submit.label }}"> 53 <span class="glyphicon glyphicon-ok"></span> 54 {{ form.buttons.submit.label }} 55 </button> 56 {% endif %} 57 {% else %} 58 {# Modal mode #} 59 {% if tIsModal %} 60 <input class="btn btn-default form_btn_cancel" type="button" value="{{ 'Portal:Button:Close'|dict_s }}" data-dismiss="modal"> 61 {% endif %} 62 {% endif %} 63 </div> 64 {% endblock %} 65 </div> 66</form> 67 68<script type="text/javascript"> 69 $(document).ready(function(){ 70 // Form field set declaration 71 var oFieldSet_{{ sFormIdSanitized }} = $('#{{ sFormId }} > .form_fields').field_set({{ form.fieldset|json_encode()|raw }}); 72 // Form handler declaration 73 $('#{{ sFormId }}').portal_form_handler({ 74 formmanager_class: "{{ form.formmanager_class|escape('js') }}", 75 formmanager_data: {{ form.formmanager_data|json_encode()|raw }}, 76 field_set: oFieldSet_{{ sFormIdSanitized }}, 77 submit_btn_selector: $('#{{ sFormId }}').parent().find('.form_btn_submit, .form_btn_transition'), 78 cancel_btn_selector: $('#{{ sFormId }}').parent().find('.form_btn_cancel'), 79 submit_url: {% if form.submit_callback is not null %}"{{ form.submit_callback|raw }}"{% else %}null{% endif %}, 80 cancel_url: {% if form.cancel_callback is not null %}"{{ form.cancel_callback|raw }}"{% else %}null{% endif %}, 81 endpoint: "{{ form.renderer.GetEndpoint()|raw }}", 82 is_modal: {% if tIsModal == true %}true{% else %}false{% endif %} 83 }); 84 85 // Sticky buttons handler 86 {% if sMode != 'view' %} 87 if( $('#{{ sFormId }} .form_btn_regular button').length > 0 ) 88 { 89 // Note : This pattern if to prevent performance issues 90 // - Cloning buttons 91 var oNormalRegularButtons_{{ sFormIdSanitized }} = $('#{{ sFormId }} .form_btn_regular'); 92 var oStickyRegularButtons_{{ sFormIdSanitized }} = oNormalRegularButtons_{{ sFormIdSanitized }}.clone(true, true); 93 oStickyRegularButtons_{{ sFormIdSanitized }}.addClass('sticky'); 94 if(oStickyRegularButtons_{{ sFormIdSanitized }}.find('.form_btn_submit span.glyphicon').length > 0) 95 { 96 oStickyRegularButtons_{{ sFormIdSanitized }}.find('.form_btn_submit').html( oStickyRegularButtons_{{ sFormIdSanitized }}.find('.form_btn_submit span.glyphicon')[0].outerHTML ); 97 } 98 if(oStickyRegularButtons_{{ sFormIdSanitized }}.find('.form_btn_cancel span.glyphicon').length > 0) 99 { 100 oStickyRegularButtons_{{ sFormIdSanitized }}.find('.form_btn_cancel').html( oStickyRegularButtons_{{ sFormIdSanitized }}.find('.form_btn_cancel span.glyphicon')[0].outerHTML ); 101 } 102 103 $('#{{ sFormId }}').closest({% if tIsModal == true %}'.modal'{% else %}'#main-content'{% endif %}).append(oStickyRegularButtons_{{ sFormIdSanitized }}); 104 105 // - Global timeout for any 106 var oScrollTimeout; 107 // - Scroll handler 108 scrollHandler_{{ sFormIdSanitized }} = function () { 109 if($('#{{ sFormId }} .form_buttons').visible()) 110 { 111 oStickyRegularButtons_{{ sFormIdSanitized }}.addClass('closed'); 112 } 113 else 114 { 115 oStickyRegularButtons_{{ sFormIdSanitized }}.removeClass('closed'); 116 } 117 }; 118 // - Event binding for scroll 119 $({% if tIsModal == true %}'.modal.in'{% else %}window{% endif %}).off('scroll').on('scroll', function () { 120 if (oScrollTimeout) { 121 // Clear the timeout, if one is pending 122 clearTimeout(oScrollTimeout); 123 oScrollTimeout = null; 124 } 125 oScrollTimeout = setTimeout(scrollHandler_{{ sFormIdSanitized }}, 50); 126 }); 127 // - Event binding for linkedset collapse 128 $({% if tIsModal == true %}'.modal.in'{% else %}window{% endif %}).off('shown.bs.collapse hidden.bs.collapse').on('shown.bs.collapse hidden.bs.collapse', function () { 129 scrollHandler_{{ sFormIdSanitized }}(); 130 }); 131 // - Event binding for form building / updating 132 // Note : We do not want to 'off' the event or it will remove listeners from the widget 133 oFieldSet_{{ sFormIdSanitized }}.on('form_built', function(oEvent){ 134 scrollHandler_{{ sFormIdSanitized }}(); 135 }); 136 // - Initial test 137 setTimeout(function(){ scrollHandler_{{ sFormIdSanitized }}(); }, 400); 138 139 // Remove sticky button when closing modal 140 $('#{{ sFormId }}').closest('.modal').on('hide.bs.modal', function () { 141 oStickyRegularButtons_{{ sFormIdSanitized }}.remove(); 142 }); 143 } 144 {% endif %} 145 146 {% if tIsModal == true %} 147 // Scroll top (because sometimes when several modals have been opened) 148 $('#{{ sFormId }}').closest('.modal').scrollTop(0); 149 $('#{{ sFormId }}').closest('.modal').find('.modal-footer').hide(); 150 {% endif %} 151 }); 152</script>