Skip to content

Commit b4dcc18

Browse files
added suggestions by copilot
1 parent 9e504a7 commit b4dcc18

File tree

7 files changed

+39
-25
lines changed

7 files changed

+39
-25
lines changed

app/eventyay/base/migrations/0002_room_visibility_fields.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,21 @@
44
def set_initial_visibility(apps, schema_editor):
55
Room = apps.get_model("base", "Room")
66
batch = []
7-
for room in Room.objects.all().iterator():
7+
batch_size = 1000
8+
for room in Room.objects.all().iterator(chunk_size=batch_size):
89
has_modules = bool(room.module_config)
910
room.setup_complete = has_modules
1011
room.sidebar_hidden = not has_modules
1112
batch.append(room)
13+
if len(batch) >= batch_size:
14+
Room.objects.bulk_update(
15+
batch,
16+
fields=[
17+
"setup_complete",
18+
"sidebar_hidden",
19+
],
20+
)
21+
batch = []
1222
if batch:
1323
Room.objects.bulk_update(
1424
batch,

app/eventyay/base/models/room.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ class Room(VersionedModel, OrderedModel, PretalxModel):
206206
force_join = models.BooleanField(default=False)
207207
setup_complete = models.BooleanField(default=False)
208208
hidden = models.BooleanField(default=False)
209+
# Default is True (hidden) for safety - rooms should be hidden until configured.
210+
# The _create_room function and migration explicitly set this based on module_config.
209211
sidebar_hidden = models.BooleanField(default=True)
210212

211213
objects = RoomQuerySet.as_manager()

app/eventyay/base/services/room.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@ def delete_room(event, room, by_user):
122122
def reorder_rooms(event, id_list, by_user):
123123
def key(r):
124124
try:
125-
return id_list.index(str(r.id)), r.sorting_priority, r.name
125+
return id_list.index(str(r.id)), r.sorting_priority, r.name, r.id
126126
except Exception:
127-
return sys.maxsize, r.sorting_priority, r.name
127+
return sys.maxsize, r.sorting_priority, r.name, r.id
128128

129129
all_rooms = list(
130130
event.rooms.filter(deleted=False)

app/eventyay/webapp/src/App.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ export default {
278278
if (this.room && !this.visibleRooms.includes(this.room)) {
279279
this.$router.push('/').catch(() => {})
280280
}
281-
if (this.backgroundRoom && !this.rooms.includes(this.backgroundRoom)) {
281+
if (this.backgroundRoom && !this.visibleRooms.includes(this.backgroundRoom)) {
282282
this.backgroundRoom = null
283283
}
284284
}

app/eventyay/webapp/src/views/admin/rooms/EditForm.vue

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@
2727
.visibility-controls
2828
h3 Visibility
2929
bunt-checkbox(name="hidden", v-model="config.hidden", class="visibility-option") Hide this room from schedule-editor
30-
bunt-checkbox(
31-
name="sidebar_hidden",
32-
v-model="config.sidebar_hidden",
33-
:disabled="sidebarHiddenDisabled",
34-
class="visibility-option"
35-
) Hide from Sidebar
36-
small(v-if="!config.setup_complete") Hidden from the sidebar until setup is complete.
37-
small(v-else-if="config.hidden") Hidden rooms are always removed from the sidebar.
30+
template(v-if="config.setup_complete")
31+
bunt-checkbox(
32+
name="sidebar_hidden",
33+
v-model="config.sidebar_hidden",
34+
:disabled="config.hidden",
35+
class="visibility-option"
36+
) Hide from Sidebar
37+
small(v-if="config.hidden") Hidden rooms are always removed from the sidebar.
38+
template(v-else)
39+
small Hidden from the sidebar until setup is complete.
3840
template(v-if="inferredType && typeComponents[inferredType.id]")
3941
.video-settings(v-if="showVideoSettingsTitle")
4042
h3 Video Settings
@@ -126,12 +128,6 @@ export default {
126128
const videoTypes = ['stage', 'channel-bbb', 'channel-janus', 'channel-zoom', 'channel-roulette']
127129
return videoTypes.includes(this.inferredType?.id)
128130
},
129-
visibilityDependencies() {
130-
return [this.config?.hidden, this.config?.setup_complete]
131-
},
132-
sidebarHiddenDisabled() {
133-
return !this.config.setup_complete || this.config.hidden
134-
},
135131
localizedName: {
136132
get() {
137133
return this.$localize(this.config.name)
@@ -168,14 +164,15 @@ export default {
168164
},
169165
methods: {
170166
applyVisibilityDefaults(config) {
171-
if (config.hidden === undefined) config.hidden = false
172-
if (config.sidebar_hidden === undefined) {
167+
if (config.hidden == null) config.hidden = false
168+
if (config.sidebar_hidden == null) {
173169
config.sidebar_hidden = !config.setup_complete
174170
}
175171
},
176172
syncSidebarHidden() {
177173
if (!this.config) return
178-
if (this.config.hidden || !this.config.setup_complete) {
174+
// Enforce business rule: sidebar_hidden must be true if hidden is true or setup is incomplete
175+
if ((this.config.hidden || !this.config.setup_complete) && !this.config.sidebar_hidden) {
179176
this.config.sidebar_hidden = true
180177
}
181178
},

app/eventyay/webapp/src/views/admin/rooms/RoomListItem.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ export default {
2424
return this.isConfigured ? 'Configure' : 'Complete Setup'
2525
},
2626
visibilityIconClass() {
27-
return this.room.hidden || this.room.sidebar_hidden || !this.room.setup_complete ? 'fa-eye-slash' : 'fa-eye'
27+
if (this.room.hidden) return 'fa-eye-slash hidden-room'
28+
if (!this.room.setup_complete) return 'fa-eye-slash setup-incomplete'
29+
if (this.room.sidebar_hidden) return 'fa-eye-slash sidebar-hidden'
30+
return 'fa-eye visible-room'
2831
}
2932
},
3033
methods: {

app/eventyay/webapp/src/views/admin/rooms/index.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
)
2828
RoomListItem(v-for="(room, index) of rooms" :index="index", :key="room.id", :room="room", :disabled="rooms.length < 2")
2929
.table-body(v-else, v-scrollbar.y="")
30-
RoomListItem(v-for="room of filteredRooms", :key="room.id", :room="room", :disabled="true")
30+
RoomListItem(v-for="room of filteredRooms", :key="room.id", :room="room", :disabled="filteredRooms.length < 2")
3131
bunt-progress-circular(v-else, size="huge", :page="true")
3232
</template>
3333
<script>
@@ -89,13 +89,15 @@ export default {
8989
},
9090
async onListSort() {
9191
const idList = this.rooms.map(room => String(room.id))
92+
const previousOrder = [...this.rooms]
9293
try {
9394
this.rooms = await api.call('room.config.reorder', idList)
9495
} catch (e) {
9596
console.error(e)
96-
this.fetchRooms()
97+
// Rollback to previous order on error
98+
this.rooms = previousOrder
99+
await this.fetchRooms()
97100
}
98-
// TODO error handling
99101
}
100102
}
101103
}

0 commit comments

Comments
 (0)