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. * Enable/disable registered action checkboxes based on selected object_types.
*/ */
export function initRegisteredActions(): void { 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) { if (!selectedList) {
return; return;
@@ -22,7 +24,7 @@ export function initRegisteredActions(): void {
const selectedModels = new Set<string>(); const selectedModels = new Set<string>();
// Get model keys from selected options // 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; const modelKey = option.dataset.modelKey;
if (modelKey) { if (modelKey) {
selectedModels.add(modelKey); selectedModels.add(modelKey);
@@ -54,7 +56,7 @@ export function initRegisteredActions(): void {
for (const btn of getElements<HTMLButtonElement>('.move-option')) { for (const btn of getElements<HTMLButtonElement>('.move-option')) {
btn.addEventListener('click', () => { btn.addEventListener('click', () => {
// Wait for DOM update // Wait for DOM update
setTimeout(updateState, 50); setTimeout(updateState, 0);
}); });
} }
} }

View File

@@ -346,7 +346,7 @@ class ObjectPermissionForm(forms.ModelForm):
registered_actions = forms.MultipleChoiceField( registered_actions = forms.MultipleChoiceField(
required=False, required=False,
widget=RegisteredActionsWidget(), widget=RegisteredActionsWidget(),
label=_('Custom actions'), label=_('Registered actions'),
) )
actions = SimpleArrayField( actions = SimpleArrayField(
label=_('Additional actions'), 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) option = super().create_option(name, value, label, selected, index, subindex=subindex, attrs=attrs)
action_name = str(value) 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, '') option['help_text'] = self._action_help_text.get(action_name, '')
return option return option

View File

@@ -216,6 +216,11 @@ class ObjectTypeAvailableOptions(ObjectTypeSelectMultiple):
class ObjectTypeSelectedOptions(ObjectTypeSelectMultiple): class ObjectTypeSelectedOptions(ObjectTypeSelectMultiple):
include_selected = True 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): class ObjectTypeSplitMultiSelectWidget(SplitMultiSelectWidget):
""" """