This commit is contained in:
Markos Gogoulos 2025-10-21 09:56:47 +03:00
parent 845ceeaed7
commit 7acf748c24
7 changed files with 14 additions and 74 deletions

View File

@ -94,7 +94,7 @@ def add_subtitle(request):
if not media: if not media:
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
if not (request.user == media.user or is_mediacms_editor(request.user)): if not (is_mediacms_editor(request.user) or request.user.has_contributor_access_to_media(media)):
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
# Initialize variables # Initialize variables
@ -146,7 +146,7 @@ def edit_subtitle(request):
if not subtitle: if not subtitle:
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
if not (request.user == subtitle.user or is_mediacms_editor(request.user)): if not (is_mediacms_editor(request.user) or request.user.has_contributor_access_to_media(subtitle.media)):
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
context = {"subtitle": subtitle, "action": action} context = {"subtitle": subtitle, "action": action}
@ -252,7 +252,7 @@ def video_chapters(request, friendly_token):
if not media: if not media:
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
if not (request.user == media.user or is_mediacms_editor(request.user)): if not (is_mediacms_editor(request.user) or request.user.has_contributor_access_to_media(media)):
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
try: try:
@ -370,7 +370,7 @@ def edit_chapters(request):
if not media: if not media:
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
if not (request.user == media.user or is_mediacms_editor(request.user)): if not (is_mediacms_editor(request.user) or request.user.has_contributor_access_to_media(media)):
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
chapters = media.chapter_data chapters = media.chapter_data
@ -395,7 +395,7 @@ def trim_video(request, friendly_token):
if not media: if not media:
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
if not (request.user == media.user or is_mediacms_editor(request.user)): if not (is_mediacms_editor(request.user) or request.user.has_contributor_access_to_media(media)):
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
existing_requests = VideoTrimRequest.objects.filter(media=media, status__in=["initial", "running"]).exists() existing_requests = VideoTrimRequest.objects.filter(media=media, status__in=["initial", "running"]).exists()
@ -426,7 +426,7 @@ def edit_video(request):
if not media: if not media:
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
if not (request.user == media.user or is_mediacms_editor(request.user)): if not (is_mediacms_editor(request.user) or request.user.has_contributor_access_to_media(media)):
return HttpResponseRedirect("/") return HttpResponseRedirect("/")
if media.media_type not in ["video", "audio"]: if media.media_type not in ["video", "audio"]:

View File

@ -686,9 +686,8 @@ a.item-edit-link {
} }
} }
// Show checkbox on hover or when any item is selected // Show checkbox only on hover
&:hover .item-selection-checkbox, &:hover .item-selection-checkbox {
&.has-any-selection .item-selection-checkbox {
opacity: 1; opacity: 1;
} }
@ -709,18 +708,6 @@ a.item-edit-link {
border-radius: 10px; border-radius: 10px;
} }
} }
// Make the whole item clickable for selection when any selection is active
&.has-any-selection:not(.selected) {
.item-thumb {
cursor: pointer;
}
.item-main {
cursor: pointer;
pointer-events: auto;
}
}
} }
// Edit icon styles // Edit icon styles

View File

@ -24,7 +24,8 @@ export function MediaItem(props) {
const finalClassname = containerClassname + const finalClassname = containerClassname +
(props.showSelection ? ' with-selection' : '') + (props.showSelection ? ' with-selection' : '') +
(props.isSelected ? ' selected' : ''); (props.isSelected ? ' selected' : '') +
(props.hasAnySelection ? ' has-any-selection' : '');
return ( return (
<div className={finalClassname}> <div className={finalClassname}>

View File

@ -70,32 +70,8 @@ export function MediaItemAudio(props) {
(props.isSelected ? ' selected' : '') + (props.isSelected ? ' selected' : '') +
(props.hasAnySelection ? ' has-any-selection' : ''); (props.hasAnySelection ? ' has-any-selection' : '');
const handleItemClick = (e) => {
// Only handle clicks when selection mode is active
if (props.showSelection) {
// Check if click was on the checkbox (already handled)
if (e.target.type === 'checkbox' || e.target.closest('.item-selection-checkbox')) {
return;
}
// Check if click was on the edit icon or view icon
if (e.target.closest('.item-edit-icon') || e.target.closest('.item-view-icon')) {
return;
}
// Prevent default link behavior
e.preventDefault();
e.stopPropagation();
// Toggle the checkbox
if (props.onCheckboxChange) {
props.onCheckboxChange({ target: { checked: !props.isSelected } });
}
}
};
return ( return (
<div className={finalClassname} onClick={handleItemClick}> <div className={finalClassname}>
{playlistOrderNumberComponent()} {playlistOrderNumberComponent()}
<div className="item-content"> <div className="item-content">

View File

@ -77,32 +77,8 @@ export function MediaItemVideo(props) {
(props.isSelected ? ' selected' : '') + (props.isSelected ? ' selected' : '') +
(props.hasAnySelection ? ' has-any-selection' : ''); (props.hasAnySelection ? ' has-any-selection' : '');
const handleItemClick = (e) => {
// Only handle clicks when selection mode is active
if (props.showSelection) {
// Check if click was on the checkbox (already handled)
if (e.target.type === 'checkbox' || e.target.closest('.item-selection-checkbox')) {
return;
}
// Check if click was on the edit icon or view icon
if (e.target.closest('.item-edit-icon') || e.target.closest('.item-view-icon')) {
return;
}
// Prevent default link behavior
e.preventDefault();
e.stopPropagation();
// Toggle the checkbox
if (props.onCheckboxChange) {
props.onCheckboxChange({ target: { checked: !props.isSelected } });
}
}
};
return ( return (
<div className={finalClassname} onClick={handleItemClick}> <div className={finalClassname}>
{playlistOrderNumberComponent()} {playlistOrderNumberComponent()}
<div className="item-content"> <div className="item-content">

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long