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>