diff --git a/app/Abstracts/Notification.php b/app/Abstracts/Notification.php index 8162ff98c..367af653f 100644 --- a/app/Abstracts/Notification.php +++ b/app/Abstracts/Notification.php @@ -91,7 +91,7 @@ abstract class Notification extends BaseNotification implements ShouldQueue public function getFooter() { - $url = 'https://akaunting.com/lp/accounting-software?utm_source=email&utm_medium=software&utm_campaign=footer&utm_content=' . $this->template->alias; + $url = 'https://akaunting.com/lp/accounting-software?utm_source=email&utm_medium=footer&utm_campaign=plg&utm_content=' . $this->template->alias; $get_started = '' . trans('footer.get_started') . ''; diff --git a/app/Abstracts/Widget.php b/app/Abstracts/Widget.php index 92620a984..a5d8eccc9 100644 --- a/app/Abstracts/Widget.php +++ b/app/Abstracts/Widget.php @@ -63,7 +63,7 @@ abstract class Widget 'alias' => $alias, 'utm_source' => 'widget', 'utm_medium' => 'app', - 'utm_campaign' => Str::snake(Str::camel($alias)), + 'utm_campaign' => str_replace('-', '_', $alias), ]); } diff --git a/app/Events/Auth/InvitationCreated.php b/app/Events/Auth/InvitationCreated.php deleted file mode 100644 index 07741f8a3..000000000 --- a/app/Events/Auth/InvitationCreated.php +++ /dev/null @@ -1,20 +0,0 @@ -invitation = $invitation; - } -} diff --git a/app/Http/Controllers/Auth/Register.php b/app/Http/Controllers/Auth/Register.php index 808cbce1f..4b8c711ed 100644 --- a/app/Http/Controllers/Auth/Register.php +++ b/app/Http/Controllers/Auth/Register.php @@ -46,6 +46,10 @@ class Register extends Controller { $invitation = UserInvitation::token($request->get('token'))->first(); + if (!$invitation) { + abort(403); + } + $user = $invitation->user; $this->dispatch(new DeleteInvitation($invitation)); diff --git a/app/Http/Controllers/Modals/DocumentTransactions.php b/app/Http/Controllers/Modals/DocumentTransactions.php index b532ce862..dfb3d9355 100644 --- a/app/Http/Controllers/Modals/DocumentTransactions.php +++ b/app/Http/Controllers/Modals/DocumentTransactions.php @@ -12,6 +12,7 @@ use App\Models\Setting\Currency; use App\Utilities\Modules; use App\Traits\Uploads; use App\Traits\Transactions; +use Date; class DocumentTransactions extends Controller @@ -58,6 +59,8 @@ class DocumentTransactions extends Controller $document->grand_total = round($document->total - $paid, $currency->precision); } + $document->paid_at = Date::now()->toDateString(); + $buttons = [ 'cancel' => [ 'text' => trans('general.cancel'), @@ -79,9 +82,11 @@ class DocumentTransactions extends Controller ], ]; + $method = 'POST'; + $route = ['modals.documents.document.transactions.store', $document->id]; - $html = view('modals.documents.payment', compact('document', 'route', 'currency', 'number'))->render(); + $html = view('modals.documents.payment', compact('document', 'method', 'route', 'currency', 'number'))->render(); return response()->json([ 'success' => true, @@ -139,20 +144,11 @@ class DocumentTransactions extends Controller $paid = $document->paid; - $number = $this->getNextTransactionNumber(); + $number = $transaction->number; - // Get document Totals - foreach ($document->totals as $document_total) { - $document->{$document_total->code} = $document_total->amount; - } + $document->grand_total = money($transaction->amount, $currency->code)->getAmount(); - $total = money($document->total, $currency->code, true)->format(); - - $document->grand_total = money($total, $currency->code)->getAmount(); - - if (! empty($paid)) { - $document->grand_total = round($document->total - $paid, $currency->precision); - } + $document->paid_at = $transaction->paid_at; $buttons = [ 'cancel' => [ @@ -170,9 +166,11 @@ class DocumentTransactions extends Controller ], ]; + $method = 'PATCH'; + $route = ['modals.documents.document.transactions.update', $document->id, $transaction->id]; - $html = view('modals.documents.payment', compact('document', 'transaction', 'route', 'currency', 'number'))->render(); + $html = view('modals.documents.payment', compact('document', 'transaction', 'method', 'route', 'currency', 'number'))->render(); return response()->json([ 'success' => true, diff --git a/app/Jobs/Auth/CreateInvitation.php b/app/Jobs/Auth/CreateInvitation.php index 6ca036b88..3d0fb9f2d 100644 --- a/app/Jobs/Auth/CreateInvitation.php +++ b/app/Jobs/Auth/CreateInvitation.php @@ -3,9 +3,11 @@ namespace App\Jobs\Auth; use App\Abstracts\Job; -use App\Events\Auth\InvitationCreated; use App\Models\Auth\UserInvitation; +use App\Notifications\Auth\Invitation as Notification; +use Exception; use Illuminate\Support\Str; +use Symfony\Component\Mailer\Exception\TransportException; class CreateInvitation extends Job { @@ -13,31 +15,29 @@ class CreateInvitation extends Job protected $user; - protected $company; - - public function __construct($user, $company) + public function __construct($user) { $this->user = $user; - $this->company = $company; } public function handle(): UserInvitation { \DB::transaction(function () { - if ($this->user->hasPendingInvitation($this->company->id)) { - $pending_invitation = $this->user->getPendingInvitation($this->company->id); - - $this->dispatch(new DeleteInvitation($pending_invitation)); - } - $this->invitation = UserInvitation::create([ 'user_id' => $this->user->id, - 'company_id' => $this->company->id, 'token' => (string) Str::uuid(), ]); - }); - event(new InvitationCreated($this->invitation)); + $notification = new Notification($this->invitation); + + try { + $this->dispatch(new NotifyUser($this->user, $notification)); + } catch (TransportException $e) { + $message = trans('errors.title.500'); + + throw new Exception($message); + } + }); return $this->invitation; } diff --git a/app/Jobs/Auth/CreateUser.php b/app/Jobs/Auth/CreateUser.php index 2d653080c..ce341f03b 100644 --- a/app/Jobs/Auth/CreateUser.php +++ b/app/Jobs/Auth/CreateUser.php @@ -69,12 +69,10 @@ class CreateUser extends Job implements HasOwner, HasSource, ShouldCreate 'user' => $this->model->id, 'company' => $company->id, ]); + } - if (app()->runningInConsole() || request()->isInstall()) { - continue; - } - - $this->dispatch(new CreateInvitation($this->model, $company)); + if ((! app()->runningInConsole() && ! request()->isInstall()) || app()->runningUnitTests()) { + $this->dispatch(new CreateInvitation($this->model)); } }); diff --git a/app/Jobs/Auth/DeleteUser.php b/app/Jobs/Auth/DeleteUser.php index c71b20302..e2dc1a722 100644 --- a/app/Jobs/Auth/DeleteUser.php +++ b/app/Jobs/Auth/DeleteUser.php @@ -16,6 +16,8 @@ class DeleteUser extends Job implements ShouldDelete event(new UserDeleting($this->model)); \DB::transaction(function () { + $this->deleteRelationships($this->model, ['invitation']); + $this->model->delete(); $this->model->flushCache(); diff --git a/app/Jobs/Auth/UpdateUser.php b/app/Jobs/Auth/UpdateUser.php index 7d3940e7a..56cc7c3d5 100644 --- a/app/Jobs/Auth/UpdateUser.php +++ b/app/Jobs/Auth/UpdateUser.php @@ -67,20 +67,6 @@ class UpdateUser extends Job implements ShouldUpdate 'user' => $this->model->id, 'company' => $company->id, ]); - - $this->dispatch(new CreateInvitation($this->model, $company)); - } - } - - if (isset($sync) && !empty($sync['detached'])) { - foreach ($sync['detached'] as $id) { - $company = Company::find($id); - - if ($this->model->hasPendingInvitation($company->id)) { - $pending_invitation = $this->model->getPendingInvitation($company->id); - - $this->dispatch(new DeleteInvitation($pending_invitation)); - } } } }); diff --git a/app/Jobs/Banking/UpdateBankingDocumentTransaction.php b/app/Jobs/Banking/UpdateBankingDocumentTransaction.php index f4b883097..914735cf7 100644 --- a/app/Jobs/Banking/UpdateBankingDocumentTransaction.php +++ b/app/Jobs/Banking/UpdateBankingDocumentTransaction.php @@ -3,7 +3,7 @@ namespace App\Jobs\Banking; use App\Abstracts\Job; -use App\Jobs\Banking\CreateTransaction; +use App\Jobs\Banking\UpdateTransaction; use App\Jobs\Document\CreateDocumentHistory; use App\Events\Document\PaidAmountCalculated; use App\Interfaces\Job\ShouldUpdate; @@ -21,7 +21,7 @@ class UpdateBankingDocumentTransaction extends Job implements ShouldUpdate $this->model = $model; $this->transaction = $transaction; - parent::__construct($request); + $this->request = $this->getRequestInstance($request); } public function handle(): Transaction @@ -31,7 +31,7 @@ class UpdateBankingDocumentTransaction extends Job implements ShouldUpdate $this->checkAmount(); \DB::transaction(function () { - $this->transaction = $this->dispatch(new CreateTransaction($this->request)); + $this->transaction = $this->dispatch(new UpdateTransaction($this->transaction, $this->request)); // Upload attachment if ($this->request->file('attachment')) { diff --git a/app/Listeners/Auth/DeleteUserInvitation.php b/app/Listeners/Auth/DeleteUserInvitation.php deleted file mode 100644 index b4eb8597a..000000000 --- a/app/Listeners/Auth/DeleteUserInvitation.php +++ /dev/null @@ -1,28 +0,0 @@ -user->id)->get(); - - foreach ($invitations as $invitation) { - $this->dispatch(new DeleteInvitation($invitation)); - } - } -} diff --git a/app/Listeners/Auth/SendUserInvitation.php b/app/Listeners/Auth/SendUserInvitation.php deleted file mode 100644 index 9d9d9cdf8..000000000 --- a/app/Listeners/Auth/SendUserInvitation.php +++ /dev/null @@ -1,22 +0,0 @@ -invitation; - - $invitation->user->notify(new Notification($invitation)); - } -} diff --git a/app/Listeners/Menu/ShowInNotifications.php b/app/Listeners/Menu/ShowInNotifications.php index c73da1ecc..db5168fdc 100644 --- a/app/Listeners/Menu/ShowInNotifications.php +++ b/app/Listeners/Menu/ShowInNotifications.php @@ -62,8 +62,8 @@ class ShowInNotifications $app_url = route('apps.app.show', [ 'alias' => $new_app->alias, 'utm_source' => 'notification', - 'utm_medium' => 'software', - 'utm_campaign' => str_replace('-', '', $new_app->alias), + 'utm_medium' => 'app', + 'utm_campaign' => str_replace('-', '_', $new_app->alias), ]); $new = new DatabaseNotification(); diff --git a/app/Listeners/Update/V30/Version304.php b/app/Listeners/Update/V30/Version304.php new file mode 100644 index 000000000..de4f6e069 --- /dev/null +++ b/app/Listeners/Update/V30/Version304.php @@ -0,0 +1,70 @@ +skipThisUpdate($event)) { + return; + } + + Log::channel('stderr')->info('Starting the Akaunting 3.0.4 update...'); + + $this->updateDatabase(); + + $this->deleteOldFiles(); + + Log::channel('stderr')->info('Akaunting 3.0.4 update finished.'); + } + + public function updateDatabase() + { + Log::channel('stderr')->info('Updating database...'); + + DB::table('migrations')->insert([ + 'id' => DB::table('migrations')->max('id') + 1, + 'migration' => '2022_06_28_000000_core_v304', + 'batch' => DB::table('migrations')->max('batch') + 1, + ]); + + Artisan::call('migrate', ['--force' => true]); + + Log::channel('stderr')->info('Database updated.'); + } + + public function deleteOldFiles() + { + Log::channel('stderr')->info('Deleting old files...'); + + $files = [ + 'app/Events/Auth/InvitationCreated.php', + 'app/Listeners/Auth/SendUserInvitation.php', + 'app/Listeners/Auth/DeleteUserInvitation.php', + ]; + + foreach ($files as $file) { + File::delete(base_path($file)); + } + + Log::channel('stderr')->info('Old files deleted.'); + } +} diff --git a/app/Models/Auth/User.php b/app/Models/Auth/User.php index 2d4d21c8a..bed0d6aa0 100644 --- a/app/Models/Auth/User.php +++ b/app/Models/Auth/User.php @@ -89,6 +89,11 @@ class User extends Authenticatable implements HasLocalePreference return $this->belongsToMany('App\Models\Common\Dashboard', 'App\Models\Auth\UserDashboard'); } + public function invitation() + { + return $this->hasOne('App\Models\Auth\UserInvitation', 'user_id', 'id'); + } + /** * Always capitalize the name when we retrieve it */ @@ -311,14 +316,12 @@ class User extends Authenticatable implements HasLocalePreference return $actions; } - if (! $this->hasPendingInvitation()) { - $actions[] = [ - 'title' => trans('general.edit'), - 'icon' => 'edit', - 'url' => route('users.edit', $this->id), - 'permission' => 'update-auth-users', - ]; - } + $actions[] = [ + 'title' => trans('general.edit'), + 'icon' => 'edit', + 'url' => route('users.edit', $this->id), + 'permission' => 'update-auth-users', + ]; if ($this->hasPendingInvitation()) { $actions[] = [ diff --git a/app/Models/Auth/UserInvitation.php b/app/Models/Auth/UserInvitation.php index 661088a5f..2b8a85b23 100644 --- a/app/Models/Auth/UserInvitation.php +++ b/app/Models/Auth/UserInvitation.php @@ -20,7 +20,7 @@ class UserInvitation extends Model * * @var string[] */ - protected $fillable = ['user_id', 'company_id', 'token']; + protected $fillable = ['user_id', 'token']; public function user() { diff --git a/app/Providers/Event.php b/app/Providers/Event.php index 0e9351031..05ad6759e 100644 --- a/app/Providers/Event.php +++ b/app/Providers/Event.php @@ -17,6 +17,7 @@ class Event extends Provider 'App\Listeners\Module\UpdateExtraModules', 'App\Listeners\Update\V30\Version300', 'App\Listeners\Update\V30\Version303', + 'App\Listeners\Update\V30\Version304', ], 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\Auth\Login', @@ -31,12 +32,6 @@ class Event extends Provider 'App\Events\Auth\LandingPageShowing' => [ 'App\Listeners\Auth\AddLandingPages', ], - 'App\Events\Auth\InvitationCreated' => [ - 'App\Listeners\Auth\SendUserInvitation', - ], - 'App\Events\Auth\UserDeleted' => [ - 'App\Listeners\Auth\DeleteUserInvitation', - ], 'App\Events\Document\DocumentCreated' => [ 'App\Listeners\Document\CreateDocumentCreatedHistory', 'App\Listeners\Document\IncreaseNextDocumentNumber', diff --git a/app/Traits/Cloud.php b/app/Traits/Cloud.php index 01a6e69c1..53c0231b4 100644 --- a/app/Traits/Cloud.php +++ b/app/Traits/Cloud.php @@ -15,10 +15,10 @@ trait Cloud return request()->getHost() == $this->cloud_host; } - public function getCloudRolesPageUrl() + public function getCloudRolesPageUrl($location = 'user') { if (! $this->isCloud()) { - return 'https://akaunting.com/plans?utm_source=user_role&utm_medium=software&utm_campaign=plg'; + return 'https://akaunting.com/apps/roles?utm_source=software&utm_medium=' . $location . '&utm_campaign=roles'; } if ($this->moduleIsEnabled('roles')) { @@ -26,20 +26,20 @@ trait Cloud } return route('cloud.plans.index', [ - 'utm_source' => 'user', + 'utm_source' => $location, 'utm_medium' => 'app', 'utm_campaign' => 'roles', ]); } - public function getCloudBankFeedsUrl() + public function getCloudBankFeedsUrl($location = 'widget') { if (! $this->isCloud()) { - return 'https://akaunting.com/features/connect-your-bank?utm_source=bank_feeds_widget&utm_medium=software&utm_campaign=plg'; + return 'https://akaunting.com/apps/bank-feeds?utm_source=software&utm_medium=' . $location . '&utm_campaign=bank_feeds'; } return route('cloud.plans.index', [ - 'utm_source' => 'widget', + 'utm_source' => $location, 'utm_medium' => 'app', 'utm_campaign' => 'bank_feeds', ]); diff --git a/app/Traits/Users.php b/app/Traits/Users.php index 4ef8dc26e..c127d214b 100644 --- a/app/Traits/Users.php +++ b/app/Traits/Users.php @@ -110,31 +110,25 @@ trait Users } /** - * Checks if the given user has a pending invitation for the - * provided Company. + * Checks if the given user has a pending invitation. * * @return bool */ - public function hasPendingInvitation($company_id = null) + public function hasPendingInvitation() { - $company_id = $company_id ?: company_id(); - - $invitation = UserInvitation::where('user_id', $this->id)->where('company_id', $company_id)->first(); + $invitation = UserInvitation::where('user_id', $this->id)->first(); return $invitation ? true : false; } /** - * Returns if the given user has a pending invitation for the - * provided Company. + * Returns if the given user has a pending invitation. * * @return null|UserInvitation */ - public function getPendingInvitation($company_id = null) + public function getPendingInvitation() { - $company_id = $company_id ?: company_id(); - - $invitation = UserInvitation::where('user_id', $this->id)->where('company_id', $company_id)->first(); + $invitation = UserInvitation::where('user_id', $this->id)->first(); return $invitation; } diff --git a/app/View/Components/Documents/Show/GetPaid.php b/app/View/Components/Documents/Show/GetPaid.php index 5cfbfe249..f1bf20056 100644 --- a/app/View/Components/Documents/Show/GetPaid.php +++ b/app/View/Components/Documents/Show/GetPaid.php @@ -15,7 +15,7 @@ class GetPaid extends Component */ public function render() { - $this->description = trans('general.amount_due') . ': ' . '' . money($this->document->amount, $this->document->currency_code, true) . ''; + $this->description = trans('general.amount_due') . ': ' . '' . money($this->document->amount_due, $this->document->currency_code, true) . ''; return view('components.documents.show.get-paid'); } diff --git a/app/View/Components/Documents/Show/MakePayment.php b/app/View/Components/Documents/Show/MakePayment.php index 8d1703dba..c2406dbd4 100644 --- a/app/View/Components/Documents/Show/MakePayment.php +++ b/app/View/Components/Documents/Show/MakePayment.php @@ -15,7 +15,7 @@ class MakePayment extends Component */ public function render() { - $this->description = trans('general.amount_due') . ': ' . '' . money($this->document->amount, $this->document->currency_code, true) . ''; + $this->description = trans('general.amount_due') . ': ' . '' . money($this->document->amount_due, $this->document->currency_code, true) . ''; return view('components.documents.show.make-payment'); } diff --git a/database/migrations/2022_06_28_000000_core_v304.php b/database/migrations/2022_06_28_000000_core_v304.php new file mode 100644 index 000000000..95dccd039 --- /dev/null +++ b/database/migrations/2022_06_28_000000_core_v304.php @@ -0,0 +1,30 @@ +dropColumn('company_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +}; diff --git a/index.php b/index.php index befbc69c9..169e2f190 100644 --- a/index.php +++ b/index.php @@ -2,7 +2,7 @@ /** * @package Akaunting - * @copyright 2017-2021 Akaunting. All rights reserved. + * @copyright 2017-2022 Akaunting. All rights reserved. * @license GNU GPL version 3; see LICENSE.txt * @link https://akaunting.com */ diff --git a/public/css/app.css b/public/css/app.css index 27144a2ab..b8ed5a608 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -9,6 +9,7 @@ .ql-editor p { color: #424242; + display: inline; } .ql-toolbar { @@ -28,13 +29,14 @@ color: rgb(199 201 217 / var(--tw-text-opacity)); display: block; width: 100%; - padding: .625rem .75rem; + padding: 12px 9px !important; background-color: #fff; background-clip: padding-box; border: 1px solid; border-top: unset; border-bottom-left-radius: 0.5rem; border-bottom-right-radius: 0.5rem; + font-size: 14px !important; } .ql-toolbar button:hover { @@ -36205,6 +36207,209 @@ input[type="date"]::-webkit-inner-spin-button, color: rgb(245 158 11 / var(--tw-placeholder-opacity)); } .placeholder-amber-50::-webkit-input-placeholder{ +<<<<<<< HEAD + --tw-placeholder-opacity: 1; + color: rgb(255 251 235 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-50::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(255 251 235 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-50:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(255 251 235 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-50::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(255 251 235 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-50::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(255 251 235 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-100::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(254 243 199 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-100::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(254 243 199 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-100:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(254 243 199 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-100::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(254 243 199 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-100::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(254 243 199 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-200::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(253 230 138 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-200::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(253 230 138 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-200:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(253 230 138 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-200::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(253 230 138 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-200::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(253 230 138 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-300::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(252 211 77 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-300::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(252 211 77 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-300:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(252 211 77 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-300::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(252 211 77 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-300::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(252 211 77 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-400::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(251 191 36 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-400::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(251 191 36 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-400:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(251 191 36 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-400::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(251 191 36 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-400::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(251 191 36 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-500::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(245 158 11 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-500::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(245 158 11 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-500:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(245 158 11 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-500::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(245 158 11 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-500::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(245 158 11 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-600::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(217 119 6 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-600::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(217 119 6 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-600:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(217 119 6 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-600::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(217 119 6 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-600::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(217 119 6 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-700::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(180 83 9 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-700::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(180 83 9 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-700:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(180 83 9 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-700::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(180 83 9 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-700::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(180 83 9 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-800::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(146 64 14 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-800::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(146 64 14 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-800:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(146 64 14 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-800::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(146 64 14 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-800::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(146 64 14 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-900::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(120 53 15 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-900::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(120 53 15 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-900:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(120 53 15 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-900::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(120 53 15 / var(--tw-placeholder-opacity)); +} +.placeholder-amber-900::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(120 53 15 / var(--tw-placeholder-opacity)); +} +.placeholder-yellow-50::-webkit-input-placeholder{ +======= +>>>>>>> 78a2d87fc0a334e495dc2c8a4a752829cd408a14 --tw-placeholder-opacity: 1; color: rgb(255 251 235 / var(--tw-placeholder-opacity)); } @@ -37824,6 +38029,406 @@ input[type="date"]::-webkit-inner-spin-button, --tw-placeholder-opacity: 1; color: rgb(12 74 110 / var(--tw-placeholder-opacity)); } +.placeholder-cyan-50::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(236 254 255 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-50::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(236 254 255 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-50:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(236 254 255 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-50::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(236 254 255 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-50::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(236 254 255 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-100::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(207 250 254 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-100::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(207 250 254 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-100:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(207 250 254 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-100::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(207 250 254 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-100::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(207 250 254 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-200::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(165 243 252 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-200::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(165 243 252 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-200:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(165 243 252 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-200::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(165 243 252 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-200::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(165 243 252 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-300::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(103 232 249 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-300::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(103 232 249 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-300:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(103 232 249 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-300::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(103 232 249 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-300::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(103 232 249 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-400::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(34 211 238 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-400::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(34 211 238 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-400:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(34 211 238 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-400::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(34 211 238 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-400::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(34 211 238 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-500::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(6 182 212 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-500::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(6 182 212 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-500:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(6 182 212 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-500::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(6 182 212 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-500::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(6 182 212 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-600::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(8 145 178 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-600::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(8 145 178 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-600:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(8 145 178 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-600::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(8 145 178 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-600::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(8 145 178 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-700::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(14 116 144 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-700::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(14 116 144 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-700:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(14 116 144 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-700::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(14 116 144 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-700::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(14 116 144 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-800::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(21 94 117 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-800::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(21 94 117 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-800:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(21 94 117 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-800::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(21 94 117 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-800::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(21 94 117 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-900::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(22 78 99 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-900::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(22 78 99 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-900:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(22 78 99 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-900::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(22 78 99 / var(--tw-placeholder-opacity)); +} +.placeholder-cyan-900::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(22 78 99 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-50::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(240 249 255 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-50::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(240 249 255 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-50:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(240 249 255 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-50::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(240 249 255 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-50::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(240 249 255 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-100::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(224 242 254 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-100::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(224 242 254 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-100:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(224 242 254 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-100::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(224 242 254 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-100::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(224 242 254 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-200::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(186 230 253 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-200::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(186 230 253 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-200:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(186 230 253 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-200::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(186 230 253 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-200::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(186 230 253 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-300::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(125 211 252 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-300::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(125 211 252 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-300:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(125 211 252 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-300::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(125 211 252 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-300::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(125 211 252 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-400::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(56 189 248 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-400::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(56 189 248 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-400:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(56 189 248 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-400::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(56 189 248 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-400::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(56 189 248 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-500::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(14 165 233 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-500::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(14 165 233 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-500:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(14 165 233 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-500::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(14 165 233 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-500::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(14 165 233 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-600::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(2 132 199 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-600::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(2 132 199 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-600:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(2 132 199 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-600::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(2 132 199 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-600::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(2 132 199 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-700::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(3 105 161 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-700::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(3 105 161 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-700:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(3 105 161 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-700::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(3 105 161 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-700::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(3 105 161 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-800::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(7 89 133 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-800::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(7 89 133 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-800:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(7 89 133 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-800::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(7 89 133 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-800::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(7 89 133 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-900::-webkit-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(12 74 110 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-900::-moz-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(12 74 110 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-900:-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(12 74 110 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-900::-ms-input-placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(12 74 110 / var(--tw-placeholder-opacity)); +} +.placeholder-sky-900::placeholder{ + --tw-placeholder-opacity: 1; + color: rgb(12 74 110 / var(--tw-placeholder-opacity)); +} .placeholder-blue-50::-webkit-input-placeholder{ --tw-placeholder-opacity: 1; color: rgb(242 248 251 / var(--tw-placeholder-opacity)); diff --git a/public/css/third_party/vue-html-editor_custom.css b/public/css/third_party/vue-html-editor_custom.css index ed13be59f..725f38afb 100644 --- a/public/css/third_party/vue-html-editor_custom.css +++ b/public/css/third_party/vue-html-editor_custom.css @@ -9,6 +9,7 @@ .ql-editor p { color: #424242; + display: inline; } .ql-toolbar { @@ -24,13 +25,14 @@ @apply text-sm text-light-gray; display: block; width: 100%; - padding: .625rem .75rem; + padding: 12px 9px !important; background-color: #fff; background-clip: padding-box; border: 1px solid; border-top: unset; border-bottom-left-radius: 0.5rem; border-bottom-right-radius: 0.5rem; + font-size: 14px !important; } .ql-toolbar button:hover { diff --git a/resources/assets/js/views/common/companies.js b/resources/assets/js/views/common/companies.js index a6d7affbc..c43366979 100644 --- a/resources/assets/js/views/common/companies.js +++ b/resources/assets/js/views/common/companies.js @@ -30,5 +30,22 @@ const app = new Vue({ form: new Form('company'), bulk_action: new BulkAction('companies') } + }, + + methods: { + // Form Submit + onSubmit() { + this.form.loading = true; + + if (this.form.country === "") { + this.form.errors.set('country', [country_validation_required_message]); + + this.form.loading = false; + + return; + } + + this.form.submit(); + }, } }); diff --git a/resources/assets/js/views/common/documents.js b/resources/assets/js/views/common/documents.js index 62b65309c..356dc19a5 100644 --- a/resources/assets/js/views/common/documents.js +++ b/resources/assets/js/views/common/documents.js @@ -696,7 +696,7 @@ const app = new Vue({ let payment = { modal: false, - url: url + '/modals/documents/' + document_id + '/transactions/edit/' + transaction_id, + url: url + '/modals/documents/' + document_id + '/transactions/' + transaction_id + '/edit', title: '', html: '', buttons:{} diff --git a/resources/views/auth/users/edit.blade.php b/resources/views/auth/users/edit.blade.php index 412fede3c..3908a8787 100644 --- a/resources/views/auth/users/edit.blade.php +++ b/resources/views/auth/users/edit.blade.php @@ -13,7 +13,7 @@