screentinker/frontend/js/views
Claude f66c941c1d Stop the content edit dialog rewriting types it cannot represent
Opening Edit on a YouTube item and pressing Save Changes — with nothing else touched — turned it
into an MP4.

The type dropdown offers six fixed options and is rendered unconditionally. For video/youtube no
option matched, so the browser selected the first one, video/mp4. The save handler then reads the
select's value and sends it because it differs from the stored type:

    const mimeType = overlay.querySelector('#editMimeType').value;   // 'video/mp4'
    if (mimeType !== contentItem.mime_type) updateData.mime_type = mimeType;

and the server stores what it is sent. mime_type is the renderer selector in every player, so the
item became an "MP4" whose source is a YouTube embed page: a dead slide on every screen in the
playlist. It could not be undone from the dialog either, because there is no video/youtube option to
set it back, and the YouTube-specific controls disappear once the type has changed.

The same applies to uploads the sniffer accepts but the list omits — the sniffer allows fifteen
types, the dropdown covers six — so .mov, .svg, .heic, .avif and .bmp were all rewritten the same
way.

The dialog now includes the item's actual type as a selected option whenever the fixed six cannot
express it, so opening and saving is a no-op and the type is never silently changed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Uaeo9MvzKoyXuN6ZsbhtkL
2026-07-30 21:09:59 -05:00
..
activity.js Make help tips reachable, and explain the pages that had none 2026-07-28 19:37:49 -05:00
admin-player-debug.js Add player debug overlay and server-side error telemetry sink 2026-05-15 15:20:42 -05:00
admin.js Show every plan on the admin tab, with who is on each 2026-07-29 19:36:10 -05:00
billing.js i18n batch 5: wire layout-editor + video-wall + billing (~85 keys) 2026-04-29 20:13:38 -05:00
content-library.js Stop the content edit dialog rewriting types it cannot represent 2026-07-30 21:09:59 -05:00
dashboard.js Dragging a screen onto a group now moves it instead of adding it 2026-07-29 21:33:56 -05:00
designer.js Translate the labels that never went through t() 2026-07-28 19:52:52 -05:00
device-detail.js Let a display opt in to pre-release builds, so a test build is not reverted under the tester 2026-07-30 18:35:31 -05:00
force-password-change.js feat(admin): admin-provisioned user creation + first-login gate (#10) 2026-06-05 11:03:56 -05:00
help.js docs(help): add AI Content Design quick-start to the in-app Help page (#41) 2026-06-09 13:58:53 -05:00
kiosk.js fix(security): patch quick-win findings from the codebase review 2026-06-08 19:02:19 -05:00
layout-editor.js Push layout edits to displays, and let a layout be renamed 2026-07-30 19:58:21 -05:00
login.js feat(auth): self-service password reset 2026-07-27 11:19:39 -05:00
no-workspace.js feat(signup): optional org-on-create for self-service signups (#12) 2026-06-05 11:16:27 -05:00
onboarding.js i18n batch 3b: wire onboarding.js + admin.js (~84 keys) 2026-04-29 20:04:23 -05:00
playlists.js Make help tips reachable, and explain the pages that had none 2026-07-28 19:37:49 -05:00
reports.js i18n batch 4: wire schedule + reports + kiosk (~95 keys) 2026-04-29 20:09:32 -05:00
schedule.js Bind the calendar's pointer handlers once, not once per render 2026-07-28 20:08:31 -05:00
settings.js Make help tips reachable, and explain the pages that had none 2026-07-28 19:37:49 -05:00
teams.js Say Teams is switched off instead of showing an empty list 2026-07-28 19:46:26 -05:00
video-wall.js Translate the labels that never went through t() 2026-07-28 19:52:52 -05:00
widgets.js feat(designer): edit designer-made widgets in the designer (+ legacy reconstruction) (#207) 2026-07-21 09:00:36 -05:00
workspace-members.js feat(admin): admin-provisioned user creation + first-login gate (#10) 2026-06-05 11:03:56 -05:00