vendor/se7enxweb/admin-ui/src/bundle/Resources/views/themes/admin/ui/layout.html.twig line 146

Open in your IDE?
  1. <!DOCTYPE html>
  2. <html lang="{{ app.request.locale }}">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="CSRF-Token" content="{{ csrf_token('rest') }}" />
  6. <meta name="SiteAccess" content="{{ app.request.get('siteaccess').name }}" />
  7. <meta name="UserId" content="{{ ibexa_admin_ui_config.user.user.id|default() }}" />
  8. <script>
  9. const userAgent = navigator.userAgent.toLowerCase();
  10. if (userAgent.indexOf('chrome') < 0 && userAgent.indexOf('safari') >= 0) {
  11. window.onpageshow = (event) => {
  12. if (event.persisted) {
  13. document.body.classList.remove('ibexa-prevent-click');
  14. }
  15. };
  16. }
  17. </script>
  18. <script>
  19. window.ibexa = window.eZ = {
  20. addConfig: (path, value, shouldMerge = false) => {
  21. const keys = path.split('.');
  22. const lastIndex = keys.length - 1;
  23. const objectConstructorName = 'Object';
  24. const setValue = (newValue, oldValue) => {
  25. const hasValue = newValue && !!newValue.constructor;
  26. const oldHasValue = oldValue && !!oldValue.constructor;
  27. if (!shouldMerge || !hasValue || !oldHasValue) {
  28. return newValue;
  29. }
  30. if (Array.isArray(newValue)) {
  31. return [...oldValue, ...newValue];
  32. }
  33. if (newValue.constructor.name === objectConstructorName) {
  34. return Object.assign({}, oldValue, newValue);
  35. }
  36. };
  37. keys.reduce((currentObj, nextKey, index) => {
  38. const isLastIndex = index === lastIndex;
  39. if (!currentObj[nextKey] && !isLastIndex) {
  40. currentObj[nextKey] = {};
  41. }
  42. if (isLastIndex) {
  43. currentObj[nextKey] = setValue(value, currentObj[nextKey]);
  44. }
  45. return currentObj[nextKey];
  46. }, window.ibexa);
  47. },
  48. };
  49. </script>
  50. {% block meta %}
  51. {% endblock %}
  52. <script>
  53. window.ibexa.addConfig('adminUiConfig', {{ ibexa_admin_ui_config|json_encode|raw }});
  54. window.ibexa.addConfig('richText', {{ ibexa_richtext_config|json_encode|raw }});
  55. window.ibexa.addConfig('errors', {
  56. emailRegexp: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
  57. urlRegexp: /^((https?:\/\/|ftps?:\/\/|sftp:\/\/|www\.|\/|ezlocation:\/\/)[^\s]+$)|(^([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})(\/[^\s]*)?$)/,
  58. emptyField: '{{ 'js.error.empty.field'|trans({}, 'validators')|desc('{fieldName} Field cannot be empty') }}',
  59. invalidEmail: '{{ 'js.error.invalid_email'|trans({}, 'validators')|desc('A valid email address is required') }}',
  60. invalidUrl: '{{ 'js.error.invalid_url'|trans({}, 'validators')|desc('A valid URL is required') }}',
  61. tooLong: '{{ 'js.error.too_long'|trans({}, 'validators')|desc('{fieldName} value must be less than or equal to {maxLength} characters') }}',
  62. tooShort: '{{ 'js.error.too_short'|trans({}, 'validators')|desc('{fieldName} value must be greater than or equal to {minLength} characters') }}',
  63. isNotInteger: '{{ 'js.error.is_not_integer'|trans({}, 'validators')|desc('{fieldName} value must be an integer') }}',
  64. isNotFloat: '{{ 'js.error.is_not_float'|trans({}, 'validators')|desc('{fieldName} value must be a float number') }}',
  65. isLess: '{{ 'js.error.is_less'|trans({}, 'validators')|desc('{fieldName} value must be greater than or equal to {minValue}') }}',
  66. isGreater: '{{ 'js.error.is_greater'|trans({}, 'validators')|desc('{fieldName} value must be less than or equal to {maxValue}') }}',
  67. invalidFileSize: '{{ 'js.error.invalid_file_size'|trans({}, 'validators')|desc('{fieldName}: Cannot upload. File exceeds file size limit.') }}',
  68. invalidFileType: '{{ 'js.error.invalid_file_type'|trans({}, 'validators')|desc('{fieldName}: Cannot upload. File has wrong type.') }}',
  69. provideLatitudeValue: '{{ 'js.error.provide_latitude_value'|trans({}, 'validators')|desc('Provide latitude value in the Latitude field') }}',
  70. provideLongitudeValue: '{{ 'js.error.provide_longitude_value'|trans({}, 'validators')|desc('Provide longitude value in the Longitude field') }}',
  71. addressNotFound: '{{ 'js.error.address_not_found'|trans({}, 'validators')|desc('Provided address does not exist') }}',
  72. notSamePasswords: '{{ 'js.error.not_same_passwords'|trans({}, 'validators')|desc('Passwords do not match') }}',
  73. invalidValue: '{{ 'js.error.invalid_value'|trans({}, 'validators')|desc('{fieldName} Field has invalid values') }}',
  74. outOfRangeValue: '{{ 'js.error.out_of_range_value'|trans({}, 'validators')|desc('{fieldName} value is out of range. The value must be between {min} and {max}') }}'
  75. });
  76. window.CKEDITOR_BASEPATH = window.ALLOYEDITOR_BASEPATH = "/bundles/ibexaadminuiassets/vendors/alloyeditor/dist/alloy-editor/";
  77. </script>
  78. <script src="/bundles/fosjsrouting/js/router.js"></script>
  79. <script src="{{ path('fos_js_routing_js', { callback: 'fos.Router.setData' }) }}"></script>
  80. {% if app.request.locale == 'ach-UG' %}
  81. <script type="text/javascript">
  82. var _jipt = [];
  83. _jipt.push(['project', 'ibexa-dxp']);
  84. </script>
  85. <script type="text/javascript" src="//cdn.crowdin.com/jipt/jipt.js"></script>
  86. {% endif %}
  87. <title>{% block title %}Exponential Platform DXP{% endblock %}</title>
  88. {{ encore_entry_link_tags('ibexa-admin-ui-layout-css', null, 'ibexa') }}
  89. {% block stylesheets %}{% endblock %}
  90. <link rel="icon" type="image/x-icon" href="{{ asset('bundles/ibexaadminui/img/favicon.ico') }}" />
  91. <link rel="icon" type="image/png" sizes="16x16" href="{{ asset('bundles/ibexaadminui/img/favicon-16x16.png') }}" />
  92. <link rel="icon" type="image/png" sizes="32x32" href="{{ asset('bundles/ibexaadminui/img/favicon-32x32.png') }}" />
  93. {{ ibexa_twig_component_group('admin-ui-stylesheet-head') }}
  94. {{ ibexa_twig_component_group('admin-ui-script-head') }}
  95. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/react/umd/react.production.min.js') }}"></script>
  96. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/react-dom/umd/react-dom.production.min.js') }}"></script>
  97. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/@popperjs/core/dist/umd/popper.min.js') }}"></script>
  98. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/bootstrap/dist/js/bootstrap.min.js') }}"></script>
  99. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/create-react-class/create-react-class.min.js') }}"></script>
  100. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/prop-types/prop-types.min.js') }}"></script>
  101. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/flatpickr/dist/flatpickr.min.js') }}"></script>
  102. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/moment/min/moment-with-locales.min.js') }}"></script>
  103. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/moment-timezone/builds/moment-timezone-with-data.min.js') }}"></script>
  104. <script src="{{ asset('bundles/bazingajstranslation/js/translator.min.js') }}"></script>
  105. <script src="{{ asset('assets/translations/config.js') }}"></script>
  106. <script src="{{ asset('assets/translations/' ~ app.request.locale ~ '.js') }}"></script>
  107. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/chart-js/dist/chart.umd.js') }}"></script>
  108. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/chartjs-plugin-datalabels/dist/chartjs-plugin-datalabels.min.js') }}"></script>
  109. <script src="{{ asset('bundles/ibexaadminuiassets/vendors/js-md5/build/md5.min.js') }}"></script>
  110. </head>
  111. <body class="{% block body_class %}ibexa-theme {% if ibexa_is_focus_mode_on() %}ibexa-theme--dark{% endif %}{% endblock %}">
  112. <div id="react-udw" data-filter-subtree-udw-config="{{ ibexa_udw_config('single_container', {}) }}"></div>
  113. {% block header_row %}
  114. <header class="ibexa-main-header">
  115. <div class="ibexa-main-header__brand-column">
  116. {% block brand %}
  117. <a class="ibexa-main-header__brand" href="{{ url('ibexa.dashboard') }}">
  118. <img class="ibexa-main-header__brand-image" src="{{ asset('bundles/ibexaadminui/img/exponential-platform-dxp-logo.svg') }}" alt="Exponential Platform DXP" />
  119. </a>
  120. {% endblock %}
  121. {% block user_mode %}
  122. {{ include('@ibexadesign/ui/user_mode_badge.html.twig') }}
  123. {% endblock %}
  124. </div>
  125. {% block global_search_wrapper %}
  126. <div class="ibexa-main-header__search-column">
  127. {% block global_search %}
  128. {{ ibexa_twig_component_group('admin-ui-global-search') }}
  129. {% endblock %}
  130. </div>
  131. {% endblock %}
  132. {% block user_menu_wrapper %}
  133. <div class="ibexa-main-header__user-menu-column">
  134. {% block user_menu %}
  135. {{ ibexa_twig_component_group('admin-ui-user-menu') }}
  136. {% endblock %}
  137. </div>
  138. {% endblock %}
  139. </header>
  140. {% endblock %}
  141. {% block main_container %}
  142. <main class="ibexa-main-container {% block main_container_class %}{% endblock %}">
  143. {% block side_column %}
  144. <div class="ibexa-main-container__side-column {% block side_column_class %}{% endblock %}">
  145. {% block left_sidebar %}
  146. {% set main_menu_context = {
  147. 'location': location ?? null,
  148. 'content': content ?? null
  149. } %}
  150. {% set main_menu = knp_menu_get('ezplatform_admin_ui.menu.main', [], main_menu_context) %}
  151. <nav class="ibexa-main-menu">
  152. {{ knp_menu_render(main_menu, {
  153. 'depth': 1,
  154. 'template': '@ibexadesign/ui/menu/main.html.twig',
  155. 'currentClass': 'active',
  156. 'ancestorClass': 'active'
  157. }) }}
  158. {{ knp_menu_render(main_menu, {
  159. 'depth': 2,
  160. 'template': '@ibexadesign/ui/menu/main_2nd_level.html.twig',
  161. 'currentClass': 'active',
  162. 'ancestorClass': 'active'
  163. }) }}
  164. {% block content_tree %}{% endblock %}
  165. </nav>
  166. {% endblock %}
  167. </div>
  168. {% endblock %}
  169. {% block content_column %}
  170. <div
  171. class="ibexa-main-container__content-column
  172. {%- if not is_back_to_top_disabled|default(false) %} ibexa-back-to-top-scroll-container{% endif %}"
  173. >
  174. <div class="container ibexa-back-to-top-anchor">
  175. {% block content_header %}
  176. <div class="ibexa-page-header-wrapper">
  177. <div class="ibexa-breadcrums-wrapper">
  178. {% block breadcrumbs %}{% endblock %}
  179. </div>
  180. <div class="ibexa-content-menu-wrapper">
  181. {% block context_menu %}{% endblock %}
  182. </div>
  183. <div class="ibexa-header-wrapper">
  184. {% block header %}{% endblock %}
  185. </div>
  186. </div>
  187. {% endblock %}
  188. {% block content %}{% endblock %}
  189. </div>
  190. </div>
  191. {% endblock %}
  192. </main>
  193. {% endblock %}
  194. <div
  195. class="ibexa-notifications-container"
  196. data-notifications="{{ app.flashes|json_encode() }}"
  197. data-template="{{ include('@ibexadesign/ui/notification.html.twig', {
  198. label: '{{ label }}',
  199. message: '{{ message }}',
  200. })|e('html_attr') }}"></div>
  201. <div class="ibexa-modal-wrapper"></div>
  202. <div class="ibexa-quick-action-menu">
  203. {% if not is_back_to_top_disabled|default(false) %}
  204. {% block back_to_top %}
  205. <div class="ibexa-back-to-top">
  206. <button type="button" class="btn ibexa-btn ibexa-btn--tertiary ibexa-btn--no-text ibexa-back-to-top__btn">
  207. <span class="ibexa-back-to-top__title">
  208. {{ 'back.to.top'|trans|desc('Go to top') }}
  209. </span>
  210. <svg class="ibexa-icon ibexa-icon--medium ibexa-back-to-top__icon">
  211. <use xlink:href="{{ ibexa_icon_path('back') }}"></use>
  212. </svg>
  213. </button>
  214. </div>
  215. {% endblock %}
  216. {% endif %}
  217. {{ ibexa_twig_component_group('admin-ui-quick-action-menu') }}
  218. </div>
  219. {{ ibexa_twig_component_group('admin-ui-layout-content-after') }}
  220. {{ encore_entry_script_tags('ibexa-admin-ui-layout-js', null, 'ibexa') }}
  221. {{ encore_entry_script_tags('ibexa-admin-ui-udw-tabs-js', null, 'ibexa') }}
  222. {{ encore_entry_script_tags('ibexa-admin-ui-udw-extras-js', null, 'ibexa') }}
  223. {{ encore_entry_script_tags('ibexa-admin-ui-udw-js', null, 'ibexa') }}
  224. {% block react_modules %}{% endblock %}
  225. {% block javascripts %}{% endblock %}
  226. {{ ibexa_twig_component_group('admin-ui-stylesheet-body') }}
  227. {{ ibexa_twig_component_group('admin-ui-script-body') }}
  228. </body>
  229. </html>