Merge pull request #3623 from pixelfed/staging

Staging
This commit is contained in:
daniel 2022-08-15 22:38:19 -06:00 committed by GitHub
commit c0333cc617
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 151 additions and 131 deletions

View file

@ -55,6 +55,10 @@
- Fix remote account post counts ([149cf9dc](https://github.com/pixelfed/pixelfed/commit/149cf9dc)) - Fix remote account post counts ([149cf9dc](https://github.com/pixelfed/pixelfed/commit/149cf9dc))
- Enforce blocks on incoming likes, shares, replies and follows on all endpoints ([1545e37c](https://github.com/pixelfed/pixelfed/commit/1545e37c)) - Enforce blocks on incoming likes, shares, replies and follows on all endpoints ([1545e37c](https://github.com/pixelfed/pixelfed/commit/1545e37c))
- Fix unlisted post web redirect and api response ([6033d837](https://github.com/pixelfed/pixelfed/commit/6033d837)) - Fix unlisted post web redirect and api response ([6033d837](https://github.com/pixelfed/pixelfed/commit/6033d837))
- Remove quilljs from admin page editor, fixes #3616 ([75fbd373](https://github.com/pixelfed/pixelfed/commit/75fbd373))
- Fix AdminStatService cache key, fixes #3612 ([d1dbed89](https://github.com/pixelfed/pixelfed/commit/d1dbed89))
- Improve mute/block v1 api endpoints, fixes #3540 ([c3e8a0e4](https://github.com/pixelfed/pixelfed/commit/c3e8a0e4))
- Set Last-Modified header for atom feeds, fixes #2988 ([c18dcde3](https://github.com/pixelfed/pixelfed/commit/c18dcde3))
- ([](https://github.com/pixelfed/pixelfed/commit/)) - ([](https://github.com/pixelfed/pixelfed/commit/))
## [v0.11.3 (2022-05-09)](https://github.com/pixelfed/pixelfed/compare/v0.11.2...v0.11.3) ## [v0.11.3 (2022-05-09)](https://github.com/pixelfed/pixelfed/compare/v0.11.2...v0.11.3)

View file

@ -873,12 +873,15 @@ class ApiV1Controller extends Controller
->whereFilterableType('App\Profile') ->whereFilterableType('App\Profile')
->whereFilterType('block') ->whereFilterType('block')
->simplePaginate($limit) ->simplePaginate($limit)
->pluck('filterable_id'); ->pluck('filterable_id')
->map(function($id) {
return AccountService::get($id, true);
})
->filter(function($account) {
return $account && isset($account['id']);
});
$profiles = Profile::findOrFail($blocked); return $this->json($blocked);
$resource = new Fractal\Resource\Collection($profiles, new AccountTransformer());
$res = $this->fractal->createData($resource)->toArray();
return $this->json($res);
} }
/** /**
@ -1725,19 +1728,21 @@ class ApiV1Controller extends Controller
]); ]);
$user = $request->user(); $user = $request->user();
$limit = $request->input('limit') ?? 40; $limit = $request->input('limit', 40);
$mutes = UserFilter::whereUserId($user->profile_id) $mutes = UserFilter::whereUserId($user->profile_id)
->whereFilterableType('App\Profile') ->whereFilterableType('App\Profile')
->whereFilterType('mute') ->whereFilterType('mute')
->simplePaginate($limit) ->simplePaginate($limit)
->pluck('filterable_id'); ->pluck('filterable_id')
->map(function($id) {
return AccountService::get($id, true);
})
->filter(function($account) {
return $account && isset($account['id']);
});
$accounts = Profile::find($mutes); return $this->json($mutes);
$resource = new Fractal\Resource\Collection($accounts, new AccountTransformer());
$res = $this->fractal->createData($resource)->toArray();
return $this->json($res);
} }
/** /**

View file

@ -118,8 +118,7 @@ class ProfileController extends Controller
'list' => $settings->show_profile_followers 'list' => $settings->show_profile_followers
] ]
]; ];
$ui = $request->has('ui') && $request->input('ui') == 'memory' ? 'profile.memory' : 'profile.show'; return view('profile.show', compact('profile', 'settings'));
return view($ui, compact('profile', 'settings'));
} }
} }
@ -210,7 +209,7 @@ class ProfileController extends Controller
->whereProfileId($pid) ->whereProfileId($pid)
->whereVisibility('public') ->whereVisibility('public')
->whereType('photo') ->whereType('photo')
->latest() ->orderByDesc('id')
->take(10) ->take(10)
->get() ->get()
->map(function($status) { ->map(function($status) {
@ -224,10 +223,14 @@ class ProfileController extends Controller
}) })
->values(); ->values();
$permalink = config('app.url') . "/users/{$profile['username']}.atom"; $permalink = config('app.url') . "/users/{$profile['username']}.atom";
$headers = ['Content-Type' => 'application/atom+xml'];
if($items && $items->count()) {
$headers['Last-Modified'] = now()->parse($items->first()['created_at'])->toRfc7231String();
}
return response() return response()
->view('atom.user', compact('profile', 'items', 'permalink')) ->view('atom.user', compact('profile', 'items', 'permalink'))
->header('Content-Type', 'application/atom+xml'); ->withHeaders($headers);
} }
public function meRedirect() public function meRedirect()

View file

@ -80,7 +80,7 @@ class SiteController extends Controller
{ {
$page = Cache::remember('site:privacy', now()->addDays(120), function() { $page = Cache::remember('site:privacy', now()->addDays(120), function() {
$slug = '/site/privacy'; $slug = '/site/privacy';
$page = Page::whereSlug($slug)->whereActive(true)->first(); return Page::whereSlug($slug)->whereActive(true)->first();
}); });
return View::make('site.privacy')->with(compact('page'))->render(); return View::make('site.privacy')->with(compact('page'))->render();
} }

View file

@ -113,7 +113,7 @@ class AdminStatsService
protected static function additionalDataSummary() protected static function additionalDataSummary()
{ {
$ttl = now()->addHours(24); $ttl = now()->addHours(24);
return Cache::remember('admin:dashboard:home:data:v0:24hr', $ttl, function() { return Cache::remember('admin:dashboard:home:data-summary:v0:24hr', $ttl, function() {
return [ return [
'statuses' => PrettyNumber::convert(Status::count()), 'statuses' => PrettyNumber::convert(Status::count()),
'profiles' => PrettyNumber::convert(Profile::count()), 'profiles' => PrettyNumber::convert(Profile::count()),

View file

@ -1,27 +1,36 @@
@extends('admin.partial.template') @extends('admin.partial.template-full')
@include('admin.settings.sidebar')
@section('section') @section('section')
<div class="title"> </div>
<h3 class="font-weight-bold">Edit Page</h3> <div class="header bg-primary pb-3 mt-n4">
<p class="lead">{{$page->slug}}</p> <div class="container-fluid">
</div> <div class="header-body">
<hr> <div class="row align-items-center py-4">
<div class="col-lg-6 col-7">
<div> <p class="display-1 text-white">Edit Page</p>
<p class="lead text-white mt-n4 mb-0">{{$page->slug}}</p>
</div>
</div>
</div>
</div>
</div>
<div class="container-fluid mt-4">
<input type="hidden" id="slug" name="slug" value="{{$page->slug}}"> <input type="hidden" id="slug" name="slug" value="{{$page->slug}}">
<input class="form-control form-control-lg" id="title" name="title" placeholder="Title"> <input class="form-control form-control-lg" id="title" name="title" placeholder="Title">
<p class="small text-muted"> <p class="small text-muted">
Page URL: <span class="page-url font-weight-bold">{{$page->url()}}</span> Page URL: <span class="page-url font-weight-bold">{{$page->url()}}</span>
{{-- <span class="pl-1"><a href="#" class="font-weight-bold">Edit</a></span> --}} {{-- <span class="pl-1"><a href="#" class="font-weight-bold">Edit</a></span> --}}
</p> </p>
<div id="editor" style="height: 400px"> <div id="editor" class="d-none" style="height: 400px">
{!!$page->content!!} {!!$page->content!!}
</div> </div>
<div id="rawEditor" style="height: 400px">
<label class="font-weight-bold">Raw HTML</label>
<textarea class="form-control" rows="8" id="rawText" v-pre>{{$page->content}}</textarea>
</div>
<div class="mt-3 d-flex justify-content-between"> <div class="mt-3 d-flex justify-content-between">
<div> <div>
<div class="custom-control custom-switch d-inline pr-3"> <div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="activeSwitch" {{$page->active?'checked="true"':''}}> <input type="checkbox" class="custom-control-input" id="activeSwitch" {{$page->active?'checked="true"':''}}>
<label class="custom-control-label font-weight-bold" for="activeSwitch">Active</label> <label class="custom-control-label font-weight-bold" for="activeSwitch">Active</label>
</div> </div>
@ -34,69 +43,69 @@
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection
@push('styles') @push('styles')
<link rel="stylesheet" href="{{mix('css/quill.css')}}"/>
<style type="text/css"> <style type="text/css">
.ql-container { .ql-container {
box-sizing: border-box; box-sizing: border-box;
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI", font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
Roboto,Helvetica,Arial,sans-serif;
font-size: 16px; font-size: 16px;
height: 100%; height: 100%;
margin: 0px; margin: 0px;
position: relative; position: relative;
} }
.custom-control {
padding-left: 3.5rem;
}
</style> </style>
@endpush @endpush
@push('scripts') @push('scripts')
<script src="{{mix('js/quill.js')}}"></script>
<script> <script>
window.editor = new Quill('#editor', { window.useRaw = true;
theme: 'snow'
}); $('.btn-save').on('click', function(e) {
$('.btn-save').on('click', function(e) { e.preventDefault();
e.preventDefault(); let confirm = window.confirm('Are you sure you want to save this page?');
let confirm = window.confirm('Are you sure you want to save this page?'); if(confirm !== true) {
if(confirm !== true) { return;
return; }
} let html = window.useRaw ?
let html = editor.container.firstChild.innerHTML; $('#rawText').val() :
let title = $('#title').val(); editor.root.innerHTML;
let active = $('#activeSwitch')[0].checked; let title = $('#title').val();
axios.post(window.location.href, { let active = $('#activeSwitch')[0].checked;
slug: '{{$page->slug}}', axios.post(window.location.href, {
title: title, slug: '{{$page->slug}}',
content: html, title: title,
active: active content: html,
}).then((res) => { active: active
window.location.href = '{{$page->url()}}'; }).then((res) => {
}).catch((err) => { window.location.href = '{{$page->url()}}';
console.log(err) }).catch((err) => {
console.log(err)
});
}); });
});
$('.btn-delete').on('click', function(e) { $('.btn-delete').on('click', function(e) {
e.preventDefault(); e.preventDefault();
let confirm = window.confirm('Are you sure you want to delete this page?'); let confirm = window.confirm('Are you sure you want to delete this page?');
if(confirm == true) { if(confirm == true) {
axios.post('/i/admin/settings/pages/delete', { axios.post('/i/admin/settings/pages/delete', {
id: '{{$page->id}}' id: '{{$page->id}}'
}).then(res => { }).then(res => {
window.location.href = '/i/admin/settings/pages'; window.location.href = '/i/admin/settings/pages';
}).catch(err => { }).catch(err => {
swal('Error', 'An error occured!', 'error'); swal('Error', 'An error occured!', 'error');
console.log(err); console.log(err);
}); });
} }
}); });
$('#title').on('change input', function(e) { $('#title').on('change input', function(e) {
e.preventDefault(); e.preventDefault();
let title = this.value.split(' ').join('-').toLowerCase(); let title = this.value.split(' ').join('-').toLowerCase();
}) })
</script> </script>
@endpush @endpush

View file

@ -1,11 +1,56 @@
@extends('admin.partial.template-full') @extends('admin.partial.template-full')
@section('section') @section('section')
<div class="title"> </div>
<h3 class="font-weight-bold">Pages</h3> <div class="header bg-primary pb-3 mt-n4">
<p class="lead">Set custom page content</p> <div class="container-fluid">
</div> <div class="header-body">
<hr> <div class="row align-items-center py-4">
<div class="col-lg-6 col-7">
<p class="display-1 text-white">Pages</p>
<p class="lead text-white mt-n4 mb-0">Manage public and custom page content</p>
</div>
@if($pages->count() < 4)
<div class="col-12">
<hr>
<div class="btn-group">
@if(!$pages->contains('slug', '=', '/site/about'))
<form class="form-inline mr-1" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="about">
<button type="submit" class="btn btn-default font-weight-bold">Customize About Page</button>
</form>
@endif
@if(!$pages->contains('slug', '=', '/site/privacy'))
<form class="form-inline mr-1" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="privacy">
<button type="submit" class="btn btn-default font-weight-bold">Customize Privacy Page</button>
</form>
@endif
@if(!$pages->contains('slug', '=', '/site/terms'))
<form class="form-inline mr-1" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="terms">
<button type="submit" class="btn btn-default font-weight-bold">Customize Terms Page</button>
</form>
@endif
@if(!$pages->contains('slug', '=', '/site/kb/community-guidelines'))
<form class="form-inline" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="community_guidelines">
<button type="submit" class="btn btn-default font-weight-bold">Customize Guidelines Page</button>
</form>
@endif
</div>
</div>
@endif
</div>
</div>
</div>
</div>
<div class="container-fluid mt-4">
@if($pages->count()) @if($pages->count())
<div class="table-responsive"> <div class="table-responsive">
<table class="table"> <table class="table">
@ -46,57 +91,11 @@
<div class="d-flex justify-content-center mt-5 small"> <div class="d-flex justify-content-center mt-5 small">
{{$pages->links()}} {{$pages->links()}}
</div> </div>
<hr>
<div class="btn-group">
<form class="form-inline mr-1" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="about">
<button type="submit" class="btn btn-outline-secondary font-weight-bold">Create About</button>
</form>
<form class="form-inline mr-1" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="privacy">
<button type="submit" class="btn btn-outline-secondary font-weight-bold">Create Privacy</button>
</form>
<form class="form-inline mr-1" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="terms">
<button type="submit" class="btn btn-outline-secondary font-weight-bold">Create Terms</button>
</form>
<form class="form-inline" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="community_guidelines">
<button type="submit" class="btn btn-outline-secondary font-weight-bold">Create Guidelines</button>
</form>
</div>
@else @else
<div class="card bg-light shadow-none rounded-0"> <div class="card border shadow-none rounded-0">
<div class="card-body text-center"> <div class="card-body text-center">
<p class="lead text-muted font-weight-bold py-5 mb-0">No custom pages found</p> <p class="lead text-muted font-weight-bold py-5">No custom pages found</p>
</div> </div>
</div> </div>
<hr>
<div class="btn-group">
<form class="form-inline mr-1" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="about">
<button type="submit" class="btn btn-outline-secondary font-weight-bold">Create About</button>
</form>
<form class="form-inline mr-1" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="privacy">
<button type="submit" class="btn btn-outline-secondary font-weight-bold">Create Privacy</button>
</form>
<form class="form-inline mr-1" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="terms">
<button type="submit" class="btn btn-outline-secondary font-weight-bold">Create Terms</button>
</form>
<form class="form-inline" method="post" action="/i/admin/settings/pages/create">
@csrf
<input type="hidden" name="page" value="community_guidelines">
<button type="submit" class="btn btn-outline-secondary font-weight-bold">Create Guidelines</button>
</form>
</div>
@endif @endif
@endsection @endsection