All development so far tested and merged into production. #9
@@ -97,15 +97,15 @@ class VorgabeForm(forms.ModelForm):
|
|||||||
model = Vorgabe
|
model = Vorgabe
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
class VorgabeInline(SortableInlineAdminMixin, NestedStackedInline): # Changed to StackedInline for better box separation
|
class VorgabeInline(SortableInlineAdminMixin, NestedStackedInline):
|
||||||
model = Vorgabe
|
model = Vorgabe
|
||||||
form = VorgabeForm
|
form = VorgabeForm
|
||||||
extra = 0
|
extra = 0
|
||||||
sortable_field_name = "order" # Add this - make sure your Vorgabe model has an 'order' field
|
sortable_field_name = "order"
|
||||||
show_change_link = True
|
show_change_link = True
|
||||||
inlines = [VorgabeKurztextInline, VorgabeLangtextInline, ChecklistenfragenInline]
|
inlines = [VorgabeKurztextInline, VorgabeLangtextInline, ChecklistenfragenInline]
|
||||||
autocomplete_fields = ['stichworte','referenzen','relevanz']
|
autocomplete_fields = ['stichworte','referenzen','relevanz']
|
||||||
classes = ["collapse"] # Start collapsed for better overview
|
# Remove collapse class so Vorgaben show by default
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
('Grunddaten', {
|
('Grunddaten', {
|
||||||
@@ -114,11 +114,11 @@ class VorgabeInline(SortableInlineAdminMixin, NestedStackedInline): # Changed t
|
|||||||
}),
|
}),
|
||||||
('Gültigkeit', {
|
('Gültigkeit', {
|
||||||
'fields': (('gueltigkeit_von', 'gueltigkeit_bis'),),
|
'fields': (('gueltigkeit_von', 'gueltigkeit_bis'),),
|
||||||
'classes': ('wide', 'collapse'),
|
'classes': ('wide',),
|
||||||
}),
|
}),
|
||||||
('Verknüpfungen', {
|
('Verknüpfungen', {
|
||||||
'fields': (('referenzen', 'stichworte', 'relevanz'),),
|
'fields': (('referenzen', 'stichworte', 'relevanz'),),
|
||||||
'classes': ('wide', 'collapse'),
|
'classes': ('wide',),
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -169,7 +169,7 @@ class DokumentAdmin(SortableAdminBase, NestedModelAdmin):
|
|||||||
)
|
)
|
||||||
|
|
||||||
class Media:
|
class Media:
|
||||||
js = ('admin/js/vorgabe_toggle.js',)
|
js = ('admin/js/vorgabe_collapse.js',)
|
||||||
css = {
|
css = {
|
||||||
'all': ('admin/css/vorgabe_border.css',)
|
'all': ('admin/css/vorgabe_border.css',)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,58 @@
|
|||||||
window.addEventListener('load', function () {
|
window.addEventListener('load', function () {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const vorgabenBlocks = document.querySelectorAll('.djn-dynamic-form-Standards-vorgabe');
|
// Try different selectors for nested admin vorgabe elements
|
||||||
console.log("Found", vorgabenBlocks.length, "Vorgaben blocks");
|
const selectors = [
|
||||||
|
'.djn-dynamic-form-dokumente-vorgabe',
|
||||||
|
'.djn-dynamic-form-Standards-vorgabe',
|
||||||
|
'.inline-related[data-inline-type="stacked"]',
|
||||||
|
'.nested-inline'
|
||||||
|
];
|
||||||
|
|
||||||
|
let vorgabenBlocks = [];
|
||||||
|
for (const selector of selectors) {
|
||||||
|
vorgabenBlocks = document.querySelectorAll(selector);
|
||||||
|
if (vorgabenBlocks.length > 0) {
|
||||||
|
console.log("Found", vorgabenBlocks.length, "Vorgaben blocks with selector:", selector);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vorgabenBlocks.length === 0) {
|
||||||
|
console.log("No Vorgaben blocks found, trying fallback...");
|
||||||
|
// Fallback: look for any inline with vorgabe in the class
|
||||||
|
vorgabenBlocks = document.querySelectorAll('[class*="vorgabe"]');
|
||||||
|
}
|
||||||
|
|
||||||
vorgabenBlocks.forEach((block, index) => {
|
vorgabenBlocks.forEach((block, index) => {
|
||||||
const header = document.createElement('div');
|
// Find the existing title/header within the vorgabe block
|
||||||
header.className = 'vorgabe-toggle-header';
|
const existingHeader = block.querySelector('h3, .inline-label, .module h2, .djn-inline-header');
|
||||||
header.innerHTML = `▼ Vorgabe ${index + 1}`;
|
|
||||||
header.style.cursor = 'pointer';
|
|
||||||
|
|
||||||
block.parentNode.insertBefore(header, block);
|
if (existingHeader) {
|
||||||
|
// Make the existing header clickable for collapse/expand
|
||||||
|
existingHeader.style.cursor = 'pointer';
|
||||||
|
existingHeader.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
header.addEventListener('click', () => {
|
// Find all content to collapse - everything except the header itself
|
||||||
const isHidden = block.style.display === 'none';
|
const allChildren = Array.from(block.children);
|
||||||
block.style.display = isHidden ? '' : 'none';
|
const contentElements = allChildren.filter(child => child !== existingHeader && !child.contains(existingHeader));
|
||||||
header.innerHTML = `${isHidden ? '▼' : '▶'} Vorgabe ${index + 1}`;
|
|
||||||
|
contentElements.forEach(element => {
|
||||||
|
const isHidden = element.style.display === 'none';
|
||||||
|
element.style.display = isHidden ? '' : 'none';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Update the header text to show collapse state
|
||||||
|
const originalText = existingHeader.textContent.replace(/[▼▶]\s*/, '');
|
||||||
|
const anyHidden = contentElements.some(el => el.style.display === 'none');
|
||||||
|
existingHeader.innerHTML = `${anyHidden ? '▶' : '▼'} ${originalText}`;
|
||||||
});
|
});
|
||||||
}, 500); // wait 500ms to allow nested inlines to render
|
|
||||||
|
// Add initial collapse indicator
|
||||||
|
const originalText = existingHeader.textContent;
|
||||||
|
existingHeader.innerHTML = `▼ ${originalText}`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 1000); // wait longer to allow nested inlines to render
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user