diff --git a/Controller/SettingsController.php b/Controller/SettingsController.php index 417e041..ae5bee3 100644 --- a/Controller/SettingsController.php +++ b/Controller/SettingsController.php @@ -21,6 +21,30 @@ */ class SettingsController extends Controller { + + public function enableProfileAction($key) + { + $profileName = $key; + + $cookie = $this->get('ongr_settings.cookie.active_profiles'); + $currentActiveProfiles = $cookie->getValue(); + + if (is_array($currentActiveProfiles) && !array_intersect($currentActiveProfiles, [$profileName])) { + $currentActiveProfiles[] = $profileName; + $cookie->setValue($currentActiveProfiles); + } else { + $cookie->setValue([$profileName]); + } + + $settingsManager = $this->get('ongr_settings.settings_manager'); + $settings = $settingsManager->getProfileSettings($profileName); + + return $this->render('ONGRSettingsBundle:Settings:enableProfile.html.twig', [ + 'profile' => $profileName, + 'profiles' => $settings, + ]); + } + /** * Renders settings list page. * diff --git a/EventListener/RequestListener.php b/EventListener/RequestListener.php index 25b1b0c..fc06d3c 100644 --- a/EventListener/RequestListener.php +++ b/EventListener/RequestListener.php @@ -11,15 +11,26 @@ namespace ONGR\SettingsBundle\EventListener; +use ONGR\CookiesBundle\Cookie\Model\GenericCookie; +use ONGR\SettingsBundle\Service\SettingsManager; use Symfony\Component\HttpKernel\Event\GetResponseEvent; class RequestListener { - private $cache; + /** + * @var GenericCookie + */ + private $cookie; - public function __construct($cache) + /** + * @var SettingsManager + */ + private $settingsManager; + + public function __construct($cookie, $settingsManager) { - $this->cache = $cache; + $this->cookie = $cookie; + $this->settingsManager = $settingsManager; } public function onKernelRequest(GetResponseEvent $event) @@ -28,6 +39,10 @@ public function onKernelRequest(GetResponseEvent $event) return; } - // ... + $profiles = $this->cookie->getValue(); + + if (is_array($profiles)) { + $this->settingsManager->appendActiveProfilesList($profiles); + } } } diff --git a/Resources/config/routing.yml b/Resources/config/routing.yml index 08108b3..a39ab30 100644 --- a/Resources/config/routing.yml +++ b/Resources/config/routing.yml @@ -5,6 +5,12 @@ ongr_settings_home: route: ongr_settings_settings permanent: true +ongr_settings_enable_profile: + path: /enable/{key} + defaults: { _controller: ONGRSettingsBundle:Settings:enableProfile } + options: + expose: true + ongr_settings_search_page: path: /settings/search methods: [GET] diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 6debc98..ad5c21d 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -35,6 +35,6 @@ services: ongr_settings.request_listener: class: ONGR\SettingsBundle\EventListener\RequestListener - arguments: ["@ong_settings.cache_provider"] + arguments: ["@ongr_settings.cookie.active_profiles", "@ongr_settings.settings_manager"] tags: - { name: kernel.event_listener, event: kernel.request } \ No newline at end of file diff --git a/Resources/js/script.js b/Resources/js/script.js index 80f6cd6..a195af9 100644 --- a/Resources/js/script.js +++ b/Resources/js/script.js @@ -206,8 +206,6 @@ $(document).ready(function () { }); }); - - //Profile section var profileTable = $('#profiles').DataTable( { ajax: { @@ -252,8 +250,11 @@ $(document).ready(function () { "targets": 3, "data": null, "orderable": false, - "defaultContent": 'Copy link ' + - '' + // "render": function(data, type, row) { + // return 'Copy link '; + // }, + "defaultContent": + 'Copy link ' } ] } ); @@ -266,8 +267,48 @@ $(document).ready(function () { $('#profiles tbody').on( 'click', 'a.copy-link', function (e) { e.preventDefault(); - $('#profile-list-error-message').html('Enabling profiles by link is not yet implemented.'); - $('#profile-list-error').show(); + var data = profileTable.row( $(this).parents('tr') ).data(); + var link = Routing.generate('ongr_settings_enable_profile', {key:data.name},true); + $('#copy-placeholder').text(link); + var range = document.createRange(); + var field = document.querySelector('#copy-placeholder'); + range.selectNode(field); + window.getSelection().addRange(range); + try { + var success = document.execCommand('copy'); + if (success) { + noty({ + text: 'Link successfully copied to the clipboard.', + type: 'success', + layout : 'topRight', + theme: 'bootstrapTheme', + timeout: 10, + animation: { + open: 'animated fadeIn', + close: 'animated fadeOut', + } + }); + } else { + throw new Error("Cannot copy"); + } + } catch(err) { + noty({ + text: 'Something went wrong..', + type: 'error', + layout : 'topRight', + theme: 'bootstrapTheme', + timeout: 10, + animation: { + open: 'animated fadeIn', + close: 'animated fadeOut', + } + }); + $.alert({ + title: 'Here\'s the link:', + content: ''+link+'', + confirmButton: 'Close', + }); + } } ); }); \ No newline at end of file diff --git a/Resources/public/script.js b/Resources/public/script.js index ae69d45..b8f9a16 100644 --- a/Resources/public/script.js +++ b/Resources/public/script.js @@ -1 +1 @@ -$(document).ready(function(){function t(t,e){var a="";e&&(a='checked="checked"');var n='";$("#profiles-container .checkbox").append(n)}function e(e){$("#profiles-loader").show(),$("#profiles-container .checkbox").html(""),$.post(Routing.generate("ongr_settings_profiles_get_all"),function(a){$("#profiles-loader").hide(),a.forEach(function(a){$.inArray(a,e)>-1?t(a,!0):t(a,!1)})})}var a=$("#settings").DataTable({ajax:{url:Routing.generate("ongr_settings_search_page"),dataSrc:"documents"},stateSave:!0,columns:[{data:"name"},{data:"value"},{data:"description"},{data:"profile"},{}],columnDefs:[{targets:1,render:function(t,e,a){if("bool"==a.type){var n=$("").addClass("boolean-property btn btn-default").addClass("boolean-property-"+a.id).attr("data-name",a.name),o=n.clone().html("ON").attr("data-element","boolean-property-"+a.id).attr("data-value",1),l=n.clone().html("OFF").attr("data-element","boolean-property-"+a.id).attr("data-value",0);1==a.value?o.addClass("btn-primary"):l.addClass("btn-primary");var i=$("
").addClass("btn-group btn-group-sm").append(o,l);return i.prop("outerHTML")}return t}},{targets:3,orderable:!1},{targets:4,data:null,orderable:!1,render:function(t,e,a){return'Edit Delete'}}]}),n=$("").html("Add new setting").addClass("btn btn-success btn-sm").attr({id:"new-setting-button"});$("#settings_filter").append(n.prop("outerHTML")),$("#new-setting-button").on("click",function(){$("#profiles-loader").show(),$(".profile-choice").remove(),$("#setting-action-title").text("New setting"),$("#setting-form-modal").modal(),e()}),$("#select-all-profiles").on("click",function(){$('#profiles-container .checkbox input[type="checkbox"]').prop("checked",!0)}),$("#add-new-profile").on("click",function(){t($("#add-new-profile-input").val()),$("#add-new-profile-input").val("")}),$("#add-new-profile-show-form").on("click",function(){$(this).hide(),$("#add-new-profile-container").show(),$("#add-new-profile-input").focus()}),$(".bool-value-input").on("click",function(){$(".bool-value-input").removeClass("btn-primary"),$(this).addClass("btn-primary"),$("#bool-value-input").val($(this).data("value"))}),$("#setting-value-tabs").on("shown.bs.tab",function(t){var e=$(t.target).data("value");$("#setting-type-input").val(e)}),$("#setting-form-modal").on("hide.bs.modal",function(){$("#setting-form-error").hide(),$("#setting-name-input").val(""),$("#setting-description-input").val(""),$("#setting-value-input").val(""),$("#force-update").val("0"),$(".bool-value-input").removeClass("btn-primary"),$(".bool-value-input-0").addClass("btn-primary"),$("#bool-value-input").val("0"),$("#string-value-input").val(""),$("#yaml-value-input").val(""),$("#setting-name-input").removeAttr("disable"),$("input:checkbox").removeAttr("checked")}),$("#setting-form-submit").on("click",function(t){t.preventDefault(),$("#setting-value-input").val($("#"+$("#setting-type-input").val()+"-value-input").val());var e=$("#setting-form").serializeArray();$.ajax({url:Routing.generate("ongr_settings_setting_submit"),data:e,success:function(t){0==t.error?(a.ajax.reload(),$("#setting-form-modal").modal("hide")):($("#setting-form-error-message").html(t.message),$("#setting-form-error").show())}})}),$("#settings tbody").on("click","a.edit",function(){var t=a.row($(this).parents("tr")).data();switch(e(t.profile),$("#setting-action-title").text("Setting edit"),$("#force-update").val("1"),$("#setting-name-input").val(t.name),$("#setting-name-input").attr("disable","disable"),$("#setting-name").val(t.name),$("#setting-description-input").val(t.description),$("#setting-value-input").val(t.value),$("#setting-type-input").val(t.type),$('#setting-value-tabs a[href="#'+t.type+'-value"]').tab("show"),$("#"+t.type+"-value-input").val(t.value),t.type){case"yaml":case"string":break;case"bool":$(".bool-value-input").removeClass("btn-primary"),$(".bool-value-input-"+t.value).addClass("btn-primary")}$("#setting-form-modal").modal()}),$("#settings tbody").on("click","label.boolean-property",function(){var t=$(this);$.post(Routing.generate("ongr_settings_settings_update_value"),{name:t.data("name"),value:t.data("value")},function(){var e=t.data("element");$("."+e).toggleClass("btn-primary")})}),$("#settings tbody").on("click","a.delete-setting",function(t){t.preventDefault();var e=$(this).data("name");$.confirm({text:"Are you sure you want to delete setting?",title:"Confirmation required",confirm:function(t){$.post(Routing.generate("ongr_settings_settings_delete"),{name:e},function(t){0==t.error&&a.ajax.reload()})},confirmButton:"Yes, delete it",cancelButton:"No",confirmButtonClass:"btn-danger",dialogClass:"modal-dialog modal-lg"})});$("#profiles").DataTable({ajax:{url:Routing.generate("ongr_settings_profiles_get_all_detailed"),dataSrc:"documents"},stateSave:!0,order:[[1,"asc"]],columns:[{data:"name"},{data:"name"},{data:"settings"},{}],columnDefs:[{targets:0,orderable:!1,render:function(t,e,a){var n="toggle-profile",o=$("").addClass("btn btn-default").addClass(n).addClass(n+"-"+a.name).attr("data-name",a.name),l=o.clone().html("ON").attr("data-element",n+"-"+a.name),i=o.clone().html("OFF").attr("data-element",n+"-"+a.name);1==a.active?l.addClass("btn-primary"):i.addClass("btn-primary");var r=$("").addClass("btn-group btn-group-sm").append(l,i);return r.prop("outerHTML")}},{targets:2,orderable:!1},{targets:3,data:null,orderable:!1,defaultContent:'Copy link '}]});$("#profiles tbody").on("click","label.toggle-profile",function(){var t=$(this);$.post(Routing.generate("ongr_settings_profiles_toggle"),{name:t.data("name")},function(){$(".toggle-profile-"+t.data("name")).toggleClass("btn-primary")})}),$("#profiles tbody").on("click","a.copy-link",function(t){t.preventDefault(),$("#profile-list-error-message").html("Enabling profiles by link is not yet implemented."),$("#profile-list-error").show()})}); \ No newline at end of file +$(document).ready(function(){function t(t,e){var a="";e&&(a='checked="checked"');var n='";$("#profiles-container .checkbox").append(n)}function e(e){$("#profiles-loader").show(),$("#profiles-container .checkbox").html(""),$.post(Routing.generate("ongr_settings_profiles_get_all"),function(a){$("#profiles-loader").hide(),a.forEach(function(a){$.inArray(a,e)>-1?t(a,!0):t(a,!1)})})}var a=$("#settings").DataTable({ajax:{url:Routing.generate("ongr_settings_search_page"),dataSrc:"documents"},stateSave:!0,columns:[{data:"name"},{data:"value"},{data:"description"},{data:"profile"},{}],columnDefs:[{targets:1,render:function(t,e,a){if("bool"==a.type){var n=$("").addClass("boolean-property btn btn-default").addClass("boolean-property-"+a.id).attr("data-name",a.name),o=n.clone().html("ON").attr("data-element","boolean-property-"+a.id).attr("data-value",1),i=n.clone().html("OFF").attr("data-element","boolean-property-"+a.id).attr("data-value",0);1==a.value?o.addClass("btn-primary"):i.addClass("btn-primary");var r=$("").addClass("btn-group btn-group-sm").append(o,i);return r.prop("outerHTML")}return t}},{targets:3,orderable:!1},{targets:4,data:null,orderable:!1,render:function(t,e,a){return'Edit Delete'}}]}),n=$("").html("Add new setting").addClass("btn btn-success btn-sm").attr({id:"new-setting-button"});$("#settings_filter").append(n.prop("outerHTML")),$("#new-setting-button").on("click",function(){$("#profiles-loader").show(),$(".profile-choice").remove(),$("#setting-action-title").text("New setting"),$("#setting-form-modal").modal(),e()}),$("#select-all-profiles").on("click",function(){$('#profiles-container .checkbox input[type="checkbox"]').prop("checked",!0)}),$("#add-new-profile").on("click",function(){t($("#add-new-profile-input").val()),$("#add-new-profile-input").val("")}),$("#add-new-profile-show-form").on("click",function(){$(this).hide(),$("#add-new-profile-container").show(),$("#add-new-profile-input").focus()}),$(".bool-value-input").on("click",function(){$(".bool-value-input").removeClass("btn-primary"),$(this).addClass("btn-primary"),$("#bool-value-input").val($(this).data("value"))}),$("#setting-value-tabs").on("shown.bs.tab",function(t){var e=$(t.target).data("value");$("#setting-type-input").val(e)}),$("#setting-form-modal").on("hide.bs.modal",function(){$("#setting-form-error").hide(),$("#setting-name-input").val(""),$("#setting-description-input").val(""),$("#setting-value-input").val(""),$("#force-update").val("0"),$(".bool-value-input").removeClass("btn-primary"),$(".bool-value-input-0").addClass("btn-primary"),$("#bool-value-input").val("0"),$("#string-value-input").val(""),$("#yaml-value-input").val(""),$("#setting-name-input").removeAttr("disable"),$("input:checkbox").removeAttr("checked")}),$("#setting-form-submit").on("click",function(t){t.preventDefault(),$("#setting-value-input").val($("#"+$("#setting-type-input").val()+"-value-input").val());var e=$("#setting-form").serializeArray();$.ajax({url:Routing.generate("ongr_settings_setting_submit"),data:e,success:function(t){0==t.error?(a.ajax.reload(),$("#setting-form-modal").modal("hide")):($("#setting-form-error-message").html(t.message),$("#setting-form-error").show())}})}),$("#settings tbody").on("click","a.edit",function(){var t=a.row($(this).parents("tr")).data();switch(e(t.profile),$("#setting-action-title").text("Setting edit"),$("#force-update").val("1"),$("#setting-name-input").val(t.name),$("#setting-name-input").attr("disable","disable"),$("#setting-name").val(t.name),$("#setting-description-input").val(t.description),$("#setting-value-input").val(t.value),$("#setting-type-input").val(t.type),$('#setting-value-tabs a[href="#'+t.type+'-value"]').tab("show"),$("#"+t.type+"-value-input").val(t.value),t.type){case"yaml":case"string":break;case"bool":$(".bool-value-input").removeClass("btn-primary"),$(".bool-value-input-"+t.value).addClass("btn-primary")}$("#setting-form-modal").modal()}),$("#settings tbody").on("click","label.boolean-property",function(){var t=$(this);$.post(Routing.generate("ongr_settings_settings_update_value"),{name:t.data("name"),value:t.data("value")},function(){var e=t.data("element");$("."+e).toggleClass("btn-primary")})}),$("#settings tbody").on("click","a.delete-setting",function(t){t.preventDefault();var e=$(this).data("name");$.confirm({text:"Are you sure you want to delete setting?",title:"Confirmation required",confirm:function(t){$.post(Routing.generate("ongr_settings_settings_delete"),{name:e},function(t){0==t.error&&a.ajax.reload()})},confirmButton:"Yes, delete it",cancelButton:"No",confirmButtonClass:"btn-danger",dialogClass:"modal-dialog modal-lg"})});var o=$("#profiles").DataTable({ajax:{url:Routing.generate("ongr_settings_profiles_get_all_detailed"),dataSrc:"documents"},stateSave:!0,order:[[1,"asc"]],columns:[{data:"name"},{data:"name"},{data:"settings"},{}],columnDefs:[{targets:0,orderable:!1,render:function(t,e,a){var n="toggle-profile",o=$("").addClass("btn btn-default").addClass(n).addClass(n+"-"+a.name).attr("data-name",a.name),i=o.clone().html("ON").attr("data-element",n+"-"+a.name),r=o.clone().html("OFF").attr("data-element",n+"-"+a.name);1==a.active?i.addClass("btn-primary"):r.addClass("btn-primary");var l=$("").addClass("btn-group btn-group-sm").append(i,r);return l.prop("outerHTML")}},{targets:2,orderable:!1},{targets:3,data:null,orderable:!1,defaultContent:'Copy link '}]});$("#profiles tbody").on("click","label.toggle-profile",function(){var t=$(this);$.post(Routing.generate("ongr_settings_profiles_toggle"),{name:t.data("name")},function(){$(".toggle-profile-"+t.data("name")).toggleClass("btn-primary")})}),$("#profiles tbody").on("click","a.copy-link",function(t){t.preventDefault();var e=o.row($(this).parents("tr")).data(),a=Routing.generate("ongr_settings_enable_profile",{key:e.name},!0);$("#copy-placeholder").text(a);var n=document.createRange(),i=document.querySelector("#copy-placeholder");n.selectNode(i),window.getSelection().addRange(n);try{var r=document.execCommand("copy");if(!r)throw new Error("Cannot copy");noty({text:"Link successfully copied to the clipboard.",type:"success",layout:"topRight",theme:"bootstrapTheme",timeout:10,animation:{open:"animated fadeIn",close:"animated fadeOut"}})}catch(t){noty({text:"Something went wrong..",type:"error",layout:"topRight",theme:"bootstrapTheme",timeout:10,animation:{open:"animated fadeIn",close:"animated fadeOut"}}),$.alert({title:"Here's the link:",content:""+a+"",confirmButton:"Close"})}})}); \ No newline at end of file diff --git a/Resources/public/style.css b/Resources/public/style.css index 585f25c..ce3de0e 100644 --- a/Resources/public/style.css +++ b/Resources/public/style.css @@ -1,3 +1,3 @@ -#new-setting-button{margin-left:10px}.header{border-bottom:1px solid #dee0df;margin-bottom:10px}body{padding-top:20px;padding-bottom:20px}.profile-select-pointer{cursor:pointer}.pb-5{padding-bottom:5px}.pb-10{padding-bottom:10px}.form-group .btn.active{background-color:#265a88;color:#fff}.profile-choice{margin-right:20px}.form-group .tab-content{padding:10px} +#new-setting-button{margin-left:10px}.header{border-bottom:1px solid #dee0df;margin-bottom:10px}body{padding-top:20px;padding-bottom:20px}.profile-select-pointer{cursor:pointer}.pb-5{padding-bottom:5px}.pb-10{padding-bottom:10px}.form-group .btn.active{background-color:#265a88;color:#fff}.profile-choice{margin-right:20px}.form-group .tab-content{padding:10px}#copy-placeholder{position:absolute;top:-10000px;left:-10000px} /*# sourceMappingURL=style.css.map */ diff --git a/Resources/public/style.css.map b/Resources/public/style.css.map index a44416c..11cf458 100644 --- a/Resources/public/style.css.map +++ b/Resources/public/style.css.map @@ -1 +1 @@ -{"version":3,"sources":["style.scss"],"names":[],"mappings":"AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,IAAK,CACnB,AAED,OAAO,AAAC,CACN,aAAa,CAAE,iBAAkB,CACjC,aAAa,CAAE,IAAK,CACrB,AAED,IAAI,AAAC,CACH,WAAW,CAAE,IAAK,CAClB,cAAc,CAAE,IAAK,CACtB,AAED,uBAAuB,AAAC,CACtB,MAAM,CAAE,OAAQ,CACjB,AAED,KAAK,AAAC,CACJ,cAAc,CAAE,GAAI,CACrB,AAED,MAAM,AAAC,CACL,cAAc,CAAE,IAAK,CACtB,AAED,AACM,WADK,CACT,IAAI,OAAO,AAAC,CACV,gBAAgB,CAAE,OAAQ,CAC1B,KAAK,CAAE,IAAK,CACb,AAGH,eAAe,AAAC,CACd,YAAY,CAAE,IAAK,CACpB,AAED,AACE,WADS,CACT,YAAY,AAAC,CACX,OAAO,CAAE,IAAK,CACf","file":"style.css","sourcesContent":["#new-setting-button {\n margin-left: 10px;\n}\n\n.header {\n border-bottom: 1px solid #dee0df;\n margin-bottom: 10px;\n}\n\nbody {\n padding-top: 20px;\n padding-bottom: 20px;\n}\n\n.profile-select-pointer {\n cursor: pointer;\n}\n\n.pb-5 {\n padding-bottom: 5px;\n}\n\n.pb-10 {\n padding-bottom: 10px;\n}\n\n.form-group {\n .btn.active {\n background-color: #265a88;\n color: #fff;\n }\n}\n\n.profile-choice {\n margin-right: 20px;\n}\n\n.form-group {\n .tab-content {\n padding: 10px;\n }\n}"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["style.scss"],"names":[],"mappings":"AAAA,mBAAmB,AAAC,CAClB,WAAW,CAAE,IAAK,CACnB,AAED,OAAO,AAAC,CACN,aAAa,CAAE,iBAAkB,CACjC,aAAa,CAAE,IAAK,CACrB,AAED,IAAI,AAAC,CACH,WAAW,CAAE,IAAK,CAClB,cAAc,CAAE,IAAK,CACtB,AAED,uBAAuB,AAAC,CACtB,MAAM,CAAE,OAAQ,CACjB,AAED,KAAK,AAAC,CACJ,cAAc,CAAE,GAAI,CACrB,AAED,MAAM,AAAC,CACL,cAAc,CAAE,IAAK,CACtB,AAED,AACM,WADK,CACT,IAAI,OAAO,AAAC,CACV,gBAAgB,CAAE,OAAQ,CAC1B,KAAK,CAAE,IAAK,CACb,AAGH,eAAe,AAAC,CACd,YAAY,CAAE,IAAK,CACpB,AAED,AACE,WADS,CACT,YAAY,AAAC,CACX,OAAO,CAAE,IAAK,CACf,AAGH,iBAAiB,AAAC,CAChB,QAAQ,CAAE,QAAS,CACnB,GAAG,CAAE,QAAS,CACd,IAAI,CAAE,QAAS,CAChB","file":"style.css","sourcesContent":["#new-setting-button {\n margin-left: 10px;\n}\n\n.header {\n border-bottom: 1px solid #dee0df;\n margin-bottom: 10px;\n}\n\nbody {\n padding-top: 20px;\n padding-bottom: 20px;\n}\n\n.profile-select-pointer {\n cursor: pointer;\n}\n\n.pb-5 {\n padding-bottom: 5px;\n}\n\n.pb-10 {\n padding-bottom: 10px;\n}\n\n.form-group {\n .btn.active {\n background-color: #265a88;\n color: #fff;\n }\n}\n\n.profile-choice {\n margin-right: 20px;\n}\n\n.form-group {\n .tab-content {\n padding: 10px;\n }\n}\n\n#copy-placeholder {\n position: absolute;\n top: -10000px;\n left: -10000px;\n}"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/Resources/sass/style.scss b/Resources/sass/style.scss index 9dc2461..31133cf 100644 --- a/Resources/sass/style.scss +++ b/Resources/sass/style.scss @@ -39,4 +39,10 @@ body { .tab-content { padding: 10px; } +} + +#copy-placeholder { + position: absolute; + top: -10000px; + left: -10000px; } \ No newline at end of file diff --git a/Resources/views/Profiles/list.html.twig b/Resources/views/Profiles/list.html.twig index a70a157..c22ad91 100644 --- a/Resources/views/Profiles/list.html.twig +++ b/Resources/views/Profiles/list.html.twig @@ -1,7 +1,6 @@ {% extends 'ONGRSettingsBundle::base.html.twig' %} - - {% block body %} +