Address review feedback on registered actions

- Sort model_keys in data-models attribute for deterministic output
- Rename registered_actions field label to 'Registered actions'
- Target object_types selected list via data-object-types-selected
  attribute instead of hardcoded DOM ID
- Reduce setTimeout delay to 0ms since moveOption() is synchronous
This commit is contained in:
Jason Novinger
2026-04-01 16:19:28 -05:00
parent 002cf25a2c
commit 84c2acb1f9
6 changed files with 15 additions and 8 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -4,7 +4,9 @@ import { getElements } from '../util';
* Enable/disable registered action checkboxes based on selected object_types.
*/
export function initRegisteredActions(): void {
const selectedList = document.getElementById('id_object_types_1') as HTMLSelectElement;
const selectedList = document.querySelector<HTMLSelectElement>(
'select[data-object-types-selected]',
);
if (!selectedList) {
return;
@@ -22,7 +24,7 @@ export function initRegisteredActions(): void {
const selectedModels = new Set<string>();
// Get model keys from selected options
for (const option of Array.from(selectedList.options)) {
for (const option of Array.from(selectedList!.options)) {
const modelKey = option.dataset.modelKey;
if (modelKey) {
selectedModels.add(modelKey);
@@ -54,7 +56,7 @@ export function initRegisteredActions(): void {
for (const btn of getElements<HTMLButtonElement>('.move-option')) {
btn.addEventListener('click', () => {
// Wait for DOM update
setTimeout(updateState, 50);
setTimeout(updateState, 0);
});
}
}

View File

@@ -346,7 +346,7 @@ class ObjectPermissionForm(forms.ModelForm):
registered_actions = forms.MultipleChoiceField(
required=False,
widget=RegisteredActionsWidget(),
label=_('Custom actions'),
label=_('Registered actions'),
)
actions = SimpleArrayField(
label=_('Additional actions'),

View File

@@ -42,6 +42,6 @@ class RegisteredActionsWidget(forms.CheckboxSelectMultiple):
"""
option = super().create_option(name, value, label, selected, index, subindex=subindex, attrs=attrs)
action_name = str(value)
option['model_keys'] = ','.join(self._action_model_keys.get(action_name, set()))
option['model_keys'] = ','.join(sorted(self._action_model_keys.get(action_name, set())))
option['help_text'] = self._action_help_text.get(action_name, '')
return option

View File

@@ -216,6 +216,11 @@ class ObjectTypeAvailableOptions(ObjectTypeSelectMultiple):
class ObjectTypeSelectedOptions(ObjectTypeSelectMultiple):
include_selected = True
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
context['widget']['attrs']['data-object-types-selected'] = True
return context
class ObjectTypeSplitMultiSelectWidget(SplitMultiSelectWidget):
"""