This commit is contained in:
Markos Gogoulos 2025-10-25 16:11:26 +03:00
parent 3c74badaec
commit 55c5b0be12
11 changed files with 75 additions and 21 deletions

View File

@ -1 +1 @@
VERSION = "7.1.0"
VERSION = "7.2.0"

View File

@ -221,13 +221,12 @@ class MediaList(APIView):
if publish_state and publish_state in ['private', 'public', 'unlisted']:
media = media.filter(state=publish_state)
if show_param == "shared_with_me":
media = media[:1000] # limit to 1000 results
already_sorted = True
if not already_sorted:
media = media.order_by(f"{ordering}{sort_by}")
if show_param == "shared_with_me":
media = media[:1000] # limit to 1000 results
paginator = pagination_class()
page = paginator.paginate_queryset(media, request)

View File

@ -414,10 +414,22 @@ class NavMenuInlineTabs extends React.PureComponent {
) : null}
{this.props.onToggleSortingClick && ['media', 'shared_by_me', 'shared_with_me'].includes(this.props.type) ? (
<li className="media-sorting-toggle">
<span style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }} onClick={this.props.onToggleSortingClick} title={translateString('Sort By')}>
<span style={{ display: 'flex', alignItems: 'center', cursor: 'pointer', position: 'relative' }} onClick={this.props.onToggleSortingClick} title={translateString('Sort By')}>
<CircleIconButton buttonShadow={false}>
<i className="material-icons">swap_vert</i>
</CircleIconButton>
{this.props.hasActiveSort ? (
<span style={{
position: 'absolute',
top: '8px',
right: '8px',
width: '8px',
height: '8px',
borderRadius: '50%',
backgroundColor: 'var(--default-theme-color)',
border: '2px solid white',
}}></span>
) : null}
</span>
</li>
) : null}
@ -438,6 +450,7 @@ NavMenuInlineTabs.propTypes = {
onToggleSortingClick: PropTypes.func,
hasActiveFilters: PropTypes.bool,
hasActiveTags: PropTypes.bool,
hasActiveSort: PropTypes.bool,
};
function AddBannerButton(props) {
@ -663,6 +676,7 @@ export default function ProfilePagesHeader(props) {
onToggleSortingClick={props.onToggleSortingClick}
hasActiveFilters={props.hasActiveFilters}
hasActiveTags={props.hasActiveTags}
hasActiveSort={props.hasActiveSort}
/>
</div>
</div>
@ -678,6 +692,7 @@ ProfilePagesHeader.propTypes = {
onToggleSortingClick: PropTypes.func,
hasActiveFilters: PropTypes.bool,
hasActiveTags: PropTypes.bool,
hasActiveSort: PropTypes.bool,
};
ProfilePagesHeader.defaultProps = {

View File

@ -67,6 +67,9 @@ export function ProfileMediaFilters(props) {
}
function onFilterSelect(ev) {
const filterType = ev.currentTarget.getAttribute('filter');
const clickedValue = ev.currentTarget.getAttribute('value');
const args = {
media_type: mediaTypeFilter,
upload_date: uploadDateFilter,
@ -76,34 +79,35 @@ export function ProfileMediaFilters(props) {
tag: props.selectedTag || tagFilter,
};
switch (ev.currentTarget.getAttribute('filter')) {
switch (filterType) {
case 'media_type':
args.media_type = ev.currentTarget.getAttribute('value');
// If clicking the currently selected filter, deselect it (set to 'all')
args.media_type = clickedValue === mediaTypeFilter ? 'all' : clickedValue;
props.onFiltersUpdate(args);
setFilter_media_type(args.media_type);
break;
case 'upload_date':
args.upload_date = ev.currentTarget.getAttribute('value');
args.upload_date = clickedValue === uploadDateFilter ? 'all' : clickedValue;
props.onFiltersUpdate(args);
setFilter_upload_date(args.upload_date);
break;
case 'duration':
args.duration = ev.currentTarget.getAttribute('value');
args.duration = clickedValue === durationFilter ? 'all' : clickedValue;
props.onFiltersUpdate(args);
setFilter_duration(args.duration);
break;
case 'publish_state':
args.publish_state = ev.currentTarget.getAttribute('value');
args.publish_state = clickedValue === publishStateFilter ? 'all' : clickedValue;
props.onFiltersUpdate(args);
setFilter_publish_state(args.publish_state);
break;
case 'sort_by':
args.sort_by = ev.currentTarget.getAttribute('value');
args.sort_by = clickedValue === sortByFilter ? 'date_added_desc' : clickedValue;
props.onFiltersUpdate(args);
setFilter_sort_by(args.sort_by);
break;
case 'tag':
args.tag = ev.currentTarget.getAttribute('value');
args.tag = clickedValue === tagFilter ? 'all' : clickedValue;
props.onFiltersUpdate(args);
setFilter_tag(args.tag);
break;

View File

@ -26,8 +26,10 @@ export function ProfileMediaTags(props) {
function onFilterSelect(ev) {
const tag = ev.currentTarget.getAttribute('value');
setFilter_tag(tag);
props.onTagSelect(tag);
// If clicking the currently selected tag, deselect it (set to 'all')
const newTag = tag === tagFilter ? 'all' : tag;
setFilter_tag(newTag);
props.onTagSelect(newTag);
}
useEffect(() => {

View File

@ -605,7 +605,7 @@ export class ProfileMediaPage extends Page {
}
onTagSelect(tag) {
this.setState({ selectedTag: tag, hiddenTags: true }, () => {
this.setState({ selectedTag: tag }, () => {
// Apply tag filter
this.onFiltersUpdate({
media_type: this.state.filterArgs.includes('media_type') ? this.state.filterArgs.match(/media_type=([^&]*)/)?.[1] : null,
@ -617,7 +617,7 @@ export class ProfileMediaPage extends Page {
}
onSortSelect(sortOption) {
this.setState({ selectedSort: sortOption, hiddenSorting: true }, () => {
this.setState({ selectedSort: sortOption }, () => {
// Apply sort filter
this.onFiltersUpdate({
media_type: this.state.filterArgs.includes('media_type') ? this.state.filterArgs.match(/media_type=([^&]*)/)?.[1] : null,
@ -884,12 +884,15 @@ export class ProfileMediaPage extends Page {
);
const hasActiveTags = this.state.selectedTag && this.state.selectedTag !== 'all';
const hasActiveSort = this.state.selectedSort && this.state.selectedSort !== 'date_added_desc';
console.log('Filter Debug:', {
filterArgs: this.state.filterArgs,
selectedTag: this.state.selectedTag,
selectedSort: this.state.selectedSort,
hasActiveFilters,
hasActiveTags
hasActiveTags,
hasActiveSort
});
return [
@ -904,6 +907,7 @@ export class ProfileMediaPage extends Page {
onToggleSortingClick={this.onToggleSortingClick}
hasActiveFilters={hasActiveFilters}
hasActiveTags={hasActiveTags}
hasActiveSort={hasActiveSort}
/>
) : null,
this.state.author ? (

View File

@ -151,17 +151,23 @@ export class ProfileSharedByMePage extends Page {
onToggleFiltersClick() {
this.setState({
hiddenFilters: !this.state.hiddenFilters,
hiddenTags: true,
hiddenSorting: true,
});
}
onToggleTagsClick() {
this.setState({
hiddenFilters: true,
hiddenTags: !this.state.hiddenTags,
hiddenSorting: true,
});
}
onToggleSortingClick() {
this.setState({
hiddenFilters: true,
hiddenTags: true,
hiddenSorting: !this.state.hiddenSorting,
});
}
@ -290,6 +296,12 @@ export class ProfileSharedByMePage extends Page {
const isMediaAuthor = authorData && authorData.username === MemberContext._currentValue.username;
// Check if any filters are active
const hasActiveFilters = this.state.filterArgs && (
this.state.filterArgs.includes('media_type=') ||
this.state.filterArgs.includes('upload_date=')
);
return [
this.state.author ? (
<ProfilePagesHeader
@ -300,6 +312,9 @@ export class ProfileSharedByMePage extends Page {
onToggleFiltersClick={this.onToggleFiltersClick}
onToggleTagsClick={this.onToggleTagsClick}
onToggleSortingClick={this.onToggleSortingClick}
hasActiveFilters={hasActiveFilters}
hasActiveTags={this.state.selectedTag !== 'all'}
hasActiveSort={this.state.selectedSort !== 'date_added_desc'}
/>
) : null,
this.state.author ? (

View File

@ -151,17 +151,23 @@ export class ProfileSharedWithMePage extends Page {
onToggleFiltersClick() {
this.setState({
hiddenFilters: !this.state.hiddenFilters,
hiddenTags: true,
hiddenSorting: true,
});
}
onToggleTagsClick() {
this.setState({
hiddenFilters: true,
hiddenTags: !this.state.hiddenTags,
hiddenSorting: true,
});
}
onToggleSortingClick() {
this.setState({
hiddenFilters: true,
hiddenTags: true,
hiddenSorting: !this.state.hiddenSorting,
});
}
@ -290,6 +296,12 @@ export class ProfileSharedWithMePage extends Page {
const isMediaAuthor = authorData && authorData.username === MemberContext._currentValue.username;
// Check if any filters are active
const hasActiveFilters = this.state.filterArgs && (
this.state.filterArgs.includes('media_type=') ||
this.state.filterArgs.includes('upload_date=')
);
return [
this.state.author ? (
<ProfilePagesHeader
@ -300,6 +312,9 @@ export class ProfileSharedWithMePage extends Page {
onToggleFiltersClick={this.onToggleFiltersClick}
onToggleTagsClick={this.onToggleTagsClick}
onToggleSortingClick={this.onToggleSortingClick}
hasActiveFilters={hasActiveFilters}
hasActiveTags={this.state.selectedTag !== 'all'}
hasActiveSort={this.state.selectedSort !== 'date_added_desc'}
/>
) : null,
this.state.author ? (

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long