Skip to content

Commit c120451

Browse files
committed
IBX-10776: Added Languages tab
1 parent 437ec66 commit c120451

6 files changed

Lines changed: 213 additions & 138 deletions

File tree

src/bundle/Resources/config/services/tabs.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ imports:
22
- { resource: tabs/locationview.yaml }
33
- { resource: tabs/content_type.yaml }
44
- { resource: tabs/url_management.yaml }
5+
- { resource: tabs/languages.yaml }
56

67
services:
78
_defaults:
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
services:
2+
ibexa.admin_ui.languages.tab_group:
3+
parent: Ibexa\AdminUi\Component\TabsComponent
4+
arguments:
5+
$template: '@@ibexadesign/ui/tab/languages.html.twig'
6+
$groupIdentifier: 'languages'
7+
tags:
8+
- { name: ibexa.twig.component, group: 'admin-ui-languages-tab-groups' }
9+
10+
Ibexa\AdminUi\Tab\Language\LanguagesTab:
11+
parent: Ibexa\Contracts\AdminUi\Tab\AbstractTab
12+
tags:
13+
- { name: ibexa.admin_ui.tab, group: 'languages' }

src/bundle/Resources/views/themes/admin/language/list.html.twig

Lines changed: 5 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
{% extends "@ibexadesign/ui/layout.html.twig" %}
22

3-
{% from '@ibexadesign/ui/component/macros.html.twig' import results_headline %}
4-
5-
{% form_theme form_languages_delete '@ibexadesign/ui/form_fields.html.twig' %}
6-
73
{% trans_default_domain 'ibexa_language' %}
84

95
{% block body_class %}ibexa-language-list-view{% endblock %}
@@ -45,140 +41,11 @@
4541
{% endblock %}
4642

4743
{% block content %}
48-
<section class="container ibexa-container">
49-
{% set body_rows = [] %}
50-
{% for language in pager.currentPageResults %}
51-
{% set body_row_cols = [] %}
52-
53-
{% set col_raw %}
54-
{% if can_administrate %}
55-
{{ form_widget(form_languages_delete.languages[language.id]) }}
56-
{% else %}
57-
{% do form_languages_delete.languages.setRendered %}
58-
{% endif %}
59-
{% endset %}
60-
{% set body_row_cols = body_row_cols|merge([{
61-
has_checkbox: true,
62-
content: col_raw,
63-
raw: true,
64-
}]) %}
65-
66-
{% set col_raw %}
67-
<a href="{{ path( 'ibexa.language.view', {'languageId': language.id} ) }}">
68-
{{ language.name }}
69-
</a>
70-
{% endset %}
71-
{% set body_row_cols = body_row_cols|merge([{
72-
content: col_raw,
73-
raw: true,
74-
}]) %}
75-
76-
{% set body_row_cols = body_row_cols|merge([
77-
{ content: language.languageCode },
78-
{ content: language.id },
79-
]) %}
80-
81-
{% set col_raw %}
82-
<div class="form-check">
83-
<input
84-
type="checkbox"
85-
title="{{ language.enabled ? 'language.enabled'|trans|desc('Enabled') : 'language.disabled'|trans|desc('Disabled') }}"
86-
class="ibexa-input ibexa-input--checkbox form-check-input"
87-
disabled
88-
{% if language.enabled %}checked{% endif %}
89-
>
90-
</div>
91-
{% endset %}
92-
{% set body_row_cols = body_row_cols|merge([{
93-
content: col_raw,
94-
center_content: true,
95-
raw: true,
96-
}]) %}
97-
98-
{% set col_raw %}
99-
{% if can_administrate %}
100-
<a
101-
title="{{ 'language.edit'|trans|desc('Edit') }}"
102-
href="{{ path('ibexa.language.edit', {'languageId': language.id}) }}"
103-
class="btn ibexa-btn ibexa-btn--ghost ibexa-btn--no-text"
104-
>
105-
<svg class="ibexa-icon ibexa-icon--small-medium">
106-
<use xlink:href="{{ ibexa_icon_path('edit') }}"></use>
107-
</svg>
108-
</a>
109-
{% endif %}
110-
{% endset %}
111-
{% set body_row_cols = body_row_cols|merge([{
112-
has_action_btns: true,
113-
content: col_raw,
114-
raw: true,
115-
}]) %}
116-
117-
{% set body_rows = body_rows|merge([{ cols: body_row_cols }]) %}
118-
{% endfor %}
119-
120-
{% embed '@ibexadesign/ui/component/table/table.html.twig' with {
121-
headline: custom_results_headline ?? results_headline(pager.getNbResults()),
122-
head_cols: [
123-
{ has_checkbox: true },
124-
{ content: 'language.name'|trans|desc('Name') },
125-
{ content: 'language.code'|trans|desc('Code') },
126-
{ content: 'language.id'|trans|desc('ID') },
127-
{
128-
content: 'language.enabled'|trans|desc('Enabled'),
129-
center_content: true,
130-
},
131-
{ },
132-
],
133-
body_rows,
134-
} %}
135-
{% block header %}
136-
{% embed '@ibexadesign/ui/component/table/table_header.html.twig' %}
137-
{% block actions %}
138-
{% if can_administrate %}
139-
{% set modal_data_target = 'delete-languages-modal' %}
140-
<button
141-
id="delete-languages"
142-
type="button"
143-
class="btn ibexa-btn ibexa-btn--ghost ibexa-btn--small"
144-
disabled
145-
data-bs-toggle="modal"
146-
data-bs-target="#{{ modal_data_target }}"
147-
>
148-
<svg class="ibexa-icon ibexa-icon--small-medium ibexa-icon--trash">
149-
<use xlink:href="{{ ibexa_icon_path('trash') }}"></use>
150-
</svg>
151-
<span class="ibexa-btn__small">
152-
{{ 'language.delete'|trans|desc('Delete') }}
153-
</span>
154-
</button>
155-
{% include '@ibexadesign/ui/modal/bulk_delete_confirmation.html.twig' with {
156-
'id': modal_data_target,
157-
'message': 'language.modal.message'|trans|desc(
158-
'Delete the languages?'
159-
),
160-
'data_click': '#languages_delete_delete',
161-
}%}
162-
{% endif %}
163-
{% endblock %}
164-
{% endembed %}
165-
{% endblock %}
166-
167-
{% block between_header_and_table %}
168-
{{ form_start(form_languages_delete, {
169-
'action': path('ibexa.language.bulk_delete'),
170-
'attr': { 'class': 'ibexa-toggle-btn-state', 'data-toggle-button-id': '#delete-languages' }
171-
}) }}
172-
{% endblock %}
173-
{% endembed %}
174-
{{ form_end(form_languages_delete) }}
175-
176-
{% if pager.haveToPaginate %}
177-
{% include '@ibexadesign/ui/pagination.html.twig' with {
178-
'pager': pager
179-
} %}
180-
{% endif %}
181-
</section>
44+
{{ ibexa_twig_component_group('admin-ui-languages-tab-groups', {
45+
pager: pager,
46+
form_languages_delete: form_languages_delete,
47+
can_administrate: can_administrate,
48+
}) }}
18249
{% endblock %}
18350

18451
{% block javascripts %}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
{% trans_default_domain 'ibexa_language' %}
2+
3+
{% from '@ibexadesign/ui/component/macros.html.twig' import results_headline %}
4+
5+
{% form_theme form_languages_delete '@ibexadesign/ui/form_fields.html.twig' %}
6+
7+
<section class="container ibexa-container">
8+
{% set body_rows = [] %}
9+
{% for language in pager.currentPageResults %}
10+
{% set body_row_cols = [] %}
11+
12+
{% set col_raw %}
13+
{% if can_administrate %}
14+
{{ form_widget(form_languages_delete.languages[language.id]) }}
15+
{% else %}
16+
{% do form_languages_delete.languages.setRendered %}
17+
{% endif %}
18+
{% endset %}
19+
{% set body_row_cols = body_row_cols|merge([{
20+
has_checkbox: true,
21+
content: col_raw,
22+
raw: true,
23+
}]) %}
24+
25+
{% set col_raw %}
26+
<a href="{{ path('ibexa.language.view', {'languageId': language.id}) }}">
27+
{{ language.name }}
28+
</a>
29+
{% endset %}
30+
{% set body_row_cols = body_row_cols|merge([{
31+
content: col_raw,
32+
raw: true,
33+
}]) %}
34+
35+
{% set body_row_cols = body_row_cols|merge([
36+
{ content: language.languageCode },
37+
{ content: language.id },
38+
]) %}
39+
40+
{% set col_raw %}
41+
<div class="form-check">
42+
<input
43+
type="checkbox"
44+
title="{{ language.enabled ? 'language.enabled'|trans|desc('Enabled') : 'language.disabled'|trans|desc('Disabled') }}"
45+
class="ibexa-input ibexa-input--checkbox form-check-input"
46+
disabled
47+
{% if language.enabled %}checked{% endif %}
48+
>
49+
</div>
50+
{% endset %}
51+
{% set body_row_cols = body_row_cols|merge([{
52+
content: col_raw,
53+
center_content: true,
54+
raw: true,
55+
}]) %}
56+
57+
{% set col_raw %}
58+
{% if can_administrate %}
59+
<a
60+
title="{{ 'language.edit'|trans|desc('Edit') }}"
61+
href="{{ path('ibexa.language.edit', {'languageId': language.id}) }}"
62+
class="btn ibexa-btn ibexa-btn--ghost ibexa-btn--no-text"
63+
>
64+
<svg class="ibexa-icon ibexa-icon--small-medium">
65+
<use xlink:href="{{ ibexa_icon_path('edit') }}"></use>
66+
</svg>
67+
</a>
68+
{% endif %}
69+
{% endset %}
70+
{% set body_row_cols = body_row_cols|merge([{
71+
has_action_btns: true,
72+
content: col_raw,
73+
raw: true,
74+
}]) %}
75+
76+
{% set body_rows = body_rows|merge([{ cols: body_row_cols }]) %}
77+
{% endfor %}
78+
79+
{% embed '@ibexadesign/ui/component/table/table.html.twig' with {
80+
headline: custom_results_headline ?? results_headline(pager.getNbResults()),
81+
head_cols: [
82+
{ has_checkbox: true },
83+
{ content: 'language.name'|trans|desc('Name') },
84+
{ content: 'language.code'|trans|desc('Code') },
85+
{ content: 'language.id'|trans|desc('ID') },
86+
{
87+
content: 'language.enabled'|trans|desc('Enabled'),
88+
center_content: true,
89+
},
90+
{},
91+
],
92+
body_rows,
93+
} %}
94+
{% block header %}
95+
{% embed '@ibexadesign/ui/component/table/table_header.html.twig' %}
96+
{% block actions %}
97+
{% if can_administrate %}
98+
{% set modal_data_target = 'delete-languages-modal' %}
99+
<button
100+
id="delete-languages"
101+
type="button"
102+
class="btn ibexa-btn ibexa-btn--ghost ibexa-btn--small"
103+
disabled
104+
data-bs-toggle="modal"
105+
data-bs-target="#{{ modal_data_target }}"
106+
>
107+
<svg class="ibexa-icon ibexa-icon--small-medium ibexa-icon--trash">
108+
<use xlink:href="{{ ibexa_icon_path('trash') }}"></use>
109+
</svg>
110+
<span class="ibexa-btn__small">
111+
{{ 'language.delete'|trans({}, 'ibexa_language')|desc('Delete') }}
112+
</span>
113+
</button>
114+
{% include '@ibexadesign/ui/modal/bulk_delete_confirmation.html.twig' with {
115+
id: modal_data_target,
116+
message: 'language.modal.message'|trans({}, 'ibexa_language')|desc('Delete the languages?'),
117+
data_click: '#languages_delete_delete',
118+
} %}
119+
{% endif %}
120+
{% endblock %}
121+
{% endembed %}
122+
{% endblock %}
123+
124+
{% block between_header_and_table %}
125+
{{ form_start(form_languages_delete, {
126+
action: path('ibexa.language.bulk_delete'),
127+
attr: {'class': 'ibexa-toggle-btn-state', 'data-toggle-button-id': '#delete-languages'}
128+
}) }}
129+
{% endblock %}
130+
{% endembed %}
131+
{{ form_end(form_languages_delete) }}
132+
133+
{% if pager.haveToPaginate %}
134+
{% include '@ibexadesign/ui/pagination.html.twig' with {
135+
pager: pager,
136+
} %}
137+
{% endif %}
138+
</section>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{% set tabs_to_show = tabs|map((tab, index) => {
2+
id: group ~ '-' ~ tab.identifier,
3+
label: tab.name,
4+
content: tab.view,
5+
active: index == 0,
6+
}) %}
7+
{% include '@ibexadesign/ui/component/tab/tabs.html.twig' with {
8+
tabs: tabs_to_show,
9+
} %}
10+
11+
{% block javascripts %}
12+
{{ encore_entry_script_tags('ibexa-admin-ui-tabs-js', null, 'ibexa') }}
13+
{% endblock %}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\AdminUi\Tab\Language;
10+
11+
use Ibexa\Contracts\AdminUi\Tab\AbstractTab;
12+
use Ibexa\Contracts\AdminUi\Tab\OrderedTabInterface;
13+
use JMS\TranslationBundle\Annotation\Desc;
14+
15+
class LanguagesTab extends AbstractTab implements OrderedTabInterface
16+
{
17+
public function getIdentifier(): string
18+
{
19+
return 'languages';
20+
}
21+
22+
public function getName(): string
23+
{
24+
return /** @Desc("Languages") */
25+
$this->translator->trans('language.list', [], 'ibexa_language');
26+
}
27+
28+
public function getOrder(): int
29+
{
30+
return 10;
31+
}
32+
33+
/**
34+
* @param array<string, mixed> $parameters
35+
*/
36+
public function renderView(array $parameters): string
37+
{
38+
return $this->twig->render(
39+
'@ibexadesign/language/tab/languages.html.twig',
40+
$parameters
41+
);
42+
}
43+
}

0 commit comments

Comments
 (0)