Merge pull request #916 from pixelfed/frontend-ui-refactor

Frontend ui refactor
This commit is contained in:
daniel 2019-03-01 14:09:52 -07:00 committed by GitHub
commit 81e4fb805c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
34 changed files with 625 additions and 56 deletions

View file

@ -56,6 +56,7 @@ MIX_API_SEARCH="${API_SEARCH}"
ACTIVITYPUB_INBOX=false ACTIVITYPUB_INBOX=false
ACTIVITYPUB_SHAREDINBOX=false ACTIVITYPUB_SHAREDINBOX=false
HORIZON_DARKMODE=true
# Set these both "true" to enable federation. # Set these both "true" to enable federation.
# You might need to also run: # You might need to also run:

View file

@ -15,6 +15,7 @@ class Avatar extends Model
* @var array * @var array
*/ */
protected $dates = ['deleted_at']; protected $dates = ['deleted_at'];
protected $fillable = ['profile_id'];
public function profile() public function profile()
{ {

View file

@ -0,0 +1,88 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\User;
class UserCreate extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'user:create';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a new user';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->info('Creating a new user...');
$name = $this->ask('Name');
$username = $this->ask('Username');
if(User::whereUsername($username)->exists()) {
$this->error('Username already in use, please try again...');
exit;
}
$email = $this->ask('Email');
if(User::whereEmail($email)->exists()) {
$this->error('Email already in use, please try again...');
exit;
}
$password = $this->secret('Password');
$confirm = $this->secret('Confirm Password');
if($password !== $confirm) {
$this->error('Password mismatch, please try again...');
exit;
}
$is_admin = $this->confirm('Make this user an admin?');
$confirm_email = $this->confirm('Manually verify email address?');
if($this->confirm('Are you sure you want to create this user?') &&
$username &&
$name &&
$email &&
$password
) {
$user = new User;
$user->username = $username;
$user->name = $name;
$user->email = $email;
$user->password = bcrypt($password);
$user->is_admin = $is_admin;
$user->email_verified_at = $confirm_email ? now() : null;
$user->save();
$this->info('Created new user!');
}
}
}

View file

@ -0,0 +1,72 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\User;
use App\Jobs\DeletePipeline\DeleteAccountPipeline;
class UserDelete extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'user:delete {id}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Delete account';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$id = $this->argument('id');
$user = User::whereUsername($id)->orWhere('id', $id)->first();
if(!$user) {
$this->error('Could not find any user with that username or id.');
exit;
}
if($user->is_admin == true) {
$this->error('Cannot delete an admin account from CLI.');
exit;
}
if(!$this->confirm('Are you sure you want to delete this account?')) {
exit;
}
$confirmation = $this->ask('Enter the username to confirm deletion');
if($confirmation !== $user->username) {
$this->error('Username does not match, exiting...');
exit;
}
$profile = $user->profile;
$profile->status = $user->status = 'deleted';
$profile->save();
$user->save();
DeleteAccountPipeline::dispatchNow($user);
}
}

View file

@ -0,0 +1,54 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\User;
class UserShow extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'user:show {id}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Show user info';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$id = $this->argument('id');
$user = User::whereUsername($id)->orWhere('id', $id)->first();
if(!$user) {
$this->error('Could not find any user with that username or id.');
exit;
}
$this->info('User ID: ' . $user->id);
$this->info('Username: ' . $user->username);
$this->info('Email: ' . $user->email);
$this->info('Joined: ' . $user->created_at->diffForHumans());
$this->info('Status Count: ' . $user->statuses()->count());
}
}

View file

@ -0,0 +1,56 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\User;
class UserSuspend extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'user:suspend {id}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Suspend a local user.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$id = $this->argument('id');
$user = User::whereUsername($id)->orWhere('id', $id)->first();
if(!$user) {
$this->error('Could not find any user with that username or id.');
exit;
}
$this->info('Found user, username: ' . $user->username);
if($this->confirm('Are you sure you want to suspend this user?')) {
$profile = $user->profile;
$user->status = $profile->status = 'suspended';
$user->save();
$profile->save();
$this->info('User account has been suspended.');
}
}
}

View file

@ -0,0 +1,49 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\User;
class UserTable extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'user:table {limit=10}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Display latest users';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$limit = $this->argument('limit');
$headers = ['ID', 'Username', 'Name', 'Registered'];
$users = User::orderByDesc('id')->take($limit)->get(['id', 'username', 'name', 'created_at'])->toArray();
$this->table($headers, $users);
}
}

View file

@ -0,0 +1,56 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\User;
class UserUnsuspend extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'user:unsuspend {id}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Unsuspend a local user.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$id = $this->argument('id');
$user = User::whereUsername($id)->orWhere('id', $id)->first();
if(!$user) {
$this->error('Could not find any user with that username or id.');
exit;
}
$this->info('Found user, username: ' . $user->username);
if($this->confirm('Are you sure you want to unsuspend this user?')) {
$profile = $user->profile;
$user->status = $profile->status = null;
$user->save();
$profile->save();
$this->info('User account has been unsuspended.');
}
}
}

View file

@ -19,8 +19,8 @@ trait AdminSettingsController
public function settingsBackups(Request $request) public function settingsBackups(Request $request)
{ {
$path = storage_path('app/PixelFed'); $path = storage_path('app/'.config('app.name'));
$files = new \DirectoryIterator($path); $files = is_dir($path) ? new \DirectoryIterator($path) : [];
return view('admin.settings.backups', compact('files')); return view('admin.settings.backups', compact('files'));
} }
@ -106,7 +106,7 @@ trait AdminSettingsController
$sys = [ $sys = [
'pixelfed' => config('pixelfed.version'), 'pixelfed' => config('pixelfed.version'),
'php' => phpversion(), 'php' => phpversion(),
'redis' => explode(' ',exec('redis-cli -v'))[1], 'laravel' => app()->version(),
]; ];
switch (config('database.default')) { switch (config('database.default')) {
case 'pgsql': case 'pgsql':

View file

@ -30,11 +30,10 @@ class AvatarController extends Controller
$dir = $path['root']; $dir = $path['root'];
$name = $path['name']; $name = $path['name'];
$public = $path['storage']; $public = $path['storage'];
$currentAvatar = storage_path('app/'.$profile->avatar->media_path);
$loc = $request->file('avatar')->storeAs($public, $name); $loc = $request->file('avatar')->storeAs($public, $name);
$avatar = Avatar::whereProfileId($profile->id)->firstOrFail(); $avatar = Avatar::firstOrNew(['profile_id' => $profile->id]);
$opath = $avatar->media_path; $currentAvatar = $avatar->recentlyCreated ? null : storage_path('app/'.$profile->avatar->media_path);
$avatar->media_path = "$public/$name"; $avatar->media_path = "$public/$name";
$avatar->thumb_path = null; $avatar->thumb_path = null;
$avatar->change_count = ++$avatar->change_count; $avatar->change_count = ++$avatar->change_count;

33
app/Mail/EmailChange.php Normal file
View file

@ -0,0 +1,33 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class EmailChange extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->markdown('emails.notification.email_change');
}
}

View file

@ -0,0 +1,33 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class PasswordChange extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->markdown('emails.notification.password_change');
}
}

View file

@ -0,0 +1,50 @@
<?php
namespace App\Providers;
use Laravel\Horizon\Horizon;
use Illuminate\Support\Facades\Gate;
use Laravel\Horizon\HorizonApplicationServiceProvider;
class HorizonServiceProvider extends HorizonApplicationServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
parent::boot();
// Horizon::routeSmsNotificationsTo('15556667777');
// Horizon::routeMailNotificationsTo('example@example.com');
// Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');
}
/**
* Register the Horizon gate.
*
* This gate determines who can access Horizon in non-local environments.
*
* @return void
*/
protected function gate()
{
Gate::define('viewHorizon', function ($user) {
return $user->is_admin == true;
});
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
if(config('horizon.darkmode') == true) {
Horizon::night();
}
}
}

View file

@ -19,7 +19,7 @@
"greggilbert/recaptcha": "dev-master", "greggilbert/recaptcha": "dev-master",
"intervention/image": "^2.4", "intervention/image": "^2.4",
"laravel/framework": "5.8.*", "laravel/framework": "5.8.*",
"laravel/horizon": "^1.2", "laravel/horizon": "^3.0",
"laravel/passport": "^7.0", "laravel/passport": "^7.0",
"laravel/tinker": "^1.0", "laravel/tinker": "^1.0",
"league/flysystem-aws-s3-v3": "~1.0", "league/flysystem-aws-s3-v3": "~1.0",
@ -42,7 +42,7 @@
"fzaninotto/faker": "^1.4", "fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0", "mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0", "nunomaduro/collision": "^2.0",
"phpunit/phpunit": "^7.0" "phpunit/phpunit": "^7.5"
}, },
"autoload": { "autoload": {
"classmap": [ "classmap": [
@ -69,11 +69,11 @@
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
], ],
"post-create-project-cmd": [ "post-create-project-cmd": [
"@php artisan key:generate" "@php artisan key:generate --ansi"
], ],
"post-autoload-dump": [ "post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover" "@php artisan package:discover --ansi"
] ]
}, },
"config": { "config": {

42
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "8f9feb6f0dd669b7a0974809de05d8bd", "content-hash": "d7c9f518e63d20424dd17883057f5cb8",
"packages": [ "packages": [
{ {
"name": "alchemy/binary-driver", "name": "alchemy/binary-driver",
@ -71,16 +71,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.87.19", "version": "3.87.21",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "79366d3335649960f49694eb052cbdac6616f843" "reference": "266641679eea15075ea13c088f9737460351f7ab"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/79366d3335649960f49694eb052cbdac6616f843", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/266641679eea15075ea13c088f9737460351f7ab",
"reference": "79366d3335649960f49694eb052cbdac6616f843", "reference": "266641679eea15075ea13c088f9737460351f7ab",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -149,7 +149,7 @@
"s3", "s3",
"sdk" "sdk"
], ],
"time": "2019-02-26T19:08:43+00:00" "time": "2019-02-28T20:02:04+00:00"
}, },
{ {
"name": "beyondcode/laravel-self-diagnosis", "name": "beyondcode/laravel-self-diagnosis",
@ -1741,40 +1741,42 @@
}, },
{ {
"name": "laravel/horizon", "name": "laravel/horizon",
"version": "v1.4.3", "version": "v3.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/horizon.git", "url": "https://github.com/laravel/horizon.git",
"reference": "b00da78d10158036cab2f45115ecc360f2014ed4" "reference": "11acb6eafee4a0ea3bea87c6277f4342ebd2e1e3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/horizon/zipball/b00da78d10158036cab2f45115ecc360f2014ed4", "url": "https://api.github.com/repos/laravel/horizon/zipball/11acb6eafee4a0ea3bea87c6277f4342ebd2e1e3",
"reference": "b00da78d10158036cab2f45115ecc360f2014ed4", "reference": "11acb6eafee4a0ea3bea87c6277f4342ebd2e1e3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"cakephp/chronos": "^1.0", "cakephp/chronos": "^1.0",
"ext-json": "*",
"ext-pcntl": "*", "ext-pcntl": "*",
"ext-posix": "*", "ext-posix": "*",
"illuminate/contracts": "~5.5", "illuminate/contracts": "~5.7.0|~5.8.0",
"illuminate/queue": "~5.5", "illuminate/queue": "~5.7.0|~5.8.0",
"illuminate/support": "~5.5", "illuminate/support": "~5.7.0|~5.8.0",
"php": ">=7.1.0", "php": ">=7.1.0",
"predis/predis": "^1.1", "predis/predis": "^1.1",
"ramsey/uuid": "^3.5", "ramsey/uuid": "^3.5",
"symfony/debug": "~3.3|~4.0" "symfony/debug": "^4.2",
"symfony/process": "^4.2"
}, },
"require-dev": { "require-dev": {
"mockery/mockery": "~1.0", "mockery/mockery": "^1.0",
"orchestra/database": "~3.5", "orchestra/database": "^3.7",
"orchestra/testbench": "~3.5", "orchestra/testbench": "^3.7",
"phpunit/phpunit": "~6.0" "phpunit/phpunit": "^7.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.0-dev" "dev-master": "3.0-dev"
}, },
"laravel": { "laravel": {
"providers": [ "providers": [
@ -1805,7 +1807,7 @@
"laravel", "laravel",
"queue" "queue"
], ],
"time": "2018-11-01T14:03:51+00:00" "time": "2019-02-27T15:44:24+00:00"
}, },
{ {
"name": "laravel/passport", "name": "laravel/passport",

View file

@ -91,4 +91,6 @@ return [
], ],
], ],
], ],
'darkmode' => env('HORIZON_DARKMODE', false),
]; ];

2
public/vendor/horizon/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*
!.gitignore

Binary file not shown.

View file

@ -1 +0,0 @@
{"version":3,"file":"/css/app.css","sources":[],"mappings":";;;;;A","sourceRoot":""}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 648 B

View file

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="226px" height="30px" viewBox="0 0 226 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 42 (36781) - http://www.bohemiancoding.com/sketch -->
<title>horizon</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="horizon" fill="#405263">
<path d="M54.132,25 L53.488,20.856 L47.552,20.856 L47.552,5.68 L42.764,5.68 L42.764,25 L54.132,25 Z M67.432,25 L63.68,25 L63.4,23.292 C62.28,24.468 60.964,25.28 59.088,25.28 C56.904,25.28 55.364,23.964 55.364,21.472 C55.364,18.252 57.828,16.74 63.204,16.264 L63.204,16.012 C63.204,14.808 62.532,14.276 61.132,14.276 C59.592,14.276 58.164,14.668 56.708,15.312 L56.204,12.12 C57.772,11.476 59.536,11.056 61.776,11.056 C65.556,11.056 67.432,12.316 67.432,15.816 L67.432,25 Z M63.204,21.22 L63.204,18.308 C60.32,18.756 59.536,19.708 59.536,20.912 C59.536,21.78 60.068,22.256 60.852,22.256 C61.664,22.256 62.448,21.892 63.204,21.22 Z M79.08,15.312 L78.38,11 C76.364,11.14 75.216,12.428 74.376,13.996 L73.928,11.28 L70.232,11.28 L70.232,25 L74.46,25 L74.46,17.384 C75.496,16.264 77.036,15.452 79.08,15.312 Z M92.184,25 L88.432,25 L88.152,23.292 C87.032,24.468 85.716,25.28 83.84,25.28 C81.656,25.28 80.116,23.964 80.116,21.472 C80.116,18.252 82.58,16.74 87.956,16.264 L87.956,16.012 C87.956,14.808 87.284,14.276 85.884,14.276 C84.344,14.276 82.916,14.668 81.46,15.312 L80.956,12.12 C82.524,11.476 84.288,11.056 86.528,11.056 C90.308,11.056 92.184,12.316 92.184,15.816 L92.184,25 Z M87.956,21.22 L87.956,18.308 C85.072,18.756 84.288,19.708 84.288,20.912 C84.288,21.78 84.82,22.256 85.604,22.256 C86.416,22.256 87.2,21.892 87.956,21.22 Z M107.5,11.28 L103.384,11.28 L100.892,19.764 L98.344,11.084 L93.808,11.616 L98.484,25.056 L102.712,25.056 L107.5,11.28 Z M121.052,18.112 C121.052,18.532 121.024,18.98 120.968,19.204 L112.736,19.204 C112.96,21.36 114.248,22.2 116.096,22.2 C117.608,22.2 119.092,21.64 120.604,20.772 L121.024,23.74 C119.54,24.692 117.72,25.28 115.564,25.28 C111.448,25.28 108.508,23.096 108.508,18.196 C108.508,13.716 111.252,11 114.976,11 C119.176,11 121.052,14.136 121.052,18.112 Z M117.02,16.88 C116.88,14.808 116.152,13.744 114.864,13.744 C113.688,13.744 112.848,14.78 112.708,16.88 L117.02,16.88 Z M127.66,25 L127.66,4.784 L123.404,5.456 L123.404,25 L127.66,25 Z M152.692,25 L152.692,5.68 L150.76,5.68 L150.76,14.024 L140.036,14.024 L140.036,5.68 L138.104,5.68 L138.104,25 L140.036,25 L140.036,15.76 L150.76,15.76 L150.76,25 L152.692,25 Z M168.568,18.392 C168.568,22.76 165.936,25.28 162.548,25.28 C159.16,25.28 156.612,22.76 156.612,18.392 C156.612,13.996 159.216,11.476 162.548,11.476 C165.992,11.476 168.568,13.996 168.568,18.392 Z M166.664,18.392 C166.664,15.34 165.208,13.044 162.548,13.044 C159.916,13.044 158.488,15.256 158.488,18.392 C158.488,21.444 159.944,23.712 162.548,23.712 C165.236,23.712 166.664,21.528 166.664,18.392 Z M178.872,13.212 L178.564,11.476 C176.38,11.532 174.84,12.988 173.86,14.472 L173.44,11.756 L172.068,11.756 L172.068,25 L173.916,25 L173.916,16.684 C174.812,14.92 176.688,13.352 178.872,13.212 Z M184.136,7.248 C184.136,6.52 183.548,5.904 182.82,5.904 C182.092,5.904 181.476,6.52 181.476,7.248 C181.476,7.976 182.092,8.592 182.82,8.592 C183.548,8.592 184.136,7.976 184.136,7.248 Z M183.716,25 L183.716,11.756 L181.896,11.756 L181.896,25 L183.716,25 Z M197.464,25 L197.212,23.46 L189.344,23.46 L197.24,13.184 L197.24,11.756 L187.636,11.756 L187.888,13.296 L195.112,13.296 L187.216,23.572 L187.216,25 L197.464,25 Z M211.94,18.392 C211.94,22.76 209.308,25.28 205.92,25.28 C202.532,25.28 199.984,22.76 199.984,18.392 C199.984,13.996 202.588,11.476 205.92,11.476 C209.364,11.476 211.94,13.996 211.94,18.392 Z M210.036,18.392 C210.036,15.34 208.58,13.044 205.92,13.044 C203.288,13.044 201.86,15.256 201.86,18.392 C201.86,21.444 203.316,23.712 205.92,23.712 C208.608,23.712 210.036,21.528 210.036,18.392 Z M225.884,25 L225.884,15.536 C225.884,12.988 224.568,11.476 221.936,11.476 C220.144,11.476 218.632,12.428 217.176,13.716 L216.868,11.756 L215.44,11.756 L215.44,25 L217.288,25 L217.288,15.424 C218.744,13.996 220.172,13.128 221.572,13.128 C223.252,13.128 224.036,14.164 224.036,15.872 L224.036,25 L225.884,25 Z" id="Laravel-Horizon"></path>
<path d="M5.26176342,26.4094389 C2.04147988,23.6582233 0,19.5675182 0,15 C0,10.8578644 1.67893219,7.10786438 4.39339828,4.39339828 C7.10786438,1.67893219 10.8578644,0 15,0 C23.2842712,3.55271368e-15 30,6.71572875 30,15 C30,23.2842712 23.2842712,30 15,30 C11.283247,30 7.88222338,28.6482016 5.26176342,26.4094389 L5.26176342,26.4094389 Z M4.03811305,15.9222506 C5.70084247,14.4569342 6.87195416,12.5 10,12.5 C15,12.5 15,17.5 20,17.5 C23.1280454,17.5 24.2991572,15.5430664 25.961887,14.0777498 C25.4934253,8.43417206 20.7645408,4 15,4 C8.92486775,4 4,8.92486775 4,15 C4,15.3105915 4.01287248,15.6181765 4.03811305,15.9222506 L4.03811305,15.9222506 Z" id="Combined-Shape" fill-rule="nonzero"></path>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

View file

@ -172,7 +172,7 @@
<div class="list-group-item border-0" v-for="(user, index) in likes" :key="'modal_likes_'+index"> <div class="list-group-item border-0" v-for="(user, index) in likes" :key="'modal_likes_'+index">
<div class="media"> <div class="media">
<a :href="user.url"> <a :href="user.url">
<img class="mr-3 rounded-circle box-shadow" :src="user.avatar" :alt="user.username + s avatar'" width="30px"> <img class="mr-3 rounded-circle box-shadow" :src="user.avatar" :alt="user.username + 's avatar'" width="30px">
</a> </a>
<div class="media-body"> <div class="media-body">
<p class="mb-0" style="font-size: 14px"> <p class="mb-0" style="font-size: 14px">

View file

@ -671,6 +671,9 @@ export default {
.then(res => { .then(res => {
this.following = res.data; this.following = res.data;
this.followingCursor++; this.followingCursor++;
if(res.data.length < 10) {
this.followingMore = false;
}
}); });
this.$refs.followingModal.show(); this.$refs.followingModal.show();
}, },
@ -688,6 +691,9 @@ export default {
.then(res => { .then(res => {
this.followers = res.data; this.followers = res.data;
this.followerCursor++; this.followerCursor++;
if(res.data.length < 10) {
this.followerMore = false;
}
}) })
this.$refs.followerModal.show(); this.$refs.followerModal.show();
}, },
@ -702,7 +708,8 @@ export default {
if(res.data.length > 0) { if(res.data.length > 0) {
this.following.push(...res.data); this.following.push(...res.data);
this.followingCursor++; this.followingCursor++;
} else { }
if(res.data.length < 10) {
this.followingMore = false; this.followingMore = false;
} }
}); });
@ -719,7 +726,8 @@ export default {
if(res.data.length > 0) { if(res.data.length > 0) {
this.followers.push(...res.data); this.followers.push(...res.data);
this.followerCursor++; this.followerCursor++;
} else { }
if(res.data.length < 10) {
this.followerMore = false; this.followerMore = false;
} }
}); });

View file

@ -892,6 +892,9 @@
this.following = res.data; this.following = res.data;
this.followingCursor++; this.followingCursor++;
}); });
if(res.data.length < 10) {
this.followingMore = false;
}
this.$refs.followingModal.show(); this.$refs.followingModal.show();
}, },
@ -909,6 +912,9 @@
this.followers = res.data; this.followers = res.data;
this.followerCursor++; this.followerCursor++;
}) })
if(res.data.length < 10) {
this.followerMore = false;
}
this.$refs.followerModal.show(); this.$refs.followerModal.show();
}, },
@ -922,7 +928,8 @@
if(res.data.length > 0) { if(res.data.length > 0) {
this.following.push(...res.data); this.following.push(...res.data);
this.followingCursor++; this.followingCursor++;
} else { }
if(res.data.length < 10) {
this.followingMore = false; this.followingMore = false;
} }
}); });
@ -939,7 +946,8 @@
if(res.data.length > 0) { if(res.data.length > 0) {
this.followers.push(...res.data); this.followers.push(...res.data);
this.followerCursor++; this.followerCursor++;
} else { }
if(res.data.length < 10) {
this.followerMore = false; this.followerMore = false;
} }
}); });

View file

@ -211,6 +211,46 @@ body, button, input, textarea {
animation: loading-bar 3s linear infinite; animation: loading-bar 3s linear infinite;
} }
.liked {
position: relative;
z-index: 1;
}
.liked::after {
content: "\F0a3";
color: transparent;
animation: liking 1.5s;
position: absolute;
z-index: -1;
left: 50%;
top: 0;
}
@keyframes liking {
0% {
-webkit-transform:rotate(0deg);
transform:rotate(0deg);
font-size:0;
top: .25rem;
color: #ebf70e;
}
75% {
-webkit-transform:rotate(1turn);
transform:rotate(1turn);
top: -0.55rem;
font-size: 2.8rem;
opacity:1;
left: -0.55rem;
}
100% {
transform:rotate(1turn);
top: 2.5rem;
left: 0em;
font-size:0;
left: 0.9rem
}
}
.max-hide-overflow { .max-hide-overflow {
max-height: 500px; max-height: 500px;
overflow-y: hidden; overflow-y: hidden;

View file

@ -37,9 +37,9 @@
<div class="col-12 col-md-3"> <div class="col-12 col-md-3">
<div class="card mb-3 border-left-blue"> <div class="card mb-3 border-left-blue">
<div class="card-body text-center"> <div class="card-body text-center">
<p class="font-weight-ultralight h2 mb-0 text-truncate">{{$sys['redis']}}</p> <p class="font-weight-ultralight h2 mb-0 text-truncate">{{$sys['laravel']}}</p>
</div> </div>
<div class="card-footer font-weight-bold py-0 text-center bg-white">Redis</div> <div class="card-footer font-weight-bold py-0 text-center bg-white">Laravel</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -8,5 +8,5 @@ Confirm Email
@endcomponent @endcomponent
Thanks,<br> Thanks,<br>
{{ config('app.name') }} {{ config('pixelfed.domain.app') }}
@endcomponent @endcomponent

View file

@ -0,0 +1,15 @@
@component('mail::message')
# Account Email Changed
@component('mail::panel')
<p>The email associated to your account has been changed.</p>
@endcomponent
<small>If you did not make this change and believe your Pixelfed account has been compromised, please contact the instance admin.</small>
<br>
Thanks,<br>
{{ config('pixelfed.domain.app') }}
@endcomponent

View file

@ -0,0 +1,15 @@
@component('mail::message')
# Account Password Changed
@component('mail::panel')
<p>The password for your account has been changed.</p>
@endcomponent
<small>If you did not make this change and believe your Pixelfed account has been compromised, please change your password immediately or contact the instance admin if you're locked out of your account.</small>
<br>
Thanks,<br>
{{ config('pixelfed.domain.app') }}
@endcomponent

View file

@ -1,4 +1,4 @@
@extends('layouts.app',['title' => $user->username . " posted a photo: " . $status->likes_count . " likes, " . $status->comments_count . " comments" ]) @extends('layouts.app',['title' => "A post by " . $user->username])
@section('content') @section('content')
<noscript> <noscript>
@ -18,6 +18,7 @@
<meta property="og:description" content="{{ $status->caption }}"> <meta property="og:description" content="{{ $status->caption }}">
<meta property="og:image" content="{{$status->mediaUrl()}}"> <meta property="og:image" content="{{$status->mediaUrl()}}">
<link href='{{$status->url()}}' rel='alternate' type='application/activity+json'> <link href='{{$status->url()}}' rel='alternate' type='application/activity+json'>
<meta name="twitter:card" content="summary_large_image">
@endpush @endpush
@push('scripts') @push('scripts')