refactor: replace custom CRM with Monica fork
Some checks failed
Build & Push Monica Image to Gitea Registry / build-and-push (push) Failing after 9s

This commit is contained in:
Kroonk
2026-05-22 16:19:55 +02:00
parent 38cc4c09ca
commit a213a1dba0
2215 changed files with 242567 additions and 6015 deletions

View File

@@ -0,0 +1,49 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="signup-box">
<div class="dt w-100">
<div class="dtc tc">
<img src="img/monica.svg" width="97" height="88" alt="">
</div>
</div>
<h2>{{ trans('auth.email_change_title') }}</h2>
<h3>{{ trans('auth.login_again') }}</h3>
@include ('partials.errors')
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<form action="settings/emailchange1" method="post">
@csrf
<div class="form-group">
<label>{{ trans('auth.email_change_current_email') }}</label>
{{ $email }}
<input type="hidden" class="form-control" id="email" name="email" value="{{ $email }}" required autocomplete="email" autofocus>
</div>
<div class="form-group">
<label for="password">{{ trans('auth.password') }}</label>
<input type="password" class="form-control" id="password" name="password" required autocomplete="current-password">
</div>
<div class="form-group actions">
<button type="submit" class="btn btn-primary">{{ trans('auth.login') }}</button>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
@endsection

View File

@@ -0,0 +1,50 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="signup-box">
<div class="dt w-100">
<div class="dtc tc">
<img src="img/monica.svg" width="97" height="88" alt="">
</div>
</div>
<h2>{{ trans('auth.email_change_title') }}</h2>
@include ('partials.errors')
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<form action="settings/emailchange2" method="POST">
@csrf
<div class="form-group">
<label>{{ trans('auth.email_change_current_email') }}</label>
{{ $email }}
</div>
{{-- email address --}}
<div class="form-group">
<label for="newmail">{{ trans('auth.email_change_new') }}</label>
<input type="email" class="form-control" name="newmail" id="newmail" placeholder="{{ trans('settings.email_placeholder') }}" required autocomplete="email" autofocus>
<small id="emailHelp" class="form-text text-muted">{{ trans('settings.email_help') }}</small>
</div>
<button type="submit" class="btn btn-primary">{{ trans('app.save') }}</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1 @@
{{ trans('auth.password_reset_email_content') }}&nbsp;<a href="{{ $link = url('password/reset', $token).'?email='.urlencode($user->getEmailForPasswordReset()) }}">{{ $link }}</a>

View File

@@ -0,0 +1,82 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="signup-box">
<div class="dt w-100">
<div class="dtc tc">
<img src="img/monica.svg" width="97" height="88" alt="">
</div>
</div>
<h2>{{ trans('auth.login_to_account') }}</h2>
@include ('partials.errors')
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
@if (session('confirmation-success'))
<div class="alert alert-success">
{{ session('confirmation-success') }}
</div>
@endif
@if (session('confirmation-danger'))
<div class="alert alert-danger">
{!! __(session('confirmation-danger'), ['url' => 'confirmation/resend']) !!}
</div>
<div class="alert alert-danger">
{!! trans('auth.confirmation_again', ['url' => 'settings/emailchange1']) !!}
</div>
@endif
<form action="login" method="post">
@csrf
<div class="form-group">
<label for="email">{{ trans('auth.email') }}</label>
<input type="email" class="form-control" id="email" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
</div>
<div class="form-group">
<label for="password">{{ trans('auth.password') }}</label>
<input type="password" class="form-control" id="password" name="password" required autocomplete="current-password">
</div>
<div class="form-group actions">
<button type="submit" class="btn btn-primary">{{ trans('auth.login') }}</button>
</div>
<div class="checkbox">
<label for="remember">
<input type="checkbox" name="remember" id="remember" checked>&nbsp;{{ trans('auth.button_remember') }}
</label>
</div>
<div class="form-group links">
<ul>
<li>{{ trans('auth.password_forget') }}&nbsp;<a href="{{ route('password.request') }}">{{ trans('auth.password_reset') }}</a></li>
</ul>
</div>
<div class="form-group links">
<ul>
@if(! config('monica.disable_signup'))
<li>{{ trans('auth.signup_no_account') }}&nbsp;<a href="register">{{ trans('auth.signup') }}</a></li>
@elseif(! \App\Helpers\InstanceHelper::hasAtLeastOneAccount())
<li>{!! trans('auth.create_account', ['url' => 'register']) !!}</li>
@endif
</ul>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
@endsection

View File

@@ -0,0 +1,61 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="signup-box">
<div class="dt w-100">
<div class="dtc tc">
<img src="img/monica.svg" width="97" height="88" alt="">
</div>
</div>
<h2>{{ trans('auth.login_to_account') }}</h2>
@include ('partials.errors')
<form action="{{ route('oauth.login') }}" method="post">
@csrf
<div class="form-group">
<label for="email">{{ trans('auth.email') }}</label>
<input type="email" class="form-control" id="email" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
</div>
<div class="form-group">
<label for="password">{{ trans('auth.password') }}</label>
<input type="password" class="form-control" id="password" name="password" required autocomplete="current-password">
</div>
<div class="form-group actions">
<button type="submit" class="btn btn-primary">{{ trans('auth.login') }}</button>
</div>
@if (isset($errors))
@if (count($errors) > 0)
<div class="form-group links">
<ul>
<li>{{ trans('auth.password_forget') }}&nbsp;<a href="{{ route('password.request') }}">{{ trans('auth.password_reset') }}</a></li>
</ul>
</div>
@endif
@endif
<div class="form-group links">
<ul>
@if(! config('monica.disable_signup'))
<li>{{ trans('auth.signup_no_account') }}&nbsp;<a href="register">{{ trans('auth.signup') }}</a></li>
@elseif(! \App\Helpers\InstanceHelper::hasAtLeastOneAccount())
<li>{!! trans('auth.create_account', ['url' => 'register']) !!}</li>
@endif
</ul>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
@endsection

View File

@@ -0,0 +1,39 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="signup-box">
<h2>{{ trans('auth.password_reset_title') }}</h2>
@include ('partials.errors')
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<form action="{{ route('password.email') }}" method="post">
@csrf
<div class="form-group">
<label for="email">{{ trans('auth.password_reset_email') }}</label>
<input type="email" class="form-control" id="email" name="email" value="{{ $email ?? old('email') }}" required autocomplete="email" autofocus>
</div>
<div class="form-group actions">
<button type="submit" class="btn btn-primary">
<i class="fa fa-btn fa-envelope"></i>&nbsp;{{ trans('auth.password_reset_send_link') }}
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
@endsection

View File

@@ -0,0 +1,49 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="signup-box">
<h2>{{ trans('auth.password_reset_title') }}</h2>
@include ('partials.errors')
<form action="{{ route('password.update') }}" method="post">
@csrf
<input type="hidden" name="token" value="{{ $token }}">
<div class="form-group">
<label for="email">{{ trans('auth.password_reset_email') }}</label>
<input type="email" class="form-control" id="email" name="email" value="{{ $email ?? old('email') }}" required autocomplete="email" autofocus>
</div>
<div class="form-group{{ $errors->has('password') ? ' is-invalid' : '' }}">
<label for="password">{{ trans('auth.password_reset_password') }}</label>
<input type="password" class="form-control" id="password" name="password" required autocomplete="new-password">
</div>
<div class="form-group">
<label for="password-confirm">{{ trans('auth.password_reset_password_confirm') }}</label>
<input type="password" class="form-control" id="password-confirm" name="password_confirmation" required autocomplete="new-password">
</div>
<div class="form-group actions">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
<i class="fa fa-btn fa-refresh"></i>&nbsp;{{ trans('auth.password_reset_action') }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
@endsection

View File

@@ -0,0 +1,49 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="signup-box">
<div class="dt w-100">
<div class="dtc tc">
<img src="img/monica.svg" width="97" height="88" alt="">
</div>
</div>
<h2>{{ trans('auth.login_with_recovery') }}</h2>
@include ('partials.errors')
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<form action="{{ route('recovery.login') }}" method="post">
@csrf
<div class="form-group">
<label for="recovery">{{ trans('auth.recovery') }}</label>
<input type="recovery" class="form-control" id="recovery" name="recovery">
</div>
<div class="form-group actions">
<div class="row">
<div class="col-12 col-md-6">
<button type="submit" class="btn btn-primary">{{ trans('auth.login') }}</button>
</div>
<div class="col-12 col-md-6">
<a href="login" class="btn btn-secondary w-100 mb2 pb0-ns tc" style="margin-top: 10px">{{ trans('app.cancel') }}</a>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
@endsection

View File

@@ -0,0 +1,109 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="tc">
<ul class="horizontal f6 relative mb3 light-silver">
<li class="mr2">
<span class="relative" style="top: 3px;">
<svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.23334 13.8167C7.21667 13.8167 7.18334 13.8167 7.16667 13.8C6.05001 13.5 6.10001 12.45 6.13334 11.5833C6.15001 11.1833 6.16667 10.8 6.08334 10.5167C6.00001 10.2667 5.83334 10.1167 5.65001 9.94999C5.46667 9.78332 5.26667 9.59999 5.15001 9.33332C5.00001 9.01665 4.98334 8.68332 4.98334 8.34999C4.98334 8.14999 4.98334 7.96665 4.93334 7.79999C4.86667 7.51665 4.73334 7.44999 4.46667 7.33332C4.35001 7.28332 4.21667 7.21665 4.06667 7.13332C3.88334 7.01665 3.71667 6.88332 3.56667 6.74999C3.46667 6.66665 3.36667 6.56665 3.25001 6.49999C3.06667 6.36665 2.95001 6.33332 2.73334 6.28332C2.68334 6.26665 2.63334 6.26665 2.58334 6.24999C1.93334 6.08332 1.78334 5.53332 1.65001 5.09999C1.50001 4.59999 1.35001 3.93332 1.40001 3.23332C1.41667 3.09999 1.53334 2.98332 1.66667 2.99999C1.80001 3.01665 1.91667 3.13332 1.90001 3.26665C1.86667 3.76665 1.93334 4.28332 2.13334 4.96665C2.26667 5.44999 2.36667 5.66665 2.70001 5.76665C2.75001 5.78332 2.80001 5.78332 2.83334 5.79999C3.06667 5.86665 3.26667 5.91665 3.53334 6.09999C3.65001 6.18332 3.76667 6.28332 3.86667 6.38332C4.01667 6.51665 4.15001 6.63332 4.30001 6.71665C4.40001 6.78332 4.51667 6.83332 4.63334 6.88332C4.93334 7.01665 5.28334 7.16665 5.40001 7.71665C5.45001 7.93332 5.45001 8.14999 5.45001 8.36665C5.45001 8.64999 5.46667 8.91665 5.56667 9.13332C5.65001 9.31665 5.80001 9.44999 5.95001 9.58332C6.16667 9.78332 6.41667 9.99999 6.53334 10.3833C6.65001 10.75 6.63334 11.2 6.61667 11.6333C6.58334 12.3167 6.60001 12.8167 6.86667 13.1C6.81667 12.7833 6.80001 12.4333 6.98334 12.2C7.16667 11.9667 7.43334 11.85 7.70001 11.75C7.86667 11.6833 8.01667 11.6167 8.11667 11.5333C8.38334 11.3333 8.43334 11.15 8.50001 10.7833L8.51667 10.7333C8.60001 10.4 8.85001 10.25 9.05001 10.1333C9.13334 10.0833 9.21667 10.0333 9.28334 9.98332C9.56667 9.73332 9.98334 9.14999 9.98334 8.73332C9.98334 8.59999 9.95001 8.49999 9.86667 8.41665C9.73334 8.29999 9.55001 8.21665 9.35001 8.13332C9.23334 8.08332 9.11667 8.03332 9.00001 7.96665C8.76667 7.83332 8.61667 7.64999 8.48334 7.49999C8.40001 7.39999 8.31667 7.29999 8.21667 7.21665C8.06667 7.09999 7.85001 7.08332 7.61667 7.04999C7.48334 7.03332 7.36667 7.01665 7.23334 6.99999C7.01667 6.94999 6.80001 6.86665 6.61667 6.79999C6.43334 6.73332 6.26667 6.66665 6.10001 6.61665C5.73334 6.51665 5.38334 6.59999 4.98334 6.68332C4.50001 6.78332 4.18334 6.81665 4.01667 6.16665C3.98334 6.04999 3.86667 5.99999 3.63334 5.93332C3.33334 5.84999 2.76667 5.68332 2.96667 4.91665C3.06667 4.49999 3.40001 4.16665 3.83334 4.04999C4.15001 3.94999 4.46667 3.98332 4.75001 4.09999C4.88334 3.59999 5.20001 3.18332 5.48334 2.81665C5.96667 2.19999 6.33334 2.13332 7.06667 2.14999H7.10001C7.11667 2.14999 7.15001 2.14999 7.18334 2.14999C7.15001 2.11665 7.10001 2.08332 7.06667 2.06665C6.95001 1.98332 6.83334 1.91665 6.76667 1.79999C6.66667 1.64999 6.58334 1.46665 6.51667 1.29999C6.36667 0.949987 6.25001 0.716654 6.05001 0.683321C5.91667 0.666654 5.81667 0.533321 5.83334 0.383321C5.85001 0.233321 5.98334 0.149987 6.13334 0.166654C6.63334 0.249987 6.83334 0.716654 6.98334 1.08332C7.05001 1.23332 7.11667 1.38332 7.18334 1.48332C7.21667 1.51665 7.30001 1.58332 7.36667 1.63332C7.51667 1.73332 7.70001 1.86665 7.75001 2.04999C7.81667 2.24999 7.75001 2.38332 7.70001 2.44999C7.55001 2.64999 7.28334 2.64999 7.10001 2.63332H7.06667C6.45001 2.61665 6.25001 2.64999 5.88334 3.09999C5.56667 3.49999 5.21667 3.98332 5.18334 4.49999C5.18334 4.59999 5.11667 4.68332 5.01667 4.71665C4.93334 4.74999 4.81667 4.73332 4.75001 4.66665C4.55001 4.48332 4.25001 4.41665 3.96667 4.49999C3.70001 4.58332 3.51667 4.76665 3.45001 5.01665C3.38334 5.31665 3.43334 5.33332 3.76667 5.41665C4.03334 5.49999 4.40001 5.59999 4.51667 6.01665C4.55001 6.14999 4.56667 6.19999 4.58334 6.21665C4.63334 6.21665 4.78334 6.18332 4.88334 6.16665C5.31667 6.08332 5.73334 5.98332 6.21667 6.11665C6.41667 6.16665 6.60001 6.23332 6.78334 6.31665C6.96667 6.38332 7.15001 6.46665 7.33334 6.49999C7.43334 6.51665 7.53334 6.53332 7.65001 6.54999C7.93334 6.58332 8.25001 6.61665 8.51667 6.83332C8.65001 6.94999 8.76667 7.06665 8.85001 7.18332C8.96667 7.31665 9.06667 7.44999 9.21667 7.53332C9.31667 7.58332 9.41667 7.63332 9.51667 7.68332C9.75001 7.78332 9.98334 7.88332 10.1667 8.06665C10.35 8.24999 10.45 8.48332 10.45 8.76665C10.4333 9.39999 9.90001 10.1 9.56667 10.3833C9.46667 10.4667 9.35001 10.5333 9.26667 10.6C9.10001 10.7 9.00001 10.7667 8.96667 10.8833L8.95001 10.9333C8.86667 11.3333 8.78334 11.65 8.36667 11.9667C8.21667 12.0833 8.01667 12.1667 7.83334 12.25C7.63334 12.3333 7.41667 12.4333 7.31667 12.55C7.21667 12.6667 7.30001 13.0667 7.33334 13.3C7.35001 13.4 7.36667 13.5 7.38334 13.5833C7.40001 13.6667 7.36667 13.75 7.30001 13.8C7.35001 13.7833 7.28334 13.8167 7.23334 13.8167Z" fill="black"/>
<path d="M7.5 15C3.36667 15 0 11.6333 0 7.5C0 3.36667 3.36667 0 7.5 0C11.6333 0 15 3.36667 15 7.5C15 11.6333 11.6333 15 7.5 15ZM7.5 0.516667C3.65 0.516667 0.516667 3.65 0.516667 7.5C0.516667 11.35 3.65 14.4833 7.5 14.4833C11.35 14.4833 14.4833 11.35 14.4833 7.5C14.4833 3.65 11.35 0.516667 7.5 0.516667Z" fill="black"/>
<path d="M13.3167 8.28333C13.1167 8.28333 12.9167 8.21666 12.75 8.09999C12.15 7.68333 11.9833 6.71666 11.95 6.53333C11.9 6.18333 11.9167 5.79999 11.9333 5.41666C11.95 4.76666 11.9833 4.09999 11.6667 3.59999C11.6 3.48333 11.4667 3.38333 11.35 3.26666C11.15 3.09999 10.9333 2.91666 10.9667 2.64999C10.9833 2.49999 11.1 2.38333 11.2333 2.28333C11.0833 2.19999 10.9167 2.14999 10.75 2.09999C10.2833 1.96666 9.71667 1.79999 9.75 0.899994C9.75 0.766661 9.86667 0.649994 10.0167 0.649994C10.15 0.649994 10.2667 0.766661 10.2667 0.916661C10.25 1.41666 10.45 1.46666 10.9 1.59999C11.2167 1.69999 11.6 1.79999 11.8833 2.14999C11.9333 2.21666 11.95 2.29999 11.9333 2.36666C11.9167 2.43333 11.8667 2.51666 11.7833 2.54999C11.6167 2.61666 11.5333 2.68333 11.4833 2.71666C11.5333 2.76666 11.6 2.83333 11.6667 2.88333C11.8167 2.99999 11.9833 3.14999 12.1 3.33333C12.4833 3.96666 12.4667 4.71666 12.4333 5.44999C12.4167 5.81666 12.4 6.16666 12.45 6.46666C12.5167 6.91666 12.7167 7.48333 13.0333 7.68333C13.1667 7.76666 13.3 7.79999 13.45 7.74999C13.5667 7.71666 13.6833 7.58333 13.7833 7.44999C13.9333 7.26666 14.0833 7.04999 14.35 7.06666C14.6167 7.06666 14.8167 7.31666 14.9333 7.48333C15.0167 7.59999 14.9833 7.74999 14.8667 7.83333C14.75 7.91666 14.6 7.88333 14.5167 7.76666C14.4167 7.63333 14.3667 7.58333 14.3333 7.56666C14.2833 7.59999 14.2167 7.68333 14.1667 7.74999C14.0167 7.93333 13.8333 8.16666 13.5333 8.23333C13.4833 8.26666 13.4 8.28333 13.3167 8.28333Z" fill="black"/>
</svg>
</span>
{{ trans('auth.change_language_title') }}
</li>
@foreach($locales as $locale)
<li>
@if (App::isLocale($locale['lang']))
{{ $locale['lang'] }}
@else
<a href="{{ route('register') }}?lang={{ $locale['lang'] }}"
title="{{ trans('auth.change_language', ['lang' => $locale['name-orig']], $locale['lang']) }}">
{{ $locale['lang'] }}
</a>
@endif
</li>
@endforeach
</ul>
</div>
<div class="signup-box">
<div class="dt w-100">
<div class="dtc tc">
<img src="img/monica.svg" width="97" height="88" alt="">
</div>
</div>
@if($first)
<h1>{{ trans('auth.register_title_welcome') }}</h1>
<h2>{{ trans('auth.register_create_account') }}</h2>
@else
<h2>{{ trans('auth.register_title_create') }}</h2>
<h3>{!! trans('auth.register_login', ['url' => 'login']) !!}</h3>
@endif
@include ('partials.errors')
@if (session('confirmation-success'))
<div class="alert alert-success">
{{ session('confirmation-success') }}
</div>
@endif
<form action="register" method="post">
@csrf
<div class="form-group">
<label for="email">{{ trans('auth.register_email') }}</label>
<input type="email" class="form-control" id="email" name="email" placeholder="{{ trans('auth.register_email_example') }}" value="{{ old('email') }}" required autocomplete="email" autofocus>
</div>
<div class="row">
<div class="col-12 col-sm-6">
<div class="form-group">
<label for="first_name">{{ trans('auth.register_firstname') }}</label>
<input type="text" class="form-control" id="first_name" name="first_name" placeholder="{{ trans('auth.register_firstname_example') }}" value="{{ old('first_name') }}" required autocomplete="given-name">
</div>
</div>
<div class="col-12 col-sm-6">
<div class="form-group">
<label for="last_name">{{ trans('auth.register_lastname') }}</label>
<input type="text" class="form-control" id="last_name" name="last_name" placeholder="{{ trans('auth.register_lastname_example') }}" value="{{ old('last_name') }}" required autocomplete="family-name">
</div>
</div>
</div>
<div class="form-group">
<label for="password">{{ trans('auth.register_password') }}</label>
<input type="password" class="form-control" id="password" name="password" placeholder="{{ trans('auth.register_password_example') }}" required autocomplete="password">
</div>
<div class="form-group">
<label for="password_confirmation">{{ trans('auth.register_password_confirmation') }}</label>
<input type="password" class="form-control" id="password_confirmation" name="password_confirmation" required autocomplete="password">
</div>
<!-- Policy acceptance check -->
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" id="policy" name="policy" type="checkbox" value="policy" required>
{!! trans('auth.register_policy', ['url' => 'https://monicahq.com/privacy', 'urlterm' => 'https://monicahq.com/terms', 'hreflang' => 'en', ]) !!}
</label>
</div>
<div class="form-group actions">
<input type="hidden" name="lang" value="{{ App::getLocale() }}" />
<button type="submit" class="btn btn-primary">{{ trans('auth.register_action') }}</button>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
@endsection

View File

@@ -0,0 +1,34 @@
@extends('marketing.auth')
@section('content')
<div class="container">
<form action="{{ session('oauth') ? route('oauth.validate2fa') : route('validate2fa') }}" method="post">
<input type="hidden" name="url" value="{{ urlencode(route('dashboard.index')) }}" />
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="signup-box">
<div class="dt w-100">
<div class="dtc tc">
<img src="img/monica.svg" width="97" height="88" alt="">
</div>
</div>
<h2>{{ trans('auth.2fa_title') }}</h2>
@include ('partials.errors')
@csrf
<h3>{{ trans('auth.mfa_auth_otp') }}</h3>
@include ('partials.auth.validate2fa')
<div class="form-group links">
<ul>
<li>{!! trans('auth.use_recovery', ['url' => route('recovery.login')]) !!}</li>
</ul>
</div>
</div>
</div>
</form>
</div>
@endsection

View File

@@ -0,0 +1,48 @@
@extends('marketing.auth')
@section('content')
<div class="container">
<form action="{{ session('oauth') ? route('oauth.validate2fa') : route('validate2fa') }}" method="post">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="signup-box">
<div class="dt w-100">
<div class="dtc tc">
<img src="img/monica.svg" width="97" height="88" alt="">
</div>
</div>
<h2>{{ trans('auth.2fa_title') }}</h2>
@include ('partials.errors')
@csrf
<h3>{{ trans('auth.mfa_auth_webauthn') }}</h3>
<webauthn-connector
:method="'login'"
:public-key="{{ \Safe\json_encode($publicKey) }}"
>
</webauthn-connector>
@if (app('pragmarx.google2fa')->isActivated())
<div class="mt5">
<h3>{{ trans('auth.mfa_auth_otp') }}</h3>
@include ('partials.auth.validate2fa')
</div>
@endif
<div class="form-group links">
<ul>
<li>{!! trans('auth.use_recovery', ['url' => route('recovery.login')]) !!}</li>
</ul>
</div>
</div>
</div>
</div>
</form>
</div>
@endsection

View File

@@ -0,0 +1,42 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="signup-box">
<div class="dt w-100">
<div class="dtc tc">
<img src="img/monica.svg" width="97" height="88" alt="">
</div>
</div>
<h2>{{ trans('auth.confirmation_title') }}</h2>
<div class="card-body">
@if (session('resent'))
<div class="alert alert-success" role="alert">
{{ trans('auth.confirmation_fresh') }}
</div>
@endif
<p>
{{ trans('auth.confirmation_check') }}
</p>
<p>
<form action="{{ route('verification.resend') }}" method="post" class="di">
@csrf
{!! trans('auth.confirmation_request_another', ['action' => 'href="" onclick="this.parentNode.submit(); return false"']) !!}
</form>
</p>
<p>
{!! trans('auth.confirmation_again', ['url' => 'settings/emailchange1']) !!}
</p>
</div>
</div>
</div>
</div>
</div>
</body>
@endsection

View File

@@ -0,0 +1,29 @@
@extends('layouts.skeleton')
@section('content')
<div class="changelog">
<section class="ph3 ph0-ns pv4 cf w-100 bg-gray-monica">
<div class="mt4 mw7 center mb3">
<h3>{{ trans('changelog.title') }}</h3>
@if (\App::getLocale() != 'en')
<p>{{ trans('changelog.note') }}</p>
@endif
</div>
@foreach ($changelogs as $changelog)
<div class="mw7 center br3 ba b--gray-monica bg-white mb4 pa4">
<div class="f7 mb2">
{{ $changelog['date'] }}
</div>
<div>
<h2>{{ $changelog['title'] }}</h2>
{!! (new \Parsedown())->text($changelog['description']) !!}
</div>
</div>
@endforeach
</section>
</div>
@endsection

View File

@@ -0,0 +1,17 @@
@extends('layouts.skeleton')
@section('content')
<section class="ph3 ph0-ns mt4">
<div class="mw7 center br3 ba b--gray-monica bg-white mb5 pa5">
<h2 class="mb4">{{ trans('app.compliance_title') }}</h2>
<p>{!! trans('app.compliance_desc', ['url' => 'https://monicahq.com/privacy', 'urlterm' => 'https://monicahq.com/terms', 'hreflang' => 'en', ]) !!}</p>
<p>{{ trans('app.compliance_desc_end') }}</p>
<form action="compliance/sign" method="POST" class="tc mt4">
@csrf
<button class="btn btn-primary" name="save" type="submit">{{ trans('app.compliance_terms') }}</button>
</form>
</div>
</div>
@endsection

View File

@@ -0,0 +1,11 @@
@if (Route::currentRouteName() == $route)
<li class="selected">
<i class="{{ $icon }}" aria-hidden="true"></i>
<strong>{{ trans($title) }}</strong>
</li>
@else
<li class="bg-white">
<i class="{{ $icon }}" aria-hidden="true"></i>
<a href="{{ route($route) }}">{{ trans($title) }}</a>
</li>
@endif

View File

@@ -0,0 +1,30 @@
@foreach($reminderOutboxesList as $month => $reminderOutboxes)
<h3 class="ttu fw5 f5 pb2">{{ \App\Helpers\DateHelper::getMonthAndYear($month) }}</h3>
<ul class="mb4">
@if(count($reminderOutboxes) > 0)
@foreach($reminderOutboxes as $reminderOutbox)
@if (!is_object($reminderOutbox->reminder))
@continue;
@endif
<li class="pb2">
<span class="ttu f6 mr2 black-60">{{ \App\Helpers\DateHelper::getShortDateWithoutYear($reminderOutbox->planned_date) }}</span>
<span>
@if ($reminderOutbox->reminder->contact->is_partial)
@php($relatedRealContact = $reminderOutbox->reminder->contact->getRelatedRealContact())
<a href="{{ route('people.show', $relatedRealContact) }}">{{ $relatedRealContact->getIncompleteName() }}</a>
@else
<a href="{{ route('people.show', $reminderOutbox->reminder->contact) }}">{{ $reminderOutbox->reminder->contact->getIncompleteName() }}</a>
@endif
</span>
{{ $reminderOutbox->reminder->title }}
</li>
@endforeach
@else
<p>{{ trans('dashboard.reminders_none') }}</p>
@endif
</ul>
@endforeach

View File

@@ -0,0 +1,14 @@
@extends('layouts.skeleton')
@section('content')
<div class="mw6 center mt5 mt6-ns mb4 ph3 ph0-ns">
<div class="tc mb5">
<img src="img/dashboard/blank.svg">
</div>
<h2 class="f2 mb4 normal tc lh-title">{{ trans('dashboard.dashboard_blank_title') }}</h2>
<p class="tc f4 mb4">{{ trans('dashboard.dashboard_blank_description') }}</p>
<p class="tc mb5"><a href="{{ route('people.create') }}" id="button-add-contact" class="btn btn-primary pa4 f4">{{ trans('dashboard.dashboard_blank_cta') }}</a></p>
</div>
@endsection

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,9 @@
<div class="event-icon">
<img src="img/dashboard/activity_{{ $event['nature_of_operation'] }}.png">
</div>
<div class="event-description">
<a href="{{ route('people.show', $event['contact_id']) }}" id="activity_{{ $event['nature_of_operation'] }}_{{ $event['object_id'] }}">
{{ trans('dashboard.event_'.$event['nature_of_operation'].'_'.$event['object_type'], ['name' => $event['contact_complete_name']]) }}
</a>
</div>

View File

@@ -0,0 +1,9 @@
<div class="event-icon">
<img src="img/dashboard/call_{{ $event['nature_of_operation'] }}.png">
</div>
<div class="event-description">
<a href="{{ route('people.show', $event['contact_id']) }}" id="call_{{ $event['nature_of_operation'] }}_{{ $event['object_id'] }}">
{{ trans('dashboard.event_'.$event['nature_of_operation'].'_'.$event['object_type'], ['name' => $event['contact_complete_name']]) }}
</a>
</div>

View File

@@ -0,0 +1,9 @@
<div class="event-icon">
<img src="img/dashboard/contact_{{ $event['nature_of_operation'] }}.png">
</div>
<div class="event-description">
<a href="{{ route('people.show', $event['contact_id']) }}">{{ $event['contact_complete_name'] }}</a>:
{{ trans('dashboard.event_'.$event['nature_of_operation'].'_'.$event['object_type']) }}
</div>

View File

@@ -0,0 +1,9 @@
<div class="event-icon">
<img src="img/dashboard/debt_{{ $event['nature_of_operation'] }}.png">
</div>
<div class="event-description">
<a href="{{ route('people.show', $event['contact_id']) }}">{{ $event['contact_complete_name'] }}</a>:
{{ trans('dashboard.event_'.$event['nature_of_operation'].'_'.$event['object_type']) }}
</div>

View File

@@ -0,0 +1,9 @@
<div class="event-icon">
<img src="img/dashboard/gift_{{ $event['nature_of_operation'] }}.png">
</div>
<div class="event-description">
<a href="{{ route('people.show', $event['contact_id']) }}">{{ $event['contact_complete_name'] }}</a>:
{{ trans('dashboard.event_'.$event['nature_of_operation'].'_'.$event['object_type']) }}
</div>

View File

@@ -0,0 +1,9 @@
<div class="event-icon">
<img src="img/dashboard/note_{{ $event['nature_of_operation'] }}.png">
</div>
<div class="event-description">
<a href="{{ route('people.show', $event['contact_id']) }}" id="note_{{ $event['nature_of_operation'] }}_{{ $event['object_id'] }}">
{{ trans('dashboard.event_'.$event['nature_of_operation'].'_'.$event['object_type'], ['name' => $event['contact_complete_name']]) }}
</a>
</div>

View File

@@ -0,0 +1,9 @@
<div class="event-icon">
<img src="img/dashboard/reminder.png">
</div>
<div class="event-description">
<a href="{{ route('people.show', $event['contact_id']) }}">{{ $event['contact_complete_name'] }}</a>:
{{ trans('dashboard.event_'.$event['nature_of_operation'].'_'.$event['object_type']) }}
</div>

View File

@@ -0,0 +1,9 @@
<div class="event-icon">
<img src="img/dashboard/task_{{ $event['nature_of_operation'] }}.png">
</div>
<div class="event-description">
<a href="{{ route('people.show', $event['contact_id']) }}">{{ $event['contact_complete_name'] }}</a>:
{{ trans('dashboard.event_'.$event['nature_of_operation'].'_'.$event['object_type']) }}
</div>

View File

@@ -0,0 +1,93 @@
@extends('layouts.skeleton')
@section('content')
<div class="dashboard">
<section class="ph3 ph5-ns pv4 cf w-100 bg-gray-monica">
<div class="mw9 center">
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} w-70-ns ph2">
<div class="pb2 tc dn-ns w-100">
{{ trans('people.people_list_last_updated') }}
</div>
<div class="h3 overflow-hidden mb2">
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} pr2 dn dib-ns v-mid h3" style="line-height: 4rem;">
{{ trans('people.people_list_last_updated') }}
</div>
@foreach($lastUpdatedContacts as $contact)
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} pr2 pointer">
<avatar :contact="{{ $contact }}" :clickable="true"></avatar>
</div>
@endforeach
</div>
</div>
<div class="{{ htmldir() == 'ltr' ? 'fl-ns tr' : 'fr-ns tl' }} w-30-ns ph2">
<a href="{{ route('people.create') }}" class="btn btn-primary w-100 w-auto-ns tc" style="padding: 15px 45px;">
{{ trans('people.people_list_blank_cta') }}
</a>
</div>
</div>
</section>
{{-- Main section --}}
<section class="ph3 ph5-ns cf w-100 bg-gray-monica">
<div class="mw9 center">
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} w-50-ns w-100 pa2">
<div class="br3 ba b--gray-monica bg-white mb4">
<div class="pa3 bb b--gray-monica">
<p class="mb1 b">
📅&#8199;{{ trans('dashboard.reminders_next_months') }}
</p>
</div>
<div class="pt3 pr3 pl3 mb4">
@include('dashboard._monthReminder', ['reminderOutboxesList' => $reminderOutboxes])
</div>
</div>
</div>
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} w-50-ns w-100 pa2">
<div class="br3 ba b--gray-monica bg-white mb4">
<div class="pa3 bb b--gray-monica">
<p class="mb1 b">
☀️&#8199;{{ trans('dashboard.product_changes') }}
<span class="fr normal">
<a href="changelog">{{ trans('dashboard.product_view_details') }}</a>
</span>
</p>
</div>
<div class="pt3 pr3 pl3 mb4">
<ul>
@foreach ($changelogs as $changelog)
<li class="mb1">
<span class="gray f6">{{ $changelog['date'] }}</span>
<span class="stat-description">{{ $changelog['title'] }}</span>
</li>
@endforeach
</ul>
</div>
</div>
<dashboard-log :default-active-tab="'{!! auth()->user()->dashboard_active_tab !!}'"></dashboard-log>
<div class="br3 ba b--gray-monica bg-white mb3">
<div class="pa3 bb b--gray-monica tc">
<ul>
<li class="tc dib fl w-third">
<span class="db f3 fw5 green">{{ $number_of_contacts }}</span>
<span class="stat-description">{{ trans('dashboard.statistics_contacts') }}</span>
</li>
<li class="tc dib fl w-third">
<span class="db f3 fw5 blue">{{ $number_of_activities }}</span>
<span class="stat-description">{{ trans('dashboard.statistics_activities') }}</span>
</li>
<li class="tc dib w-third">
<span class="db f3 fw5 orange">{{ $number_of_gifts }}</span>
<span class="stat-description">{{ trans('dashboard.statistics_gifts') }}</span>
</li>
</ul>
</div>
</div>
</div>
</div>
</section>
</div>
@endsection

View File

@@ -0,0 +1,27 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="alert alert-danger">
<h3><em class="fa fa-ban"></em> @lang('auth.not_authorized')</h3>
@lang('settings.personalisation_paid_upgrade', ['url' => route('settings.subscriptions.index')])
@if(isset($exception) && $exception->getMessage())
<p class="message">{{ $exception->getMessage() }}</p>
@endif
<p><a href="">{{ trans('auth.back_homepage') }}</a></p>
</div>
</div>
</div>
</div>
</body>
@endsection

View File

@@ -0,0 +1,25 @@
@extends('marketing.skeleton')
@section('content')
<body class="marketing register">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 offset-md-3 offset-md-3-right">
<div class="alert alert-danger">
<h3><i class="fa fa-ban"></i> @lang('auth.not_authorized')</h3>
@if(isset($exception) && $exception->getMessage())
<p class="message">{{ $exception->getMessage() }}</p>
@endif
<p><a href="">{{ trans('auth.back_homepage') }}</a></p>
</div>
</div>
</div>
</div>
</body>
@endsection

View File

@@ -0,0 +1,33 @@
@extends('errors::layout')
@section('title', trans('app.error_title'))
@section('message', trans('app.error_title'))
@section('content')
@if(isset($exception) && $exception->getMessage())
<p class="message">{{ $exception->getMessage() }}</p>
@endif
@if(Auth::check() && app()->bound('sentry') && config('monica.sentry_support') && ! empty(app('sentry')->getLastEventID()))
<div class="subtitle">@lang('app.error_id', ['id' => app('sentry')->getLastEventID()])</div>
<script
src="https://browser.sentry-cdn.com/5.27.4/bundle.min.js"
integrity="sha384-yUnxX3o5D7+yEEIKDXlpygg+0Q2LdyklXwZVWUjc6fohGisYvhpyQbRvNYaDGtvU"
crossorigin="anonymous"
></script>
<script>
Sentry.init({ dsn: '{{ config('sentry.dsn') }}' });
Sentry.showReportDialog({
eventId: '{{ app('sentry')->getLastEventID() }}',
user: {
name: '{{ auth()->user()->name }}',
email: '{{ auth()->user()->email }}',
},
});
</script>
@endif
<p><a href="">{{ trans('auth.back_homepage') }}</a></p>
@endsection

View File

@@ -0,0 +1,12 @@
@extends('errors::layout')
@section('title', trans('app.error_unavailable'))
@section('message', trans('app.error_maintenance'))
@section('content')
<p>
@lang('app.error_help')
@lang('app.error_twitter', ['twitter' => config('monica.twitter_account')])
</p>
@endsection

View File

@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="{{ \App::getLocale() }}" dir="{{ htmldir() }}">
<head>
<base href="{{ url('/') }}/" />
<title>@yield('title')</title>
<style>
html, body {
height: 100%;
}
body {
margin: 0;
padding: 0;
width: 100%;
color: #999999;
display: table;
font-weight: 100;
font-family: "Lato Light", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
}
.container {
text-align: center;
display: table-cell;
vertical-align: middle;
}
.content {
text-align: center;
display: inline-block;
}
.title {
font-size: 72px;
margin-bottom: 40px;
font-weight: bold;
}
.message {
font-weight: bold;
}
</style>
</head>
<body>
<div class="container">
<div class="content">
<div class="title">
@yield('message')
</div>
<div>
@yield('content')
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,63 @@
@extends('layouts.skeleton')
@section('content')
<div class="people-show journal">
{{-- Breadcrumb --}}
<section class="ph3 ph5-ns pv3 w-100 f6 bb b--gray-monica">
<div class="mw9 center pa2">
<ul>
<li class="di">
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li class="di">
&gt; <a href="{{ route('journal.index') }}">{{ trans('app.breadcrumb_journal') }}</a>
</li>
<li class="di">
&gt; {{ trans('journal.journal_add') }}
</li>
</ul>
</div>
</section>
<!-- Page content -->
<div class="main-content central-form">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12 col-sm-6 offset-sm-3 offset-sm-3-right">
<form method="POST" action="{{ route('journal.save') }}">
@csrf
@include('partials.errors')
<h2>{{ trans('journal.journal_add') }}</h2>
{{-- Optional title --}}
<div class="form-group">
<label for="field-title">{{ trans('journal.journal_add_title') }}</label>
<input type="text" id="field-title" class="form-control" name="title" autofocus>
</div>
<div class="form-group">
<label for="field-date">{{ trans('journal.journal_add_date') }}</label>
<input type="date" id="field-date" name="date" class="form-control" value="{{ now(\App\Helpers\DateHelper::getTimezone())->toDateString() }}">
</div>
<div class="form-group">
<label for="field-entry">{{ trans('journal.journal_add_post') }}</label>
<textarea class="form-control" id="field-entry" name="entry" rows="15" required></textarea>
<p class="f6">{{ trans('app.markdown_description')}} <a href="https://guides.github.com/features/mastering-markdown/" target="_blank" rel="noopener noreferrer">{{ trans('app.markdown_link') }}</a></p>
</div>
<div class="form-group actions">
<button type="submit" cy-name="save-entry-button" class="btn btn-primary">{{ trans('journal.journal_add_cta') }}</button>
<a href="{{ route('journal.index') }}" class="btn btn-secondary">{{ trans('app.cancel') }}</a>
</div> <!-- .form-group -->
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,68 @@
@extends('layouts.skeleton')
@section('content')
<div class="people-show journal">
{{-- Breadcrumb --}}
<section class="ph3 ph5-ns pv3 w-100 f6 bb b--gray-monica">
<div class="mw9 center pa2">
<ul>
<li class="di">
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li class="di">
&gt; <a href="{{ route('journal.index') }}">{{ trans('app.breadcrumb_journal') }}</a>
</li>
<li class="di">
&gt; {{ trans('journal.journal_edit') }}
</li>
</ul>
</div>
</section>
<!-- Page content -->
<div class="main-content central-form">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-xs-12 col-sm-6 col-sm-offset-3 col-sm-offset-3-right">
<form method="POST" action="{{ route('journal.update', $entry) }}">
@method('PUT')
@csrf
@include('partials.errors')
<h2>{{ trans('journal.journal_edit') }}</h2>
{{-- Optional title --}}
<div class="form-group">
<label for="field-title">{{ trans('journal.journal_add_title') }}</label>
<input type="text" id="field-title" class="form-control" name="title" value="{{ $entry->title }}" autofocus>
</div>
<div class="form-group">
<label for="field-entry">{{ trans('journal.journal_add_date') }}</label>
<form-date
:id="'date'"
:default-date="'{{ $entry->date->toDateString() }}'"
:locale="'{{ \App::getLocale() }}'">
</form-date>
</div>
<div class="form-group">
<label for="field-entry">{{ trans('journal.journal_add_post') }}</label>
<textarea class="form-control" id="field-entry" name="entry" rows="15" required>{{ $entry->getOriginal('post') }}</textarea>
<p class="f6">{{ trans('app.markdown_description')}} <a href="https://guides.github.com/features/mastering-markdown/" target="_blank" rel="noopener noreferrer">{{ trans('app.markdown_link') }}</a></p>
</div>
<div class="form-group actions">
<button type="submit" cy-name="edit-entry-button" class="btn btn-primary">{{ trans('journal.journal_add_cta') }}</button>
<a href="{{ route('journal.index') }}" class="btn btn-secondary">{{ trans('app.cancel') }}</a>
</div> <!-- .form-group -->
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,27 @@
@extends('layouts.skeleton')
@section('content')
<div class="journal">
{{-- Breadcrumb --}}
<section class="ph3 ph5-ns pv3 w-100 f6 bb b--gray-monica">
<div class="mw9 center pa2">
<ul>
<li class="di">
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li class="di">
&gt; {{ trans('app.breadcrumb_journal') }}
</li>
</ul>
</div>
</section>
{{-- Main section --}}
<section class="ph3 ph5-ns pv3 cf w-100 bg-gray-monica">
<journal-list></journal-list>
</section>
</div>
@endsection

View File

@@ -0,0 +1,72 @@
<!DOCTYPE html>
<html lang="{{ \App::getLocale() }}" dir="{{ htmldir() }}">
<head>
<base href="{{ url('/') }}/" />
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="apple-mobile-web-app-title" content="Monica">
<meta name="application-name" content="Monica">
<meta name="theme-color" content="#325776">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>@yield('title', trans('app.application_title'))</title>
<link rel="manifest" href="manifest.webmanifest">
<link rel="stylesheet" href="{{ asset(mix('css/app-'.htmldir().'.css')) }}">
{{-- Required only for the Upgrade account page --}}
@if (Route::currentRouteName() == 'settings.subscriptions.upgrade' || Route::currentRouteName() == 'settings.subscriptions.confirm')
<link rel="stylesheet" href="{{ asset(mix('css/stripe.css')) }}">
@endif
<link rel="shortcut icon" href="img/favicon.png">
<link rel="apple-touch-icon" href="img/icons/touch-icon-iphone.png">
<link rel="apple-touch-icon" sizes="152x152" href="img/icons/touch-icon-ipad.png">
<link rel="apple-touch-icon" sizes="180x180" href="img/icons/touch-icon-iphone-retina.png">
<link rel="apple-touch-icon" sizes="167x167" href="img/icons/touch-icon-ipad-retina.png">
<link rel="shortcut icon" sizes="196x196" href="img/icons/favicon-196.png">
<script>
window.Laravel = {!! \Safe\json_encode([
'locale' => \App::getLocale(),
'htmldir' => htmldir(),
'profileDefaultView' => auth()->user()->profile_active_tab,
'timezone' => auth()->user()->timezone,
'env' => \App::environment(),
]); !!}
</script>
</head>
<body data-account-id="{{ auth()->user()->account_id }}" class="bg-gray-monica min-vh-100 flex flex-column">
<div id="app" class="flex-grow-1">
@if (Route::currentRouteName() != 'settings.subscriptions.confirm')
@include('partials.header')
@include('partials.subscription')
@endif
@yield('content')
</div>
@if (Route::currentRouteName() != 'settings.subscriptions.confirm')
@include('partials.footer')
@endif
{{-- THE JS FILE OF THE APP --}}
@push('scripts')
<script src="{{ asset(mix('js/manifest.js')) }}"></script>
<script src="{{ asset(mix('js/vendor.js')) }}"></script>
@endpush
{{-- Load everywhere except on the Upgrade account page --}}
@if (Route::currentRouteName() != 'settings.subscriptions.upgrade' && Route::currentRouteName() != 'settings.subscriptions.confirm')
@push('scripts')
<script src="{{ asset(mix('js/app.js')) }}"></script>
@endpush
@endif
@stack('scripts')
</body>
</html>

View File

@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="{{ \App::getLocale() }}" dir="{{ htmldir() }}">
<head>
<base href="{{ url('/') }}/" />
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>@yield('title', trans('app.application_title'))</title>
<link rel="manifest" href="manifest.webmanifest">
<link rel="stylesheet" href="{{ asset(mix('css/app-'.htmldir().'.css')) }}">
<link rel="shortcut icon" href="img/favicon.png">
<script>
window.Laravel = {!! \Safe\json_encode([
'locale' => \App::getLocale(),
'htmldir' => htmldir(),
]); !!}
</script>
</head>
<body data-account-id={{ auth()->user()->account_id }} class="marketing register bg-gray-monica">
<div id="app">
@yield('content')
</div>
{{-- THE JS FILE OF THE APP --}}
<script src="{{ asset(mix('js/manifest.js')) }}"></script>
<script src="{{ asset(mix('js/vendor.js')) }}"></script>
<script src="{{ asset(mix('js/app.js')) }}"></script>
@stack('scripts')
</body>
</html>

View File

@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="{{ \App::getLocale() }}" dir="{{ htmldir() }}">
<head>
<base href="{{ url('/') }}/" />
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="IE=edge,chrome=1">
<title>{{ trans('app.application_title') }}</title>
<link rel="stylesheet" href="{{ asset(mix('css/app-'.htmldir().'.css')) }}">
<meta name="description" content="{{ trans('app.application_description') }}">
<link rel="author" href="@djaiss">
<meta property="og:title" content="{{ trans('app.application_og_title') }}" />
<link rel="shortcut icon" href="img/favicon.png">
</head>
@yield('content')
</html>

View File

@@ -0,0 +1,39 @@
@if ($errors->has('totp'))
<span class="help-block">
<strong>{{ $errors->first('totp') }}</strong>
</span>
@endif
<div class="form-group">
<label for="one_time_password">{{ trans('auth.2fa_one_time_password') }}</label>
<form-input :input-type="'number'"
:id="'one_time_password'"
:width="100"
:required="true"></form-input>
<small>{{ trans('auth.2fa_otp_help') }}</small>
</div>
{{-- TODO
<div class="form-group checkbox">
<input type="checkbox" name="remember" id="remember" />
<label for="remember">Remember me on this browser</label>
</div>
--}}
{{-- TODO
<div class="form-group">
{{ trans('auth.2fa_recuperation_code') }}
</div>
--}}
<div class="row">
<div class="col-12 col-md-6">
<div class="form-group actions">
<button type="submit" name="verify" class="btn btn-primary">{{ trans('app.verify') }}</button>
</div>
</div>
<div class="col-12 col-md-6">
<div class="form-group actions">
<a href="logout" class="btn action">{{ trans('app.cancel') }}</a>
</div>
</div>
</div>

View File

@@ -0,0 +1,32 @@
{{-- Version check --}}
@if (config('monica.check_version'))
@if (($version = config('monica.app_version')) !== '' && version_compare($instance->latest_version, $version) > 0)
<li>
<a href="#showVersion" data-toggle="modal" class="badge badge-success">{{ trans('app.footer_new_version') }}</a>
</li>
@endif
<!-- Modal -->
<div class="modal show-version fade" id="showVersion" tabindex="-1">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">{{ trans('app.footer_modal_version_whats_new') }}</h5>
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p>{{ trans_choice('app.footer_modal_version_release_away', $instance->number_of_versions_since_current_version, ['number' => $instance->number_of_versions_since_current_version]) }}</p>
{!! $instance->latest_release_notes !!}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ trans('app.close') }}</button>
</div>
</div>
</div>
</div>
@endif

View File

@@ -0,0 +1,9 @@
<select name="currency_id" id="currency_id" class="form-control" required>
@foreach ( $currencies as $currency )
@if ($currency->id == $selectionID)
<option value="{{ $currency->id }}" selected>{{ $currency->name }}</option>
@else
<option value="{{ $currency->id }}" >{{ $currency->name }}</option>
@endif
@endforeach
</select>

View File

@@ -0,0 +1,52 @@
{{-- Data comes from DateSelectViewComposer --}}
<div class="mt2">
<select id="{{ $class }}_month" name="{{ $class }}_month" class="{{ htmldir() == 'ltr' ? 'mr2' : '' }}">
@foreach($months as $month)
<option value="{{ $month['id'] }}"
@if ($specialDate && $specialDate instanceof Carbon\Carbon)
{{ ($specialDate->month == $month['id']) ? 'selected="selected"': '' }}
@else
{{ ($specialDate == null) ? '' : (($specialDate->date->month == $month['id']) ? 'selected="selected"': '') }}
@endif
>
{{ $month['name'] }}
</option>
@endforeach
</select>
<select id="{{ $class }}_day" name="{{ $class }}_day" class="mr2">
@for ($day=1 ; $day < 32 ; $day++)
<option value="{{ $day }}"
@if ($specialDate && $specialDate instanceof Carbon\Carbon)
{{ $specialDate->day == $day ? 'selected="selected"': '' }}
@else
{{ ($specialDate == null) ? '' : (($specialDate->date->day == $day) ? 'selected="selected"': '') }}
@endif
>
{{ $day }}
</option>
@endfor
</select>
<select id="{{ $class }}_year" name="{{ $class }}_year" class="{{ htmldir() == 'ltr' ? '' : 'mr2' }}">
@if ($specialDate && $specialDate instanceof APP\Models\Instance\SpecialDate)
<option value="0" {{ ! $specialDate->is_year_unknown ? '' : 'selected="selected"' }}>{{ trans('app.unknown') }}</option>
@else
<option value="0">{{ trans('app.unknown') }}</option>
@endif
@foreach($years as $year)
<option value="{{ $year['id'] }}"
@if ($specialDate && $specialDate instanceof Carbon\Carbon)
{{ $specialDate->year == $year['id'] ? 'selected="selected"': '' }}
@else
{{ ($specialDate == null) ? '' : ($specialDate->is_year_unknown ? '' : (($specialDate->date->year == $year['id']) ? 'selected="selected"': '')) }}
@endif
>
{{ $year['id'] }}
</option>
@endforeach
</select>
</div>

View File

@@ -0,0 +1,11 @@
@if ($accountHasLimitations)
<div class="mb4">
<img src="img/people/upgrade_account.png">
<div class="pa3 br bl bb br2 b--black-10 br--bottom bg-white">
<p class="mb3">{{ trans('people.people_list_account_upgrade_title') }}</p>
<div class="tc">
<a href="{{ route('settings.subscriptions.index') }}" class="btn btn-secondary"> {{ trans('people.people_list_account_upgrade_cta') }}</a>
</div>
</div>
</div>
@endif

View File

@@ -0,0 +1,11 @@
@if (isset($errors))
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@endif

View File

@@ -0,0 +1,29 @@
<footer class="ph3 ph5-ns pb4 cf w-100">
<div class="mw9 center">
<div class="flex f6">
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} w-40-ns w-100 pa2 bt b--gray-monica pt3">
<ul>
<li class="di mr2">{{ trans('app.footer_remarks') }} <a href="mailto:{{ config('monica.support_email_address') }}">{{ trans('app.footer_send_email') }}</a></li>
<li class="di mr2"><a href="https://monicahq.com/privacy" hreflang="en">{{ trans('app.footer_privacy') }}</a></li>
<li class="di"><a href="https://tinyletter.com/monicahq" hreflang="en">{{ trans('app.footer_newsletter') }}</a></li>
</ul>
</div>
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} w-20-ns w-100 pa2 tc bt b--gray-monica pt3">
<img src="img/monica.svg" width="20" height="21" />
</div>
<div class="{{ htmldir() == 'ltr' ? 'fl tr' : 'fr tl' }} w-40-ns w-100 pa2 bt b--gray-monica pt3">
<ul>
<li class="di"><a href="https://monicahq.com/changelog" hreflang="en">{{ trans('app.footer_release') }}</a></li>
<li class="di ml2"><a href="https://github.com/monicahq/monica">{{ trans('app.footer_source_code') }}</a></li>
@if (($version = config('monica.app_version')) !== '')
<li class="di ml2">{{ trans('app.footer_version', ['version' => $version]) }}</li>
@endif
@include('partials.check')
</ul>
</div>
</div>
</div>
</footer>

View File

@@ -0,0 +1,46 @@
<nav class="bg-blue-monica">
<div class="ph3 ph5-ns pv2 cf w-100">
<div class="mw9 center dt w-100">
<div class="w-50-l w-100 dtc-l v-mid">
<div class="tc dib-l">
<a href="{{ route('dashboard.index') }}" class="header-logo {{ htmldir() == 'rtl' ? 'ml2' : 'mr2' }}">
<img src="img/monica_reverse.svg" width="40" height="43" />
</a>
</div>
<div class="dib w-60-l w-100 header-search">
<contact-search placeholder="{{ trans('people.people_search') }}" form-name-order="{{ App\Helpers\FormHelper::getNameOrderForForms(auth()->user()) }}">
</contact-search>
</div>
</div>
<div class="w-50-l w-100 dtc-l v-mid tl tr-l">
<div class="header-nav">
<a href="{{ route('dashboard.index') }}" class="header-nav-item-link dib">{{ trans('app.main_nav_dashboard') }}</a>
<a href="{{ route('people.index') }}" class="header-nav-item-link dib">{{ trans('app.main_nav_family') }}</a>
<a href="{{ route('journal.index') }}" class="header-nav-item-link dib">{{ trans('app.main_nav_journal') }}</a>
{{-- NON MOBILE --}}
<a href="{{ route('settings.index') }}" class="header-nav-item-link dib-l dn">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" width="14" height="16" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M14 8.77v-1.6l-1.94-.64-.45-1.09.88-1.84-1.13-1.13-1.81.91-1.09-.45-.69-1.92h-1.6l-.63 1.94-1.11.45-1.84-.88-1.13 1.13.91 1.81-.45 1.09L0 7.23v1.59l1.94.64.45 1.09-.88 1.84 1.13 1.13 1.81-.91 1.09.45.69 1.92h1.59l.63-1.94 1.11-.45 1.84.88 1.13-1.13-.92-1.81.47-1.09L14 8.75v.02zM7 11c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z" fill="#fff"/></svg>
</a>
<a href="{{ route('changelog.index') }}" class="header-nav-item-link dib-l dn">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" width="14" height="16" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M14 12v1H0v-1l.73-.58c.77-.77.81-2.55 1.19-4.42C2.69 3.23 6 2 6 2c0-.55.45-1 1-1s1 .45 1 1c0 0 3.39 1.23 4.16 5 .38 1.88.42 3.66 1.19 4.42l.66.58H14zm-7 4c1.11 0 2-.89 2-2H5c0 1.11.89 2 2 2z" fill="#fff"/></svg>
</a>
<a href="logout" class="header-nav-item-link dib-l dn" data-cy="header-link-logout">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" width="16" height="16" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M12 9V7H8V5h4V3l4 3-4 3zm-2 3H6V3L2 1h8v3h1V1c0-.55-.45-1-1-1H1C.45 0 0 .45 0 1v11.38c0 .39.22.73.55.91L6 16.01V13h4c.55 0 1-.45 1-1V8h-1v4z" fill="#fff"/></svg>
</a>
{{-- MOBILE --}}
<a href="{{ route('settings.index') }}" class="header-nav-item-link dib dn-l">
{{ trans('app.header_settings_link') }}
</a>
<a href="{{ route('changelog.index') }}" class="header-nav-item-link dib dn-l">
{{ trans('app.header_changelog_link') }}
</a>
<a href="logout" class="header-nav-item-link dib dn-l">
{{ trans('app.header_logout_link') }}
</a>
</div>
</div>
</div>
</div>
</nav>

View File

@@ -0,0 +1,4 @@
<svg class="relative" style="top: 3px;" idth="22" height="23" viewBox="0 0 22 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.0141 4C10.1697 4 9.5 3.24744 9.5 2.29857C9.5 1.44785 10.6065 0.302658 10.8103 0.0736196C10.9267 -0.0245399 11.0723 -0.0245399 11.1888 0.0736196C11.4217 0.302658 12.4991 1.41513 12.4991 2.29857C12.5282 3.24744 11.8585 4 11.0141 4ZM11.0141 0.793456C10.5773 1.28425 10.0823 1.93865 10.0823 2.29857C10.0823 2.88753 10.49 3.3456 11.0141 3.3456C11.5382 3.3456 11.9459 2.88753 11.9459 2.29857C11.9459 1.93865 11.4509 1.25153 11.0141 0.793456Z" fill="#5A6F84"/>
<path d="M22 11.2029C22 9.26087 20.41 7.66667 18.4731 7.66667H12.1419V5.28986C12.1419 5.14493 12.0263 5 11.8528 5H10.1472C9.97372 5 9.85808 5.14493 9.85808 5.28986V7.66667H3.52694C1.59001 7.66667 0 9.26087 0 11.2029C0 12.5942 0.780552 13.7826 1.93692 14.3623C1.93692 14.3913 1.90802 14.4203 1.90802 14.4493V20.6522C1.90802 21.9565 3.12221 23 4.62549 23H17.3745C18.8778 23 20.092 21.9565 20.092 20.6522V14.4783C20.092 14.4493 20.092 14.4203 20.0631 14.3913C21.2194 13.7826 22 12.5942 22 11.2029ZM10.4363 5.6087H11.5637V7.69565H10.4363V5.6087ZM19.5138 20.6812C19.5138 21.6667 18.5598 22.4493 17.3745 22.4493H4.62549C3.44021 22.4493 2.4862 21.6377 2.4862 20.6812V14.5942C2.80421 14.6812 3.15112 14.7391 3.52694 14.7391C4.45204 14.7391 5.34823 14.3623 6.01314 13.6957C6.67806 14.3623 7.57424 14.7391 8.49934 14.7391C9.42444 14.7391 10.3206 14.3623 10.9855 13.6957C11.6505 14.3623 12.5466 14.7391 13.4717 14.7391C14.3968 14.7391 15.293 14.3623 15.958 13.6957C16.6229 14.3623 17.5191 14.7391 18.4442 14.7391C18.82 14.7391 19.1669 14.6812 19.4849 14.5942V20.6812H19.5138ZM18.4731 14.1884C17.6058 14.1884 16.7674 13.7826 16.2181 13.1159C16.1603 13.058 16.0736 13 15.9869 13C15.9001 13 15.8134 13.029 15.7556 13.1159C15.1774 13.8116 14.3679 14.1884 13.5007 14.1884C12.6334 14.1884 11.795 13.7826 11.2457 13.1159C11.1301 12.971 10.8988 12.971 10.8121 13.1159C10.2339 13.8116 9.42444 14.1884 8.55716 14.1884C7.68988 14.1884 6.85151 13.7826 6.30223 13.1159C6.1866 12.971 5.95532 12.971 5.86859 13.1159C5.29041 13.8116 4.48095 14.1884 3.61367 14.1884C1.99474 14.1884 0.664914 12.8551 0.664914 11.2319C0.664914 9.6087 1.99474 8.27536 3.61367 8.27536H18.4731C20.092 8.27536 21.4218 9.6087 21.4218 11.2319C21.4218 12.8551 20.092 14.1884 18.4731 14.1884Z" fill="#5A6F84"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,6 @@
<svg class="relative" style="top: 5px;" width="18" height="19" viewBox="0 0 23 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18.8211 15.45C18.1503 14.7313 17.0003 14.875 16.4732 15.6896C15.7066 16.9354 15.3232 17.4146 15.0357 17.4146C12.2566 17.0312 6.50656 11.0417 6.21906 8.21458C6.21906 8.07083 6.17115 7.78333 7.94406 6.72917C8.75865 6.25 8.9024 5.05208 8.23156 4.38125C5.06906 1.26667 4.92531 0.5 3.87115 0.5C1.90656 0.5 0.0378125 5.57917 0.277396 7.73542C0.900313 12.8625 11.1545 23.5 15.9461 23.5C18.0066 23.5 22.5107 21.8229 22.5586 19.9542C22.5586 18.9 21.792 18.7563 18.8211 15.45ZM15.5149 22.4938C11.1066 21.8708 1.76281 12.0958 1.23573 7.59167C1.04406 6.15417 2.0024 3.18333 3.48781 1.60208C3.67948 1.41042 3.91906 1.41042 3.87115 1.45833C4.0149 1.45833 4.15865 1.50625 4.25448 1.65C7.51281 5.14792 7.7524 5.05208 7.70448 5.53125C7.70448 5.72292 7.60865 5.86667 7.4649 5.91458L7.36906 5.9625C6.21906 6.63333 5.1649 7.30417 5.26073 8.31042C5.59615 11.5687 11.7295 17.9417 14.892 18.3729C16.6649 18.6125 17.1441 15.1146 18.1503 16.1208C21.5045 19.6667 21.6003 19.5229 21.6003 19.9542C21.5524 20.7208 17.767 22.8771 15.5149 22.4938Z" fill="#5A6F84"/>
<path d="M12.0649 5.57918C15.2274 5.57918 17.8149 8.16668 17.8149 11.3292C17.8149 11.6167 18.0066 11.8083 18.2941 11.8083C18.5816 11.8083 18.7733 11.6167 18.7733 11.3292C18.7733 7.6396 15.7545 4.62085 12.0649 4.62085C11.7774 4.62085 11.5858 4.81252 11.5858 5.10002C11.5858 5.38752 11.8253 5.57918 12.0649 5.57918Z" fill="#5A6F84"/>
<path d="M11.6337 8.59791C11.6337 8.88541 11.8253 9.07708 12.1128 9.07708C13.3587 9.07708 14.3649 10.0833 14.3649 11.3292C14.3649 11.6167 14.5566 11.8083 14.8441 11.8083C15.1316 11.8083 15.3233 11.6167 15.3233 11.3292C15.3233 9.55624 13.8858 8.11874 12.1128 8.11874C11.8253 8.11874 11.6337 8.35833 11.6337 8.59791Z" fill="#5A6F84"/>
<path d="M12.1128 2.12917C17.192 2.12917 21.3128 6.25 21.3128 11.3292C21.3128 11.6167 21.5045 11.8083 21.792 11.8083C22.0795 11.8083 22.2712 11.6167 22.2712 11.3292C22.2712 5.72292 17.7191 1.17084 12.1128 1.17084C11.8253 1.17084 11.6337 1.3625 11.6337 1.65C11.6337 1.9375 11.8253 2.12917 12.1128 2.12917Z" fill="#5A6F84"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,5 @@
<svg class="relative" style="top: 6px;" width="23" height="23" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.2737 16.5067C14.1997 16.5067 14.1266 16.5208 14.0575 16.5504C14.0115 16.5694 13.8934 16.6127 13.6201 16.6813C13.4232 16.7301 13.253 16.7553 13.1139 16.7553C12.6994 16.7553 12.5926 16.6803 12.5916 16.6803C12.5905 16.6798 12.5335 16.6107 12.5335 16.3626C12.5335 16.3035 12.5424 16.1601 12.6007 15.8624C12.6486 15.618 12.7027 15.4033 12.7608 15.2216L13.5332 12.7355C13.6193 12.4776 13.6782 12.1936 13.7091 11.8898C13.7393 11.5963 13.7532 11.3907 13.7532 11.2742C13.7532 10.6141 13.491 10.0668 12.9727 9.64576C12.4705 9.2411 11.7731 9.03572 10.8987 9.03572C10.4312 9.03572 9.93497 9.11118 9.42258 9.25966C8.94463 9.39691 8.43923 9.56346 7.91959 9.75615C7.76681 9.81232 7.65358 9.93149 7.61431 10.0763L7.4072 10.8478C7.36201 11.0158 7.42334 11.1931 7.56643 11.3074C7.66165 11.3833 7.78241 11.4234 7.9056 11.4234C7.96692 11.4234 8.02986 11.4134 8.08877 11.3926C8.2289 11.344 8.39996 11.2935 8.59201 11.2407C8.75527 11.197 8.91638 11.1753 9.06835 11.1753C9.43442 11.1753 9.54281 11.2334 9.5455 11.2334C9.54954 11.2385 9.60575 11.3157 9.60575 11.565C9.60575 11.7108 9.58477 11.8791 9.5455 12.062C9.50058 12.2664 9.44329 12.4847 9.37928 12.707L8.59497 15.2272C8.521 15.5093 8.46774 15.7547 8.43359 15.9787C8.3997 16.2073 8.38356 16.4341 8.38356 16.6537C8.38356 17.305 8.6528 17.8506 9.18428 18.2748C9.69639 18.685 10.4019 18.8929 11.2814 18.8929C11.8269 18.8929 12.318 18.8247 12.7414 18.6907C13.1188 18.5722 13.6212 18.4008 14.2535 18.1741C14.4076 18.1192 14.5236 17.9988 14.5626 17.8528L14.7705 17.083C14.8176 16.9094 14.7517 16.7262 14.5983 16.6127C14.5058 16.5423 14.3896 16.5067 14.2737 16.5067ZM14.0653 17.7416C13.4421 17.9651 12.9469 18.1341 12.5744 18.2513C12.2032 18.3685 11.772 18.4279 11.2814 18.4279C10.527 18.4279 9.94089 18.2599 9.52237 17.9255C9.10412 17.5917 8.89594 17.168 8.89594 16.6537C8.89594 16.4544 8.91127 16.25 8.9422 16.041C8.97421 15.8329 9.02424 15.598 9.09337 15.3349L9.87284 12.8337C9.94196 12.5939 10.0009 12.3663 10.0477 12.1533C10.0947 11.9389 10.1179 11.7426 10.1179 11.565C10.1179 11.2466 10.045 11.0231 9.90054 10.8983C9.75449 10.7721 9.47853 10.7103 9.06808 10.7103C8.86689 10.7103 8.65979 10.7379 8.44757 10.7943C8.23751 10.8519 8.05515 10.9061 7.90506 10.9584L8.11136 10.1869C8.62159 9.99841 9.11004 9.83723 9.57616 9.70315C10.0423 9.56835 10.4826 9.50095 10.8981 9.50095C11.6475 9.50095 12.225 9.6653 12.6319 9.99376C13.0362 10.3217 13.2406 10.7491 13.2406 11.2744C13.2406 11.3831 13.2263 11.5746 13.1986 11.8486C13.1707 12.1231 13.1185 12.3736 13.0424 12.602L12.2669 15.0951C12.204 15.2944 12.147 15.524 12.0959 15.7806C12.0456 16.0363 12.0208 16.2319 12.0208 16.3626C12.0208 16.6945 12.1018 16.9196 12.2659 17.0393C12.428 17.1597 12.711 17.22 13.1134 17.22C13.3025 17.22 13.5144 17.1892 13.7549 17.1299C13.9929 17.0698 14.165 17.0171 14.2732 16.9716L14.0653 17.7416Z" fill="#5A6F84"/>
<path d="M12.7359 4.10715C12.1792 4.10715 11.6947 4.30635 11.2935 4.69983C10.8913 5.09601 10.6787 5.603 10.6787 6.16515C10.6787 6.73542 10.8862 7.22764 11.2961 7.6285C11.6966 8.01755 12.1799 8.21429 12.7359 8.21429C13.2923 8.21429 13.7752 8.01681 14.1727 7.62703C14.5791 7.22813 14.7859 6.73616 14.7859 6.1649C14.7859 5.59389 14.5791 5.10094 14.1746 4.70057C13.7769 4.30684 13.2933 4.10715 12.7359 4.10715ZM13.8698 7.28353C13.5563 7.59182 13.1775 7.74522 12.7359 7.74522C12.2945 7.74522 11.9143 7.59182 11.5974 7.28353C11.283 6.97575 11.1233 6.60295 11.1233 6.16515C11.1233 5.72883 11.2832 5.35259 11.5974 5.04258C11.9143 4.7311 12.2945 4.57622 12.7359 4.57622C13.1777 4.57622 13.5565 4.73085 13.8698 5.04258C14.1832 5.35259 14.3412 5.72883 14.3412 6.16515C14.3412 6.60295 14.1832 6.97575 13.8698 7.28353Z" fill="#5A6F84"/>
<path d="M11.5 0C5.14893 0 0 5.14868 0 11.5C0 17.8516 5.14893 23 11.5 23C17.8511 23 23 17.8516 23 11.5C23 5.14868 17.8511 0 11.5 0ZM11.5 22.5134C5.42672 22.5134 0.486833 17.573 0.486833 11.5C0.486833 5.42723 5.42672 0.486833 11.5 0.486833C17.5735 0.486833 22.5134 5.42723 22.5134 11.5C22.5134 17.573 17.5735 22.5134 11.5 22.5134Z" fill="#5A6F84"/>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@@ -0,0 +1,4 @@
<svg class="relative" style="top: 7px;" width="23" height="23" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="11.5" cy="11.5" r="11" fill="white" stroke="#A2B0BE"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.58724 10.3371C9.77486 10.1495 9.77486 9.83441 9.58724 9.64683C9.34709 9.39923 9.22702 9.07659 9.22702 8.75395C9.22702 8.43131 9.34709 8.10867 9.58724 7.86106C9.77486 7.66598 9.77486 7.35835 9.58724 7.17076C9.54373 7.12513 9.4913 7.08892 9.4332 7.0644C9.37511 7.03988 9.31259 7.02756 9.24953 7.0282C9.12946 7.0282 9.00188 7.07322 8.91182 7.17076C8.48405 7.60595 8.27392 8.1837 8.27392 8.75395C8.27392 9.32419 8.49156 9.90194 8.91182 10.3371C9.09944 10.5247 9.40713 10.5247 9.58724 10.3371V10.3371ZM7.74109 6.14282C7.64949 6.05137 7.52533 6 7.39587 6C7.26642 6 7.14226 6.05137 7.05066 6.14282C6.35272 6.86313 6 7.80854 6 8.74644C6 9.69185 6.35272 10.6373 7.05066 11.3576C7.23827 11.5527 7.54597 11.5527 7.73358 11.3576C7.9212 11.1625 7.9212 10.8473 7.73358 10.6523C7.22326 10.127 6.96811 9.43674 6.96811 8.74644C6.96811 8.05615 7.22326 7.36585 7.73358 6.84062C7.8267 6.74885 7.87975 6.62399 7.88116 6.49327C7.88256 6.36255 7.83221 6.23657 7.74109 6.14282V6.14282ZM12.0113 9.96947C12.2517 9.96947 12.4868 9.89818 12.6867 9.76462C12.8866 9.63105 13.0425 9.44122 13.1345 9.21911C13.2265 8.997 13.2506 8.7526 13.2037 8.51681C13.1567 8.28102 13.041 8.06444 12.8709 7.89444C12.7009 7.72445 12.4843 7.60868 12.2484 7.56178C12.0126 7.51488 11.7682 7.53895 11.546 7.63095C11.3239 7.72295 11.134 7.87875 11.0004 8.07864C10.8668 8.27853 10.7955 8.51354 10.7955 8.75395C10.788 9.42173 11.3358 9.96947 12.0113 9.96947V9.96947ZM16.9418 6.15033C16.8978 6.10406 16.8448 6.06722 16.7861 6.04205C16.7274 6.01688 16.6642 6.0039 16.6004 6.0039C16.5365 6.0039 16.4733 6.01688 16.4146 6.04205C16.3559 6.06722 16.3029 6.10406 16.2589 6.15033C16.0713 6.34541 16.0713 6.66055 16.2589 6.85563C16.7692 7.38086 17.0244 8.07115 17.0244 8.76145C17.0244 9.45175 16.7692 10.1345 16.2589 10.6673C16.0713 10.8624 16.0713 11.1775 16.2589 11.3726C16.3505 11.464 16.4747 11.5154 16.6041 11.5154C16.7336 11.5154 16.8577 11.464 16.9493 11.3726C17.6473 10.6523 18 9.70686 18 8.76145C17.9962 7.78742 17.6172 6.85229 16.9418 6.15033V6.15033ZM12.0113 10.9449C11.7036 10.9449 11.3884 10.8699 11.1107 10.7198L8.74672 17H9.86492L10.5103 16.2497H13.5122L14.1426 17H15.2608L12.9043 10.7198C12.6191 10.8699 12.3189 10.9449 12.0113 10.9449V10.9449ZM12.0038 11.305L12.7617 14.0062H11.2608L12.0038 11.305ZM10.5103 15.4994L11.2608 14.749H12.7617L13.5122 15.4994H10.5103ZM14.4053 7.17076C14.2176 7.35835 14.2176 7.67348 14.4053 7.86106C14.6454 8.10867 14.7655 8.43131 14.7655 8.75395C14.7655 9.07659 14.6454 9.39923 14.4053 9.64683C14.2176 9.84192 14.2176 10.1495 14.4053 10.3371C14.4493 10.382 14.5018 10.4177 14.5598 10.4421C14.6178 10.4665 14.6801 10.479 14.743 10.479C14.8059 10.479 14.8681 10.4665 14.9261 10.4421C14.9841 10.4177 15.0367 10.382 15.0807 10.3371C15.5084 9.90194 15.7186 9.32419 15.7186 8.75395C15.7186 8.1837 15.5084 7.60595 15.0807 7.17076C15.0364 7.12621 14.9838 7.09085 14.9259 7.06671C14.8679 7.04258 14.8057 7.03016 14.743 7.03016C14.6802 7.03016 14.618 7.04258 14.5601 7.06671C14.5021 7.09085 14.4495 7.12621 14.4053 7.17076V7.17076Z" fill="#219653"/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 66 KiB

View File

@@ -0,0 +1,7 @@
@if(session('success'))
<div class="alert alert-success" :timeout="4000">
{{ session('success') }}
</div>
@endif

View File

@@ -0,0 +1,16 @@
@if (($subscription = auth()->user()->account->getSubscribedPlan()) && $subscription->hasIncompletePayment())
<div class="alert alert-success">
{!! trans('settings.subscriptions_account_confirm_payment', ['url' => route('settings.subscriptions.confirm', $subscription->latestPayment() ? $subscription->latestPayment()->id : '')]) !!}
</div>
@if (! app()->environment('production'))
<p>
<a href="{{ route('settings.subscriptions.forceCompletePaymentOnTesting') }}">
{{-- No translation needed --}}
Force payment success (test).
</a>
</p>
@endif
@endif

View File

@@ -0,0 +1,132 @@
<div class="ph3 ph5-ns pv2 cf w-100 mt4 mt0-ns">
@if ($contact->isMe())
<div class="alert alert-success tc">
{{ trans('people.me') }}
</div>
@endif
<div class="mw9 center tc w-100 avatar-header relative">
{{-- AVATAR --}}
<div class="relative center dib z-3">
<div class="relative hide-child">
<div class="image-header top-0 left-0">
<img class="cover br3 bb b--gray-monica"
alt="{{ $contact->initials }}"
src="{{ $contact->getAvatarURL() }}"
style="height: 115px; width: 115px;"
v-on:error="fixAvatarDisplay"
/>
<div class="hidden br3 dib white tc f1"
style="padding-top: 21px; height: 115px; width: 115px; background-color: {{ $contact->default_avatar_color }}"
>
{{ $contact->initials }}
</div>
</div>
<div class="child absolute top-0 left-0 h-100 w-100 br3">
<div class="db w-100 h-100 center tc pt5">
<a class="no-underline white" href="{{ route('people.avatar.edit', $contact) }}">
📷 {{ trans('app.update' )}}
</a>
</div>
</div>
</div>
</div>
</div>
<div class="mw9 center dt w-100 box-shadow pa4 relative">
<h1 class="tc mb2 mt4">
<span class="{{ htmldir() == 'ltr' ? 'mr1' : 'ml1' }}">{{ $contact->name }}</span>
<contact-favorite hash="{{ $contact->hashID() }}" :starred="{{ \Safe\json_encode($contact->is_starred) }}"></contact-favorite>
@if ($contact->job)
<span class="db f5 normal">{{ $contact->job }}
@if ($contact->company)
({{ $contact->company }})
@endif
</span>
@endif
</h1>
<ul class="tc-ns mb3 {{ htmldir() == 'ltr' ? 'tl' : 'tr' }}">
{{-- AGE --}}
<li class="mb2 mb0-ns di-ns db tc {{ htmldir() == 'ltr' ? 'mr3-ns' : 'ml3-ns' }}">
@if ($contact->birthdate && !($contact->is_dead))
@if ($contact->getBirthdayState() !== 'unknown')
<span class="{{ htmldir() == 'ltr' ? 'mr1' : 'ml1' }}">@include('partials.icons.header_birthday')</span>
@if($contact->getBirthdayState() === 'approximate')
<span>{{ trans('people.age_approximate_in_years', ['age' => $contact->birthdate->getAge()]) }}</span>
@elseif($contact->getBirthdayState() === 'almost')
<span>{{$contact->birthdate->toShortString()}}</span>
@else
<span>{{$contact->birthdate->toShortString()}} ({{ $contact->birthdate->getAge() }})</span>
@endif
@endif
@elseif ($contact->is_dead)
@if (! is_null($contact->deceasedDate))
{{ trans('people.deceased_label_with_date', ['date' => $contact->deceasedDate->toShortString()]) }}
@if ($contact->deceasedDate->is_year_unknown == 0 && $contact->getBirthdayState() !== 'almost')
<span>({{ trans('people.deceased_age') }} {{ $contact->getAgeAtDeath() }})</span>
@endif
@else
{{ trans('people.deceased_label') }}
@endif
@endif
</li>
{{-- LAST ACTIVITY --}}
@if (! $contact->isMe())
<li class="mb2 mb0-ns dn di-ns tc {{ htmldir() == 'ltr' ? 'mr3-ns' : 'ml3-ns' }}">
<span class="{{ htmldir() == 'ltr' ? 'mr1' : 'ml1' }}">@include('partials.icons.header_people')</span>
@if (is_null($contact->getLastActivityDate()))
{{ trans('people.last_activity_date_empty') }}
@else
{{ trans('people.last_activity_date', ['date' => \App\Helpers\DateHelper::getShortDate($contact->getLastActivityDate())]) }}
@endif
</li>
@endif
{{-- LAST CALLED --}}
@if (! $contact->isMe())
<li class="mb2 mb0-ns dn di-ns tc {{ htmldir() == 'ltr' ? 'mr3-ns' : 'ml3-ns' }}">
<span class="{{ htmldir() == 'ltr' ? 'mr1' : 'ml1' }}">@include('partials.icons.header_call')</span>
<last-called hash="{{ $contact->hashID() }}"
initial-value="{{ is_null($contact->last_talked_to) ? null : \App\Helpers\DateHelper::getShortDate($contact->last_talked_to) }}"
ref="lastCalledAttribute"
>
</last-called>
</li>
@endif
{{-- DESCRIPTION --}}
@if ($contact->description)
<li class="mb2 mb0-ns di-ns db tc {{ htmldir() == 'ltr' ? 'mr3-ns' : 'ml3-ns' }}">
@include('partials.icons.header_description')
{{ $contact->description }}
</li>
@endif
{{-- STAY IN TOUCH --}}
@if(!$contact->is_dead && ! $contact->isMe())
<li class="mb2 mb0-ns di-ns db tc {{ htmldir() == 'ltr' ? 'mr3-ns' : 'ml3-ns' }}">
@include('partials.icons.header_stayintouch')
<stay-in-touch :first-name="'{{ $contact->first_name }}'" :frequency="{{ $contact->stay_in_touch_frequency ?? 'null' }}" :trigger-date="'{{ $contact->stay_in_touch_trigger_date !== null ? \App\Helpers\DateHelper::getTimestamp($contact->stay_in_touch_trigger_date) : null }}'" hash="{{ $contact->hashID() }}" :limited="{{ \Safe\json_encode($accountHasLimitations) }}"></stay-in-touch>
</li>
@endif
</ul>
<tags hash="{{ $contact->hashID() }}" class="mb3 mb0-ns"></tags>
<div class="absolute-ns tc profile-edit-contact-button">
<a href="{{ route('people.edit', $contact) }}" class="btn" id="button-edit-contact">{{ trans('people.edit_contact_information') }}</a>
</div>
</div>
</div>
<div class="ph3 ph5-ns pv2 cf w-100">
<div class="mw9 center dt w-100">
@include ('partials.errors')
@include ('partials.notification')
</div>
</div>

View File

@@ -0,0 +1,7 @@
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} w-100 pb3 pt1 pl3 pr3">
<div class="br2 bg-white mb2">
<activity-list hash="{{ $contact->hashID() }}" :contact-id="{{ $contact->id }}" name="{{ $contact->first_name }}" />
</div>
</div>

View File

@@ -0,0 +1,130 @@
@extends('layouts.skeleton')
@section('title', $contact->name )
@section('content')
{{-- Breadcrumb --}}
<section class="ph3 ph5-ns pt4 cf w-100 bg-gray-monica">
<div class="mw7 center">
<div class="full-page-modal-header ph4 pv3 bt br bl b--gray-monica">
<ul>
<li class="di"><a href="{{ route('people.show', $contact) }}">{{ trans('app.breadcrumb_profile', ['name' => $contact->name]) }}</a></li>
<li class="di ph2">></li>
<li class="di">{{ trans('people.activity_title') }}</li>
</ul>
</div>
</div>
</section>
{{-- Main section --}}
<section class="ph3 ph5-ns cf w-100 bg-gray-monica mb5">
<div class="mw8 center full-page-modal pt4">
<h2 class="tc bb b--gray-monica pb4 mb3 normal">{{ trans('people.activities_profile_title', ['name' => $contact->first_name]) }}</h2>
<h2 class="tc pt3 pb4 ph3 f4 normal">🚀 {{ trans_choice('people.activities_profile_subtitle', $totalActivities, ['total_activities' => $totalActivities, 'activities_last_twelve_months' => $activitiesLastTwelveMonths, 'name' => $contact->first_name]) }}</h2>
<div class="cf ph2-ns">
{{-- Left sidebar --}}
<div class="fl w-100 w-25-ns pa2">
<div class="bg-white">
<ul>
@foreach($activitiesPerYear as $activityStatistic)
<li class="full-page-modal-year-selector pv2 b {{ $year == $activityStatistic->year ? 'selected' : '' }}">
<span class="ph3">
@if ($year != $activityStatistic->year)
<a href="{{ route('people.activities.year', [$contact, $activityStatistic->year]) }}">
@endif
{{ $activityStatistic->year }}
@if ($year != $activityStatistic->year)
</a>
@endif
<span class="fr mr3">{{ $activityStatistic->count }}</span>
</span>
</li>
@endforeach
</ul>
</div>
</div>
{{-- Right Content --}}
<div class="fl w-100 w-75-ns pa2">
<div class="bg-white">
<p class="tc b">🤲 {{ trans('people.activities_profile_year_summary_activity_types', ['year' => $year]) }}</p>
<ul class="column-list mb4">
@foreach($uniqueActivityTypes as $activityType)
<li class="mb2 relative tc">
<span class="f3">{{ $activityType['occurences'] }}</span>
<span class="relative" style="top: -3px;">{{ $activityType['object']->name }}</span>
</li>
@endforeach
</ul>
<p class="tc b mb4">{{ trans('people.activities_profile_year_summary', ['year' => $year]) }}</p>
{{-- Bar chart --}}
<div class="ba b--gray-monica mb5-ns mb6 br2">
<ul class="chart-activities">
@foreach ($activitiesPerMonthForYear->sortBy('month') as $activityMonth)
<li>
<span class="f6" style="height: {{ $activityMonth['percent'] }}%" title="{{ \App\Helpers\DateHelper::getShortMonth(\Carbon\Carbon::create(1990, $activityMonth['month'], 1)) }}"></span>
</li>
@endforeach
</ul>
</div>
{{-- Details about each month --}}
@foreach ($activitiesPerMonthForYear as $activityMonth)
@if ($activityMonth['occurences'] != 0)
<h3 class="f4">
<svg width="16" height="15" viewBox="0 0 16 15" fill="none" xmlns="http://www.w3.org/2000/svg" class="mr2">
<path fill-rule="evenodd" clip-rule="evenodd" d="M16 14V15H0V0H1V14H16ZM5 13H3V8H5V13ZM9 13H7V3H9V13ZM13 13H11V6H13V13Z" fill="#4CA35A" />
</svg>
{{ \App\Helpers\DateHelper::getFullMonthAndDate(\Carbon\Carbon::create($year, $activityMonth['month'])) }} <span class="black-70 f4 normal ml3">{{ trans_choice('people.activities_profile_number_occurences', $activityMonth['occurences'], ['value' => $activityMonth['occurences']]) }}</span>
</h3>
{{-- Activities list --}}
@foreach ($activityMonth['activities'] as $activity)
<div class="pl2 bl-ns b--gray-monica">
<div class="pa3-ns pa2 br2 mb3-ns mb2 ml4-ns ml2">
<div class="mb1">
<ul class="mb3 di black-70">
<li class="di relative pr1" style="top:2px">
<svg width="13" height="14" viewBox="0 0 13 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.6308 1H10.6615V2.5C10.6615 2.78 10.4483 3 10.1769 3H8.23846C7.96708 3 7.75385 2.78 7.75385 2.5V1H4.84615V2.5C4.84615 2.78 4.63292 3 4.36154 3H2.42308C2.15169 3 1.93846 2.78 1.93846 2.5V1H0.969231C0.436154 1 0 1.45 0 2V13C0 13.55 0.436154 14 0.969231 14H11.6308C12.1638 14 12.6 13.55 12.6 13V2C12.6 1.45 12.1638 1 11.6308 1ZM11.6308 13H0.969231V4H11.6308V13ZM3.87692 2H2.90769V0H3.87692V2ZM9.69231 2H8.72308V0H9.69231V2ZM4.84615 6H3.87692V5H4.84615V6ZM6.78461 6H5.81538V5H6.78461V6ZM8.72308 6H7.75385V5H8.72308V6ZM10.6615 6H9.69231V5H10.6615V6ZM2.90769 8H1.93846V7H2.90769V8ZM4.84615 8H3.87692V7H4.84615V8ZM6.78461 8H5.81538V7H6.78461V8ZM8.72308 8H7.75385V7H8.72308V8ZM10.6615 8H9.69231V7H10.6615V8ZM2.90769 10H1.93846V9H2.90769V10ZM4.84615 10H3.87692V9H4.84615V10ZM6.78461 10H5.81538V9H6.78461V10ZM8.72308 10H7.75385V9H8.72308V10ZM10.6615 10H9.69231V9H10.6615V10ZM2.90769 12H1.93846V11H2.90769V12ZM4.84615 12H3.87692V11H4.84615V12ZM6.78461 12H5.81538V11H6.78461V12ZM8.72308 12H7.75385V11H8.72308V12Z" fill="#CDCDCD" />
</svg>
</li>
<li class="di f6 pr3">
{{ \App\Helpers\DateHelper::getShortDate($activity->happened_at) }}
</li>
@if (!is_null($activity->type))
<li class="di relative pr1" style="top:1px">
<svg width="14" height="12" viewBox="0 0 14 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 2H7V1C7 0.34 6.69 0 6 0H1C0.45 0 0 0.45 0 1V11C0 11.55 0.45 12 1 12H13C13.55 12 14 11.55 14 11V3C14 2.45 13.55 2 13 2ZM6 2H1V1H6V2Z" fill="#DFDFDF" />
</svg>
</li>
<li class="di f6">
{{ $activity->type->name }}
</li>
@endif
</ul>
</div>
<p class="mb2"><strong>{{ $activity->summary }}</strong></p>
<p class="mb0">{{ $activity->description }}</p>
</div>
</div>
@endforeach
@endif
@endforeach
</div>
</div>
</div>
</div>
</section>
@endsection

View File

@@ -0,0 +1,65 @@
@extends('layouts.skeleton')
@section('title', $contact->name )
@section('content')
{{-- Breadcrumb --}}
<section class="ph3 ph5-ns pt4 cf w-100 bg-gray-monica">
<div class="mw7 center">
<div class="full-page-modal-header ph4 pv3 bt br bl b--gray-monica tc">
<ul>
<li class="di"><a href="{{ route('people.show', $contact) }}">{{ trans('app.breadcrumb_profile', ['name' => $contact->name]) }}</a></li>
<li class="di ph2">></li>
<li class="di">{{ trans('people.auditlogs_breadcrumb') }}</li>
</ul>
</div>
</div>
</section>
{{-- Main section --}}
<section class="ph3 ph5-ns cf w-100 bg-gray-monica mb5">
<div class="mw8 center full-page-modal pt4">
<h2 class="tc bb b--gray-monica pb4 mb3 normal">{{ trans('people.auditlogs_title', ['name' => $contact->first_name]) }}</h2>
<div class="cf ph2-ns">
{{-- Left sidebar --}}
<div class="fl w-100 w-100-ns pa2">
<div class="bg-white">
<ul class="table">
<li class="table-row">
<div class="table-cell table-header">
{{ trans('settings.logs_actor') }}
</div>
<div class="table-cell table-header date">
{{ trans('settings.logs_timestamp') }}
</div>
<div class="table-cell table-header">
{{ trans('settings.logs_description') }}
</div>
</li>
@foreach ($logsCollection as $log)
<li class="table-row">
<div class="table-cell audit-log-cell">
{{ $log['author_name'] }}
</div>
<div class="table-cell audit-log-cell date">
{{ \App\Helpers\DateHelper::getShortDateWithTime($log['audited_at']) }}
</div>
<div class="table-cell audit-log-cell">
{{ $log['description'] }}
</div>
</li>
@endforeach
</ul>
<div class="tc center">
{{ $logsPagination->links() }}
</div>
</div>
</div>
</div>
</div>
</section>
@endsection

View File

@@ -0,0 +1,44 @@
@extends('layouts.skeleton')
@section('content')
<section class="ph3 ph0-ns">
{{-- Breadcrumb --}}
<div class="mt4 mw7 center mb3">
<p><a href="{{ route('people.show', $contact) }}">< {{ $contact->name }}</a></p>
<h3 class="f3 fw5">{{ trans('people.avatar_change_title') }}</h3>
</div>
<div class="mw7 center br3 ba b--gray-monica bg-white mb5">
<form method="POST" action="{{ route('people.avatar.update', $contact) }}" enctype="multipart/form-data">
@csrf
@include('partials.errors')
{{-- Adorable --}}
<contact-avatar
:avatar="'{{ $contact->avatar_source }}'"
:default-url="'{{ $contact->getAvatarDefaultURL() }}'"
:adorable-url="'{{ $contact->avatar_adorable_data_url }}'"
:gravatar-url="'{{ $contact->avatar_gravatar_url }}'"
:photo-url="'{{ $contact->getAvatarURL() }}'"
:has-reached-account-storage-limit="false"
:max-upload-size="{{ config('monica.max_upload_size') }}"
>
</contact-avatar>
{{-- Form actions --}}
<div class="ph4-ns ph3 pv3 bb b--gray-monica">
<div class="flex-ns justify-between">
<div>
<a href="{{ route('people.show', $contact) }}" class="btn btn-secondary w-auto-ns w-100 mb2 pb0-ns">{{ trans('app.cancel') }}</a>
</div>
<div>
<button class="btn btn-primary w-auto-ns w-100 mb2 pb0-ns" name="save" type="submit">{{ trans('app.save') }}</button>
</div>
</div>
</div>
</form>
</div>
</div>
@endsection

View File

@@ -0,0 +1,40 @@
<div class="blank-people-state">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
@if (! is_null($tags))
<p class="clear-filter">
{{ trans('people.people_list_filter_tag') }}
@foreach ($tags as $tag)
<span class="pretty-tag">
{{ $tag->name }}
</span>
@endforeach
<a href="{{ route('people.index') }}">{{ trans('people.people_list_clear_filter') }}</a>
</p>
@endif
@if ($tagLess)
<p class="clear-filter">
<span class="mr2">{{ trans('people.people_list_filter_untag') }}</span>
<a href="{{ route('people.index') }}">{{ trans('people.people_list_clear_filter') }}</a>
</p>
@endif
<div class="illustration-blank">
<img src="img/people/blank.svg" alt="Image">
</div>
<h3>{{ trans('people.people_list_blank_title') }}</h3>
<div class="cta-blank">
<a href="{{ route('people.create') }}" class="btn btn-primary" id="button-add-contact">{{ trans('people.people_list_blank_cta') }}</a>
</div>
<div class="mb4">
@if ($hasArchived)
<a href="{{ route('people.archived') }}">@lang('people.list_link_to_archived_contacts')</a>
@endif
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,5 @@
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} w-100 pb3 pt1 pl3 pr3">
<div class="br2 bg-white mb2">
<phone-call-list hash="{{ $contact->hashID() }}" name="{{ $contact->first_name }}"></phone-call-list>
</div>
</div>

View File

@@ -0,0 +1,93 @@
@extends('layouts.skeleton')
@section('content')
<section class="ph3 ph0-ns">
{{-- Breadcrumb --}}
<div class="mt4 mw7 center mb3">
<p><a href="{{ route('people.show', $contact) }}">&lt; {{ $contact->name }}</a></p>
<div class="mt4 mw7 center mb3">
<h3 class="f3 fw5">{{ trans('people.conversation_edit_title') }}</h3>
<form method="POST" action="{{ route('people.conversations.destroy', [$contact, $conversation]) }}">
@method('DELETE')
@csrf
<confirm message="{{ trans('people.conversation_edit_delete') }}" link-class="w-auto-ns w-100 mb2 pb0-ns">
{{ trans('people.conversation_delete_link') }}
</confirm>
</form>
</div>
</div>
<div class="mw7 center br3 ba b--gray-monica bg-white mb6">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
@include('partials.errors')
<form action="{{ route('people.conversations.update', [$contact, $conversation]) }}" method="POST" enctype="multipart/form-data">
@method('PUT')
@csrf
{{-- When did it take place --}}
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<p class="mb2 b">{{ trans('people.conversation_add_when') }}</p>
<div class="">
<div class="di {{ htmldir() == 'ltr' ? 'mr3' : 'ml3' }}">
<input type="radio" class="mr1" id="today" name="conversationDateRadio" value="today">
<label for="today" class="pointer">{{ trans('app.today') }}</label>
</div>
<div class="di {{ htmldir() == 'ltr' ? 'mr3' : 'ml3' }}">
<input type="radio" class="mr1" id="yesterday" name="conversationDateRadio" value="yesterday">
<label for="yesterday" class="pointer">{{ trans('app.yesterday') }}</label>
</div>
<div class="di {{ htmldir() == 'ltr' ? 'mr3' : 'ml3' }}">
<input type="radio" id="another" name="conversationDateRadio" value="another" checked>
<label for="another" class="pointer mr2">{{ trans('app.another_day') }}
<span class="dib">
<form-date
:id="'conversationDate'"
:default-date="'{{ now() }}'"
:value="'{{ $conversation->happened_at }}'"
:locale="'{{ \App::getLocale() }}'">
</form-date>
</span></label>
</div>
</div>
</div>
{{-- What tool did you use --}}
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<form-select
:options="{{ $contactFieldTypes }}"
:required="true"
value="{{ $conversation->contact_field_type_id }}"
:title="'{{ trans('people.conversation_add_how') }}'"
:id="'contactFieldTypeId'">
</form-select>
</div>
{{-- Conversation --}}
<conversation participant-name="{{ $contact->first_name }}" :existing-messages="{{ $messages }}"></conversation>
{{-- Form actions --}}
<div class="ph4-ns ph3 pv3 bb b--gray-monica">
<div class="flex-ns justify-between">
<div class="">
<a href="{{ route('people.show', $contact) }}" class="btn btn-secondary tc w-auto-ns w-100 mb2 pb0-ns">{{ trans('app.cancel') }}</a>
</div>
<div class="">
<button class="btn btn-primary w-auto-ns w-100 mb2 pb0-ns" name="save" type="submit">{{ trans('app.update') }}</button>
</div>
</div>
</div>
</form>
</div>
</section>
@endsection

View File

@@ -0,0 +1,28 @@
<div class="col-12 {{ \App\Helpers\LocaleHelper::getDirection() }}">
<h3>
🗣&#8199;{{ trans('people.conversation_list_title') }}
<span class="relative {{ \App\Helpers\LocaleHelper::getDirection() == 'ltr' ? 'fr' : 'fl' }}" style="top: -7px;">
<a href="{{ route('people.conversations.create', $contact) }}" class="btn edit-information">{{ trans('people.conversation_list_cta') }}</a>
</span>
</h3>
</div>
@if ($contact->conversations->count() > 0)
<div class="{{ \App\Helpers\LocaleHelper::getDirection() == 'ltr' ? 'fl' : 'fr' }} w-100 pb3 pt1 pl3 pr3">
<div class="br2 bg-white mb4">
<conversation-list hash="{{ $contact->hashID() }}"></conversation-list>
</div>
</div>
@else
<div class="col-12" cy-name="conversation-blank-state">
<div class="section-blank">
<h3>{{ trans('people.conversation_blank', ['name' => $contact->first_name]) }}</h3>
<a href="{{ route('people.conversations.create', $contact) }}" cy-name="add-conversation-button">{{ trans('people.conversation_list_cta') }}</a>
</div>
</div>
@endif

View File

@@ -0,0 +1,83 @@
@extends('layouts.skeleton')
@section('content')
<section class="ph3 ph0-ns">
{{-- Breadcrumb --}}
<div class="mt4 mw7 center mb3">
<p><a href="{{ route('people.show', $contact) }}">< {{ $contact->name }}</a></p>
<div class="mt4 mw7 center mb3">
<h3 class="f3 fw5">{{ trans('people.conversation_add_title') }}</h3>
</div>
</div>
<div class="mw7 center br3 ba b--gray-monica bg-white mb6">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
@include('partials.errors')
<form action="{{ route('people.conversations.store', $contact) }}" method="POST">
@csrf
{{-- When did it take place --}}
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<p class="mb2 b">{{ trans('people.conversation_add_when') }}</p>
<div class="">
<div class="di mr3">
<input type="radio" class="mr1" id="today" name="conversationDateRadio" value="today" checked>
<label for="today" class="pointer">{{ trans('app.today') }}</label>
</div>
<div class="di mr3">
<input type="radio" class="mr1" id="yesterday" name="conversationDateRadio" value="yesterday">
<label for="yesterday" class="pointer">{{ trans('app.yesterday') }}</label>
</div>
<div class="di mr3">
<input type="radio" id="another" name="conversationDateRadio" value="another">
<label for="another" class="pointer mr2">{{ trans('app.another_day') }}</label>
<div class="dib">
<form-date
:id="'conversationDate'"
:default-date="'{{ now(\App\Helpers\DateHelper::getTimezone()) }}'"
:locale="'{{ \App::getLocale() }}'">
</form-date>
</div>
</div>
</div>
</div>
{{-- What tool did you use --}}
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<form-select
:options="{{ $contactFieldTypes }}"
:required="true"
:title="'{{ trans('people.conversation_add_how') }}'"
:id="'contactFieldTypeId'">
</form-select>
</div>
{{-- Conversation --}}
<conversation participant-name="{{ $contact->first_name }}"></conversation>
{{-- Form actions --}}
<div class="ph4-ns ph3 pv3 bb b--gray-monica">
<div class="flex-ns justify-between">
<div class="">
<a href="{{ route('people.show', $contact) }}" class="btn btn-secondary tc w-auto-ns w-100 mb2 pb0-ns">{{ trans('app.cancel') }}</a>
</div>
<div class="">
<button class="btn btn-primary w-auto-ns w-100 mb2 pb0-ns" cy-name="save-conversation-button" name="save" type="submit">{{ trans('app.add') }}</button>
</div>
</div>
</div>
</form>
</div>
</section>
@endsection

View File

@@ -0,0 +1,153 @@
@extends('layouts.skeleton')
@section('content')
<section class="ph3 ph0-ns">
<div class="mt4 mw7 center mb3">
@if ($isContactMissing)
<h2 class="f2 fw5">{{ trans('people.people_add_missing') }}</h2>
@else
<h2 class="f3 fw5">{{ trans('people.people_add_title') }}</h2>
@endif
@if (! $accountHasLimitations)
<p class="import">{!! trans('people.people_add_import', ['url' => route('settings.import')]) !!}</p>
@endif
</div>
<div class="mw7 center br3 ba b--gray-monica bg-white mb6">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
@include('partials.errors')
<form action="{{ route('people.store') }}" method="POST">
@csrf
<div class="pa4-ns ph3 pv2 bb b--gray-monica">
{{-- This check is for the cultures that are used to say the last name first --}}
@if ($formNameOrder == 'firstname')
<div class="mb3">
<form-input
:id="'first_name'"
:input-type="'text'"
:required="true"
:title="'{{ trans('people.people_add_firstname') }}'"
value="{{ $firstName }}">
</form-input>
</div>
<div class="mb3">
<form-input
:id="'middle_name'"
:input-type="'text'"
:required="false"
:title="'{{ trans('people.people_add_middlename') }}'">
</form-input>
</div>
<div class="mb3">
<form-input
:id="'last_name'"
:input-type="'text'"
:required="false"
:title="'{{ trans('people.people_add_lastname') }}'"
value="{{ $lastName }}">
</form-input>
</div>
<div class="mb3 mb0-ns">
<form-input
:id="'nickname'"
:input-type="'text'"
:required="false"
:title="'{{ trans('people.people_add_nickname') }}'">
</form-input>
</div>
@else
<div class="mb3">
<form-input
:id="'last_name'"
:input-type="'text'"
:required="false"
:title="'{{ trans('people.people_add_lastname') }}'"
value="{{ $lastName }}">
</form-input>
</div>
<div class="mb3">
<form-input
:id="'first_name'"
:input-type="'text'"
:required="true"
:title="'{{ trans('people.people_add_firstname') }}'"
value="{{ $firstName }}">
</form-input>
</div>
<div class="mb3">
<form-input
:id="'middle_name'"
:input-type="'text'"
:required="false"
:title="'{{ trans('people.people_add_middlename') }}'">
</form-input>
</div>
<div class="mb3 mb0-ns">
<form-input
:id="'nickname'"
:input-type="'text'"
:required="false"
:title="'{{ trans('people.people_add_nickname') }}'">
</form-input>
</div>
@endif
</div>
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<form-input
:id="'email'"
:input-type="'text'"
:required="false"
:title="'{{ trans('people.people_add_email') }}'"
:value="'{{ $email }}'">
</form-input>
</div>
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<form-select
:options="{{ $genders }}"
:required="false"
:title="'{{ trans('people.people_add_gender') }}'"
:id="'gender'"
:value="'{{ $defaultGender }}'">
</form-select>
</div>
{{-- Form actions --}}
<div class="ph4-ns ph3 pv3 bb b--gray-monica">
<div class="flex-ns justify-between">
<div>
<a href="{{ route('people.index') }}" class="btn btn-secondary w-auto-ns w-100 mb2 pb0-ns">{{ trans('app.cancel') }}</a>
</div>
<div>
<button class="btn btn-secondary w-auto-ns w-100 mb2 pb0-ns" name="save_and_add_another" type="submit">{{ trans('people.people_save_and_add_another_cta') }}</button>
<button class="btn btn-primary w-auto-ns w-100 mb2 pb0-ns" name="save" value="true" type="submit">{{ trans('people.people_add_cta') }}</button>
</div>
</div>
</div>
</form>
</div>
</section>
@endsection

View File

@@ -0,0 +1,46 @@
@extends('layouts.skeleton')
@section('content')
<div class="people-show debt">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('people.index') }}">{{ trans('app.breadcrumb_list_contacts') }}</a>
</li>
<li>
{{ $contact->name }}
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Page header -->
@include('people._header')
<!-- Page content -->
<div class="main-content central-form">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12 col-sm-6 offset-sm-3 offset-sm-3-right">
@include('people.debt.form', [
'method' => 'POST',
'action' => route('people.debts.store', $contact),
'update_or_add' =>'add'
])
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,46 @@
@extends('layouts.skeleton')
@section('content')
<div class="people-show debt">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('people.index') }}">{{ trans('app.breadcrumb_list_contacts') }}</a>
</li>
<li>
{{ $contact->name }}
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Page header -->
@include('people._header')
<!-- Page content -->
<div class="main-content central-form">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12 col-sm-6 offset-sm-3 offset-sm-3-right">
@include('people.debt.form', [
'method' => 'PUT',
'action' => route('people.debts.update', [$contact, $debt]),
'update_or_add' =>'edit'
])
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,44 @@
<form method="POST" action="{{ $action }}">
@method($method)
@csrf
@include('partials.errors')
<h2>{{ trans('people.debt_add_title') }}</h2>
{{-- Debt direction --}}
<fieldset class="form-group">
<label class="form-check-inline" for="youowe">
<input type="radio" class="form-check-input" name="in_debt" id="youowe" value="yes" @if(old('in_debt') !== 'no' || $debt->in_debt !== 'no') checked @endif>
{{ trans('people.debt_add_you_owe', ['name' => $contact->first_name]) }}
</label>
<label class="form-check-inline" for="theyowe">
<input type="radio" class="form-check-input" name="in_debt" id="theyowe" value="no" @if(old('in_debt') === 'no' || $debt->in_debt === 'no') checked @endif>
{{ trans('people.debt_add_they_owe', ['name' => $contact->first_name]) }}
</label>
</fieldset>
{{-- Amount --}}
<div class="form-group">
<label for="amount">{{ trans('people.debt_add_amount') }} ({{ Auth::user()->currency->symbol }})</label>
<input type="number" step=".01" class="form-control" name="amount" id="amount" maxlength="254" value="{{ old('amount') ?? $debt->amount }}" autofocus required>
</div>
{{-- Reason --}}
<div class="form-group">
<label for="reason">{{ trans('people.debt_add_reason') }}</label>
<textarea class="form-control" name="reason" id="reason" maxlength="2500">{{ old('reason') ?? $debt->reason }}</textarea>
</div>
<div class="form-group actions">
<button type="submit" cy-name="save-debt-button" class="btn btn-primary">
@if($update_or_add == 'add')
{{ trans('people.debt_add_add_cta') }}
@elseif ($update_or_add == 'edit')
{{ trans('people.debt_edit_update_cta') }}
@endif
</button>
<a href="{{ route('people.show', $contact) }}" class="btn btn-secondary">{{ trans('app.cancel') }}</a>
</div> <!-- .form-group -->
</form>

View File

@@ -0,0 +1,86 @@
<div class="col-12 section-title">
<img src="img/people/debt/bill.svg" class="icon-section icon-money">
<h3>
{{ trans('people.debt_title') }}
<span class="{{ htmldir() == 'ltr' ? 'fr' : 'fl' }}">
<a href="{{ route('people.debts.create', $contact) }}" class="btn">{{ trans('people.debt_add_cta') }}</a>
</span>
</h3>
</div>
@if (!$contact->hasDebt())
<div class="col-12" cy-name="debt-blank-state">
<div class="section-blank">
<h3>{{ trans('people.debts_blank_title', ['name' => $contact->first_name]) }}</h3>
<a href="{{ route('people.debts.create', $contact) }}" cy-name="add-debt-button">{{ trans('people.debt_add_cta') }}</a>
</div>
</div>
@else
<div class="col-12 debts-list">
<ul class="table" cy-name="debts-body" cy-items="{{ $contact->debts->implode('id', ',') }}">
@foreach($contact->debts as $debt)
<li class="table-row" cy-name="debt-item-{{ $debt->id }}">
<div class="table-cell date">
{{ \App\Helpers\DateHelper::getShortDate($debt->created_at) }}
</div>
<div class="table-cell debt-nature">
@if ($debt->in_debt == 'yes')
{{ trans('people.debt_you_owe', [
'amount' => $debt->displayValue
]) }}
@else
{{ trans('people.debt_they_owe', [
'name' => $contact->first_name,
'amount' => $debt->displayValue
]) }}
@endif
</div>
<div class="table-cell reason">
@if (! is_null($debt->reason))
{{ $debt->reason }}
@endif
</div>
<div class="table-cell list-actions">
<a href="{{ route('people.debts.edit', [$contact, $debt]) }}" cy-name="edit-debt-button-{{ $debt->id }}">
<i class="fa fa-pencil" aria-hidden="true"></i>
</a>
<form method="POST" action="{{ route('people.debts.destroy', [$contact, $debt]) }}">
@method('DELETE')
@csrf
<confirm message="{{ trans('people.debt_delete_confirmation') }}" cy-name="delete-debt-button-{{ $debt->id }}" :name="'delete-debt'">
<i class="fa fa-trash-o" aria-hidden="true"></i>
</confirm>
</form>
</div>
</li>
@endforeach
<li class="table-row">
<div class="table-cell"></div>
<div class="table-cell">
<strong>
@if ($contact->isOwedMoney())
{{ trans('people.debt_they_owe', [
'name' => $contact->first_name,
'amount' => App\Helpers\MoneyHelper::format($contact->totalOutstandingDebtAmount(), Auth::user()->currency)
]) }}
@else
{{ trans('people.debt_you_owe', [
'amount' => App\Helpers\MoneyHelper::format(-$contact->totalOutstandingDebtAmount(), Auth::user()->currency)
]) }}
@endif
</strong>
</div>
<div class="table-cell"></div>
<div class="table-cell"></div>
</li>
</ul>
</div>
@endif

View File

@@ -0,0 +1,22 @@
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} w-100 pb3 pt1 pl3 pr3">
<div class="br2 bg-white mb4">
@if (config('monica.requires_subscription') && $accountHasLimitations)
<div class="">
<h3>
📄&#8199;{{ trans('people.document_list_title') }}
</h3>
<div class="section-blank">
<p>{{ trans('settings.storage_upgrade_notice') }}</p>
</div>
</div>
@else
<document-list hash="{{ $contact->hashID() }}" reach-limit="{{ \Safe\json_encode($hasReachedAccountStorageLimit) }}"></document-list>
@endif
</div>
</div>

View File

@@ -0,0 +1,165 @@
@extends('layouts.skeleton')
@section('content')
<section class="ph3 ph0-ns">
{{-- Breadcrumb --}}
<div class="mt4 mw7 center mb3">
<p><a href="{{ route('people.show', $contact) }}">< {{ $contact->name }}</a></p>
<h3 class="f3 fw5">{{ trans('people.information_edit_title', ['name' => $contact->first_name]) }}</h3>
@if (! $accountHasLimitations)
<p class="import">{!! trans('people.people_add_import', ['url' => 'settings/import']) !!}</p>
@endif
</div>
<div class="mw7 center br3 ba b--gray-monica bg-white mb5">
<form method="POST" action="{{ route('people.update', $contact) }}" enctype="multipart/form-data">
@method('PUT')
@csrf
@include('partials.errors')
{{-- Name --}}
<div class="pa4-ns ph3 pv2 bb b--gray-monica">
{{-- This check is for the cultures that are used to say the last name first --}}
<div class="mb3 mb0-ns">
@if ($formNameOrder == 'firstname')
<div class="dt-ns dt--fixed di">
<div class="dtc-ns pr2-ns pb0-ns w-100 pb3">
<form-input
value="{{ $contact->first_name }}"
:input-type="'text'"
:id="'firstname'"
:required="true"
:title="'{{ trans('people.people_add_firstname') }}'">
</form-input>
</div>
<div class="dtc-ns pr2-ns pb0-ns w-100 pb3">
<form-input
value="{{ $contact->middle_name }}"
:input-type="'text'"
:id="'middlename'"
:required="false"
:title="'{{ trans('people.people_add_middlename') }}'">
</form-input>
</div>
<div class="dtc-ns pr2-ns pb0-ns w-100 pb3">
<form-input
value="{{ $contact->last_name }}"
:input-type="'text'"
:id="'lastname'"
:required="false"
:title="'{{ trans('people.people_add_lastname') }}'">
</form-input>
</div>
<div class="dtc-ns pb0-ns w-100">
<form-input
value="{{ $contact->nickname }}"
:input-type="'text'"
:id="'nickname'"
:required="false"
:title="'{{ trans('people.people_add_nickname') }}'">
</form-input>
</div>
</div>
@else
<div class="dt-ns dt--fixed di">
<div class="dtc-ns pr2-ns pb0-ns w-100 pb3">
<form-input
value="{{ $contact->last_name }}"
:input-type="'text'"
:id="'lastname'"
:required="false"
:title="'{{ trans('people.people_add_lastname') }}'">
</form-input>
</div>
<div class="dtc-ns pr2-ns pb0-ns w-100 pb3">
<form-input
value="{{ $contact->first_name }}"
:input-type="'text'"
:id="'firstname'"
:required="true"
:title="'{{ trans('people.people_add_firstname') }}'">
</form-input>
</div>
<div class="dtc-ns pb0-ns w-100">
<form-input
value="{{ $contact->nickname }}"
:input-type="'text'"
:id="'nickname'"
:required="false"
:title="'{{ trans('people.people_add_nickname') }}'">
</form-input>
</div>
</div>
@endif
</div>
</div>
{{-- Gender --}}
<div class="pa4-ns ph3 pv2 bb b--gray-monica">
<div class="mb3 mb0-ns">
<form-select
:options="{{ $genders }}"
value="{{ $contact->gender_id }}"
:required="false"
:title="'{{ trans('people.people_add_gender') }}'"
:id="'gender'">
</form-select>
</div>
</div>
{{-- Description --}}
<div class="pa4-ns ph3 pv2 bb b--gray-monica">
<div class="mb3 mb0-ns">
<form-input
value="{{ $contact->description }}"
:input-type="'text'"
:id="'description'"
:required="false"
:title="'{{ trans('people.information_edit_description') }}'">
</form-input>
<small id="emailHelp" class="form-text text-muted">{{ trans('people.information_edit_description_help') }}</small>
</div>
</div>
{{-- Birthdate --}}
<form-specialdate
:months="{{ $months }}"
:days="{{ $days }}"
:month="{{ $month }}"
:day="{{ $day }}"
:age="{{ $age ?: 0 }}"
:birthdate="'{{ $birthdate }}'"
:reminder="{{ \Safe\json_encode($hasBirthdayReminder) }}"
:value="'{{ $birthdayState }}'"
></form-specialdate>
{{-- Is the contact deceased? --}}
<form-specialdeceased
:value="{{ \Safe\json_encode($contact->is_dead) }}"
:date="'{{ $deceaseddate }}'"
:reminder="{{ \Safe\json_encode($hasDeceasedReminder) }}"
>
</form-specialdeceased>
{{-- Form actions --}}
<div class="ph4-ns ph3 pv3 bb b--gray-monica">
<div class="flex-ns justify-between">
<div>
<a href="{{ route('people.show', $contact) }}" class="btn btn-secondary w-auto-ns w-100 mb2 pb0-ns" style="text-align: center;">{{ trans('app.cancel') }}</a>
</div>
<div>
<button class="btn btn-primary w-auto-ns w-100 mb2 pb0-ns" name="save" type="submit">{{ trans('app.save') }}</button>
</div>
</div>
</div>
</form>
</div>
</div>
@endsection

View File

@@ -0,0 +1,64 @@
@extends('layouts.skeleton')
@section('content')
<div class="people-show">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('people.index') }}">{{ trans('app.breadcrumb_list_contacts') }}</a>
</li>
<li>
{{ $contact->name }}
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Page header -->
@include('people._header')
<!-- Page content -->
<div class="main-content food-preferences central-form">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12 col-sm-6 offset-sm-3 offset-sm-3-right">
<form method="POST" action="{{ route('people.food.update', $contact) }}">
@csrf
<h2>{{ trans('people.food_preferences_edit_title') }}</h2>
@include('partials.errors')
<p>
@if (is_null($contact->last_name))
{{ trans('people.food_preferences_edit_description_no_last_name', ['firstname' => $contact->first_name]) }}</p>
@else
{{ trans('people.food_preferences_edit_description', ['firstname' => $contact->first_name, 'family' => $contact->last_name]) }}</p>
@endif
<div class="form-group">
<textarea class="form-control" id="food" name="food" rows="3">{{ $contact->food_preferences }}</textarea>
</div>
<div class="form-group actions">
<button type="submit" class="btn btn-primary">{{ trans('people.food_preferences_edit_cta') }}</button>
<a href="{{ route('people.show', $contact) }}" class="btn btn-secondary">{{ trans('app.cancel') }}</a>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,18 @@
<div class="sidebar-box">
<div class="sidebar-box-title">
<h3>{{ trans('people.food_preferences_title') }}</h3>
</div>
<p class="sidebar-box-paragraph">
@if (is_null($contact->food_preferences))
<a href="{{ route('people.food.index', $contact) }}">{{ trans('app.add') }}</a>
@else
{{ $contact->food_preferences }}
<a href="{{ route('people.food.index', $contact) }}" class="action-link">{{ trans('app.edit') }}</a>
@endif
</p>
</div>

View File

@@ -0,0 +1,15 @@
<div class="col-12 section-title">
<contact-gift
hash="{{ $contact->hashID() }}"
:contact-id="{{ $contact->id }}"
:gifts-active-tab="'{{ auth()->user()->gifts_active_tab }}'"
:family-contacts="{{ $familyRelationships->map(function ($familyRelationship) {
return [
'id' => $familyRelationship->ofContact->id,
'name' => $familyRelationship->ofContact->first_name,
];
}) }}"
:reach-limit="{{ \Safe\json_encode($hasReachedAccountStorageLimit) }}"
>
</contact-gift>
</div>

View File

@@ -0,0 +1,169 @@
@extends('layouts.skeleton')
@section('content')
<div class="people-list">
@csrf
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
@if ($active)
{{ trans('app.breadcrumb_list_contacts') }}
@else
{{ trans('app.breadcrumb_archived_contacts') }}
@endif
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Page content -->
<div class="main-content">
@if ($contactsCount == 0)
@include('people.blank')
@else
<div class="{{ auth()->user()->getFluidLayout() }}">
<div class="row">
@if ($hasArchived and !$active)
<div class="col-12">
<div class="ba mb3 br3 pa3 tc b--gray-monica bg-gray-monica">
{!! trans('people.list_link_to_active_contacts', ['url' => route('people.index')]) !!}
</div>
</div>
@endif
<div class="col-12 col-md-9 mb4">
@if (! is_null($tags))
<p class="clear-filter">
{{ trans('people.people_list_filter_tag') }}
@foreach ($tags as $tag)
<span class="pretty-tag">
{{ $tag->name }}
</span>
@endforeach
<a href="{{ route('people.index') }}">{{ trans('people.people_list_clear_filter') }}</a>
</p>
@endif
@if ($tagLess)
<p class="clear-filter">
<span class="mr2">{{ trans('people.people_list_filter_untag') }}</span>
<a href="{{ route('people.index') }}">{{ trans('people.people_list_clear_filter') }}</a>
</p>
@endif
<ul class="list">
{{-- Sorting options --}}
<li class="people-list-item sorting">
{{ trans_choice('people.people_list_stats', $contactsCount, ['count' => $contactsCount]) }}
<div class="options">
<div class="options-dropdowns dropdown">
<a href="" class="dropdown-btn" data-toggle="dropdown" id="dropdownSort">{{ trans('people.people_list_sort') }}</a>
<div class="dropdown-menu" aria-labelledby="dropdownSort">
<a class="dropdown-item {{ ($sort == 'firstnameAZ')?'selected':'' }}" href="{{ route('people.index') }}?sort=firstnameAZ">
{{ trans('people.people_list_firstnameAZ') }}
</a>
<a class="dropdown-item {{ ($sort == 'firstnameZA')?'selected':'' }}" href="{{ route('people.index') }}?sort=firstnameZA">
{{ trans('people.people_list_firstnameZA') }}
</a>
<a class="dropdown-item {{ ($sort == 'lastnameAZ')?'selected':'' }}" href="{{ route('people.index') }}?sort=lastnameAZ">
{{ trans('people.people_list_lastnameAZ') }}
</a>
<a class="dropdown-item {{ ($sort == 'lastnameZA')?'selected':'' }}" href="{{ route('people.index') }}?sort=lastnameZA">
{{ trans('people.people_list_lastnameZA') }}
</a>
<a class="dropdown-item {{ ($sort == 'lastactivitydateNewtoOld')?'selected':'' }}" href="{{ route('people.index') }}?sort=lastactivitydateNewtoOld">
{{ trans('people.people_list_lastactivitydateNewtoOld') }}
</a>
<a class="dropdown-item {{ ($sort == 'lastactivitydateOldtoNew')?'selected':'' }}" href="{{ route('people.index') }}?sort=lastactivitydateOldtoNew">
{{ trans('people.people_list_lastactivitydateOldtoNew') }}
</a>
</div>
</div>
</div>
</li>
<div class="{{ htmldir() == 'ltr' ? 'fl' : 'fr' }} w-100">
<div class="br2 bg-white mb4">
<contact-list
:show-archived="{{ \Safe\json_encode(! $active) }}"
></contact-list>
</div>
</div>
</ul>
</div>
<div class="col-12 col-md-3 sidebar">
<a href="{{ route('people.create') }}" id="button-add-contact" class="btn btn-primary sidebar-cta">
{{ trans('people.people_list_blank_cta') }}
</a>
<ul>
@if ($hasArchived)
@if ($active)
<li><a href="{{ route('people.archived') }}">@lang('people.list_link_to_archived_contacts')</a></li>
@endif
@endif
</ul>
{{-- Only for subscriptions --}}
@include('partials.components.people-upgrade-sidebar')
<ul class="mb4">
@foreach ($tagsCount as $tag)
@if ($tag->contact_count > 0)
<li>
<span class="pretty-tag"><a href="{{ route('people.index') }}?{{$url}}tags[]={{ urlencode($tag->name) }}">{{ $tag->name }}</a></span>
<span class="number-contacts-per-tag">{{ trans_choice('people.people_list_contacts_per_tags', $tag->contact_count, ['count' => $tag->contact_count]) }}</span>
</li>
@endif
@endforeach
@if ($tagsCount->count() != 0)
<li class="f7 mt3">
<a href="{{ route('people.index') }}?no_tag=true">{{ trans('people.people_list_untagged') }}</a>
<span class="number-contacts-without-tag">{{ trans_choice('people.people_list_contacts_per_tags', $contactsWithoutTagsCount) }}</span>
</li>
@endif
@if ($deceasedCount > 0)
@if ($hidingDeceased)
<li class="f7 mt3"><a href="{{ $active ? route('people.index') : route('people.archived') }}?show_dead=true">{{ trans('people.people_list_show_dead', ['count' => $deceasedCount]) }}</a></li>
@else
<li class="f7 mt3"><a href="{{ $active ? route('people.index') : route('people.archived') }}?show_dead=false">{{ trans('people.people_list_hide_dead', ['count' => $deceasedCount]) }}</a></li>
@endif
@endif
</ul>
</div>
</div>
</div>
@endif
</div>
</div>
@endsection

View File

@@ -0,0 +1,116 @@
@extends('layouts.skeleton')
@section('content')
<div class="people-show introductions">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('people.index') }}">{{ trans('app.breadcrumb_list_contacts') }}</a>
</li>
<li>
<a href="{{ route('people.show', $contact) }}">{{ $contact->name }}</a>
</li>
<li>
{{ trans('app.breadcrumb_edit_introductions') }}
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Page content -->
<div class="main-content central-form">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12 col-sm-6 offset-sm-3 offset-sm-3-right">
<h2>{{ trans('people.introductions_title_edit', ['name' => $contact->first_name]) }}</h2>
<form method="POST" action="{{ route('people.introductions.update', $contact) }}">
@csrf
@include('partials.errors')
{{-- How did they meet --}}
<div class="form-group">
<label for="first_met_additional_info">{{ trans('people.introductions_additional_info') }}</label>
<textarea class="form-control" id="first_met_additional_info" name="first_met_additional_info" rows="3">{{ old('first_met_additional_info') ?? $contact->first_met_additional_info }}</textarea>
</div>
<div class="form-group">
<contact-select
:id="'metThrough'"
:required="false"
:title="'{{ trans('people.introductions_edit_met_through') }}'"
:name="'metThroughId'"
:placeholder="'{{ trans('people.relationship_form_associate_dropdown_placeholder') }}'"
:default-options="{{ \Safe\json_encode($contacts) }}"
:user-contact-id="{{ $contact->id }}"
:value="{{ $introducer !== null ? \Safe\json_encode($introducer) : 'null' }}">
</contact-select>
</div>
<label>{{ trans('people.introductions_first_met_date') }}</label>
<fieldset class="form-group dates">
{{-- You don't know the date you've met --}}
<div class="form-check">
<label class="form-check-label" for="is_first_met_date_unknown">
<input type="radio" class="form-check-input" name="is_first_met_date_known" id="is_first_met_date_unknown" value="unknown"
@click="date_met_the_contact = 'unknown'"
{{ (is_null($contact->first_met_special_date_id)) ? 'checked' : '' }}
>
<div class="form-inline">
{{ trans('people.introductions_no_first_met_date') }}
</div>
</label>
</div>
{{-- You know the date you've met --}}
<div class="form-check">
<label class="form-check-label" for="is_first_met_date_known">
<input type="radio" class="form-check-input" name="is_first_met_date_known" id="is_first_met_date_known" value="known"
@click="date_met_the_contact = 'known'"
{{ (! is_null($contact->first_met_special_date_id)) ? 'checked' : '' }}
>
{{ trans('people.introductions_first_met_date_known') }}
@include('partials.components.date-select', ['contact' => $contact, 'specialDate' => $contact->firstMetDate ?? now(\App\Helpers\DateHelper::getTimezone()), 'class' => 'first_met'])
</label>
</div>
</fieldset>
<fieldset class="form-group" v-if="date_met_the_contact == 'known'">
<form-checkbox
:name="'addReminder'"
:dclass="'form-check form-check-label'"
:iclass="'form-check-input'"
>
{{ trans('people.introductions_add_reminder') }}
</form-checkbox>
</fieldset>
<div class="form-group actions">
<button type="submit" class="btn btn-primary">{{ trans('app.save') }}</button>
<a href="{{ route('people.show', $contact) }}" class="btn btn-secondary">{{ trans('app.cancel') }}</a>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,41 @@
<div class="sidebar-box introductions">
<div class="sidebar-box-title">
<h3>{{ trans('people.introductions_sidebar_title') }}</h3>
</div>
@if(! $contact->hasFirstMetInformation())
<p class="sidebar-box-paragraph">
<a href="{{ route('people.introductions.edit', $contact) }}">{{ trans('people.introductions_blank_cta', ['name' => $contact->first_name]) }}</a>
</p>
@else
<ul>
@if ($introducer = $contact->getIntroducer())
<li>
<i class="fa fa-sign-language"></i>
{!! trans('people.introductions_met_through', ['url' => route('people.show', $introducer), 'name' => $introducer->name]) !!}
</li>
@endif
@if ($contact->firstMetDate)
<li>
<i class="fa fa-hourglass-start"></i>
{{ trans('people.introductions_met_date', ['date' => $contact->firstMetDate->toShortString()]) }}
</li>
@endif
@if ($contact->first_met_additional_info)
<li>
<i class="fa fa-id-card-o"></i>
{{ $contact->first_met_additional_info }}
</li>
@endif
</ul>
<p class="sidebar-box-paragraph">
<a href="{{ route('people.introductions.edit', $contact) }}">{{ trans('app.edit') }}</a>
</p>
@endif
</div>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
<div class="{{ \App\Helpers\LocaleHelper::getDirection() == 'ltr' ? 'fl' : 'fr' }} w-100 pb3 pt1 pl3 pr3">
<div class="br2 bg-white mb4">
<life-event-list
hash="{{ $contact->hashID() }}"
:months="{{ $months }}"
:days="{{ $days }}"
:years="{{ $years }}"
contact-name="{{ $contact->first_name }}">
</life-event-list>
</div>
</div>

View File

@@ -0,0 +1,12 @@
<div class="{{ \App\Helpers\LocaleHelper::getDirection() == 'ltr' ? 'fl' : 'fr' }} w-100 pb3 pt1 pl3 pr3">
<div class="br2 bg-white mb4">
<photo-list
hash="{{ $contact->hashID() }}"
:contact-id="{{ $contact->id }}"
contact-name="'{{ $contact->first_name }}''"
current-photo-id-as-avatar="{{ $contact->avatar_photo_id }}"
reach-limit="{{ \Safe\json_encode($hasReachedAccountStorageLimit) }}"
>
</photo-list>
</div>
</div>

View File

@@ -0,0 +1,183 @@
@extends('layouts.skeleton')
@section('title', $contact->name )
@section('content')
<div class="people-show">
@csrf
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
@if ($contact->is_active)
<a href="{{ route('people.index') }}">{{ trans('app.breadcrumb_list_contacts') }}</a>
@else
<a href="{{ route('people.archived') }}">{{ trans('app.breadcrumb_archived_contacts') }}</a>
@endif
</li>
<li>
{{ $contact->name }}
</li>
</ul>
</div>
</div>
</div>
</div>
{{-- Page header --}}
@include('people._header')
{{-- Page content --}}
<div class="main-content profile">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12 col-sm-3 profile-sidebar">
@if (! is_null($weather) && $weather->summary)
<div class="ba b--near-white br2 bg-gray-monica pa3 mb3 f6">
<div class="w-100 dt">
<div class="dtc">
<h3 class="f6 ttu normal">{{ trans('app.weather_current_title') }}</h3>
</div>
</div>
<p class="mb0{{ $weather->created_at->between(now()->subHours(6), now()) ? '' : ' light-silver' }}"
title="{{ $weather->location }} &mdash; {{ $weather->date !== null ? \App\Helpers\DateHelper::getShortDateWithTime($weather->date) : '' }}">
{{ $weather->emoji }} {{ $weather->summary }} / {{ trans('app.weather_current_temperature_'.auth()->user()->temperature_scale, ['temperature' => $weather->temperature(auth()->user()->temperature_scale)]) }}
</p>
</div>
@endif
@include('people.relationship.index')
@include('people.sidebar')
<ul class="mb2">
<li>
<a href="{{ route('people.auditlogs', $contact) }}">{{ trans('people.auditlogs_link') }}</a>
</li>
<li>
<a href="{{ route('people.vcard', $contact) }}">{{ trans('people.people_export') }}</a>
</li>
<li>
<contact-archive hash="{{ $contact->hashID() }}" :active="{{ \Safe\json_encode($contact->is_active) }}"></contact-archive>
</li>
<li>
<form method="POST" action="{{ route('people.destroy', $contact) }}">
@method('DELETE')
@csrf
<confirm id="link-delete-contact" message="{{ trans('people.people_delete_confirmation', ['name' => $contact->name]) }}">
{{ trans('people.people_delete_message') }}
</confirm>
</form>
</li>
</ul>
</div>
<div class="col-12 col-sm-9">
<div class="flex items-center justify-center flex-column">
<div class='cf dib'>
@if (! $contact->isMe())
<span @click="updateDefaultProfileView('life-events')" :class="[global_profile_default_view == 'life-events' ? 'f6 fl bb bt br bl ph3 pv2 dib b br2 br--left bl mb4 b--gray-monica' : 'f6 fl bb bt br ph3 pv2 dib bg-gray-monica br2 br--left bl pointer mb4 b--gray-monica']">
@if (auth()->user()->profile_new_life_event_badge_seen == false)
<span class="bg-light-green f7 mr2 ph2 pv1 br2">{{ trans('app.new') }}</span>
@endif
{{ trans('people.life_event_list_tab_life_events') }} ({{ $contact->lifeEvents()->count() }})
</span>
@endif
<span @click="updateDefaultProfileView('notes')" :class="[global_profile_default_view == 'notes' ? 'f6 fl bb bt ph3 pv2 dib b br--right br mb4 b--gray-monica' : 'f6 fl bb bt ph3 pv2 dib bg-gray-monica br--right br pointer mb4 b--gray-monica']">{{ trans('people.life_event_list_tab_other') }}</span>
<span @click="updateDefaultProfileView('photos')" :class="[global_profile_default_view == 'photos' ? 'f6 fl bb bt ph3 pv2 dib b br2 br--right br mb4 b--gray-monica' : 'f6 fl bb bt ph3 pv2 dib bg-gray-monica br2 br--right br pointer mb4 b--gray-monica']">Photos</span>
</div>
</div>
@if (! $contact->isMe())
<div v-if="global_profile_default_view == 'life-events'">
<div class="row section">
@include('people.life-events.index')
</div>
</div>
@endif
<div v-if="global_profile_default_view == 'notes'">
@if ($modules->contains('key', 'notes'))
<div class="row section notes">
<div class="col-12 section-title">
<contact-note hash={{ $contact->hashID() }}></contact-note>
</div>
</div>
@endif
@if ($modules->contains('key', 'conversations') && ! $contact->isMe())
<div class="row section">
@include('people.conversations.index')
</div>
@endif
@if ($modules->contains('key', 'phone_calls') && ! $contact->isMe())
<div class="row section calls">
@include('people.calls.index')
</div>
@endif
@if ($modules->contains('key', 'activities') && ! $contact->isMe())
<div class="row section activities">
@include('people.activities.index')
</div>
@endif
@if ($modules->contains('key', 'reminders'))
<div class="row section reminders">
@include('people.reminders.index')
</div>
@endif
@if ($modules->contains('key', 'tasks'))
<div class="row section">
@include('people.tasks.index')
</div>
@endif
@if ($modules->contains('key', 'gifts') && ! $contact->isMe())
<div class="row section">
@include('people.gifts.index')
</div>
@endif
@if ($modules->contains('key', 'debts') && ! $contact->isMe())
<div class="row section debts">
@include('people.debt.index')
</div>
@endif
@if ($modules->contains('key', 'documents'))
<div class="row section">
@include('people.documents.index')
</div>
@endif
</div>
<div v-if="global_profile_default_view == 'photos'">
<div class="row section">
@include('people.photos.index')
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,45 @@
@foreach($relationships->groupByItemsProperty('relationshipTypeLocalized') as $type => $relationshipType)
<div class="sidebar-box-title">
<h3>{{ $type }}</h3>
</div>
@foreach ($relationshipType as $relationship)
@if (! $relationship->ofContact)
@continue
@endif
<div class="sidebar-box-paragraph">
{{-- NAME --}}
@if ($relationship->ofContact->is_partial)
<span class="{{ htmldir() == 'ltr' ? '' : 'fr' }}">{{ $relationship->ofContact->name }}</span>
@else
<a class="{{ htmldir() == 'ltr' ? '' : 'fr' }}" href="{{ route('people.show', $relationship->ofContact) }}">{{ $relationship->ofContact->name }}</a>
@endif
{{-- AGE --}}
@if ($relationship->ofContact->is_dead)
@if ($relationship->ofContact->deceasedDate)
<span class="{{ htmldir() == 'ltr' ? '' : 'fr' }}">({{ $relationship->ofContact->getAgeAtDeath() }})</span>
@endif
@elseif ($relationship->ofContact->birthday_special_date_id)
@if ($relationship->ofContact->birthdate->getAge())
<span class="{{ htmldir() == 'ltr' ? '' : 'fr' }}">({{ $relationship->ofContact->birthdate->getAge() }})</span>
@endif
@endif
<div class="db mt1">
{{-- ACTIONS: EDIT/DELETE --}}
<a href="{{ route('people.relationships.edit', [$contact, $relationship]) }}" class="action-link {{ $contact->hashID() }}-edit-relationship">{{ trans('app.edit') }}</a>
<form method="POST" action="{{ route('people.relationships.destroy', [$contact, $relationship]) }}" class="di">
@method('DELETE')
@csrf
<confirm message="{{ trans('people.relationship_unlink_confirmation') }}" link-class="action-link">
{{ trans('app.delete') }}
</confirm>
</form>
</div>
</div>
<div class="cb"></div>
@endforeach
@endforeach

View File

@@ -0,0 +1,158 @@
@extends('layouts.skeleton')
@section('content')
<section class="ph3 ph0-ns">
{{-- Breadcrumb --}}
<div class="mt4 mw7 center mb3">
<p><a href="{{ route('people.show', $contact) }}">&lt; {{ $contact->name }}</a></p>
<div class="mt4 mw7 center mb3">
<h3 class="f3 fw5">{{ trans('people.relationship_form_edit') }}</h3>
</div>
</div>
<div class="mw7 center br3 ba b--gray-monica bg-white mb6">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
@include('partials.errors')
<form action="{{ route('people.relationships.update', [$contact, $relationshipId]) }}" method="POST">
@method('PUT')
@csrf
<input type="hidden" name="type" value="{{ $type }}">
@if ($partner->is_partial)
{{-- Name --}}
<div class="pa4-ns ph3 pv2 bb b--gray-monica">
{{-- This check is for the cultures that are used to say the last name first --}}
<div class="mb3 mb0-ns">
@if ($formNameOrder == 'firstname')
<div class="dt dt--fixed">
<div class="dtc pr2">
<form-input
value="{{ $partner->first_name }}"
:input-type="'text'"
:id="'first_name'"
:required="true"
:title="'{{ trans('people.people_add_firstname') }}'">
</form-input>
</div>
<div class="dtc">
<form-input
value="{{ $partner->last_name }}"
:input-type="'text'"
:id="'last_name'"
:required="false"
:title="'{{ trans('people.people_add_lastname') }}'">
</form-input>
</div>
</div>
@else
<div class="dt dt--fixed">
<div class="dtc pr2">
<form-input
value="{{ $partner->last_name }}"
:input-type="'text'"
:id="'last_name'"
:required="false"
:title="'{{ trans('people.people_add_lastname') }}'">
</form-input>
</div>
<div class="dtc">
<form-input
value="{{ $partner->first_name }}"
:input-type="'text'"
:id="'first_name'"
:required="true"
:title="'{{ trans('people.people_add_firstname') }}'">
</form-input>
</div>
</div>
@endif
</div>
</div>
{{-- Gender --}}
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<form-select
:options="{{ $genders }}"
:required="false"
value="{{ $partner->gender_id }}"
:title="'{{ trans('people.people_add_gender') }}'"
:id="'gender_id'">
</form-select>
</div>
{{-- Birthdate --}}
<form-specialdate
:months="{{ $months }}"
:days="{{ $days }}"
:month="{{ $month }}"
:day="{{ $day }}"
:age="{{ $age ?: 0 }}"
:birthdate="'{{ $birthdate }}'"
:reminder="{{ \Safe\json_encode($hasBirthdayReminder) }}"
:value="'{{ $birthdayState }}'"
></form-specialdate>
<div class="pa4-ns ph3 pv2 bb b--gray-monica">
{{-- Real or partial contact (false in this case) --}}
<form-checkbox
:name="'realContact'"
:iclass="'pa0 ma0 lh-copy'"
:dclass="'mb3 mb0-ns flex'"
value="1"
:model-value="false"
>
<template slot="label">
{{ trans('people.relationship_form_also_create_contact') }}
</template>
<span slot="extra" class="silver">
{{ trans('people.relationship_form_add_description') }}
</span>
</form-checkbox>
</div>
@endif
{{-- Nature of relationship --}}
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<form-select
:options="{{ $relationshipTypes }}"
value="{{ $type }}"
:required="true"
:title="'{{
$partner->is_partial ?
trans('people.relationship_form_is_with') :
trans('people.relationship_form_is_with_name', ['name' => $partner->name])
}}'"
:id="'relationship_type_id'">
</form-select>
</div>
{{-- Form actions --}}
<div class="ph4-ns ph3 pv3 bb b--gray-monica">
<div class="flex-ns justify-between">
<div>
<a href="{{ route ('people.show', $contact) }}" class="btn btn-secondary w-auto-ns w-100 mb2 pb0-ns">{{ trans('app.cancel') }}</a>
</div>
<div>
<button class="btn btn-primary w-auto-ns w-100 mb2 pb0-ns" v-if="global_relationship_form_new_contact" name="save" type="submit">{{ trans('app.save') }}</button>
</div>
</div>
</div>
</form>
</div>
</section>
@endsection

View File

@@ -0,0 +1,43 @@
@if ($modules->contains('key', 'love_relationships'))
<div class="sidebar-box">
<div class="sidebar-box-title">
<h3>{{ trans('app.relationship_type_group_love') }}</h3>
</div>
@include('people.relationship._relationship', ['relationships' => $loveRelationships])
<p class="mb0 bt b--near-white f6">
<a href="{{ route('people.relationships.create', $contact) }}?type={{ $contact->account->getRelationshipTypeByType('partner')->id }}">{{ trans('app.add') }}</a>
</p>
</div>
@endif
@if ($modules->contains('key', 'family_relationships'))
<div class="sidebar-box">
<div class="sidebar-box-title">
<h3>{{ trans('app.relationship_type_group_family') }}</h3>
</div>
@include('people.relationship._relationship', ['relationships' => $familyRelationships])
<p class="mb0 bt b--near-white f6">
<a href="{{ route('people.relationships.create', $contact) }}?type={{ $contact->account->getRelationshipTypeByType('child')->id }}">{{ trans('app.add') }}</a>
</p>
</div>
@endif
@if ($modules->contains('key', 'other_relationships'))
<div class="sidebar-box f6">
<div class="sidebar-box-title">
<h3>{{ trans('app.relationship_type_group_other') }}</h3>
</div>
@include('people.relationship._relationship', ['relationships' => $friendRelationships])
@include('people.relationship._relationship', ['relationships' => $workRelationships])
<p class="mb0 bt b--near-white f6">
<a href="{{ route('people.relationships.create', $contact) }}?type={{ $contact->account->getRelationshipTypeByType('friend')->id }}">{{ trans('app.add') }}</a>
</p>
</div>
@endif

View File

@@ -0,0 +1,187 @@
@extends('layouts.skeleton')
@section('content')
<section class="ph3 ph0-ns">
{{-- Breadcrumb --}}
<div class="mt4 mw7 center mb3">
<p><a href="{{ route('people.show', $contact) }}">< {{ $contact->name }}</a></p>
<div class="mt4 mw7 center mb3">
<h3 class="f3 fw5">{{ trans('people.relationship_form_add') }}</h3>
</div>
</div>
<div class="mw7 center br3 ba b--gray-monica bg-white mb6">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
@include('partials.errors')
<form action="{{ route('people.relationships.store', $contact) }}" method="POST">
@csrf
{{-- New contact / link existing --}}
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<p class="mb2 b">{{ trans('people.relationship_form_add_choice') }}</p>
<div class="dt dt--fixed">
<div class="dtc pr2">
<input type="radio" id="new" name="relationship_type" value="new" @click="global_relationship_form_new_contact = true" checked>
<label for="new" class="pointer">{{ trans('people.relationship_form_create_contact') }}</label>
</div>
<div class="dtc">
<input type="radio" id="existing" name="relationship_type" value="existing" @click="global_relationship_form_new_contact = false">
<label for="existing" class="pointer">{{ trans('people.relationship_form_associate_contact') }}</label>
</div>
</div>
</div>
<div v-if="global_relationship_form_new_contact">
{{-- Name --}}
<div class="pa4-ns ph3 pv2 bb b--gray-monica">
{{-- This check is for the cultures that are used to say the last name first --}}
<div class="mb3 mb0-ns">
@if ($formNameOrder == 'firstname')
<div class="dt dt--fixed">
<div class="dtc pr2">
<form-input
value=""
:input-type="'text'"
:id="'first_name'"
:required="true"
:title="'{{ trans('people.people_add_firstname') }}'">
</form-input>
</div>
<div class="dtc">
<form-input
value=""
:input-type="'text'"
:id="'last_name'"
:required="false"
:title="'{{ trans('people.people_add_lastname') }}'">
</form-input>
</div>
</div>
@else
<div class="dt dt--fixed">
<div class="dtc pr2">
<form-input
value=""
:input-type="'text'"
:id="'last_name'"
:required="false"
:title="'{{ trans('people.people_add_lastname') }}'">
</form-input>
</div>
<div class="dtc">
<form-input
value=""
:input-type="'text'"
:id="'first_name'"
:required="true"
:title="'{{ trans('people.people_add_firstname') }}'">
</form-input>
</div>
</div>
@endif
</div>
</div>
{{-- Gender --}}
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<form-select
:options="{{ $genders }}"
:required="false"
:title="'{{ trans('people.people_add_gender') }}'"
:id="'gender_id'"
:value="'{{ $defaultGender }}'">
</form-select>
</div>
{{-- Birthdate --}}
<form-specialdate
:months="{{ $months }}"
:days="{{ $days }}"
:birthdate="'{{ $birthdate }}'"
></form-specialdate>
<div class="pa4-ns ph3 pv2 bb b--gray-monica">
{{-- Real or partial contact (default true) --}}
<form-checkbox
:name="'realContact'"
:iclass="'pa0 ma0 lh-copy'"
:dclass="'mb3 mb0-ns flex'"
value="1"
:model-value="true"
>
<template slot="label">
{{ trans('people.relationship_form_also_create_contact') }}
</template>
<span slot="extra" class="silver">
{{ trans('people.relationship_form_add_description') }}
</span>
</form-checkbox>
</div>
</div>
<div v-if="!global_relationship_form_new_contact">
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
@if ($existingContacts->count() == 0)
<div class="mb1 mt2 tc">
<img src="img/people/no_record_found.svg">
<p>{{ trans('people.relationship_form_add_no_existing_contact', ['name' => $contact->first_name]) }}</p>
</div>
@else
<contact-select
:required="true"
:title="'{{ trans('people.relationship_form_associate_dropdown') }}'"
:name="'existing_contact_id'"
:placeholder="'{{ trans('people.relationship_form_associate_dropdown_placeholder') }}'"
:default-options="{{ \Safe\json_encode($existingContacts) }}"
:user-contact-id="{{ $contact->id }}">
</contact-select>
@endif
</div>
</div>
{{-- Nature of relationship --}}
<div class="pa4-ns ph3 pv2 mb3 mb0-ns bb b--gray-monica">
<form-select
:options="{{ $relationshipTypes }}"
value="{{ $type }}"
:required="true"
:title="'{{ trans('people.relationship_form_is_with') }}'"
:id="'relationship_type_id'">
</form-select>
</div>
{{-- Form actions --}}
<div class="ph4-ns ph3 pv3 bb b--gray-monica">
<div class="flex-ns justify-between">
<div>
<a href="{{ route('people.show', $contact) }}" class="btn btn-secondary w-auto-ns w-100 mb2 pb0-ns" style="text-align: center;">{{ trans('app.cancel') }}</a>
</div>
<div>
@if ($existingContacts->count() == 0)
<button class="btn btn-primary w-auto-ns w-100 mb2 pb0-ns" disabled v-if="!global_relationship_form_new_contact" name="save" type="submit">{{ trans('app.add') }}</button>
<button class="btn btn-primary w-auto-ns w-100 mb2 pb0-ns" v-if="global_relationship_form_new_contact" name="save" type="submit">{{ trans('app.add') }}</button>
@else
<button class="btn btn-primary w-auto-ns w-100 mb2 pb0-ns" name="save" type="submit">{{ trans('app.add') }}</button>
@endif
</div>
</div>
</div>
</form>
</div>
</section>
@endsection

View File

@@ -0,0 +1,46 @@
@extends('layouts.skeleton')
@section('content')
<div class="people-show">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('people.index') }}">{{ trans('app.breadcrumb_list_contacts') }}</a>
</li>
<li>
{{ $contact->name }}
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Page header -->
@include('people._header')
<!-- Page content -->
<div class="main-content reminders central-form">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12 col-sm-6 offset-sm-3 offset-sm-3-right">
@include('people.reminders.form', [
'method' => 'POST',
'action' => route('people.reminders.store', $contact),
'update_or_add' =>'add'
])
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,46 @@
@extends('layouts.skeleton')
@section('content')
<div class="people-show">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('people.index') }}">{{ trans('app.breadcrumb_list_contacts') }}</a>
</li>
<li>
{{ $contact->name }}
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Page header -->
@include('people._header')
<!-- Page content -->
<div class="main-content reminders central-form">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12 col-sm-6 offset-sm-3 offset-sm-3-right">
@include('people.reminders.form', [
'method' => 'PUT',
'action' => route('people.reminders.update', [$contact, $reminder]),
'update_or_add' =>'edit'
])
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,89 @@
<form method="POST" action="{{ $action }}">
@method($method)
@csrf
<h2>{{ trans('people.reminders_add_title', ['name' => $contact->first_name]) }}</h2>
@include('partials.errors')
<p>{{ trans('people.reminders_add_description') }}</p>
{{-- Nature of reminder --}}
<fieldset class="form-group nature">
<div class="form-group">
<input type="text" class="form-control" name="title" value="{{ old('title') ?? $reminder->title }}" required>
</div>
</fieldset>
{{-- Date --}}
<div class="form-group">
<label for="initial_date">{{ trans('people.reminders_add_next_time') }}</label>
<input type="date" id="initial_date" name="initial_date" class="form-control"
@if (is_null($reminder->initial_date))
value="{{ old('initial_date') ?? now(\App\Helpers\DateHelper::getTimezone())->toDateString() }}"
@else
value="{{ old('initial_date') ?? $reminder->initial_date->toDateString() }}"
@endif
min="{{ now(\App\Helpers\DateHelper::getTimezone())->toDateString() }}"
max="{{ now(\App\Helpers\DateHelper::getTimezone())->addYears(10)->toDateString() }}"
>
<fieldset class="form-group frequency{{ $errors->has('frequency_type') ? ' has-error' : '' }}">
{{-- One time reminder --}}
<div class="form-check">
<label class="form-check-label" for="frequency_type_once">
<input type="radio" id="frequency_type_once" class="form-check-input" name="frequency_type"
:value="'one_time'"
{{ $reminder->frequency_type === 'one_time' ? 'checked' : '' }}
>
{{ trans('people.reminders_add_once') }}
</label>
</div>
{{-- Recurring reminder --}}
<div class="form-check">
<label class="form-check-label" for="frequency_type_recurrent">
<input type="radio" id="frequency_type_recurrent" class="form-check-input" name="frequency_type"
:value="'recurrent'"
{{ $reminder->frequency_type !== null && $reminder->frequency_type !== 'one_time' ? 'checked' : '' }}
>
{{ trans('people.reminders_add_recurrent') }}
<input type="number" class="form-control frequency-type" name="frequency_number"
value="{{ $reminder->frequency_number ?? 1 }}"
min="1"
max="115"
:disabled="reminders_frequency == 'one_time'">
<select name="frequency_number_select" :disabled="reminders_frequency == 'one_time'">
<option value="week"{{ $reminder->frequency_type === 'week' ? 'selected' : '' }}>{{ trans('people.reminders_type_week') }}</option>
<option value="month"{{ $reminder->frequency_type === 'month' ? 'selected' : '' }}>{{ trans('people.reminders_type_month') }}</option>
<option value="year"{{ $reminder->frequency_type === 'year' ? 'selected' : '' }}>{{ trans('people.reminders_type_year') }}</option>
</select>
{{ trans('people.reminders_add_starting_from') }}
</label>
</div>
</fieldset>
</div>
<div class="form-group">
<label for="description">{{ trans('people.reminders_add_optional_comment') }}</label>
<textarea class="form-control" id="description" name="description" rows="3">{{ old('description') ?? $reminder->description }}</textarea>
</div>
<div class="form-group actions">
<button type="submit" class="btn btn-primary">
@if($update_or_add == 'add')
{{ trans('people.reminders_add_cta') }}
@elseif ($update_or_add == 'edit')
{{ trans('people.reminders_edit_update_cta') }}
@endif
</button>
<a href="{{ route('people.show', $contact) }}" class="btn btn-secondary">{{ trans('app.cancel') }}</a>
</div>
</form>

View File

@@ -0,0 +1,79 @@
<div class="col-12 section-title">
<img src="img/people/reminders.svg" class="icon-section icon-reminders">
<h3>
{{ trans('people.section_personal_reminders') }}
<span class="{{ htmldir() == 'ltr' ? 'fr' : 'fl' }}">
<a href="{{ route('people.reminders.create', $contact) }}" class="btn">{{ trans('people.reminders_cta') }}</a>
</span>
</h3>
</div>
@if ($reminders->count() === 0)
<div class="col-12">
<div class="section-blank">
<h3>{{ trans('people.reminders_blank_title', ['name' => $contact->first_name]) }}</h3>
<a href="{{ route('people.reminders.create', $contact) }}">{{ trans('people.reminders_blank_add_activity') }}</a>
</div>
</div>
@else
<div class="col-12 reminders-list">
@if (! $accountHasLimitations)
<p>{{ trans('people.reminders_description') }}</p>
@else
<p>{{ trans('people.reminders_free_plan_warning') }}</p>
@endif
<ul class="table">
@foreach($reminders as $reminder)
<li class="table-row">
<div class="table-cell date">
{{ $reminder->next_expected_date_human_readable }}
</div>
<div class="table-cell frequency-type">
@if ($reminder->frequency_type != 'one_time')
{{ trans_choice('people.reminder_frequency_'.$reminder->frequency_type, $reminder->frequency_number, ['number' => $reminder->frequency_number]) }}
@else
{{ trans('people.reminders_one_time') }}
@endif
</div>
<div class="table-cell title">
{{ $reminder->title }}
</div>
<div class="table-cell comment">
@if (!is_null($reminder->description))
{{ $reminder->description }}
@endif
</div>
<div class="table-cell list-actions">
{{-- Only display this if the reminder can be deleted - ie if it's not a reminder added automatically for birthdates --}}
@if ($reminder->delible || ! $reminder->isBirthdayReminder())
<a href="{{ route('people.reminders.edit', [$contact, $reminder]) }}" class="edit">
<i class="fa fa-pencil-square-o" aria-hidden="true"></i>
</a>
@endif
<form method="POST" action="{{ route('people.reminders.destroy', [$contact, $reminder]) }}" class="di">
@method('DELETE')
@csrf
<confirm message="{{ trans('people.reminders_delete_confirmation') }}">
<i class="fa fa-trash-o" aria-hidden="true"></i>
</confirm>
</form>
</div>
</li>
@endforeach
</ul>
</div>
@endif

View File

@@ -0,0 +1,29 @@
{{-- Pets --}}
@if ($modules->contains('key', 'pets'))
<pet hash="{{ $contact->hashID() }}"></pet>
@endif
{{-- Contact information --}}
@if ($modules->contains('key', 'contact_information'))
<contact-information hash="{{ $contact->hashID() }}"></contact-information>
@endif
{{-- Address --}}
@if ($modules->contains('key', 'addresses'))
<contact-address hash="{{ $contact->hashID() }}"></contact-address>
@endif
{{-- Introductions --}}
@if ($modules->contains('key', 'how_you_met') && ! $contact->isMe())
@include('people.introductions.index')
@endif
{{-- Work --}}
@if ($modules->contains('key', 'work_information'))
@include('people.work.index')
@endif
{{-- Food preferences --}}
@if ($modules->contains('key', 'food_preferences') && ! $contact->isMe())
@include('people.food-preferences.index')
@endif

View File

@@ -0,0 +1,3 @@
<div class="col-12 section-title">
<contact-task hash={{ $contact->hashID() }} :contact-id={{ $contact->id }}></contact-task>
</div>

View File

@@ -0,0 +1,62 @@
@extends('layouts.skeleton')
@section('content')
<div class="people-show">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('people.index') }}">{{ trans('app.breadcrumb_list_contacts') }}</a>
</li>
<li>
{{ $contact->name }}
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Page content -->
<div class="main-content central-form">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12 col-sm-6 offset-sm-3 offset-sm-3-right">
<form method="POST" action="{{ route('people.work.update', $contact) }}" enctype="multipart/form-data">
@csrf
@include('partials.errors')
<h2>{{ trans('people.work_edit_title', ['name' => $contact->first_name]) }}</h2>
{{-- Job --}}
<div class="form-group">
<label for="job">{{ trans('people.work_edit_job') }}</label>
<input type="text" class="form-control" name="job" id="job" value="{{ $contact->job }}" autofocus>
</div>
{{-- Company --}}
<div class="form-group">
<label for="company">{{ trans('people.work_edit_company') }}</label>
<input type="text" class="form-control" name="company" id="company" value="{{ $contact->company }}">
</div>
<div class="form-group actions">
<button type="submit" class="btn btn-primary">{{ trans('app.save') }}</button>
<a href="{{ route('people.show', $contact) }}" class="btn btn-secondary">{{ trans('app.cancel') }}</a>
</div> <!-- .form-group -->
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,35 @@
<div class="sidebar-box">
<div class="sidebar-box-title">
<h3>{{ trans('people.work_information') }}</h3>
</div>
<div class="work">
<ul>
{{-- Work information --}}
<li>
<i class="fa fa-building-o" aria-hidden="true"></i>
@if (is_null($contact->job) and is_null($contact->company))
{{ trans('people.information_no_work_defined') }}
@else
@if (!is_null($contact->job))
{{ $contact->job }}
@if (!is_null($contact->company))
{{ trans('people.information_work_at', ['company' => $contact->company]) }}
@endif
@else
{{ $contact->company }}
@endif
@endif
</li>
</ul>
<p class="sidebar-box-paragraph">
<a href="{{ route('people.work.edit', $contact) }}">{{ trans('people.work_add_cta') }}</a>
</p>
</div>
</div>

View File

@@ -0,0 +1,81 @@
<div class="col-12 col-sm-3 sidebar-menu">
<ul class="mb4">
@component('components.sidebar', [
'route' => 'settings.index',
'icon' => 'fa fa-cog',
'title' => 'settings.sidebar_settings'])
@endcomponent
@component('components.sidebar', [
'route' => 'settings.personalization.index',
'icon' => 'fa fa-handshake-o',
'title' => 'settings.sidebar_personalization'])
@endcomponent
@component('components.sidebar', [
'route' => 'settings.storage.index',
'icon' => 'fa fa-cube',
'title' => 'settings.sidebar_settings_storage'])
@endcomponent
@component('components.sidebar', [
'route' => 'settings.export.index',
'icon' => 'fa fa-cloud-download',
'title' => 'settings.sidebar_settings_export'])
@endcomponent
@component('components.sidebar', [
'route' => 'settings.import',
'icon' => 'fa fa-cloud-upload',
'title' => 'settings.sidebar_settings_import'])
@endcomponent
@component('components.sidebar', [
'route' => 'settings.users.index',
'icon' => 'fa fa-user-circle-o',
'title' => 'settings.sidebar_settings_users'])
@endcomponent
@if (config('monica.requires_subscription') && ! auth()->user()->account->has_access_to_paid_version_for_free)
@component('components.sidebar', [
'route' => 'settings.subscriptions.index',
'icon' => 'fa fa-money',
'title' => 'settings.sidebar_settings_subscriptions'])
@endcomponent
@endif
@component('components.sidebar', [
'route' => 'settings.tags.index',
'icon' => 'fa fa-tags',
'title' => 'settings.sidebar_settings_tags'])
@endcomponent
@component('components.sidebar', [
'route' => 'settings.api',
'icon' => 'fa fa-random',
'title' => 'settings.sidebar_settings_api'])
@endcomponent
@if (config('laravelsabre.enabled') && ! $accountHasLimitations)
@component('components.sidebar', [
'route' => 'settings.dav',
'icon' => 'fa fa-calendar',
'title' => 'settings.sidebar_settings_dav'])
@endcomponent
@endif
@component('components.sidebar', [
'route' => 'settings.auditlog.index',
'icon' => 'fa fa-id-card-o',
'title' => 'settings.sidebar_settings_auditlogs'])
@endcomponent
@component('components.sidebar', [
'route' => 'settings.security.index',
'icon' => 'fa fa-shield',
'title' => 'settings.sidebar_settings_security'])
@endcomponent
</ul>
</div>

View File

@@ -0,0 +1,63 @@
@extends('layouts.skeleton')
@section('content')
<div class="settings">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ auth()->user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('settings.index') }}">{{ trans('app.breadcrumb_settings') }}</a>
</li>
<li>
{{ trans('app.breadcrumb_api') }}
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
@include('settings._sidebar')
<div class="col-12 col-sm-9">
<div class="mb3">
<h2 class="f3 fw5">{{ trans('settings.api_title') }}</h2 >
<p>{{ trans('settings.api_description') }}</p>
<p>{!! trans('settings.api_help', ['url' => config('api.help')]) !!}</p>
<p>
{{ trans('settings.api_endpoint') }}
<input value="{{ route('api') }}" class="url form-control" type="text" readonly />
</p>
</div>
<div class="br3 ba b--gray-monica bg-white mb4">
<div class="pa3 bb b--gray-monica">
<passport-personal-access-tokens></passport-personal-access-tokens>
</div>
</div>
<div class="br3 ba b--gray-monica bg-white mb4">
<div class="pa3 bb b--gray-monica">
<passport-clients></passport-clients>
<passport-authorized-clients class="mt4"></passport-authorized-clients>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,88 @@
@extends('layouts.skeleton')
@section('content')
<div class="settings">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('settings.index') }}">{{ trans('app.breadcrumb_settings') }}</a>
</li>
<li>
{{ trans('app.breadcrumb_settings_users') }}
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
@include('settings._sidebar')
<div class="col-12 col-sm-9 users-list">
<div class="br3 ba b--gray-monica bg-white mb4">
<div class="pa3 bb b--gray-monica">
<h3>
{{ trans('settings.logs_title') }}
</h3>
<ul class="table">
<li class="table-row">
<div class="table-cell table-header">
{{ trans('settings.logs_actor') }}
</div>
<div class="table-cell table-header date">
{{ trans('settings.logs_timestamp') }}
</div>
<div class="table-cell table-header">
{{ trans('settings.logs_description') }}
</div>
<div class="table-cell table-header">
{{ trans('settings.logs_subject') }}
</div>
</li>
@foreach ($logsCollection as $log)
<li class="table-row">
<div class="table-cell audit-log-cell">
{{ $log['author_name'] }}
</div>
<div class="table-cell audit-log-cell date">
{{ \App\Helpers\DateHelper::getShortDateWithTime($log['audited_at']) }}
</div>
<div class="table-cell audit-log-cell">
{{ $log['description'] }}
</div>
<div class="table-cell audit-log-cell">
@if($log['link'])
<a href="{{ $log['link'] }}">{{ $log['object'] }}</a>
@else
{{ $log['object'] }}
@endif
</div>
</li>
@endforeach
</ul>
<div class="tc center">
{{ $logsPagination->links() }}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,51 @@
@extends('layouts.skeleton')
@section('content')
<div class="settings">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ auth()->user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('settings.index') }}">{{ trans('app.breadcrumb_settings') }}</a>
</li>
<li>
{{ trans('app.breadcrumb_dav') }}
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="{{ auth()->user()->getFluidLayout() }}">
<div class="row">
@include('settings._sidebar')
<div class="col-12 col-md-9">
<div class="br3 ba b--gray-monica bg-white mb4">
<div class="pa3 bb b--gray-monica">
<dav-resources
:dav-route="'{{ $davRoute }}'"
:card-dav-route="'{{ $cardDavRoute }}'"
:cal-dav-birthdays-route="'{{ $calDavBirthdaysRoute }}'"
:cal-dav-tasks-route="'{{ $calDavTasksRoute }}'"
></dav-resources>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,123 @@
@extends('layouts.skeleton')
@section('content')
<div class="settings">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('settings.index') }}">{{ trans('app.breadcrumb_settings') }}</a>
</li>
<li>
{{ trans('app.breadcrumb_settings_export') }}
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
@include('settings._sidebar')
<div class="col-12 col-sm-9">
<div class="br3 ba b--gray-monica bg-white mb4">
<div class="pa3 bb b--gray-monica">
@include ('partials.errors')
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<h3>{{ trans('settings.export_title') }}</h3>
<h4>{{ trans('settings.export_title_sql') }}</h4>
<p>{{ trans('settings.export_sql_explanation') }}</p>
<p>{{ trans('settings.export_be_patient') }}</p>
<form action="{{ route('settings.export.store.sql') }}" method="POST">
@csrf
<p>
<button type="submit" class="btn">{{ trans('settings.export_sql_cta') }}</button>
</p>
</form>
<p>{!! trans('settings.export_sql_link_instructions', ['url' => 'https://github.com/monicahq/monica/blob/main/docs/installation/update.md#importing-sql-from-the-exporter-feature']) !!}</p>
<h4>{{ trans('settings.export_title_json') }}</h4>
<p>{{ trans('settings.export_json_explanation') }}</p>
<div class="alert alert-success">
{{ trans('settings.export_json_beta') }}
<a href="https://github.com/monicahq/monica/discussions/5824" target="_blank" rel="noopener noreferrer">https://github.com/monicahq/monica/discussions/5824</a>
</div>
<form method="POST" action="{{ route('settings.export.store.json') }}">
@csrf
<p><button type="submit" class="btn">{{ trans('settings.export_json_cta') }}</button></p>
</form>
<h4>{{ trans('settings.export_last_title') }}</h4>
@if ($exports->count() === 0)
<em>{{ trans('settings.export_empty_title') }}</em>
@else
<ul class="table">
<li class="table-row">
<div class="table-cell table-header">
{{ trans('settings.export_header_type') }}
</div>
<div class="table-cell table-header date">
{{ trans('settings.export_header_timestamp') }}
</div>
<div class="table-cell table-header">
{{ trans('settings.export_header_status') }}
</div>
<div class="table-cell table-header">
{{ trans('settings.export_header_actions') }}
</div>
</li>
@foreach ($exports as $export)
<li class="table-row">
<div class="table-cell">
{{ trans("settings.export_type_{$export['type']}") }}
</div>
<div class="table-cell date">
{{ \App\Helpers\DateHelper::getShortDateWithTime($export['created_at']) }}
</div>
<div class="table-cell">
{{ trans("settings.export_status_{$export['status']}") }}
</div>
<div class="table-cell actions">
@if ($export['status'] === \App\Models\Account\ExportJob::EXPORT_DONE)
<form method="POST" action="{{ route('settings.export.download', ['uuid' => $export['uuid']]) }}">
@csrf
<a href="#" onclick="this.parentNode.submit(); return false">
{{ trans('app.download') }}
</a>
</form>
@endif
</div>
</li>
@endforeach
</ul>
@endif
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,59 @@
@extends('layouts.skeleton')
@section('content')
<div class="settings">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('settings.index') }}">{{ trans('app.breadcrumb_settings') }}</a>
</li>
<li>
{{ trans('app.breadcrumb_settings_import') }}
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
@include('settings._sidebar')
<div class="col-12 col-sm-9 blank-screen">
<div class="br3 ba b--gray-monica bg-white mb4">
<div class="pa3 bb b--gray-monica">
<img src="img/settings/imports/import.svg">
<h2>{{ trans('settings.import_blank_title') }}</h2>
<h3>{{ trans('settings.import_blank_question') }}</h3>
<p>{{ trans('settings.import_blank_description') }}</p>
<p class="cta"><a href="{{ route('settings.upload') }}" class="btn">{{ trans('settings.import_blank_cta') }}</a></p>
@if (config('monica.requires_subscription') && $accountHasLimitations)
<p class="requires-subscription">{{ trans('settings.import_need_subscription') }}</p>
@endif
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,83 @@
@extends('layouts.skeleton')
@section('content')
<div class="settings import">
{{-- Breadcrumb --}}
<div class="breadcrumb">
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
<div class="col-12">
<ul class="horizontal">
<li>
<a href="{{ route('dashboard.index') }}">{{ trans('app.breadcrumb_dashboard') }}</a>
</li>
<li>
<a href="{{ route('settings.index') }}">{{ trans('app.breadcrumb_settings') }}</a>
</li>
<li>
{{ trans('app.breadcrumb_settings_import') }}
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="{{ Auth::user()->getFluidLayout() }}">
<div class="row">
@include('settings._sidebar')
<div class="col-12 col-sm-9">
<h3 class="with-actions">
{{ trans('settings.import_title') }}
<a href="{{ route('settings.upload') }}" class="btn">{{ trans('settings.import_cta') }}</a>
</h3>
<p>{{ trans('settings.import_stat', ['number' => auth()->user()->account->importjobs->count()]) }}</p>
<ul class="table">
@foreach (auth()->user()->account->importjobs as $importJob)
<li class="table-row">
<div class="table-cell">
@if (! is_null($importJob->ended_at))
@if ($importJob->failed)
<i class="fa fa-exclamation-triangle danger"></i>
@elseif ($importJob->contacts_found != $importJob->contacts_imported)
<i class="fa fa-check-circle warning"></i>
@else
<i class="fa fa-check-circle success"></i>
@endif
@else
<i class="fa fa-refresh"></i>
@endif
<span class="date">{{ \App\Helpers\DateHelper::getShortDateWithTime($importJob->created_at) }}</span>
</div>
<div class="table-cell">
@if (is_null($importJob->ended_at))
{{ trans('settings.import_in_progress') }}
@endif
@if($importJob->failed_reason)
{{ $importJob->failed_reason }}
@elseif (! is_null($importJob->ended_at))
{{ trans_choice('settings.import_result_stat', $importJob->contacts_found, ['total_contacts' => $importJob->contacts_found, 'total_imported' => $importJob->contacts_imported, 'total_skipped' => $importJob->contacts_skipped]) }}
@endif
</div>
<div class="table-cell">
@if (! is_null($importJob->ended_at))
<a href="{{ route('settings.report', $importJob) }}">{{ trans('settings.import_view_report') }}</a>
@endif
</div>
</li>
@endforeach
</ul>
</div>
</div>
</div>
</div>
@endsection

Some files were not shown because too many files have changed in this diff Show More