Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
51399fd
IBX-11507-use-ds-radio-button: include DS base styles in admin UI
tischsoic Mar 28, 2026
7892aa3
IBX-11413: add DS dropdown compatibility wrapper
tischsoic May 5, 2026
721f6f8
fix: support DS dropdowns in admin UI dynamic flows
tischsoic May 5, 2026
51c949e
fix: pass hidden state to DS dropdown wrapper
tischsoic May 6, 2026
2644efb
fix: keep DS dropdown placeholder behavior consistent
tischsoic May 6, 2026
9da020a
fix: render multi dropdown selections as chips
tischsoic May 7, 2026
6be9109
refactor: reuse shared overflow list markup
tischsoic May 7, 2026
7e98f29
refactor: render flat dropdowns with DS inputs directly
tischsoic May 7, 2026
f4b66e6
fix: wire DS dropdown context in UDW
tischsoic May 8, 2026
51febe6
fix: preserve source select attributes in DS dropdowns
tischsoic May 10, 2026
4295911
IBX-11506: Initialize DS components in admin UI
tischsoic Mar 27, 2026
0e03da2
Revert "IBX-11506: Initialize DS components in admin UI"
tischsoic May 10, 2026
ea20748
fix: support small DS dropdown wrappers
tischsoic May 10, 2026
07dc1ca
fix: keep small dropdowns on legacy renderer
tischsoic May 10, 2026
aad8208
refactor
tischsoic May 11, 2026
56774cb
fix: toggle matching dropdown disabled class
tischsoic May 11, 2026
4977b3c
refactor: simplify dropdown compatibility helpers
tischsoic May 11, 2026
bfcb1b4
refactor: drop unused source attr exclusions
tischsoic May 11, 2026
fafeefa
refactor: tighten DS dropdown bridge setup
tischsoic May 11, 2026
f071848
refactor: simplify dropdown bridge context maps
tischsoic May 11, 2026
e49c4fa
fix: address design system provider lint issues
tischsoic May 11, 2026
35c11fe
DST in composer.json
tischsoic Mar 12, 2026
da1844b
fix: support DS translation modal dropdowns
tischsoic Jun 9, 2026
7d5ff4f
Fix discount behat test selectors aftrer DS update
KamilSznajdrowicz Jun 10, 2026
482f1c7
Make dropdown selectors compatible with legacy and DS
KamilSznajdrowicz Jun 10, 2026
f7dd27b
Fix-cs and others selectors
KamilSznajdrowicz Jun 10, 2026
6aa6998
Make dropdown selectors compatible with DS
KamilSznajdrowicz Jun 11, 2026
1fe890c
Fix
KamilSznajdrowicz Jun 11, 2026
f283496
Fix expandLastFieldDefinition() method after DS changes
KamilSznajdrowicz Jun 14, 2026
e23e6d8
refactor: simplify dropdown DS twig conditional merges
tischsoic Jun 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"ibexa/content-forms": "~6.0.x-dev",
"ibexa/core": "~6.0.x-dev",
"ibexa/design-engine": "~6.0.x-dev",
"ibexa/design-system-twig": "~6.0.x-dev",
"ibexa/rest": "~6.0.x-dev",
"ibexa/search": "~6.0.x-dev",
"ibexa/twig-components": "~6.0.x-dev",
Expand Down Expand Up @@ -97,5 +98,11 @@
"branch-alias": {
"dev-main": "6.0.x-dev"
}
}
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/ibexa/design-system-twig"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is probably not needed.

}
]
}
3 changes: 2 additions & 1 deletion features/standard/ContentType.feature
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ Feature: Content types management

@javascript
Scenario: New content type can be added to content type group
Given I am logged as admin
Given I open Login page in admin SiteAccess
And I log in as "admin" with password "publish"
And I'm on content type Page for "Content" group
When I create a new content type
And I set fields
Expand Down
9 changes: 5 additions & 4 deletions features/standard/fields/other.feature
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ Feature: Content fields setting and editing
| Field | <value1> | <fieldTypeIdentifier> |

Examples:
| fieldInternalName | fieldName | fieldSettings | label1 | value1 | contentItemName | fieldTypeIdentifier |
| ibexa_selection | Selection | is_multiple:false,options:A first-Bielefeld-TestValue-Turtles-Zombies | value | TestValue | TestValue | ibexa_selection |
| fieldInternalName | fieldName | fieldSettings | label1 | value1 | contentItemName | fieldTypeIdentifier |
| ibexa_selection | Selection | is_multiple:false,options:A first-Bielefeld-TestValue-Turtles-Zombies | value | TestValue | TestValue | ibexa_selection |
| ibexa_boolean | Checkbox | | value | true | 1 | |
| ibexa_email | Email address | | value | email@example.com | email@example.com | |
| ibexa_float | Float | | value | 11.11 | 11.11 | |
Expand All @@ -40,7 +40,8 @@ Feature: Content fields setting and editing

@javascript @APIUser:admin
Scenario Outline: Edit content item with given field
Given I am logged as admin
Given I open Login page in admin SiteAccess
And I log in as "admin" with password "publish"
And I'm on Content view Page for "OtherFieldsContainer/<oldContentItemName>"
When I perform the "Edit" action
And I set content fields
Expand All @@ -55,7 +56,7 @@ Feature: Content fields setting and editing

Examples:
| label1 | value1 | oldContentItemName | newContentItemName | fieldTypeIdentifier |
| value | Bielefeld | TestValue | Bielefeld | ibexa_selection |
| value | Bielefeld | TestValue | Bielefeld | ibexa_selection |
| value | false | 1 | 0 | |
| value | edited.email@example.com | email@example.com | edited.email@example.com | |
| value | 12.34 | 11.11 | 12.34 | |
Expand Down
1 change: 1 addition & 0 deletions src/bundle/Resources/encore/ibexa.css.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ module.exports = (Encore) => {
path.resolve(__dirname, '../public/scss/ibexa-bootstrap.scss'),
path.resolve(__dirname, '../public/scss/ibexa.scss'),
path.resolve(__dirname, '../public/scss/ui/ibexa-modules.scss'),
path.resolve('./vendor/ibexa/admin-ui-assets/src/bundle/Resources/public/vendors/ids-assets/dist/css/styles.css'),
path.resolve('./vendor/ibexa/admin-ui-assets/src/bundle/Resources/public/vendors/flatpickr/dist/flatpickr.min.css'),
path.resolve(
'./vendor/ibexa/admin-ui-assets/src/bundle/Resources/public/vendors/flatpickr/dist/plugins/confirmDate/confirmDate.css',
Expand Down
4 changes: 4 additions & 0 deletions src/bundle/Resources/encore/ibexa.js.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ const layout = [
path.resolve(__dirname, '../public/js/scripts/admin.format.date.js'),
path.resolve(__dirname, '../public/js/scripts/core/draggable.js'),
path.resolve(__dirname, '../public/js/scripts/core/dropdown.js'),
path.resolve(
__dirname,
'../../../../../design-system-twig/src/bundle/Resources/public/ts/init_components.ts',
),
path.resolve(__dirname, '../public/js/scripts/core/backdrop.js'),
path.resolve(__dirname, '../public/js/scripts/core/custom.tooltip.js'),
path.resolve(__dirname, '../public/js/scripts/core/base.chart.js'),
Expand Down
45 changes: 33 additions & 12 deletions src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { DropdownMultiInput, DropdownSingleInput } from '../../../../../../../design-system-twig/src/bundle/Resources/public/ts/components/dropdown';

(function (global, doc, ibexa, Routing, Translator, bootstrap) {
const SELECTOR_INPUTS_TO_VALIDATE = '.ibexa-input[required]:not([disabled]):not([hidden])';
const SELETOR_FIELD_INPUTS =
Expand Down Expand Up @@ -102,6 +104,35 @@
return fieldNode;
};
const attachFieldDefinitionNodeEvents = (fieldNode, { targetContainer }) => {
const initDropdown = (dropdownContainer) => {
const dropdownAlreadyInitialized = !!ibexa.helpers.objectInstances.getInstance(dropdownContainer);
Comment thread
albozek marked this conversation as resolved.

if (dropdownAlreadyInitialized) {
return;
}

if (dropdownContainer.classList.contains('ids-dropdown--multi')) {
const dropdown = new DropdownMultiInput(dropdownContainer);

dropdown.init();

return;
}

if (dropdownContainer.classList.contains('ids-dropdown--single')) {
const dropdown = new DropdownSingleInput(dropdownContainer);

dropdown.init();

return;
}

const dropdown = new ibexa.core.Dropdown({
container: dropdownContainer,
});

dropdown.init();
};
const fieldGroupInput = fieldNode.querySelector('.ibexa-input--field-group');
const fieldDefinitionsInputs = fieldNode.querySelectorAll(SELETOR_FIELD_INPUTS);
const removeFieldBtns = fieldNode.querySelectorAll('.ibexa-collapse__extra-action-button--remove-field-definitions');
Expand All @@ -122,20 +153,10 @@
});
}

const dropdowns = fieldNode.querySelectorAll('.ibexa-dropdown');
const dropdowns = fieldNode.querySelectorAll('.ibexa-dropdown, .ids-dropdown');

dropdowns.forEach((dropdownContainer) => {
const dropdownAlreadyInitialized = !!ibexa.helpers.objectInstances.getInstance(dropdownContainer);

if (dropdownAlreadyInitialized) {
return;
}

const dropdown = new ibexa.core.Dropdown({
container: dropdownContainer,
});

dropdown.init();
initDropdown(dropdownContainer);
});

draggableGroups.forEach((group) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,21 @@
};
const toggleSiteAccessSelect = (event) => {
const isChecked = event.target.checked;
const siteAccessSelect = modal.querySelector('.ibexa-custom-url-from__item--siteacces .ibexa-dropdown');
const siteAccessSelect = modal.querySelector('.ibexa-custom-url-from__item--siteacces .ibexa-dropdown, .ibexa-custom-url-from__item--siteacces .ids-dropdown');
const sourceSelect = siteAccessSelect?.querySelector('.ibexa-input--select, .ids-dropdown__source select');

siteAccessSelect.classList.toggle('ibexa-dropdown--is-disabled', isChecked);
if (siteAccessSelect?.classList.contains('ibexa-dropdown')) {
siteAccessSelect.classList.toggle('ibexa-dropdown--disabled', isChecked);
} else if (siteAccessSelect?.classList.contains('ids-dropdown')) {
siteAccessSelect.classList.toggle('ids-dropdown--disabled', isChecked);
}

if (sourceSelect) {
sourceSelect.disabled = isChecked;
}
};

toggleSiteAccessSelect({ target: siteRootCheckbox });
input.addEventListener('input', toggleButtonState, false);
siteRootCheckbox.addEventListener('change', toggleSiteAccessSelect, false);
discardBtns.forEach((btn) => btn.addEventListener('click', clearValues, false));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,16 @@
};

doc.querySelectorAll('.ibexa-translation__language-wrapper--language').forEach((select) => {
const dropdown = select.closest('.ibexa-dropdown');
const dropdown = select.closest('.ibexa-dropdown, .ids-dropdown');
const observer = new MutationObserver(() => toggleBtnDisabledState(select));

toggleBtnDisabledState(select);
select.addEventListener('change', ({ target }) => toggleBtnDisabledState(target), false);

if (!dropdown) {
return;
}

observer.observe(dropdown, observerConfig);
});
})(window, window.document);
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
return;
}

const sourceSelect = filterNode.querySelector('.ibexa-list-filters__item-content .ibexa-dropdown__source .ibexa-input--select');
const sourceSelect = filterNode.querySelector(
'.ibexa-list-filters__item-content .ibexa-dropdown__source .ibexa-input--select, .ibexa-list-filters__item-content .ids-dropdown__source select',
);
const checkboxes = filterNode.querySelectorAll(
'.ibexa-list-filters__item-content .ibexa-input--checkbox:not([name="dropdown-checkbox"])',
);
Expand Down Expand Up @@ -57,7 +59,9 @@
return;
}

const sourceSelect = filterNode.querySelector('.ibexa-list-filters__item-content .ibexa-dropdown__source .ibexa-input--select');
const sourceSelect = filterNode.querySelector(
'.ibexa-list-filters__item-content .ibexa-dropdown__source .ibexa-input--select, .ibexa-list-filters__item-content .ids-dropdown__source select',
);

sourceSelect?.addEventListener('change', filterChange, false);
};
Expand All @@ -79,7 +83,7 @@
return;
}

const select = filterNode.querySelector('.ibexa-dropdown__source .ibexa-input--select');
const select = filterNode.querySelector('.ibexa-dropdown__source .ibexa-input--select, .ids-dropdown__source select');
const checkedCheckboxes = filterNode.querySelectorAll('.ibexa-input--checkbox:checked');

if (isNodeDatePicker(filterNode)) {
Expand Down
32 changes: 23 additions & 9 deletions src/bundle/Resources/public/js/scripts/admin.search.filters.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,16 @@
const clearBtn = filters.querySelector('.ibexa-btn--clear');
const applyBtn = filters.querySelector('.ibexa-btn--apply');
const contentTypeSelect = doc.querySelector('.ibexa-filters__item--content-type .ibexa-filters__select');
const sectionSelect = doc.querySelector('.ibexa-filters__item--section .ibexa-filters__select');
const lastModifiedSelectNode = doc.querySelector('.ibexa-filters__item--modified .ibexa-filters__select');
const lastModifiedSelect = getInstance(lastModifiedSelectNode);
const sectionSelect = filters.querySelector(
'.ibexa-filters__item--section .ibexa-input--select, .ibexa-filters__item--section .ids-dropdown__source select',
);
const lastModifiedDropdownNode = filters.querySelector(
'.ibexa-filters__item--modified .ibexa-dropdown, .ibexa-filters__item--modified .ids-dropdown',
);
const lastModifiedSelectNode = filters.querySelector(
'.ibexa-filters__item--modified .ibexa-input--select, .ibexa-filters__item--modified .ids-dropdown__source select',
);
const lastModifiedSelect = getInstance(lastModifiedDropdownNode);
const lastModifiedDateRangeNode = doc.querySelector('.ibexa-filters__item--modified .ibexa-date-time-range-single');
const lastModifiedDateRange = getInstance(lastModifiedDateRangeNode);
const {
Expand All @@ -23,8 +30,13 @@
const lastModifiedPeriod = doc.querySelector(lastModifiedPeriodSelector);
const lastModifiedStartDate = doc.querySelector(lastModifiedStartSelector);
const lastModifiedEndDate = doc.querySelector(lastModifiedEndSelector);
const lastCreatedSelectNode = doc.querySelector('.ibexa-filters__item--created .ibexa-filters__select');
const lastCreatedSelect = getInstance(lastCreatedSelectNode);
const lastCreatedDropdownNode = filters.querySelector(
'.ibexa-filters__item--created .ibexa-dropdown, .ibexa-filters__item--created .ids-dropdown',
);
const lastCreatedSelectNode = filters.querySelector(
'.ibexa-filters__item--created .ibexa-input--select, .ibexa-filters__item--created .ids-dropdown__source select',
);
const lastCreatedSelect = getInstance(lastCreatedDropdownNode);
const lastCreatedDateRangeNode = doc.querySelector('.ibexa-filters__item--created .ibexa-date-time-range-single');
const lastCreatedDateRange = getInstance(lastCreatedDateRangeNode);
const {
Expand Down Expand Up @@ -63,9 +75,8 @@
sectionSelect[0].selected = true;
}

lastModifiedSelectNode[0].selected = true;
lastCreatedSelectNode[0].selected = true;
lastModifiedSelectNode.querySelector('option').selected = true;
lastModifiedSelect.selectFirstOption();
lastCreatedSelect.selectFirstOption();
lastModifiedPeriod.value = '';
lastModifiedEnd.value = '';
lastCreatedPeriod.value = '';
Expand Down Expand Up @@ -240,7 +251,10 @@
removeSearchTag(event);
};
const clearSection = (event) => {
sectionSelect[0].selected = true;
if (sectionSelect) {
sectionSelect[0].selected = true;
}

removeSearchTag(event);
};
const clearSubtree = (event) => {
Expand Down
10 changes: 5 additions & 5 deletions src/bundle/Resources/public/js/scripts/filters.action.btns.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
containers.forEach((container) => {
const clearBtn = container.querySelector('.ibexa-adaptive-filters__clear-btn');
const applyBtn = container.querySelector('.ibexa-adaptive-filters__submit-btn');
const dropdownNodes = [...container.querySelectorAll('.ibexa-dropdown')];
const dropdownNodes = [...container.querySelectorAll('.ibexa-dropdown, .ids-dropdown')];
const textInputNodes = [...container.querySelectorAll('.ibexa-input--text')];
const dateInputNodes = [...container.querySelectorAll('.ibexa-input--date')];
const originalValuesMap = new Map();
Expand Down Expand Up @@ -40,8 +40,8 @@
return (
textInputNodes.every((textInputNode) => textInputNode.disabled || textInputNode.value === '') &&
dropdownNodes.every((dropdownNode) => {
const isDisabled = dropdownNode.classList.contains('ibexa-dropdown--disabled');
const selectNode = dropdownNode.querySelector('.ibexa-input--select');
const isDisabled = dropdownNode.classList.contains('ibexa-dropdown--disabled') || dropdownNode.classList.contains('ids-dropdown--disabled');
const selectNode = dropdownNode.querySelector('.ibexa-input--select, .ids-dropdown__source select');
const dropdown = dropdownNode.ibexaInstance;

return isDisabled || (dropdown.canSelectOnlyOne ? selectNode.selectedIndex === 0 : selectNode.selectedIndex === -1);
Expand Down Expand Up @@ -78,7 +78,7 @@
}
});
dropdownNodes.forEach((dropdownNode) => {
const isDisabled = dropdownNode.classList.contains('ibexa-dropdown--disabled');
const isDisabled = dropdownNode.classList.contains('ibexa-dropdown--disabled') || dropdownNode.classList.contains('ids-dropdown--disabled');

if (!isDisabled) {
const dropdown = dropdownNode.ibexaInstance;
Expand Down Expand Up @@ -135,7 +135,7 @@
}

dropdownNodes.forEach((dropdownNode) => {
const select = dropdownNode.querySelector('.ibexa-input--select');
const select = dropdownNode.querySelector('.ibexa-input--select, .ids-dropdown__source select');

select.addEventListener('change', handleInputChange, false);
});
Expand Down
4 changes: 2 additions & 2 deletions src/bundle/Resources/public/js/scripts/helpers/icon.helper.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { getAdminUiConfig } from './context.helper';

const getIconPath = (aliasPath, iconSet) => {
const getIconPath = (iconName, iconSet, useLegacyNames = true) => {
const adminUiConfig = getAdminUiConfig();
const { defaultIconSet, iconSets, iconAliases } = adminUiConfig.iconPaths;
const path = iconAliases[aliasPath] || aliasPath;
const path = useLegacyNames ? iconAliases[iconName] || iconName : iconName;

if (!iconSet) {
iconSet = defaultIconSet;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import { getInstance } from '@ibexa-admin-ui/src/bundle/Resources/public/js/scri

node.checked = value;
} else if (node.tagName === 'SELECT') {
const dropdownContainer = node.closest('.ibexa-dropdown');
const dropdownContainer = node.closest('.ibexa-dropdown, .ids-dropdown');

if (dropdownContainer) {
const dropdownInstance = getInstance(dropdownContainer);
Expand Down
8 changes: 8 additions & 0 deletions src/bundle/Resources/public/scss/_dropdown.scss
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,14 @@
}
}

.ids-dropdown {
&__selection-info,
&__selection-info-items,
.ids-overflow-list {
min-width: 0;
}
}

.form-inline {
.ibexa-dropdown {
margin: calculateRem(5px) calculateRem(8px);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@
</select>
{% endset %}

{% include '@ibexadesign/ui/component/dropdown/dropdown.html.twig' with {
{% include '@ibexadesign/ui/component/dropdown/dropdown_ds.html.twig' with {
source: source,
choices: choices,
value: value,
is_small: true,
} %}
} only %}
</form>
{% endif %}
{% endblock %}
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,12 @@
</select>
{% endset %}

{% include '@ibexadesign/ui/component/dropdown/dropdown.html.twig' with {
{% include '@ibexadesign/ui/component/dropdown/dropdown_ds.html.twig' with {
source: source,
choices: choices,
value: value,
is_small: true,
} %}
} only %}
</form>
{% endif %}
{% endset %}
Expand Down
Loading
Loading