From a3ba68ea986a9d33084fabc199cfe98c387fe0d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sun, 22 Jul 2018 15:43:17 +0200 Subject: [PATCH] logo, improved listing, some helpers, mail confirms table, confirmed flag, user title column.. --- app/Console/Commands/ConfirmUser.php | 45 ++ app/Http/Controllers/Auth/LoginController.php | 2 +- .../Controllers/Auth/RegisterController.php | 15 +- app/Http/Controllers/HomeController.php | 20 - app/Http/Controllers/TableController.php | 64 ++- app/Http/Controllers/UserController.php | 24 + app/Models/ContentReport.php | 2 +- app/Models/EmailConfirmation.php | 26 + app/Models/Proposal.php | 6 +- app/Models/Revision.php | 9 +- app/Models/Table.php | 22 +- app/Models/TableComment.php | 8 +- app/Models/User.php | 60 ++- app/Providers/AppServiceProvider.php | 3 +- app/Providers/RouteServiceProvider.php | 6 +- app/View/Widget.php | 7 +- app/helpers.php | 21 + .../2014_10_12_000000_create_users_table.php | 5 +- ...18_07_08_193600_create_revisions_table.php | 2 + ...83900_create_email_confirmations_table.php | 32 ++ porklib/Utils/Str.php | 11 +- public/fonts/fa-dtbl-1-preview.html | 491 +++++++++++++++++- public/fonts/fa-dtbl-1.css | 53 +- public/fonts/fa-dtbl-1.eot | Bin 4804 -> 10832 bytes public/fonts/fa-dtbl-1.svg | 133 ++++- public/fonts/fa-dtbl-1.ttf | Bin 4624 -> 10652 bytes public/fonts/fa-dtbl-1.woff2 | Bin 2296 -> 5020 bytes public/images/logo.inkscape.svg | 270 ++++++++++ public/images/logo.svg | 1 + resources/assets/sass/_bst-modules.scss | 4 +- resources/assets/sass/app.scss | 19 + resources/views/auth/register.blade.php | 8 +- resources/views/form/_help.blade.php | 2 +- resources/views/form/checkbox.blade.php | 7 +- resources/views/form/input.blade.php | 41 +- resources/views/form/textarea.blade.php | 7 +- resources/views/home.blade.php | 52 -- resources/views/layouts/footer.blade.php | 2 + resources/views/layouts/main-nav.blade.php | 17 +- resources/views/table/create.blade.php | 21 +- resources/views/table/view.blade.php | 2 + resources/views/user/view.blade.php | 120 +++++ resources/views/welcome.blade.php | 26 +- routes/login.php | 13 +- routes/public.php | 22 - routes/user.php | 13 - routes/web.php | 40 ++ 47 files changed, 1462 insertions(+), 292 deletions(-) create mode 100644 app/Console/Commands/ConfirmUser.php delete mode 100644 app/Http/Controllers/HomeController.php create mode 100644 app/Http/Controllers/UserController.php create mode 100644 app/Models/EmailConfirmation.php create mode 100644 database/migrations/2018_07_22_083900_create_email_confirmations_table.php create mode 100644 public/images/logo.inkscape.svg create mode 100644 public/images/logo.svg delete mode 100644 resources/views/home.blade.php create mode 100644 resources/views/user/view.blade.php delete mode 100644 routes/public.php delete mode 100644 routes/user.php create mode 100644 routes/web.php diff --git a/app/Console/Commands/ConfirmUser.php b/app/Console/Commands/ConfirmUser.php new file mode 100644 index 0000000..daeb24e --- /dev/null +++ b/app/Console/Commands/ConfirmUser.php @@ -0,0 +1,45 @@ +argument('user')); + $u->update('confirmed', true); + $this->info("User #$u->id with e-mail $u->email and handle @$u->name was confirmed."); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index b2ea669..191b2b6 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -25,7 +25,7 @@ class LoginController extends Controller * * @var string */ - protected $redirectTo = '/home'; + protected $redirectTo = '/'; /** * Create a new controller instance. diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 8973825..f21741e 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -7,6 +7,7 @@ use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Illuminate\Foundation\Auth\RegistersUsers; +use Illuminate\Validation\Rule; class RegisterController extends Controller { @@ -28,7 +29,7 @@ class RegisterController extends Controller * * @var string */ - protected $redirectTo = '/home'; + protected $redirectTo = '/'; /** * Create a new controller instance. @@ -49,9 +50,15 @@ class RegisterController extends Controller protected function validator(array $data) { return Validator::make($data, [ - 'name' => 'required|string|max:255|regex:/^[a-zA-Z0-9_.-]+$/', + 'name' => [ + 'regex:/^[a-zA-Z0-9_.-]+$/', + 'required', + 'string', + 'max:255', + 'unique:users' + ], 'email' => 'required|string|email|max:255|unique:users', - 'password' => 'required|string|min:6|confirmed', + 'password' => 'required|string|min:6|max:1000|confirmed', // max len to foil DOS attempts ]); } @@ -65,7 +72,7 @@ class RegisterController extends Controller { return User::create([ 'name' => $data['name'], - 'title' => $data['name'], // display name - by default, init to name + 'title' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php deleted file mode 100644 index 94c3b2d..0000000 --- a/app/Http/Controllers/HomeController.php +++ /dev/null @@ -1,20 +0,0 @@ -tables()->paginate(10); - - return view('home')->with(compact('tables')); - } -} diff --git a/app/Http/Controllers/TableController.php b/app/Http/Controllers/TableController.php index d60af5d..2066139 100644 --- a/app/Http/Controllers/TableController.php +++ b/app/Http/Controllers/TableController.php @@ -8,6 +8,7 @@ use App\Models\Table; use App\Models\User; use App\Utils\Column; use Illuminate\Http\Request; +use Illuminate\Validation\Rule; use MightyPork\Exceptions\NotApplicableException; class TableController extends Controller @@ -16,7 +17,7 @@ class TableController extends Controller { /** @var Table $tableModel */ $tableModel = $user->tables()->where('name', $table)->first(); - $revision = $tableModel->activeRevision; + $revision = $tableModel->revision; return view('table.view', [ 'table' => $tableModel, @@ -54,12 +55,12 @@ class TableController extends Controller $u = \Auth::user(); $this->validate($request, [ - 'name' => 'required', - 'title' => 'string', - 'description' => 'string|nullable', - 'license' => 'string|nullable', - 'origin' => 'string|nullable', - 'columns' => 'required', + 'name' => 'required|string|max:255', + 'title' => 'string|string|max:255', + 'description' => 'string|nullable|max:4000', + 'license' => 'string|nullable|max:4000', + 'origin' => 'string|nullable|max:4000', + 'columns' => 'required|string', 'data' => 'string|nullable', ]); @@ -74,16 +75,24 @@ class TableController extends Controller // Parse and validate the columns specification /** @var Column[] $columns */ $columns = []; + $column_keys = []; // for checking duplicates $colTable = array_map('str_getcsv', explode("\n", $request->get('columns'))); + + // prevent griefing via long list of columns + if (count($colTable) > 100) return $this->backWithErrors(['columns' => "Too many columns"]); + foreach ($colTable as $col) { $col = array_map('trim', $col); - if (count($col) < 2) { - return $this->backWithErrors([ - 'columns' => "All columns must have at least name and type.", - ]); + if (count($col) < 2 || strlen($col[0])==0) { + return $this->backWithErrors(['columns' => "All columns must have at least name and type."]); } try { + if (in_array($col[0], $column_keys)) { + return $this->backWithErrors(['columns' => "Duplicate column: $col[0]"]); + } + $column_keys[] = $col[0]; + $columns[] = new Column([ 'name' => $col[0], 'type' => $col[1], @@ -93,6 +102,7 @@ class TableController extends Controller return $this->backWithErrors(['columns' => $e->getMessage()]); } } + if (count($columns) == 0) return $this->backWithErrors(['columns' => "Define at least one column"]); $rowTable = array_map('str_getcsv', explode("\n", $request->get('data'))); @@ -110,38 +120,42 @@ class TableController extends Controller } return [ 'data' => json_encode($parsed), - 'refs' => 1, ]; }, $rowTable); } catch (\Exception $e) { return $this->backWithErrors(['columns' => $e->getMessage()]); } - $revision = Revision::create([ - 'refs' => 1, // from the new table + $revisionFields = [ 'note' => "Initial revision of table $u->name/$tabName", 'columns' => json_encode($columns), - ]); + 'row_count' => count($rowsData), + ]; - $table = Table::create([ + $tableFields = [ 'owner_id' => $u->id, - 'revision_id' => $revision->id, + 'revision_id' => 0, 'name' => $tabName, 'title' => $request->get('title'), 'description' => $request->get('description'), 'license' => $request->get('license'), 'origin' => $request->get('origin'), - ]); + ]; + + \DB::transaction(function () use ($revisionFields, $tableFields, $rowsData) { + $revision = Revision::create($revisionFields); - // Attach the revision to the table, set as current - $table->revisions()->attach($revision); - $table->activeRevision()->associate($revision); + $tableFields['revision_id'] = $revision->id; // to meet the not-null constraint + $table = Table::create($tableFields); - // Spawn the rows, linked to the revision - $revision->rows()->createMany($rowsData); + // Attach the revision to the table, set as current + $table->revisions()->attach($revision); + $table->revision()->associate($revision); - // Now we create rows, a revision pointing to them, and the table using it. + // Spawn rows, linked to the revision + $revision->rows()->createMany($rowsData); + }); - return "Ok."; + return redirect(route('table.view', ['user' => $u, 'table' => $tabName])); } } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php new file mode 100644 index 0000000..4c2a871 --- /dev/null +++ b/app/Http/Controllers/UserController.php @@ -0,0 +1,24 @@ +tables() + ->with('revision:id,row_count') + ->paginate(3); + + return view('user.view')->with(compact('tables', 'user')); + } +} diff --git a/app/Models/ContentReport.php b/app/Models/ContentReport.php index d79e369..d044f02 100644 --- a/app/Models/ContentReport.php +++ b/app/Models/ContentReport.php @@ -14,8 +14,8 @@ use Illuminate\Database\Eloquent\Model; * @property int $object_id * @property int $author_id * @property string $message - * @property User $author * @property mixed $object - morph + * @property-read User $author */ class ContentReport extends Model { diff --git a/app/Models/EmailConfirmation.php b/app/Models/EmailConfirmation.php new file mode 100644 index 0000000..31ba99e --- /dev/null +++ b/app/Models/EmailConfirmation.php @@ -0,0 +1,26 @@ +belongsTo(User::class, 'user_id'); + } +} diff --git a/app/Models/Proposal.php b/app/Models/Proposal.php index 877f881..ef9973c 100644 --- a/app/Models/Proposal.php +++ b/app/Models/Proposal.php @@ -15,10 +15,10 @@ use Illuminate\Database\Eloquent\Model; * @property int $revision_id * @property int $author_id * @property string $note - * @property User $author - * @property Table $table - * @property Revision $revision * @property object $changes - JSONB + * @property-read User $author + * @property-read Table $table + * @property-read Revision $revision */ class Proposal extends Model { diff --git a/app/Models/Revision.php b/app/Models/Revision.php index fbf3321..bfe2a35 100644 --- a/app/Models/Revision.php +++ b/app/Models/Revision.php @@ -15,10 +15,11 @@ use Riesjart\Relaquent\Model\Concerns\HasRelaquentRelationships; * @property int $ancestor_id * @property string $note * @property object $columns - * @property Revision|null $parentRevision - * @property Row[]|Collection $rows - * @property Proposal|null $sourceProposal - proposal that was used to create this revision - * @property Proposal[]|Collection $dependentProposals + * @property int $row_count - cached number of rows in the revision + * @property-read Revision|null $parentRevision + * @property-read Row[]|Collection $rows + * @property-read Proposal|null $sourceProposal - proposal that was used to create this revision + * @property-read Proposal[]|Collection $dependentProposals */ class Revision extends Model { diff --git a/app/Models/Table.php b/app/Models/Table.php index de6ebd3..f07047b 100644 --- a/app/Models/Table.php +++ b/app/Models/Table.php @@ -2,9 +2,11 @@ namespace App\Models; +use App\Models\Concerns\ManyManyThrough; use App\Models\Concerns\Reportable; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; +use Riesjart\Relaquent\Model\Concerns\HasRelaquentRelationships; /** * A data table object (referencing revisions) @@ -20,15 +22,15 @@ use Illuminate\Database\Eloquent\Model; * @property string $description * @property string $license * @property string $origin - * @property User $owner - * @property Table $parentTable - * @property Table[]|Collection $forks - * @property Revision[]|Collection $revisions - * @property Revision $activeRevision - * @property Proposal[]|Collection $proposal - * @property TableComment[]|Collection $comments - * @property User[]|Collection $favouritingUsers - * @property User[]|Collection $discussionFollowers + * @property-read User $owner + * @property-read Table $parentTable + * @property-read Table[]|Collection $forks + * @property-read Revision[]|Collection $revisions + * @property-read Revision $revision + * @property-read Proposal[]|Collection $proposal + * @property-read TableComment[]|Collection $comments + * @property-read User[]|Collection $favouritingUsers + * @property-read User[]|Collection $discussionFollowers */ class Table extends Model { @@ -60,7 +62,7 @@ class Table extends Model } /** Active revision */ - public function activeRevision() + public function revision() { return $this->belongsTo(Revision::class, 'revision_id'); } diff --git a/app/Models/TableComment.php b/app/Models/TableComment.php index 6b65e30..fb25afb 100644 --- a/app/Models/TableComment.php +++ b/app/Models/TableComment.php @@ -16,10 +16,10 @@ use Illuminate\Database\Eloquent\Model; * @property int $author_id * @property int $ancestor_id * @property string $message - * @property User $author - * @property Table $table - * @property TableComment|null $ancestor - * @property TableComment[]|Collection $replies + * @property-read User $author + * @property-read Table $table + * @property-read TableComment|null $ancestor + * @property-read TableComment[]|Collection $replies */ class TableComment extends Model { diff --git a/app/Models/User.php b/app/Models/User.php index 6c426b9..81403db 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -8,6 +8,8 @@ use Illuminate\Database\Eloquent\Collection; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notification; +use MightyPork\Exceptions\ArgumentException; +use MightyPork\Exceptions\NotExistException; /** * A user in the application @@ -19,16 +21,18 @@ use Illuminate\Notifications\Notification; * @property string $title - for display * @property string $email - unique, for login and social auth chaining * @property string $password - hashed pw - * @property Proposal[]|Collection $proposals - * @property Table[]|Collection $tables - * @property OAuthIdentity[]|Collection $socialIdentities - * @property TableComment[]|Collection $tableComments - * @property Table[]|Collection $favouriteTables - * @property Table[]|Collection $followedDiscussions - * @property ContentReport[]|Collection $authoredReports - * @property Notification[]|Collection $notifications - * @property Notification[]|Collection $readNotifications - * @property Notification[]|Collection $unreadNotifications + * @property bool $confirmed - user e-mail is confirmed + * @property-read Proposal[]|Collection $proposals + * @property-read Table[]|Collection $tables + * @property-read OAuthIdentity[]|Collection $socialIdentities + * @property-read TableComment[]|Collection $tableComments + * @property-read Table[]|Collection $favouriteTables + * @property-read Table[]|Collection $followedDiscussions + * @property-read ContentReport[]|Collection $authoredReports + * @property-read Notification[]|Collection $notifications + * @property-read Notification[]|Collection $readNotifications + * @property-read Notification[]|Collection $unreadNotifications + * @property-read string $handle - user handle, including @ */ class User extends Authenticatable { @@ -137,12 +141,36 @@ class User extends Authenticatable $this->followedDiscussions()->detach($table); } - public function fakeTables() + /** + * Resolve user by a given name, id, or e-mail + * + * @param string $ident + * @return User + */ + public static function resolve($ident) { - return [ - (object)['title' => 'Table 1'], - (object)['title' => 'Table 2'], - (object)['title' => 'Table 3'] - ]; + $ident = "$ident"; + if (strlen($ident) == 0) throw new ArgumentException("Can't find user by empty string."); + + if (is_numeric($ident)) { + $u = static::find((int)$ident); + } + else if ($ident[0] == '@') { + $u = static::where('name', substr($ident, 1))->first(); + } + else { + $u = static::where('email', $ident)->first(); + } + + if (!$u) throw new NotExistException("No user found matching \"$ident\""); + + return $u; + } + + public function __get($name) + { + if ($name == 'handle') return "@$this->name"; + + return parent::__get($name); } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 9111c52..55bc903 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -22,7 +22,8 @@ class AppServiceProvider extends ServiceProvider \Route::bind('user', function ($value) { $u = User::where('name', $value)->first(); // it may also be the _id directly - if (!$u) $u = User::find($value); + if (!$u && is_numeric($value)) $u = User::find((int)$value); + if (!$u) abort(404); return $u; }); } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 69772c1..5ea48d3 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -53,11 +53,7 @@ class RouteServiceProvider extends ServiceProvider { Route::middleware('web') ->namespace($this->namespace) - ->group(base_path('routes/public.php')); - - Route::middleware(['web', 'auth']) - ->namespace($this->namespace) - ->group(base_path('routes/user.php')); + ->group(base_path('routes/web.php')); } /** diff --git a/app/View/Widget.php b/app/View/Widget.php index 4f5326c..4041400 100644 --- a/app/View/Widget.php +++ b/app/View/Widget.php @@ -19,9 +19,10 @@ class Widget { protected $attributesArray = [], $id, $name, $label, $value, - $viewName, - $help, - $labelCols, $fieldCols, + $viewName, // view to use inside the form namespace + $help, // help button with tooltip + $prepend, $append, // input-group (add-ons) + $labelCols, $fieldCols, // grid layout setting (label/field cols) $styleArray = []; public function __construct($viewName, $name, $label) diff --git a/app/helpers.php b/app/helpers.php index 08be97b..b93192b 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -1,3 +1,24 @@ timestamps(); $table->string('name')->unique(); $table->string('title')->index(); + $table->text('bio')->nullable(); + $table->text('website')->nullable(); $table->string('email')->unique(); // would have to be nullable if we supported login via providers that don't give us e-mail - $table->string('password')->nullable(); + $table->string('password')->nullable(); // null if registered via provider and not set a pw yet + $table->boolean('confirmed')->default(false); // set to 1 after e-mail is verified $table->rememberToken(); }); } diff --git a/database/migrations/2018_07_08_193600_create_revisions_table.php b/database/migrations/2018_07_08_193600_create_revisions_table.php index 3dc32f1..3a339b5 100644 --- a/database/migrations/2018_07_08_193600_create_revisions_table.php +++ b/database/migrations/2018_07_08_193600_create_revisions_table.php @@ -18,6 +18,8 @@ class CreateRevisionsTable extends Migration $table->timestamps(); $table->unsignedInteger('ancestor_id')->index()->nullable(); // parent revision + $table->unsignedInteger('row_count'); // cached nbr of rows + // columns specification // array with: {name, title, type} $table->jsonb('columns'); diff --git a/database/migrations/2018_07_22_083900_create_email_confirmations_table.php b/database/migrations/2018_07_22_083900_create_email_confirmations_table.php new file mode 100644 index 0000000..5f64e76 --- /dev/null +++ b/database/migrations/2018_07_22_083900_create_email_confirmations_table.php @@ -0,0 +1,32 @@ +unsignedInteger('user_id')->index(); + $table->timestamp('created_at')->nullable(); + $table->string('token'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('email_confirmations'); + } +} diff --git a/porklib/Utils/Str.php b/porklib/Utils/Str.php index 7c72f8a..0cdf125 100644 --- a/porklib/Utils/Str.php +++ b/porklib/Utils/Str.php @@ -654,11 +654,18 @@ class Str extends \Illuminate\Support\Str return preg_replace('/,\s*([}\]])/s','\1', $str); } - public static function ellipsis($str, $maxlen) + public static function ellipsis($str, $maxlen, $margin=10) { $len = mb_strlen($str); if ($len > $maxlen) { - return mb_substr($str, 0, $maxlen) . '…'; + $hard = mb_substr($str, 0, $maxlen); + + $lastspace = mb_strrpos($hard, ' '); + if ($lastspace > $maxlen - $margin) { + $hard = mb_substr($hard, 0, $lastspace); + } + + return $hard . '…'; } return $str; diff --git a/public/fonts/fa-dtbl-1-preview.html b/public/fonts/fa-dtbl-1-preview.html index 0fa4298..2540925 100644 --- a/public/fonts/fa-dtbl-1-preview.html +++ b/public/fonts/fa-dtbl-1-preview.html @@ -161,18 +161,47 @@ [data-icon]:before { content: attr(data-icon); } [data-icon]:before, - .fa-check:before, + .fa-bell:before, +.fa-bell-o:before, +.fa-calendar:before, +.fa-check:before, +.fa-clock-o:before, +.fa-cloud-upload:before, +.fa-code-fork:before, +.fa-download:before, +.fa-eye:before, +.fa-eye-slash:before, .fa-facebook-square:before, +.fa-filter:before, +.fa-flag:before, .fa-floppy-o:before, +.fa-gavel:before, .fa-github:before, .fa-google:before, +.fa-history:before, +.fa-link:before, +.fa-pencil-square-o:before, .fa-question-circle:before, +.fa-quote-left:before, +.fa-reply:before, +.fa-rss:before, +.fa-search:before, +.fa-share-alt:before, .fa-sign-in:before, .fa-sign-out:before, +.fa-sliders:before, +.fa-sort:before, +.fa-sort-asc:before, +.fa-sort-desc:before, +.fa-star:before, +.fa-star-o:before, +.fa-table:before, .fa-times:before, +.fa-trash:before, .fa-trash-o:before, .fa-user-circle-o:before, -.fa-user-plus:before { +.fa-user-plus:before, +.fa-wrench:before { display: inline-block; font-family: "fa-dtbl-1"; font-style: normal; @@ -187,18 +216,47 @@ font-smoothing: antialiased; } - .fa-check:before { content: "\f100"; } -.fa-facebook-square:before { content: "\f101"; } -.fa-floppy-o:before { content: "\f102"; } -.fa-github:before { content: "\f103"; } -.fa-google:before { content: "\f104"; } -.fa-question-circle:before { content: "\f105"; } -.fa-sign-in:before { content: "\f106"; } -.fa-sign-out:before { content: "\f107"; } -.fa-times:before { content: "\f108"; } -.fa-trash-o:before { content: "\f109"; } -.fa-user-circle-o:before { content: "\f10a"; } -.fa-user-plus:before { content: "\f10b"; } + .fa-bell:before { content: "\f100"; } +.fa-bell-o:before { content: "\f101"; } +.fa-calendar:before { content: "\f102"; } +.fa-check:before { content: "\f103"; } +.fa-clock-o:before { content: "\f104"; } +.fa-cloud-upload:before { content: "\f105"; } +.fa-code-fork:before { content: "\f106"; } +.fa-download:before { content: "\f107"; } +.fa-eye:before { content: "\f108"; } +.fa-eye-slash:before { content: "\f109"; } +.fa-facebook-square:before { content: "\f10a"; } +.fa-filter:before { content: "\f10b"; } +.fa-flag:before { content: "\f10c"; } +.fa-floppy-o:before { content: "\f10d"; } +.fa-gavel:before { content: "\f10e"; } +.fa-github:before { content: "\f10f"; } +.fa-google:before { content: "\f110"; } +.fa-history:before { content: "\f111"; } +.fa-link:before { content: "\f112"; } +.fa-pencil-square-o:before { content: "\f113"; } +.fa-question-circle:before { content: "\f114"; } +.fa-quote-left:before { content: "\f115"; } +.fa-reply:before { content: "\f116"; } +.fa-rss:before { content: "\f117"; } +.fa-search:before { content: "\f118"; } +.fa-share-alt:before { content: "\f119"; } +.fa-sign-in:before { content: "\f11a"; } +.fa-sign-out:before { content: "\f11b"; } +.fa-sliders:before { content: "\f11c"; } +.fa-sort:before { content: "\f11d"; } +.fa-sort-asc:before { content: "\f11e"; } +.fa-sort-desc:before { content: "\f11f"; } +.fa-star:before { content: "\f120"; } +.fa-star-o:before { content: "\f121"; } +.fa-table:before { content: "\f122"; } +.fa-times:before { content: "\f123"; } +.fa-trash:before { content: "\f124"; } +.fa-trash-o:before { content: "\f125"; } +.fa-user-circle-o:before { content: "\f126"; } +.fa-user-plus:before { content: "\f127"; } +.fa-wrench:before { content: "\f128"; } @@ -214,11 +272,50 @@
-

fa-dtbl-1 contains 12 glyphs:

+

fa-dtbl-1 contains 41 glyphs:

Toggle Preview Characters
+
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+
PpPpPpPpPpPpPpPpPpPp @@ -228,7 +325,85 @@
- + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ +
@@ -241,7 +416,33 @@
- + +
+ + +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ +
@@ -255,7 +456,21 @@
- + +
+ + +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
@@ -268,7 +483,7 @@
- +
@@ -281,7 +496,47 @@
- + +
+ + +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
@@ -294,7 +549,72 @@
- + +
+ + +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ +
@@ -307,7 +627,7 @@
- +
@@ -320,7 +640,98 @@
- + +
+ + +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ + +
+
+ +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ +
@@ -334,7 +745,20 @@
- + +
+ + +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ +
@@ -347,7 +771,7 @@
- +
@@ -360,7 +784,7 @@
- +
@@ -373,7 +797,20 @@
- + +
+ + +
+
+ PpPpPpPpPpPpPpPpPpPp +
+
+ 12141618212436486072 +
+
+ +
diff --git a/public/fonts/fa-dtbl-1.css b/public/fonts/fa-dtbl-1.css index 138f940..dba08d5 100644 --- a/public/fonts/fa-dtbl-1.css +++ b/public/fonts/fa-dtbl-1.css @@ -38,15 +38,44 @@ font-smoothing: antialiased; } -.fa-check::before { content: "\f100"; } -.fa-facebook-square::before { content: "\f101"; } -.fa-floppy-o::before, .fa-save::before { content: "\f102"; } -.fa-github::before { content: "\f103"; } -.fa-google::before { content: "\f104"; } -.fa-question-circle::before { content: "\f105"; } -.fa-sign-in::before { content: "\f106"; } -.fa-sign-out::before { content: "\f107"; } -.fa-times::before, .fa-close::before { content: "\f108"; } -.fa-trash-o::before { content: "\f109"; } -.fa-user-circle-o::before { content: "\f10a"; } -.fa-user-plus::before { content: "\f10b"; } +.fa-bell::before { content: "\f100"; } +.fa-bell-o::before { content: "\f101"; } +.fa-calendar::before { content: "\f102"; } +.fa-check::before { content: "\f103"; } +.fa-clock-o::before { content: "\f104"; } +.fa-cloud-upload::before { content: "\f105"; } +.fa-code-fork::before { content: "\f106"; } +.fa-download::before { content: "\f107"; } +.fa-eye::before { content: "\f108"; } +.fa-eye-slash::before { content: "\f109"; } +.fa-facebook-square::before { content: "\f10a"; } +.fa-filter::before { content: "\f10b"; } +.fa-flag::before { content: "\f10c"; } +.fa-floppy-o::before, .fa-save::before { content: "\f10d"; } +.fa-gavel::before, .fa-legal::before { content: "\f10e"; } +.fa-github::before { content: "\f10f"; } +.fa-google::before { content: "\f110"; } +.fa-history::before { content: "\f111"; } +.fa-link::before { content: "\f112"; } +.fa-pencil-square-o::before, .fa-edit::before { content: "\f113"; } +.fa-question-circle::before { content: "\f114"; } +.fa-quote-left::before { content: "\f115"; } +.fa-reply::before { content: "\f116"; } +.fa-rss::before { content: "\f117"; } +.fa-search::before { content: "\f118"; } +.fa-share-alt::before { content: "\f119"; } +.fa-sign-in::before { content: "\f11a"; } +.fa-sign-out::before { content: "\f11b"; } +.fa-sliders::before { content: "\f11c"; } +.fa-sort::before { content: "\f11d"; } +.fa-sort-asc::before { content: "\f11e"; } +.fa-sort-desc::before { content: "\f11f"; } +.fa-star::before { content: "\f120"; } +.fa-star-o::before { content: "\f121"; } +.fa-table::before { content: "\f122"; } +.fa-times::before, .fa-close::before { content: "\f123"; } +.fa-trash::before { content: "\f124"; } +.fa-trash-o::before { content: "\f125"; } +.fa-user-circle-o::before { content: "\f126"; } +.fa-user-plus::before { content: "\f127"; } +.fa-wrench::before { content: "\f128"; } diff --git a/public/fonts/fa-dtbl-1.eot b/public/fonts/fa-dtbl-1.eot index 3cea9014ad7e56f6a32e6c5181f6b8654636e22b..ba2b8b536a20d1cee49fb9e89064a620cd64fcdc 100644 GIT binary patch delta 6539 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 E2apnxtpET3 diff --git a/public/fonts/fa-dtbl-1.svg b/public/fonts/fa-dtbl-1.svg index cb7fc6f..1f6fdde 100644 --- a/public/fonts/fa-dtbl-1.svg +++ b/public/fonts/fa-dtbl-1.svg @@ -1,11 +1,11 @@ -Created by FontForge 20170805 at Sat Jul 21 17:17:47 2018 +Created by FontForge 20170805 at Sun Jul 22 15:14:07 2018 By ondra The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/OFL). Fork Awesome is a fork based of off Font Awesome 4.7.0 by Dave Gandy. More info on licenses at https://forkawesome.github.io @@ -19,54 +19,155 @@ The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/ panose-1="2 0 5 3 0 0 0 0 0 0" ascent="1536" descent="-256" - bbox="0 -256 2048 1536" + bbox="-0.0376684 -256 2048 1536" underline-thickness="89.6" underline-position="-179.2" - unicode-range="U+0020-F10B" + unicode-range="U+0020-F128" /> - + + + - + + + + + + - + + - + - - + + + - + + + + + - - + + + + + + + - + - - + diff --git a/public/fonts/fa-dtbl-1.ttf b/public/fonts/fa-dtbl-1.ttf index 9fa1282d83d4f8ac1472b3261b6a10ea75dc913c..5b07fa029a38e36c99d6ab39158d3a9e03d60029 100644 GIT binary patch literal 10652 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 delta 638 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/logo.svg b/public/images/logo.svg new file mode 100644 index 0000000..3a46cbf --- /dev/null +++ b/public/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/assets/sass/_bst-modules.scss b/resources/assets/sass/_bst-modules.scss index e2397dd..d1b64f9 100644 --- a/resources/assets/sass/_bst-modules.scss +++ b/resources/assets/sass/_bst-modules.scss @@ -10,12 +10,12 @@ @import "~bootstrap/scss/transitions"; @import "~bootstrap/scss/dropdown"; @import "~bootstrap/scss/button-group"; -//@import "~bootstrap/scss/input-group"; +@import "~bootstrap/scss/input-group"; @import "~bootstrap/scss/custom-forms"; //@import "~bootstrap/scss/nav"; @import "~bootstrap/scss/navbar"; @import "~bootstrap/scss/card"; -//@import "~bootstrap/scss/breadcrumb"; +@import "~bootstrap/scss/breadcrumb"; @import "~bootstrap/scss/pagination"; @import "~bootstrap/scss/badge"; //@import "~bootstrap/scss/jumbotron"; diff --git a/resources/assets/sass/app.scss b/resources/assets/sass/app.scss index 9530fda..5c40212 100644 --- a/resources/assets/sass/app.scss +++ b/resources/assets/sass/app.scss @@ -7,15 +7,33 @@ @import "variables"; @import "bst-modules"; +// generic hiding class +.hidden { + display: none !important; +} + +// padding right for icons (must not use space next to it!) +.fa-pr::before { + margin-right: ($spacer*.5); +} + +// button in card header, adjusting margins to not stretch the header +.card-header .btn { + margin-top: -3px; + margin-bottom: -10px; +} + html { overflow-y: scroll; } +// help bubble icon .form-help { display: inline-block; margin-top: $form-text-margin-top; } +// tooltip tweaking .tooltip-inner { text-align: left; } @@ -24,6 +42,7 @@ html { box-shadow: 0 2px 5px rgba(black, .3); } +// layout tweaks .page-navbar { background: white; border-bottom: 1px solid $primary; diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index f73732f..6a39af7 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -13,12 +13,12 @@ @php(Widget::setLayout(4, 6)) - {!! Widget::text('name', 'Name')->required()->autofocus() + {!! Widget::text('name', 'Username')->required()->prepend('@') ->help('This will be part of your vanity URL; only letters, digits and - some symbols are allowed. You can always change this later, and even - set a different Display Name.') !!} + some symbols are allowed. You can always change this later.') !!} - {!! Widget::email('email', 'E-Mail Address')->required()->autofocus() !!} + {!! Widget::email('email', 'E-Mail Address')->required()->autofocus() + ->help('Used to login and for password reset e-mails') !!} {!! Widget::password('password', 'Password')->required() !!} {!! Widget::password('password_confirmation', 'Confirm Password')->required() !!} diff --git a/resources/views/form/_help.blade.php b/resources/views/form/_help.blade.php index 33105c4..134c443 100644 --- a/resources/views/form/_help.blade.php +++ b/resources/views/form/_help.blade.php @@ -1,4 +1,4 @@ -
+
@if($w->help) value?'checked':''}} name="{{ $w->name }}"> - + + @include('form._help', ['mobile' => true])
@if ($errors->has($w->name)) @@ -18,5 +21,5 @@ @endif
- @include('form._help') + @include('form._help', ['mobile' => false]) diff --git a/resources/views/form/input.blade.php b/resources/views/form/input.blade.php index 4a592a0..600aa66 100644 --- a/resources/views/form/input.blade.php +++ b/resources/views/form/input.blade.php @@ -3,19 +3,36 @@ @endphp
- +
- attributes !!}> +
+ @if($w->prepend) +
+ {{$w->prepend}} +
+ @endif - @if ($errors->has($w->name)) - - {{ $errors->first($w->name) }} - - @endif + attributes !!}> + + @if($w->append) +
+ {{$w->append}} +
+ @endif + + @if ($errors->has($w->name)) + + {{ $errors->first($w->name) }} + + @endif +
- @include('form._help') + @include('form._help', ['mobile' => false])
diff --git a/resources/views/form/textarea.blade.php b/resources/views/form/textarea.blade.php index 410e055..3291e1d 100644 --- a/resources/views/form/textarea.blade.php +++ b/resources/views/form/textarea.blade.php @@ -3,7 +3,10 @@ @endphp
- +