mirror of
https://gitlab.linphone.org/BC/public/flexisip-account-manager.git
synced 2026-01-17 10:08:05 +00:00
Fix FLEXIAPI-232 Add provisioning email
This commit is contained in:
parent
e2f40699fb
commit
0160779784
72 changed files with 1037 additions and 686 deletions
|
|
@ -31,6 +31,7 @@ v1.7
|
|||
- Fix FLEXIAPI-277 Restrict authorized ini keys that can be set to prevent conflict with the existing ones set in the UI
|
||||
- Fix FLEXIAPI-272 Add Space based email server integration
|
||||
- Fix FLEXIAPI-284 Add configurable admin API Keys
|
||||
- Fix FLEXIAPI-232 Add provisioning email + important redesign of the contacts page
|
||||
|
||||
v1.6
|
||||
----
|
||||
|
|
|
|||
|
|
@ -25,19 +25,6 @@ use App\Libraries\FlexisipRedisConnector;
|
|||
|
||||
class DeviceController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$connector = new FlexisipRedisConnector;
|
||||
|
||||
return view(
|
||||
'account.device.index',
|
||||
[
|
||||
'account' => $request->user(),
|
||||
'devices' => $connector->getDevices($request->user()->identifier)
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
public function delete(Request $request, string $uuid)
|
||||
{
|
||||
$connector = new FlexisipRedisConnector;
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ class AccountAccountTypeController extends Controller
|
|||
|
||||
Log::channel('events')->info('Web Admin: Account type attached', ['id' => $account->identifier, 'type_id' => $request->get('account_type_id')]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $account);
|
||||
return redirect()->route('admin.account.show', $account)->withFragment('#types');
|
||||
}
|
||||
|
||||
public function destroy(Request $request, int $id, int $typeId)
|
||||
|
|
@ -66,6 +66,6 @@ class AccountAccountTypeController extends Controller
|
|||
|
||||
Log::channel('events')->info('Web Admin: Account type detached', ['id' => $account->identifier, 'type_id' => $request->get('account_type_id')]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $account);
|
||||
return redirect()->route('admin.account.show', $account)->withFragment('#types');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ class AccountActionController extends Controller
|
|||
|
||||
Log::channel('events')->info('Web Admin: Account action created', ['id' => $account->identifier, 'action' => $accountAction->key]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $accountAction->account);
|
||||
return redirect()->route('admin.account.show', $accountAction->account)->withFragment('#actions');
|
||||
}
|
||||
|
||||
public function edit(int $accountId, int $actionId)
|
||||
|
|
@ -91,7 +91,7 @@ class AccountActionController extends Controller
|
|||
|
||||
Log::channel('events')->info('Web Admin: Account action updated', ['id' => $account->identifier, 'action' => $accountAction->key]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $account);
|
||||
return redirect()->route('admin.account.show', $account)->withFragment('#actions');
|
||||
}
|
||||
|
||||
public function delete(int $accountId, int $actionId)
|
||||
|
|
@ -116,6 +116,6 @@ class AccountActionController extends Controller
|
|||
|
||||
Log::channel('events')->info('Web Admin: Account action deleted', ['id' => $accountAction->account->identifier, 'action_id' => $accountAction->key]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $accountAction->account);
|
||||
return redirect()->route('admin.account.show', $accountAction->account)->withFragment('#actions');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,9 +24,24 @@ use Illuminate\Http\Request;
|
|||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
use App\Account;
|
||||
use App\ContactsList;
|
||||
|
||||
class AccountContactController extends Controller
|
||||
{
|
||||
public function index(int $accountId)
|
||||
{
|
||||
$account = Account::findOrFail($accountId);
|
||||
|
||||
return view('admin.account.contact.index', [
|
||||
'account' => $account,
|
||||
'contacts_lists' => ContactsList::whereNotIn('id', function ($query) use ($accountId) {
|
||||
$query->select('contacts_list_id')
|
||||
->from('account_contacts_list')
|
||||
->where('account_id', $accountId);
|
||||
})->withCount('contacts')->get()
|
||||
]);
|
||||
}
|
||||
|
||||
public function create(int $accountId)
|
||||
{
|
||||
$account = Account::findOrFail($accountId);
|
||||
|
|
@ -56,7 +71,7 @@ class AccountContactController extends Controller
|
|||
|
||||
Log::channel('events')->info('Web Admin: Account contact added', ['id' => $account->identifier, 'contact' => $contact->identifier]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $account);
|
||||
return redirect()->route('admin.account.contact.index', $account);
|
||||
}
|
||||
|
||||
public function delete(int $accountId, int $contactId)
|
||||
|
|
@ -79,6 +94,6 @@ class AccountContactController extends Controller
|
|||
|
||||
Log::channel('events')->info('Web Admin: Account contact removed', ['id' => $account->identifier, 'contact' => $contact->identifier]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $account);
|
||||
return redirect()->route('admin.account.contact.index', $account);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ use App\Account;
|
|||
use App\ContactsList;
|
||||
use App\Http\Requests\Account\Create\Web\AsAdminRequest;
|
||||
use App\Http\Requests\Account\Update\Web\AsAdminRequest as WebAsAdminRequest;
|
||||
use App\Libraries\FlexisipRedisConnector;
|
||||
use App\Services\AccountService;
|
||||
use App\Space;
|
||||
|
||||
|
|
@ -39,8 +40,7 @@ class AccountController extends Controller
|
|||
'order_sort' => 'in:asc,desc',
|
||||
]);
|
||||
|
||||
$accounts = Account::with('contactsLists')
|
||||
->orderBy($request->get('order_by', 'updated_at'), $request->get('order_sort', 'desc'));
|
||||
$accounts = Account::orderBy($request->get('order_by', 'updated_at'), $request->get('order_sort', 'desc'));
|
||||
|
||||
if ($request->has('search')) {
|
||||
$accounts = $accounts->where('username', 'like', '%' . $request->get('search') . '%');
|
||||
|
|
@ -75,6 +75,16 @@ class AccountController extends Controller
|
|||
return redirect()->route('admin.account.index', $request->except('_token', 'query'));
|
||||
}
|
||||
|
||||
public function show(Request $request, int $accountId)
|
||||
{
|
||||
$account = Account::findOrFail($accountId);
|
||||
|
||||
return view('admin.account.show', [
|
||||
'account' => $account,
|
||||
'devices' => (new FlexisipRedisConnector)->getDevices($account->identifier)
|
||||
]);
|
||||
}
|
||||
|
||||
public function create(Request $request)
|
||||
{
|
||||
$account = new Account;
|
||||
|
|
@ -102,7 +112,7 @@ class AccountController extends Controller
|
|||
|
||||
Log::channel('events')->info('Web Admin: Account created', ['id' => $account->identifier]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $account->id);
|
||||
return redirect()->route('admin.account.show', $account);
|
||||
}
|
||||
|
||||
public function edit(Request $request, int $accountId)
|
||||
|
|
@ -115,11 +125,6 @@ class AccountController extends Controller
|
|||
'domains' => $request->user()?->superAdmin
|
||||
? Space::all()
|
||||
: Space::where('domain', $account->domain)->get(),
|
||||
'contacts_lists' => ContactsList::whereNotIn('id', function ($query) use ($accountId) {
|
||||
$query->select('contacts_list_id')
|
||||
->from('account_contacts_list')
|
||||
->where('account_id', $accountId);
|
||||
})->get()
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
@ -129,7 +134,7 @@ class AccountController extends Controller
|
|||
|
||||
Log::channel('events')->info('Web Admin: Account updated', ['id' => $account->identifier]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $accountId);
|
||||
return redirect()->route('admin.account.show', $accountId);
|
||||
}
|
||||
|
||||
public function provision(int $accountId)
|
||||
|
|
@ -173,7 +178,7 @@ class AccountController extends Controller
|
|||
$account->contactsLists()->detach([$request->get('contacts_list_id')]);
|
||||
$account->contactsLists()->attach([$request->get('contacts_list_id')]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $accountId)->withFragment('#contacts_lists');
|
||||
return redirect()->route('admin.account.contact.index', $accountId)->withFragment('#contacts_lists');
|
||||
}
|
||||
|
||||
public function contactsListRemove(Request $request, int $accountId)
|
||||
|
|
@ -181,6 +186,6 @@ class AccountController extends Controller
|
|||
$account = Account::findOrFail($accountId);
|
||||
$account->contactsLists()->detach([$request->get('contacts_list_id')]);
|
||||
|
||||
return redirect()->route('admin.account.edit', $accountId)->withFragment('#contacts_lists');
|
||||
return redirect()->route('admin.account.contact.index', $accountId)->withFragment('#contacts_lists');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,16 +27,6 @@ use App\AccountDictionaryEntry;
|
|||
|
||||
class AccountDictionaryController extends Controller
|
||||
{
|
||||
public function index(int $accountId)
|
||||
{
|
||||
return view(
|
||||
'admin.account.dictionary.index',
|
||||
[
|
||||
'account' => Account::findOrFail($accountId)
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
public function create(int $accountId)
|
||||
{
|
||||
return view('admin.account.dictionary.create_edit', [
|
||||
|
|
@ -61,7 +51,7 @@ class AccountDictionaryController extends Controller
|
|||
accountServiceAccountEditedHook($request, $account);
|
||||
}
|
||||
|
||||
return redirect()->route('admin.account.dictionary.index', $account->id);
|
||||
return redirect()->route('admin.account.show', $account);
|
||||
}
|
||||
|
||||
public function edit(int $accountId, string $key)
|
||||
|
|
@ -91,7 +81,7 @@ class AccountDictionaryController extends Controller
|
|||
accountServiceAccountEditedHook($request, $account);
|
||||
}
|
||||
|
||||
return redirect()->route('admin.account.dictionary.index', $account->id);
|
||||
return redirect()->route('admin.account.show', $account);
|
||||
}
|
||||
|
||||
public function delete(int $accountId, string $key)
|
||||
|
|
@ -112,6 +102,6 @@ class AccountDictionaryController extends Controller
|
|||
$account = Account::findOrFail($accountId);
|
||||
$account->dictionaryEntries()->where('key', $request->get('key'))->delete();
|
||||
|
||||
return redirect()->route('admin.account.dictionary.index', $account);
|
||||
return redirect()->route('admin.account.show', $account);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,10 +43,6 @@ class ContactsListController extends Controller
|
|||
]);
|
||||
}
|
||||
|
||||
public function show(int $id)
|
||||
{
|
||||
}
|
||||
|
||||
public function create(Request $request)
|
||||
{
|
||||
return view('admin.contacts_list.create_edit', [
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ class ExternalAccountController extends Controller
|
|||
|
||||
$externalAccount->save();
|
||||
|
||||
return redirect()->route('admin.account.external.show', $account->id);
|
||||
return redirect()->route('admin.account.show', $account->id);
|
||||
}
|
||||
|
||||
public function delete(int $accountId)
|
||||
|
|
@ -93,6 +93,6 @@ class ExternalAccountController extends Controller
|
|||
$account = Account::findOrFail($accountId);
|
||||
$account->external->delete();
|
||||
|
||||
return redirect()->route('admin.account.external.show', $account->id);
|
||||
return redirect()->route('admin.account.show', $account->id);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Account;
|
||||
use App\ResetPasswordEmailToken;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Mail\Provisioning;
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class ProvisioningEmailController extends Controller
|
||||
{
|
||||
public function create(int $accountId)
|
||||
{
|
||||
$account = Account::findOrFail($accountId);
|
||||
|
||||
return view('admin.account.provisioning_email.create', [
|
||||
'account' => $account
|
||||
]);
|
||||
}
|
||||
|
||||
public function send(int $accountId)
|
||||
{
|
||||
$account = Account::findOrFail($accountId);
|
||||
$account->provision();
|
||||
|
||||
Mail::to($account)->send(new Provisioning($account));
|
||||
|
||||
Log::channel('events')->info('Web Admin: Sending provisioning email', ['id' => $account->identifier]);
|
||||
|
||||
return redirect()->route('admin.account.show', $account);
|
||||
}
|
||||
}
|
||||
|
|
@ -6,6 +6,7 @@ use App\Account;
|
|||
use App\ResetPasswordEmailToken;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Mail\ResetPassword;
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
|
|
|
|||
41
flexiapi/app/Mail/Provisioning.php
Normal file
41
flexiapi/app/Mail/Provisioning.php
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
namespace App\Mail;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
use App\Account;
|
||||
|
||||
class Provisioning extends Mailable
|
||||
{
|
||||
use Queueable, SerializesModels;
|
||||
|
||||
private $account;
|
||||
|
||||
public function __construct(Account $account)
|
||||
{
|
||||
$this->account = $account;
|
||||
}
|
||||
|
||||
public function build()
|
||||
{
|
||||
return $this->view(view()->exists('mails.provisioning_custom')
|
||||
? 'mails.provisioning_custom'
|
||||
: 'mails.provisioning')
|
||||
->text(view()->exists('mails.provisioning_text_custom')
|
||||
? 'mails.provisioning_text_custom'
|
||||
: 'mails.provisioning_text')
|
||||
->with([
|
||||
'provisioning_link' => route('provisioning.provision', [
|
||||
'provisioning_token' => $this->account->provisioning_token,
|
||||
'reset_password' => true
|
||||
]),
|
||||
'provisioning_qrcode' => route('provisioning.qrcode', [
|
||||
'provisioning_token' => $this->account->provisioning_token,
|
||||
'reset_password' => true
|
||||
])
|
||||
]);
|
||||
}
|
||||
}
|
||||
63
flexiapi/composer.lock
generated
63
flexiapi/composer.lock
generated
|
|
@ -582,26 +582,29 @@
|
|||
},
|
||||
{
|
||||
"name": "doctrine/deprecations",
|
||||
"version": "1.1.4",
|
||||
"version": "1.1.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/doctrine/deprecations.git",
|
||||
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9"
|
||||
"reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9",
|
||||
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9",
|
||||
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
|
||||
"reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0"
|
||||
},
|
||||
"conflict": {
|
||||
"phpunit/phpunit": "<=7.5 || >=13"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/coding-standard": "^9 || ^12",
|
||||
"phpstan/phpstan": "1.4.10 || 2.0.3",
|
||||
"doctrine/coding-standard": "^9 || ^12 || ^13",
|
||||
"phpstan/phpstan": "1.4.10 || 2.1.11",
|
||||
"phpstan/phpstan-phpunit": "^1.0 || ^2",
|
||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
|
||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
|
||||
"psr/log": "^1 || ^2 || ^3"
|
||||
},
|
||||
"suggest": {
|
||||
|
|
@ -621,9 +624,9 @@
|
|||
"homepage": "https://www.doctrine-project.org/",
|
||||
"support": {
|
||||
"issues": "https://github.com/doctrine/deprecations/issues",
|
||||
"source": "https://github.com/doctrine/deprecations/tree/1.1.4"
|
||||
"source": "https://github.com/doctrine/deprecations/tree/1.1.5"
|
||||
},
|
||||
"time": "2024-12-07T21:18:45+00:00"
|
||||
"time": "2025-04-07T20:06:18+00:00"
|
||||
},
|
||||
{
|
||||
"name": "doctrine/event-manager",
|
||||
|
|
@ -1321,16 +1324,16 @@
|
|||
},
|
||||
{
|
||||
"name": "giggsey/libphonenumber-for-php-lite",
|
||||
"version": "9.0.2",
|
||||
"version": "9.0.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/giggsey/libphonenumber-for-php-lite.git",
|
||||
"reference": "124cd8095f49df71a52b920f9e50d63e5efd6a14"
|
||||
"reference": "e4f4c5834d35773bf9d5e72e3e764cfe4e301a8c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/giggsey/libphonenumber-for-php-lite/zipball/124cd8095f49df71a52b920f9e50d63e5efd6a14",
|
||||
"reference": "124cd8095f49df71a52b920f9e50d63e5efd6a14",
|
||||
"url": "https://api.github.com/repos/giggsey/libphonenumber-for-php-lite/zipball/e4f4c5834d35773bf9d5e72e3e764cfe4e301a8c",
|
||||
"reference": "e4f4c5834d35773bf9d5e72e3e764cfe4e301a8c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -1395,7 +1398,7 @@
|
|||
"issues": "https://github.com/giggsey/libphonenumber-for-php-lite/issues",
|
||||
"source": "https://github.com/giggsey/libphonenumber-for-php-lite"
|
||||
},
|
||||
"time": "2025-03-28T09:51:47+00:00"
|
||||
"time": "2025-04-11T07:36:14+00:00"
|
||||
},
|
||||
{
|
||||
"name": "graham-campbell/result-type",
|
||||
|
|
@ -2402,16 +2405,16 @@
|
|||
},
|
||||
{
|
||||
"name": "league/commonmark",
|
||||
"version": "2.6.1",
|
||||
"version": "2.6.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/thephpleague/commonmark.git",
|
||||
"reference": "d990688c91cedfb69753ffc2512727ec646df2ad"
|
||||
"reference": "06c3b0bf2540338094575612f4a1778d0d2d5e94"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad",
|
||||
"reference": "d990688c91cedfb69753ffc2512727ec646df2ad",
|
||||
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/06c3b0bf2540338094575612f4a1778d0d2d5e94",
|
||||
"reference": "06c3b0bf2540338094575612f4a1778d0d2d5e94",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -2505,7 +2508,7 @@
|
|||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-12-29T14:10:59+00:00"
|
||||
"time": "2025-04-18T21:09:27+00:00"
|
||||
},
|
||||
{
|
||||
"name": "league/config",
|
||||
|
|
@ -5726,16 +5729,16 @@
|
|||
},
|
||||
{
|
||||
"name": "sabre/vobject",
|
||||
"version": "4.5.6",
|
||||
"version": "4.5.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sabre-io/vobject.git",
|
||||
"reference": "900266bb3bd448a9f7f41f82344ad0aba237cb27"
|
||||
"reference": "ff22611a53782e90c97be0d0bc4a5f98a5c0a12c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sabre-io/vobject/zipball/900266bb3bd448a9f7f41f82344ad0aba237cb27",
|
||||
"reference": "900266bb3bd448a9f7f41f82344ad0aba237cb27",
|
||||
"url": "https://api.github.com/repos/sabre-io/vobject/zipball/ff22611a53782e90c97be0d0bc4a5f98a5c0a12c",
|
||||
"reference": "ff22611a53782e90c97be0d0bc4a5f98a5c0a12c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -5745,7 +5748,7 @@
|
|||
},
|
||||
"require-dev": {
|
||||
"friendsofphp/php-cs-fixer": "~2.17.1",
|
||||
"phpstan/phpstan": "^0.12 || ^1.11",
|
||||
"phpstan/phpstan": "^0.12 || ^1.12 || ^2.0",
|
||||
"phpunit/php-invoker": "^2.0 || ^3.1",
|
||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.6"
|
||||
},
|
||||
|
|
@ -5826,7 +5829,7 @@
|
|||
"issues": "https://github.com/sabre-io/vobject/issues",
|
||||
"source": "https://github.com/fruux/sabre-vobject"
|
||||
},
|
||||
"time": "2024-10-14T11:53:54+00:00"
|
||||
"time": "2025-04-17T09:22:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sabre/xml",
|
||||
|
|
@ -9888,16 +9891,16 @@
|
|||
},
|
||||
{
|
||||
"name": "squizlabs/php_codesniffer",
|
||||
"version": "3.12.0",
|
||||
"version": "3.12.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
|
||||
"reference": "2d1b63db139c3c6ea0c927698e5160f8b3b8d630"
|
||||
"reference": "6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/2d1b63db139c3c6ea0c927698e5160f8b3b8d630",
|
||||
"reference": "2d1b63db139c3c6ea0c927698e5160f8b3b8d630",
|
||||
"url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa",
|
||||
"reference": "6d4cf6032d4b718f168c90a96e36c7d0eaacb2aa",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -9968,7 +9971,7 @@
|
|||
"type": "thanks_dev"
|
||||
}
|
||||
],
|
||||
"time": "2025-03-18T05:04:51+00:00"
|
||||
"time": "2025-04-13T04:10:18+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/config",
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
"Activity expiration delay": "Délais d'expiration après activité",
|
||||
"Add contact": "Ajout d'un contact",
|
||||
"Add contacts": "Ajouter des contacts",
|
||||
"Add existing contacts lists to display them in the user applications.": "Ajouter des listes de contacts existantes afin qu’elles soient visibles dans les applications de l’utilisateur.",
|
||||
"Add": "Ajouter",
|
||||
"Admin": "Administrateur",
|
||||
"Administration": "Administration",
|
||||
|
|
@ -23,6 +24,7 @@
|
|||
"Allow a custom CSS theme": "Autoriser un thème CSS personnalisé",
|
||||
"Allow client settings to be overwritten by the provisioning ones": "Écraser la configuration client avec celle du provisionnement",
|
||||
"An email will be sent to :email with a unique link allowing the user to reset its password.": "Un email sera envoyé à :email avec un lien unique l'invitant à réinitialiser son mot de passe",
|
||||
"An email will be sent to :email with a QR Code and provisioning link.": "Un email sera envoyé à :email contenant un QR Code et un lien de provisionnement.",
|
||||
"An email will be sent to this email when someone join the newsletter": "Un email sera envoyé à cette addresse quand quelqu'un rejoint la liste de diffusion",
|
||||
"App Configuration": "Configuration de l'App",
|
||||
"Api Keys": "Clefs d'API",
|
||||
|
|
@ -154,6 +156,7 @@
|
|||
"Select a domain": "Sélectionner un domaine",
|
||||
"Select a file": "Choisir un fichier",
|
||||
"Send an email to the user to reset the password": "Envoyer un email à l'utilisateur pour réinitialiser son mot de passe",
|
||||
"Send an email to the user with provisioning information": "Envoyer un email à l'utilisateur avec les informations de provisionnement",
|
||||
"Send": "Envoyer",
|
||||
"Settings": "Paramètres",
|
||||
"Sip Adress": "Adresse SIP",
|
||||
|
|
|
|||
13
flexiapi/public/css/form.css
vendored
13
flexiapi/public/css/form.css
vendored
|
|
@ -31,6 +31,7 @@ p .btn {
|
|||
.oppose {
|
||||
float: right;
|
||||
text-align: right;
|
||||
margin-left: 1rem;
|
||||
}
|
||||
|
||||
p .btn.oppose {
|
||||
|
|
@ -56,33 +57,33 @@ p .btn.oppose {
|
|||
border-color: var(--main-7);
|
||||
}
|
||||
|
||||
.btn.btn-secondary {
|
||||
.btn.secondary {
|
||||
background-color: transparent;
|
||||
color: var(--main-5);
|
||||
}
|
||||
|
||||
.btn.btn-secondary:hover {
|
||||
.btn.secondary:hover {
|
||||
background-color: var(--main-1);
|
||||
}
|
||||
|
||||
.btn.btn-secondary:active {
|
||||
.btn.secondary:active {
|
||||
background-color: var(--main-5);
|
||||
border-color: var(--main-5);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn.btn-tertiary {
|
||||
.btn.tertiary {
|
||||
background-color: var(--main-1);
|
||||
border-color: var(--main-1);
|
||||
color: var(--main-5);
|
||||
}
|
||||
|
||||
.btn.btn-tertiary:hover {
|
||||
.btn.tertiary:hover {
|
||||
background-color: var(--main-2);
|
||||
border-color: var(--main-2);
|
||||
}
|
||||
|
||||
.btn.btn-tertiary:active {
|
||||
.btn.tertiary:active {
|
||||
background-color: var(--main-3);
|
||||
border-color: var(--main-3);
|
||||
}
|
||||
|
|
|
|||
51
flexiapi/public/css/style.css
vendored
51
flexiapi/public/css/style.css
vendored
|
|
@ -137,11 +137,11 @@ p {
|
|||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
p b {
|
||||
p > b {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
p i {
|
||||
p > i {
|
||||
vertical-align: middle;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
|
|
@ -369,7 +369,11 @@ form section {
|
|||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 1rem;
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.grid .card {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.grid.third {
|
||||
|
|
@ -396,6 +400,10 @@ form section {
|
|||
grid-column: span 3;
|
||||
}
|
||||
|
||||
.grid.third .mid {
|
||||
grid-column: span 2;
|
||||
}
|
||||
|
||||
content section header {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
|
|
@ -433,8 +441,7 @@ content>nav {
|
|||
background-color: var(--main-5);
|
||||
width: 20rem;
|
||||
margin-left: 0;
|
||||
padding: 1.5rem;
|
||||
padding-left: 1rem;
|
||||
padding: 5rem 1.5rem;
|
||||
padding-bottom: 10rem;
|
||||
border-radius: 0 3rem 0 0;
|
||||
background-size: auto 10rem;
|
||||
|
|
@ -564,7 +571,7 @@ h3 {
|
|||
border-bottom: 1px solid var(--grey-2);
|
||||
}
|
||||
|
||||
h3 i {
|
||||
h3 > i {
|
||||
line-height: 2rem;
|
||||
margin-right: 1rem;
|
||||
vertical-align: middle;
|
||||
|
|
@ -651,6 +658,10 @@ table {
|
|||
width: 100%;
|
||||
}
|
||||
|
||||
h3 + table {
|
||||
margin-top: -0.5rem;
|
||||
}
|
||||
|
||||
table tr td a {
|
||||
display: inline-block;
|
||||
}
|
||||
|
|
@ -660,8 +671,29 @@ table tr th {
|
|||
width: 20rem;
|
||||
padding: 1rem;
|
||||
font-size: 1.5rem;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table tr td form {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.card table tr td:first-child,
|
||||
.card table tr th:first-child {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
table tr:not(.empty) th.actions,
|
||||
table tr:not(.empty) td.actions {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.card table tr:not(.empty) th.actions,
|
||||
.card table tr:not(.empty) td.actions {
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
|
||||
table tr th {
|
||||
padding: 0 1rem;
|
||||
line-height: 4rem;
|
||||
|
|
@ -672,7 +704,10 @@ table tr th {
|
|||
|
||||
table tr td.line,
|
||||
table tr th.line {
|
||||
max-width: 100%;
|
||||
max-width: 0;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
table tr th,
|
||||
|
|
@ -846,7 +881,7 @@ select.list_toggle {
|
|||
}
|
||||
|
||||
.disabled {
|
||||
opacity: 0.5;
|
||||
opacity: 0.3;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
<header>
|
||||
<h1><i class="ph">trash</i> Delete my account</h1>
|
||||
|
||||
<a href="{{ route('account.dashboard') }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('account.dashboard') }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
<input form="delete" class="btn" type="submit" value="{{ __('Delete') }}">
|
||||
</header>
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
<div class="large" style="margin-top: 2rem;">
|
||||
<p>
|
||||
You didn't receive the code?
|
||||
<a class="btn btn-secondary" href="{{ route('account.email.change') }}">Resend a code</a>
|
||||
<a class="btn secondary" href="{{ route('account.email.change') }}">Resend a code</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
<p>
|
||||
{{ __('No account yet?') }}
|
||||
<a class="btn btn-secondary" href="{{ route('account.register') }}">{{ __('Register') }}</a>
|
||||
<a class="btn secondary" href="{{ route('account.register') }}">{{ __('Register') }}</a>
|
||||
</p>
|
||||
@endif
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
<h1><i class="ph">lock</i> {{ __('Create') }}</h1>
|
||||
@endif
|
||||
|
||||
<a href="{{ route('account.dashboard') }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('account.dashboard') }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
<input form="password_update" class="btn" type="submit" value="{{ __('Edit') }}">
|
||||
</header>
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
<div class="large" style="margin-top: 2rem;">
|
||||
<p>
|
||||
{{ __("You didn't receive the code?"") }}
|
||||
<a class="btn btn-secondary" href="{{ route('account.phone.change') }}">{{ __('Resend') }}</a>
|
||||
<a class="btn secondary" href="{{ route('account.phone.change') }}">{{ __('Resend') }}</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<h1><i class="ph">user-circle</i> {{ __('Register') }}</h1>
|
||||
<p style="margin-bottom: 2rem;">
|
||||
{{ __('You already have an account?') }}
|
||||
<a class="btn btn-secondary" href="{{ route('account.login') }}">{{ __('Login') }}</a>
|
||||
<a class="btn secondary" href="{{ route('account.login') }}">{{ __('Login') }}</a>
|
||||
</p>
|
||||
@include('parts.tabs.register')
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<h1><i class="ph">user-circle</i> {{ __('Register') }}</h1>
|
||||
<p style="margin-bottom: 2rem;">
|
||||
{{ __('You already have an account?') }}
|
||||
<a class="btn btn-secondary" href="{{ route('account.login') }}">{{ __('Login') }}</a>
|
||||
<a class="btn secondary" href="{{ route('account.login') }}">{{ __('Login') }}</a>
|
||||
</p>
|
||||
@include('parts.tabs.register')
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">
|
||||
{{ __('Types') }}
|
||||
</li>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">
|
||||
{{ __('Actions') }}
|
||||
</li>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active">
|
||||
{{ __('Actions') }}
|
||||
</li>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">Activity</li>
|
||||
@endsection
|
||||
|
||||
|
|
@ -14,220 +14,233 @@
|
|||
|
||||
@include('admin.account.parts.tabs')
|
||||
|
||||
<div class="grid">
|
||||
@if ($account->apiKey)
|
||||
<div class="card large">
|
||||
<h3>Api Key</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ __('Code') }}</th>
|
||||
<th>{{ __('Created') }}</th>
|
||||
<th>{{ __('Used on') }}</th>
|
||||
<th>IP</th>
|
||||
<th>{{ __('Requests') }}</th>
|
||||
<th>Key</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $account->apiKey->key }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $account->apiKey->created_at }}
|
||||
<small>
|
||||
{{ __('Used on') }}: {{ $account->apiKey->last_used_at }}
|
||||
</small>
|
||||
</td>
|
||||
<td>
|
||||
{{ $account->apiKey->last_used_at }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $account->apiKey->ip ?? '*' }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $account->apiKey->requests }}
|
||||
{{ $account->apiKey->key }}
|
||||
<small>
|
||||
IP: {{ $account->apiKey->ip ?? '*' }} |
|
||||
{{ __('Requests') }}: {{ $account->apiKey->requests }}
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if ($account->accountCreationToken)
|
||||
<div class="card large">
|
||||
<h3>Account Creation Token</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ __('Code') }}</th>
|
||||
<th>{{ __('Created') }}</th>
|
||||
<th>{{ __('Used on') }}</th>
|
||||
<th>IP</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr @if ($account->accountCreationToken->offed()) class="disabled crossed" @endif>
|
||||
<td>****</td>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $account->accountCreationToken->created_at }}
|
||||
<small>{{ $account->accountCreationToken->created_at ?? '-' }}</small>
|
||||
</td>
|
||||
<td>
|
||||
{{ $account->accountCreationToken->created_at != $account->accountCreationToken->updated_at ? $account->accountCreationToken->updated_at : '-' }}
|
||||
</td>
|
||||
<td title="{{ $account->accountCreationToken->user_agent }}">
|
||||
{{ $account->accountCreationToken->ip ? $account->accountCreationToken->ip : '-' }}
|
||||
<small title="{{ $account->accountCreationToken->user_agent }}">
|
||||
{{ \Illuminate\Support\Str::limit($account->accountCreationToken->user_agent, 20, $end='...') }}
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if ($account->recoveryCodes->isNotEmpty())
|
||||
<div class="card">
|
||||
<h3>Recovery Codes</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ __('Code') }}</th>
|
||||
<th>{{ __('Created') }}</th>
|
||||
<th>{{ __('Used on') }}</th>
|
||||
<th>IP</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($account->recoveryCodes as $key => $recoveryCode)
|
||||
<tr @if ($recoveryCode->offed() || $key > 0) class="disabled crossed" @endif>
|
||||
<td>****</td>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $recoveryCode->created_at }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $recoveryCode->created_at != $recoveryCode->updated_at ? $recoveryCode->updated_at : '-' }}
|
||||
</td>
|
||||
<td title="{{ $recoveryCode->user_agent }}">
|
||||
{{ $recoveryCode->ip ? $recoveryCode->ip : '-' }}
|
||||
<small title="{{ $recoveryCode->user_agent }}">
|
||||
IP: {{ $recoveryCode->ip ?? '-' }} |
|
||||
{{ \Illuminate\Support\Str::limit($recoveryCode->user_agent, 20, $end='...') }}
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if ($account->phoneChangeCodes->isNotEmpty())
|
||||
<div class="card">
|
||||
<h3>Phone Change requests</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ __('Phone number') }}</th>
|
||||
<th>{{ __('Code') }}</th>
|
||||
<th>{{ __('Created') }}</th>
|
||||
<th>{{ __('Phone number') }}</th>
|
||||
<th>{{ __('Used on') }}</th>
|
||||
<th>IP</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($account->phoneChangeCodes as $key => $phoneChangeCode)
|
||||
<tr @if ($phoneChangeCode->offed() || $key > 0) class="disabled crossed" @endif>
|
||||
<td>{{ $phoneChangeCode->phone }}</td>
|
||||
<td>{{ $phoneChangeCode->code ?? '-' }}</td>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $phoneChangeCode->created_at }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $phoneChangeCode->created_at != $phoneChangeCode->updated_at ? $phoneChangeCode->updated_at : '-' }}
|
||||
{{ $phoneChangeCode->phone }}
|
||||
<small>{{ __('Code') }}: {{ $phoneChangeCode->code ?? '-' }}</small>
|
||||
</td>
|
||||
<td title="{{ $phoneChangeCode->user_agent }}">
|
||||
{{ $phoneChangeCode->ip ? $phoneChangeCode->ip : '-' }}
|
||||
{{ $phoneChangeCode->created_at != $phoneChangeCode->updated_at ? $phoneChangeCode->updated_at : '-' }}
|
||||
<small>
|
||||
IP: {{ $phoneChangeCode->ip ?? '-' }} |
|
||||
{{ \Illuminate\Support\Str::limit($phoneChangeCode->user_agent, 20, $end='...') }}
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if ($account->emailChangeCodes->isNotEmpty())
|
||||
<div class="card">
|
||||
<h3>Email Change requests</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ __('Email') }}</th>
|
||||
<th>{{ __('Code') }}</th>
|
||||
<th>{{ __('Created') }}</th>
|
||||
<th>{{ __('Email') }}</th>
|
||||
<th>{{ __('Used on') }}</th>
|
||||
<th>IP</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($account->emailChangeCodes as $key => $emailChangeCode)
|
||||
<tr @if ($emailChangeCode->offed() || $key > 0) class="disabled crossed" @endif>
|
||||
<td>{{ $emailChangeCode->email }}</td>
|
||||
<td>{{ $emailChangeCode->code ?? '-' }}</td>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $emailChangeCode->created_at }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $emailChangeCode->created_at != $emailChangeCode->updated_at ? $emailChangeCode->updated_at : '-' }}
|
||||
{{ $emailChangeCode->email }}
|
||||
<small>{{ __('Code') }}: {{ $emailChangeCode->code ?? '-' }}</small>
|
||||
</td>
|
||||
<td title="{{ $emailChangeCode->user_agent }}">
|
||||
{{ $emailChangeCode->ip ? $emailChangeCode->ip : '-' }}
|
||||
{{ $emailChangeCode->created_at != $emailChangeCode->updated_at ? $emailChangeCode->updated_at : '-' }}
|
||||
<small>
|
||||
IP: {{ $emailChangeCode->ip ?? '-' }} |
|
||||
{{ \Illuminate\Support\Str::limit($emailChangeCode->user_agent, 20, $end='...') }}
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if ($account->provisioningTokens->isNotEmpty())
|
||||
<div class="card">
|
||||
<h3>{{ __('Provisioning tokens') }}</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Token</th>
|
||||
<th>{{ __('Created') }}</th>
|
||||
<th>{{ __('Used on') }}</th>
|
||||
<th>IP</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($account->provisioningTokens as $key => $provisioningToken)
|
||||
<tr @if ($provisioningToken->offed() || $key > 0) class="disabled crossed" @endif>
|
||||
<td>{{ $provisioningToken->token }}</td>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $provisioningToken->created_at }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $provisioningToken->consumed() ? $provisioningToken->updated_at : '-' }}
|
||||
</td>
|
||||
<td title="{{ $provisioningToken->user_agent }}">
|
||||
{{ $provisioningToken->ip ? $provisioningToken->ip : '-' }}
|
||||
<small title="{{ $provisioningToken->user_agent }}">
|
||||
IP: {{ $provisioningToken->ip ?? '-' }} |
|
||||
{{ \Illuminate\Support\Str::limit($provisioningToken->user_agent, 20, $end='...') }}
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if ($account->resetPasswordEmailTokens->isNotEmpty())
|
||||
<div class="card">
|
||||
<h3>{{ __('Reset password emails') }}</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Token</th>
|
||||
<th>{{ __('Created') }}</th>
|
||||
<th>{{ __('Used on') }}</th>
|
||||
<th>{{ __('Email') }}</th>
|
||||
<th>{{ __('Used on') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($account->resetPasswordEmailTokens as $key => $resetPasswordEmailToken)
|
||||
<tr @if ($resetPasswordEmailToken->offed() || $key > 0) class="disabled crossed" @endif>
|
||||
<td>{{ $resetPasswordEmailToken->token }}</td>
|
||||
<tr>
|
||||
<td>
|
||||
{{ $resetPasswordEmailToken->created_at }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $resetPasswordEmailToken->consumed() ? $resetPasswordEmailToken->updated_at : '-' }}
|
||||
{{ $resetPasswordEmailToken->email }}
|
||||
<small>
|
||||
{{ $resetPasswordEmailToken->token }}
|
||||
</small>
|
||||
</td>
|
||||
<td>
|
||||
{{ $resetPasswordEmailToken->email }}
|
||||
{{ $resetPasswordEmailToken->consumed() ? $resetPasswordEmailToken->updated_at : '-' }}
|
||||
<small title="{{ $resetPasswordEmailToken->user_agent }}">
|
||||
IP: {{ $resetPasswordEmailToken->ip ?? '-' }} |
|
||||
{{ $resetPasswordEmailToken->user_agent ? \Illuminate\Support\Str::limit($resetPasswordEmailToken->user_agent, 20, $end='...') : '-' }}
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
|
|
@ -2,14 +2,14 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Add contact') }}</li>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<header>
|
||||
<h1><i class="ph">user-plus</i> {{ __('Add contact') }}</h1>
|
||||
<a href="{{ route('admin.account.edit', $account->id) }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.account.edit', $account->id) }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
<input form="add_contact" class="btn" type="submit" value="Add">
|
||||
</header>
|
||||
<form id="add_contact" method="POST" action="{{ route('admin.account.contact.store', $account->id) }}" accept-charset="UTF-8">
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active">
|
||||
{{ __('Contacts') }}
|
||||
</li>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,97 @@
|
|||
@extends('layouts.main')
|
||||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Contacts') }}</li>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<header>
|
||||
<h1><i class="ph">users</i> {{ $account->identifier }}</h1>
|
||||
</header>
|
||||
@include('admin.account.parts.tabs')
|
||||
|
||||
<a class="btn small oppose" href="{{ route('admin.account.contact.create', $account) }}">
|
||||
<i class="ph">plus</i> {{ __('Add') }}
|
||||
</a>
|
||||
<h3>
|
||||
{{ __('Contacts') }}
|
||||
</h3>
|
||||
<table>
|
||||
<tbody>
|
||||
@if ($account->contacts->isEmpty())
|
||||
<tr class="empty">
|
||||
<td colspan="2">{{ __('Empty') }}</td>
|
||||
</tr>
|
||||
@else
|
||||
@foreach ($account->contacts as $contact)
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ route('admin.account.edit', $account) }}">{{ $contact->identifier }}</a>
|
||||
</td>
|
||||
<td class="actions">
|
||||
<a type="button" class="btn small tertiary" href="{{ route('admin.account.contact.delete', [$account, $contact->id]) }}">
|
||||
<i class="ph">trash</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
@endif
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<hr />
|
||||
|
||||
<h3 id="contacts_lists">{{ __('Contacts Lists') }}</h3>
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
@foreach ($account->contactsLists as $contactsList)
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ route('admin.contacts_lists.edit', ['contacts_list_id' => $contactsList->id]) }}">{{ $contactsList->title }}</a>
|
||||
<small>{{ $contactsList->contacts_count }} {{ __('Contacts') }}</small>
|
||||
</td>
|
||||
<td class="actions">
|
||||
<a type="button" class="btn small tertiary" href="{{ route('admin.account.contacts_lists.detach', ['account_id' => $account->id, 'contacts_list_id' => $contactsList->id]) }}">
|
||||
<i class="ph">trash</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@if ($contacts_lists->isNotEmpty())
|
||||
<div class="card">
|
||||
<div class="grid">
|
||||
<div>
|
||||
<h4><i class="ph">plus</i> {{ __('Add') }}</h4>
|
||||
<p>{{ __('Add existing contacts lists to display them in the user applications.') }}</p>
|
||||
</div>
|
||||
<div>
|
||||
<form method="POST" action="{{ route('admin.account.contacts_lists.attach', $account->id) }}"
|
||||
accept-charset="UTF-8">
|
||||
@csrf
|
||||
@method('post')
|
||||
|
||||
<div class="select">
|
||||
<select name="contacts_list_id" onchange="this.form.submit()">
|
||||
<option>
|
||||
{{ __('Contacts Lists') }}
|
||||
</option>
|
||||
@foreach ($contacts_lists as $contacts_list)
|
||||
<option value="{{ $contacts_list->id }}">
|
||||
{{ $contacts_list->title }}
|
||||
</option>
|
||||
@endforeach
|
||||
<label></label>
|
||||
</select>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
@endsection
|
||||
|
|
@ -3,7 +3,8 @@
|
|||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@if ($account->id)
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Edit') }}</li>
|
||||
@else
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Create') }}</li>
|
||||
@endif
|
||||
|
|
@ -13,10 +14,6 @@
|
|||
@if ($account->id)
|
||||
<header>
|
||||
<h1><i class="ph">users</i> {{ $account->identifier }}</h1>
|
||||
<a class="btn btn-secondary oppose" href="{{ route('admin.account.delete', $account->id) }}">
|
||||
<i class="ph">trash</i>
|
||||
{{ __('Delete') }}
|
||||
</a>
|
||||
</header>
|
||||
@if ($account->updated_at)
|
||||
<p title="{{ $account->updated_at }}">{{ __('Updated on') }} {{ $account->updated_at->format('d/m/Y') }}
|
||||
|
|
@ -25,7 +22,7 @@
|
|||
@else
|
||||
<header>
|
||||
<h1><i class="ph">users</i> {{ __('Create') }}</h1>
|
||||
<a href="{{ route('admin.account.index') }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.account.index') }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
</header>
|
||||
@endif
|
||||
|
||||
|
|
@ -80,14 +77,6 @@
|
|||
value="@if($account->id){{ $account->email }}@else{{ old('email') }}@endif">
|
||||
<label for="email">{{ __('Email') }}</label>
|
||||
@include('parts.errors', ['name' => __('email')])
|
||||
|
||||
@if (!empty($account->email))
|
||||
<p>
|
||||
<a href="{{ route('admin.account.reset_password_email.create', $account) }}">
|
||||
{{ __('Send an email to the user to reset the password') }}
|
||||
</a>
|
||||
</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div>
|
||||
|
|
@ -130,130 +119,4 @@
|
|||
@endif
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<hr class="large">
|
||||
|
||||
@if ($account->id)
|
||||
<h2 class="large">{{ __('Contacts') }}</h2>
|
||||
|
||||
@foreach ($account->contacts as $contact)
|
||||
<p class="chip">
|
||||
<a href="{{ route('admin.account.edit', $account) }}">{{ $contact->identifier }}</a>
|
||||
<a href="{{ route('admin.account.contact.delete', [$account, $contact->id]) }}">
|
||||
<i class="ph">x</i>
|
||||
</a>
|
||||
</p>
|
||||
@endforeach
|
||||
|
||||
<a class="btn btn-tertiary" href="{{ route('admin.account.contact.create', $account) }}">{{ __('Add') }}</a>
|
||||
|
||||
<h3 id="contacts_lists">{{ __('Contacts Lists') }}</h3>
|
||||
|
||||
@if ($contacts_lists->isNotEmpty())
|
||||
<form method="POST" action="{{ route('admin.account.contacts_lists.attach', $account->id) }}"
|
||||
accept-charset="UTF-8">
|
||||
@csrf
|
||||
@method('post')
|
||||
|
||||
<div class="select">
|
||||
<select name="contacts_list_id" onchange="this.form.submit()">
|
||||
<option>
|
||||
{{ __('Contacts Lists') }}
|
||||
</option>
|
||||
@foreach ($contacts_lists as $contacts_list)
|
||||
<option value="{{ $contacts_list->id }}">
|
||||
{{ $contacts_list->title }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
<label for="contacts_list_id">{{ __('Add') }}</label>
|
||||
</div>
|
||||
</form>
|
||||
<br />
|
||||
@endif
|
||||
|
||||
@foreach ($account->contactsLists as $contactsList)
|
||||
<p class="chip">
|
||||
<a
|
||||
href="{{ route('admin.contacts_lists.edit', ['contacts_list_id' => $contactsList->id]) }}">{{ $contactsList->title }}</a>
|
||||
<a
|
||||
href="{{ route('admin.account.contacts_lists.detach', ['account_id' => $account->id, 'contacts_list_id' => $contactsList->id]) }}">
|
||||
<i class="ph">x</i>
|
||||
</a>
|
||||
</p>
|
||||
@endforeach
|
||||
|
||||
<br />
|
||||
|
||||
<h2 class="large" id="provisioning">{{ __('Provisioning') }}</h2>
|
||||
|
||||
@if ($account->provisioning_token)
|
||||
<div>
|
||||
<img style="max-width: 15rem;" src="{{ route('provisioning.qrcode', $account->provisioning_token) }}">
|
||||
</div>
|
||||
|
||||
<form class="inline">
|
||||
<div>
|
||||
<input type="text" style="min-width: 40rem;" readonly
|
||||
value="{{ route('provisioning.provision', $account->provisioning_token) }}">
|
||||
<small>{{ __('The link can only be visited once') }}</small>
|
||||
</div>
|
||||
<div>
|
||||
<a class="btn" href="{{ route('admin.account.provision', $account->id) }}">{{ __('Renew') }}</a>
|
||||
</div>
|
||||
</form>
|
||||
@else
|
||||
<a class="btn btn-light" href="{{ route('admin.account.provision', $account->id) }}">{{ __('Create') }}</a>
|
||||
@endif
|
||||
|
||||
@if (space()?->intercom_features))
|
||||
<h2>{{ __('Actions') }}</h2>
|
||||
|
||||
@if ($account->dtmf_protocol)
|
||||
<table>
|
||||
<tbody>
|
||||
@foreach ($account->actions as $action)
|
||||
<tr>
|
||||
<th scope="row">{{ $action->key }}</th>
|
||||
<td>{{ $action->code }}</td>
|
||||
<td>
|
||||
<a class="btn"
|
||||
href="{{ route('admin.account.action.edit', [$account, $action->id]) }}">{{ __('Edit') }}</a>
|
||||
<a class="btn"
|
||||
href="{{ route('admin.account.action.delete', [$account, $action->id]) }}">{{ __('Delete') }}</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<a class="btn" href="{{ route('admin.account.action.create', $account) }}">{{ __('Add') }}</a>
|
||||
@else
|
||||
<p>To manage actions, you must configure the DTMF protocol in the account settings.</p>
|
||||
@endif
|
||||
|
||||
<h2>{{ __('Types') }}</h2>
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
@foreach ($account->types as $type)
|
||||
<tr>
|
||||
<th scope="row">{{ $type->key }}</th>
|
||||
<td>
|
||||
<form method="POST"
|
||||
action="{{ route('admin.account.account_type.destroy', [$account, $type->id]) }}"
|
||||
accept-charset="UTF-8">
|
||||
@csrf
|
||||
@method('delete')
|
||||
<input class="btn" type="submit" value="{{ __('Delete') }}">
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<a class="btn" href="{{ route('admin.account.account_type.create', $account) }}">{{ __('Add') }}</a>
|
||||
@endif
|
||||
@endif
|
||||
@endsection
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Delete') }}</li>
|
||||
@endsection
|
||||
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
<header>
|
||||
<h1><i class="ph">trash</i> {{ __('Delete') }}</h1>
|
||||
|
||||
<a href="{{ route('admin.account.edit', $account->id) }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.account.show', $account->id) }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
<input form="delete" class="btn" type="submit" value="{{ __('Delete') }}">
|
||||
</header>
|
||||
<form id="delete" method="POST" action="{{ route('admin.account.destroy') }}" accept-charset="UTF-8">
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('admin.account.device.index', $account) }}">Devices</a>
|
||||
</li>
|
||||
|
|
|
|||
|
|
@ -1,46 +0,0 @@
|
|||
@extends('layouts.main')
|
||||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Devices') }}</li>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
|
||||
<header>
|
||||
<h1><i class="ph">users</i> {{ $account->identifier }}</h1>
|
||||
</header>
|
||||
|
||||
@include('admin.account.parts.tabs')
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>User Agent</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if ($devices->isEmpty())
|
||||
<tr class="empty">
|
||||
<td colspan="3">{{ __('Empty') }}</td>
|
||||
</tr>
|
||||
@else
|
||||
@foreach ($devices as $device)
|
||||
<tr>
|
||||
<td>{{ $device->user_agent }}</td>
|
||||
<td>
|
||||
<a type="button"
|
||||
class="btn"
|
||||
href="{{ route('admin.account.device.delete', [$account, $device->uuid]) }}">
|
||||
{{ __('Delete') }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
@endif
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@endsection
|
||||
|
|
@ -2,11 +2,8 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('admin.account.dictionary.index', $account) }}">Dictionary</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active" aria-current="page">@if ($entry->id){{ __('Edit') }}@else{{ __('Create') }}@endif</li>
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Dictionary') }}</li>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
|
|
|
|||
|
|
@ -2,11 +2,8 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('admin.account.dictionary.index', $account) }}">Dictionary</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Delete') }}</li>
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Dictionary') }}</li>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
|
|
|
|||
|
|
@ -1,56 +0,0 @@
|
|||
@extends('layouts.main')
|
||||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Dictionary') }}</li>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
|
||||
<header>
|
||||
<h1><i class="ph">users</i> {{ $account->identifier }}</h1>
|
||||
<a class="btn oppose" href="{{ route('admin.account.dictionary.create', $account) }}">
|
||||
<i class="ph">plus</i>
|
||||
{{ __('Add') }}
|
||||
</a>
|
||||
</header>
|
||||
|
||||
@include('admin.account.parts.tabs')
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ __('Key') }}</th>
|
||||
<th>{{ __('Value') }}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if ($account->dictionaryEntries->isEmpty())
|
||||
<tr class="empty">
|
||||
<td colspan="3">{{ __('Empty') }}</td>
|
||||
</tr>
|
||||
@endif
|
||||
@foreach ($account->dictionaryEntries as $dictionaryEntry)
|
||||
<tr>
|
||||
<td>{{ $dictionaryEntry->key }}</td>
|
||||
<td>{{ $dictionaryEntry->value }}</td>
|
||||
<td>
|
||||
<a type="button"
|
||||
class="btn"
|
||||
href="{{ route('admin.account.dictionary.edit', [$account, $dictionaryEntry->key]) }}">
|
||||
{{ __('Edit') }}
|
||||
</a>
|
||||
<a type="button"
|
||||
class="btn btn-secondary"
|
||||
href="{{ route('admin.account.dictionary.delete', [$account, $dictionaryEntry->key]) }}">
|
||||
{{ __('Delete') }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@endsection
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item"><a href="{{ route('admin.account.external.show', ['account' => $account]) }}">{{ __('External Account') }}</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Delete') }}</li>
|
||||
@endsection
|
||||
|
|
@ -11,7 +11,7 @@
|
|||
<header>
|
||||
<h1><i class="ph">trash</i> {{ __('Delete') }}</h1>
|
||||
|
||||
<a href="{{ route('admin.account.external.show', ['account' => $account]) }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.account.external.show', ['account' => $account]) }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
<input form="delete" class="btn" type="submit" value="{{ __('Delete') }}">
|
||||
</header>
|
||||
<form id="delete" method="POST" action="{{ route('admin.account.external.destroy', $account->id) }}" accept-charset="UTF-8">
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active">{{ __('External Account') }}</li>
|
||||
@endsection
|
||||
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
<header>
|
||||
<h1><i class="ph">user-circle-dashed</i> {{ __('External Account') }}</h1>
|
||||
@if($externalAccount->id)
|
||||
<a class="btn btn-secondary oppose" href="{{ route('admin.account.external.delete', $account->id) }}">
|
||||
<a class="btn secondary oppose" href="{{ route('admin.account.external.delete', $account->id) }}">
|
||||
<i class="ph">trash</i>
|
||||
{{ __('Delete') }}
|
||||
</a>
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@
|
|||
@section('content')
|
||||
<header>
|
||||
<h1><i class="ph">users</i> {{ __('Import') }}</h1>
|
||||
<a href="{{ route('admin.account.index') }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.account.index') }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
|
||||
<a href="#" onclick="history.back()" class="btn btn-secondary">Previous</a>
|
||||
<a href="#" onclick="history.back()" class="btn secondary">Previous</a>
|
||||
<form name="handle" method="POST" action="{{ route('admin.account.import.handle') }}" accept-charset="UTF-8"
|
||||
enctype="multipart/form-data">
|
||||
@csrf
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
@section('content')
|
||||
<header>
|
||||
<h1><i class="ph">users</i> {{ __('Import') }}</h1>
|
||||
<a href="{{ route('admin.account.index') }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.account.index') }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
<input form="import" class="btn" type="submit" value="{{ __('Next') }}">
|
||||
</header>
|
||||
|
||||
|
|
|
|||
|
|
@ -6,12 +6,12 @@
|
|||
@if ($space)
|
||||
<p>{{ $accounts->count()}} / @if ($space->max_accounts > 0){{ $space->max_accounts }} @else <i class="ph">infinity</i>@endif</p>
|
||||
@endif
|
||||
<a class="btn btn-secondary oppose" href="{{ route('admin.account.import.create') }}">
|
||||
<a class="btn secondary oppose" href="{{ route('admin.account.import.create') }}">
|
||||
<i class="ph">download-simple</i>
|
||||
{{ __('Import') }}
|
||||
</a>
|
||||
@if (space()?->intercom_features)
|
||||
<a class="btn btn-secondary" href="{{ route('admin.account.type.index') }}">
|
||||
<a class="btn secondary" href="{{ route('admin.account.type.index') }}">
|
||||
<i class="ph">shapes</i>
|
||||
{{ __('Types') }}
|
||||
</a>
|
||||
|
|
@ -52,7 +52,7 @@
|
|||
<label for="updated_date">{{ __('Updated on') }}</label>
|
||||
</div>
|
||||
<div class="oppose">
|
||||
<a href="{{ route('admin.account.index') }}" type="reset" class="btn btn-tertiary">{{ __('Reset') }}</a>
|
||||
<a href="{{ route('admin.account.index') }}" type="reset" class="btn tertiary">{{ __('Reset') }}</a>
|
||||
<button type="submit" class="btn">{{ __('Search') }}</button>
|
||||
</div>
|
||||
</form>
|
||||
|
|
@ -62,7 +62,7 @@
|
|||
<thead>
|
||||
<tr>
|
||||
@include('parts.column_sort', ['key' => 'username', 'title' => __('Identifier')])
|
||||
<th>{{ __('Contacts Lists') }}</th>
|
||||
<th></th>
|
||||
@include('parts.column_sort', ['key' => 'updated_at', 'title' => __('Updated')])
|
||||
</tr>
|
||||
</thead>
|
||||
|
|
@ -74,29 +74,13 @@
|
|||
@endif
|
||||
@foreach ($accounts as $account)
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ route('admin.account.edit', $account->id) }}">
|
||||
<td style="width: 50%">
|
||||
<a href="{{ route('admin.account.show', $account->id) }}">
|
||||
{{ $account->identifier }}
|
||||
</a>
|
||||
@if ($account->activated)
|
||||
<span class="badge badge-success oppose" title="{{ __('Activated') }}"><i class="ph">check</i></span>
|
||||
@endif
|
||||
@if ($account->superAdmin)
|
||||
<span class="badge badge-error oppose" title="{{ __('Super Admin') }}">Super Adm.</span>
|
||||
@elseif ($account->admin)
|
||||
<span class="badge badge-primary oppose" title="{{ __('Admin') }}">Adm.</span>
|
||||
@endif
|
||||
@if ($account->blocked)
|
||||
<span class="badge badge-error oppose" title="{{ __('Blocked') }}"><i class="ph">prohibit</i></span>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if ($account->contactsLists->isNotEmpty())
|
||||
{{ $account->contactsLists->first()->title }}
|
||||
@if ($account->contactsLists->count() > 1)
|
||||
<span class="badge">+{{ $account->contactsLists->count() - 1 }}</span>
|
||||
@endif
|
||||
@endif
|
||||
@include('admin.account.parts.badges', ['account' => $account])
|
||||
</td>
|
||||
<td>{{ $account->updated_at }}</td>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
@if ($account->activated)
|
||||
<span class="badge badge-success" title="{{ __('Activated') }}"><i class="ph">check</i></span>
|
||||
@endif
|
||||
@if ($account->superAdmin)
|
||||
<span class="badge badge-error" title="{{ __('Super Admin') }}">Super Adm.</span>
|
||||
@elseif ($account->admin)
|
||||
<span class="badge badge-primary" title="{{ __('Admin') }}">Adm.</span>
|
||||
@endif
|
||||
@if ($account->blocked)
|
||||
<span class="badge badge-error" title="{{ __('Blocked') }}"><i class="ph">prohibit</i></span>
|
||||
@endif
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('admin.account.edit', $account->id) }}">{{ $account->identifier }}</a>
|
||||
</li>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('admin.account.show', $account->id) }}">{{ $account->identifier }}</a>
|
||||
</li>
|
||||
|
|
@ -1,11 +1,9 @@
|
|||
@include('parts.tabs', [
|
||||
'items' => [
|
||||
route('admin.account.edit', $account->id) => __('Information'),
|
||||
route('admin.account.external.show', $account->id) => __('External Account'),
|
||||
route('admin.account.statistics.show_call_logs', $account->id) => __('Calls logs'),
|
||||
route('admin.account.device.index', $account->id) => __('Devices'),
|
||||
route('admin.account.statistics.show', $account->id) => __('Statistics'),
|
||||
route('admin.account.activity.index', $account->id) => __('Activity'),
|
||||
route('admin.account.dictionary.index', $account->id) => __('Dictionary'),
|
||||
route('admin.account.show', $account) => __('Information'),
|
||||
route('admin.account.contact.index', $account) => __('Contacts'),
|
||||
route('admin.account.statistics.show_call_logs', $account) => __('Calls logs'),
|
||||
route('admin.account.statistics.show', $account) => __('Statistics'),
|
||||
route('admin.account.activity.index', $account) => __('Activity'),
|
||||
],
|
||||
])
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
@extends('layouts.main')
|
||||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Reset password') }}</li>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
|
||||
<header>
|
||||
<h1><i class="ph">envelope</i> {{ __('Reset password') }}</h1>
|
||||
</header>
|
||||
|
||||
<p>{{ __('An email will be sent to :email with a QR Code and provisioning link.', ['email' => $account->email]) }}</p>
|
||||
|
||||
@if (config('app.provisioning_token_expiration_minutes') > 0)
|
||||
<p>{{ __('This link will be available for :hours hours', ['hours' => config('app.provisioning_token_expiration_minutes')/60]) }}</p>
|
||||
@endif
|
||||
|
||||
<p>
|
||||
<a class="btn oppose" href="{{ route('admin.account.provisioning_email.send', $account) }}">
|
||||
<i class="ph">paper-plane-right</i> {{ __('Send') }}
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@endsection
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Reset password') }}</li>
|
||||
@endsection
|
||||
|
||||
|
|
@ -14,10 +14,12 @@
|
|||
|
||||
<p>{{ __('An email will be sent to :email with a unique link allowing the user to reset its password.', ['email' => $account->email]) }}</p>
|
||||
|
||||
<p>{{ __('This link will be available for :hours hours.', ['hours' => config('app.reset_password_email_token_expiration_minutes')/60]) }}</p>
|
||||
@if (config('app.reset_password_email_token_expiration_minutes') > 0)
|
||||
<p>{{ __('This link will be available for :hours hours', ['hours' => config('app.reset_password_email_token_expiration_minutes')/60]) }}</p>
|
||||
@endif
|
||||
|
||||
<p>
|
||||
<a class="btn" href="{{ route('admin.account.reset_password_email.send', $account) }}">
|
||||
<a class="btn oppose" href="{{ route('admin.account.reset_password_email.send', $account) }}">
|
||||
<i class="ph">paper-plane-right</i> {{ __('Send') }}
|
||||
</a>
|
||||
</p>
|
||||
|
|
|
|||
286
flexiapi/resources/views/admin/account/show.blade.php
Normal file
286
flexiapi/resources/views/admin/account/show.blade.php
Normal file
|
|
@ -0,0 +1,286 @@
|
|||
@extends('layouts.main')
|
||||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<header>
|
||||
<h1><i class="ph">users</i> {{ $account->identifier }}</h1>
|
||||
</header>
|
||||
@include('admin.account.parts.tabs')
|
||||
|
||||
<div class="grid">
|
||||
<div class="card">
|
||||
<a class="btn small oppose" href="{{ route('admin.account.edit', $account) }}">
|
||||
<i class="ph">pencil</i>
|
||||
{{ __('Edit') }}
|
||||
</a>
|
||||
<h3>
|
||||
@if ($account->updated_at)
|
||||
<small class="oppose" title="{{ $account->updated_at }}">{{ __('Updated on') }} {{ $account->updated_at->format('d/m/Y') }}</small>
|
||||
@endif
|
||||
{{ __('Information') }}
|
||||
</h3>
|
||||
|
||||
<p><i class="ph">user</i> {{ __('SIP Adress') }}: sip:{{ $account->identifier }}</p>
|
||||
@if ($account->email)
|
||||
<p><i class="ph">envelope</i> {{ __('Email') }}: {{ $account->email }}</p>
|
||||
@endif
|
||||
@if ($account->phone)
|
||||
<p><i class="ph">phone</i> {{ __('Phone') }}: {{ $account->phone }}</p>
|
||||
@endif
|
||||
@if ($account->passwords()->count() > 0)
|
||||
<p><i class="ph">password</i> {{ __('Password') }}: **********</p>
|
||||
@endif
|
||||
<p>
|
||||
@include('admin.account.parts.badges', ['account' => $account])
|
||||
</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>
|
||||
{{ __('Manage') }}
|
||||
</h3>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr @if (empty($account->email))class="disabled"@endif>
|
||||
<td>{{ __('Send an email to the user to reset the password') }}</td>
|
||||
<td class="actions">
|
||||
<a class="btn secondary small" href="{{ route('admin.account.reset_password_email.create', $account) }}">
|
||||
<i class="ph">paper-plane-right</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr @if (empty($account->email))class="disabled"@endif>
|
||||
<td>{{ __('Send an email to the user with provisioning information') }}</td>
|
||||
<td class="actions">
|
||||
<a class="btn secondary small" href="{{ route('admin.account.provisioning_email.create', $account) }}">
|
||||
<i class="ph">paper-plane-right</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
{{ __('Delete') }}
|
||||
</td>
|
||||
<td class="actions">
|
||||
<a class="btn tertiary small" href="{{ route('admin.account.delete', $account->id) }}">
|
||||
<i class="ph">trash</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<a class="btn small oppose" href="{{ route('admin.account.external.show', $account) }}">
|
||||
<i class="ph">pencil</i>
|
||||
@if ($account->external){{ __('Edit') }}@else{{ __('Create') }}@endif
|
||||
</a>
|
||||
<h3>
|
||||
{{ __('External Account') }}
|
||||
</h3>
|
||||
@if ($account->external)
|
||||
@if ($account->external->username)
|
||||
<p><i class="ph">user</i> {{ __('Usernale') }}: {{ $account->external->username }}</p>
|
||||
@endif
|
||||
@if ($account->external->domain)
|
||||
<p><i class="ph">hard-drive</i> {{ __('Domain') }}: {{ $account->external->domain }}</p>
|
||||
@endif
|
||||
@if ($account->external->password)
|
||||
<p><i class="ph">password</i> {{ __('Password') }}: **********</p>
|
||||
@endif
|
||||
@else
|
||||
<p>{{ __('Empty') }}</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<a class="btn small oppose" href="{{ route('admin.account.provision', $account->id) }}">
|
||||
<i class="ph">repeat</i>
|
||||
{{ __('Renew') }}
|
||||
</a>
|
||||
<h3 class="large" id="provisioning">{{ __('Provisioning') }}</h3>
|
||||
|
||||
@if ($account->provisioning_token)
|
||||
<div>
|
||||
<img style="max-width: 15rem;" src="{{ route('provisioning.qrcode', $account->provisioning_token) }}">
|
||||
</div>
|
||||
|
||||
<form class="inline">
|
||||
<div>
|
||||
<input type="text" style="min-width: 40rem;" readonly
|
||||
value="{{ route('provisioning.provision', $account->provisioning_token) }}">
|
||||
<small>{{ __('The link can only be visited once') }}</small>
|
||||
</div>
|
||||
</form>
|
||||
@else
|
||||
<a class="btn btn-light" href="{{ route('admin.account.provision', $account->id) }}">{{ __('Create') }}</a>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="card large">
|
||||
<h3>
|
||||
{{ __('Devices') }}
|
||||
</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>User Agent</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if ($devices->isEmpty())
|
||||
<tr class="empty">
|
||||
<td colspan="3">{{ __('Empty') }}</td>
|
||||
</tr>
|
||||
@else
|
||||
@foreach ($devices as $device)
|
||||
<tr>
|
||||
<td class="line">{{ $device->user_agent }}</td>
|
||||
<td class="actions">
|
||||
<a type="button" class="btn small tertiary" href="{{ route('account.device.delete', [$device->uuid]) }}">
|
||||
<i class="ph">trash</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
@endif
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="card large">
|
||||
<a class="btn small oppose" href="{{ route('admin.account.dictionary.create', $account) }}">
|
||||
<i class="ph">plus</i>
|
||||
{{ __('Add') }}
|
||||
</a>
|
||||
<h3>
|
||||
{{ __('Dictionary') }}
|
||||
</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ __('Key') }}</th>
|
||||
<th>{{ __('Value') }}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if ($account->dictionaryEntries->isEmpty())
|
||||
<tr class="empty">
|
||||
<td colspan="3">{{ __('Empty') }}</td>
|
||||
</tr>
|
||||
@endif
|
||||
@foreach ($account->dictionaryEntries as $dictionaryEntry)
|
||||
<tr>
|
||||
<td class="line">{{ $dictionaryEntry->key }}</td>
|
||||
<td class="line">{{ $dictionaryEntry->value }}</td>
|
||||
<td class="actions">
|
||||
<a type="button"
|
||||
class="btn secondary small"
|
||||
href="{{ route('admin.account.dictionary.edit', [$account, $dictionaryEntry->key]) }}">
|
||||
<i class="ph">pencil</i>
|
||||
</a>
|
||||
<a type="button"
|
||||
class="btn small tertiary"
|
||||
href="{{ route('admin.account.dictionary.delete', [$account, $dictionaryEntry->key]) }}">
|
||||
<i class="ph">trash</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@if (space()?->intercom_features)
|
||||
<div class="card" id="actions">
|
||||
@if ($account->dtmf_protocol)
|
||||
<a class="btn small oppose" href="{{ route('admin.account.action.create', $account) }}">
|
||||
<i class="ph">plus</i>{{ __('Add') }}
|
||||
</a>
|
||||
@else
|
||||
<a class="btn small oppose" href="{{ route('admin.account.edit', $account) }}">
|
||||
<i class="ph">pencil</i>
|
||||
{{ __('Edit') }}
|
||||
</a>
|
||||
@endif
|
||||
<h3>
|
||||
{{ __('Actions') }}
|
||||
@if ($account->dtmf_protocol)
|
||||
<small class="oppose">{{ $account->dtmf_protocol}}</small>
|
||||
@endif
|
||||
</h3>
|
||||
|
||||
@if ($account->dtmf_protocol)
|
||||
<table>
|
||||
<tbody>
|
||||
@if ($account->actions->isEmpty())
|
||||
<tr class="empty">
|
||||
<td colspan="2">{{ __('Empty') }}</td>
|
||||
</tr>
|
||||
@endif
|
||||
@foreach ($account->actions as $action)
|
||||
<tr>
|
||||
<td scope="row">{{ $action->key }}</td>
|
||||
<td>{{ $action->code }}</td>
|
||||
<td class="actions">
|
||||
<a class="btn small secondary"
|
||||
href="{{ route('admin.account.action.edit', [$account, $action->id]) }}">
|
||||
<i class="ph">pencil</i>
|
||||
</a>
|
||||
<a class="btn small tertiary"
|
||||
href="{{ route('admin.account.action.delete', [$account, $action->id]) }}">
|
||||
<i class="ph">trash</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
@else
|
||||
<p>To manage actions, you must configure the DTMF protocol in the account settings.</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="card" id="types">
|
||||
<a class="btn small oppose" href="{{ route('admin.account.account_type.create', $account) }}">
|
||||
<i class="ph">plus</i>{{ __('Add') }}
|
||||
</a>
|
||||
|
||||
<h3>{{ __('Types') }}</h3>
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
@if ($account->types->isEmpty())
|
||||
<tr class="empty">
|
||||
<td colspan="2">{{ __('Empty') }}</td>
|
||||
</tr>
|
||||
@endif
|
||||
@foreach ($account->types as $type)
|
||||
<tr>
|
||||
<td scope="row">{{ $type->key }}</td>
|
||||
<td class="actions">
|
||||
<form method="POST"
|
||||
action="{{ route('admin.account.account_type.destroy', [$account, $type->id]) }}"
|
||||
accept-charset="UTF-8">
|
||||
@csrf
|
||||
@method('delete')
|
||||
<button class="btn small tertiary" type="submit" title="{{ __('Delete') }}">
|
||||
<i class="ph">trash</i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Statistics') }}</li>
|
||||
@endsection
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@section('breadcrumb')
|
||||
@include('admin.account.parts.breadcrumb_accounts_index')
|
||||
@include('admin.account.parts.breadcrumb_accounts_edit', ['account' => $account])
|
||||
@include('admin.account.parts.breadcrumb_accounts_show', ['account' => $account])
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ __('Calls logs') }}</li>
|
||||
@endsection
|
||||
|
||||
|
|
@ -28,7 +28,7 @@
|
|||
</div>
|
||||
|
||||
<div class="oppose">
|
||||
<a class="btn btn-secondary" href="{{ route('admin.account.statistics.show_call_logs', $account->id) }}">{{ __('Reset') }}</a>
|
||||
<a class="btn secondary" href="{{ route('admin.account.statistics.show_call_logs', $account->id) }}">{{ __('Reset') }}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -29,12 +29,12 @@
|
|||
<td>
|
||||
{{ $type->key }}
|
||||
</td>
|
||||
<td>
|
||||
<a class="btn" href="{{ route('admin.account.type.edit', [$type->id]) }}">
|
||||
{{ __('Edit') }}
|
||||
<td class="actions">
|
||||
<a class="btn small secondary" href="{{ route('admin.account.type.edit', [$type->id]) }}">
|
||||
<i class="ph">pencil</i>
|
||||
</a>
|
||||
<a class="btn btn-secondary" href="{{ route('admin.account.type.delete', [$type->id]) }}">
|
||||
{{ __('Delete') }}
|
||||
<a class="btn tertiary small" href="{{ route('admin.account.type.delete', [$type->id]) }}">
|
||||
<i class="ph">trash</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
@section('content')
|
||||
<header>
|
||||
<h1><i class="ph">key</i> {{ __('Create') }}</h1>
|
||||
<a href="{{ route('admin.api_keys.index') }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.api_keys.index') }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
</header>
|
||||
|
||||
<form method="POST"
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
@section('content')
|
||||
<header>
|
||||
<h1><i class="ph">trash</i> {{ __('Delete') }}</h1>
|
||||
<a href="{{ route('admin.api_keys.index') }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.api_keys.index') }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
<input form="delete" class="btn" type="submit" value="{{ __('Delete') }}">
|
||||
</header>
|
||||
|
||||
|
|
|
|||
|
|
@ -39,9 +39,9 @@
|
|||
<small>{{ __('Activity expiration delay') }}: {{ $api_key->expires_after_last_used_minutes ? $api_key->expires_after_last_used_minutes . ' min' : __('Never')}} | {{ __('Last used') }}: {{ $api_key->last_used_at ?? __('Never') }}</small>
|
||||
</td>
|
||||
<td>{{ $api_key->created_at }}
|
||||
<a class="btn btn-secondary small oppose" href="{{ route('admin.api_keys.delete', $api_key->key) }}"><i class="ph">trash</i></a>
|
||||
<a class="btn secondary small oppose" href="{{ route('admin.api_keys.delete', $api_key->key) }}"><i class="ph">trash</i></a>
|
||||
<small>
|
||||
<a href="{{ route('admin.account.edit', $api_key->account->id) }}">
|
||||
<a href="{{ route('admin.account.show', $api_key->account->id) }}">
|
||||
{{ __('By') }}: {{ $api_key->account->identifier }}
|
||||
</a>
|
||||
</small>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
<header>
|
||||
<h1><i class="ph">user-rectangle</i> {{ $contacts_list->title }}</h1>
|
||||
|
||||
<a href="{{ route('admin.contacts_lists.edit', $contacts_list->id) }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.contacts_lists.edit', $contacts_list->id) }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
|
||||
<form method="POST" action="{{ route('admin.contacts_lists.contacts.store', $contacts_list->id) }}"
|
||||
name="contacts_lists_contacts_store" accept-charset="UTF-8">
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
@include('admin.account.parts.forms.select_domain')
|
||||
<div>
|
||||
<a href="{{ route('admin.contacts_lists.contacts.add', $contacts_list->id) }}" type="reset"
|
||||
class="btn btn-secondary">{{ __('Reset') }}</a>
|
||||
class="btn secondary">{{ __('Reset') }}</a>
|
||||
<button type="submit" class="btn">{{ __('Search') }}</button>
|
||||
</div>
|
||||
<div class="oppose">
|
||||
|
|
|
|||
|
|
@ -11,16 +11,14 @@
|
|||
<header>
|
||||
@if ($contacts_list->id)
|
||||
<h1><i class="ph">user-rectangle</i> {{ $contacts_list->title }}</h1>
|
||||
<a href="{{ route('admin.contacts_lists.index') }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a class="btn btn-secondary" href="{{ route('admin.contacts_lists.delete', $contacts_list->id) }}">
|
||||
<a class="btn secondary oppose" href="{{ route('admin.contacts_lists.delete', $contacts_list->id) }}">
|
||||
<i class="ph">trash</i>
|
||||
{{ __('Delete') }}
|
||||
</a>
|
||||
<input form="create_edit_contacts_list" class="btn" type="submit" value="{{ __('Update') }}">
|
||||
@else
|
||||
<h1><i class="ph">user-rectangle</i> {{ __('Create') }}</h1>
|
||||
<a href="{{ route('admin.contacts_lists.index') }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<input form="create_edit_contacts_list" class="btn" type="submit" value="{{ __('Create') }}">
|
||||
<input form="create_edit_contacts_list" class="btn oppose" type="submit" value="{{ __('Create') }}">
|
||||
@endif
|
||||
</header>
|
||||
|
||||
|
|
@ -50,7 +48,7 @@
|
|||
@if ($contacts_list->id)
|
||||
<hr>
|
||||
|
||||
<a class="btn btn-secondary oppose" href="{{ route('admin.contacts_lists.contacts.add', $contacts_list->id) }}">
|
||||
<a class="btn secondary oppose" href="{{ route('admin.contacts_lists.contacts.add', $contacts_list->id) }}">
|
||||
<i class="ph">plus</i> {{ __('Add contacts') }}
|
||||
</a>
|
||||
|
||||
|
|
@ -76,12 +74,12 @@
|
|||
@include('admin.account.parts.forms.select_domain')
|
||||
<div>
|
||||
<a href="{{ route('admin.contacts_lists.edit', $contacts_list->id) }}" type="reset"
|
||||
class="btn btn-secondary">{{ __('Reset') }}</a>
|
||||
class="btn secondary">{{ __('Reset') }}</a>
|
||||
<button type="submit" class="btn">{{ __('Search') }}</button>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a class="btn btn-tertiary oppose"
|
||||
<a class="btn tertiary oppose"
|
||||
onclick="Utils.clearStorageList('d{{ $contacts_list->id }}'); document.querySelector('form[name=contacts_lists_contacts_destroy]').submit()">
|
||||
<i class="ph">trash</i>
|
||||
{{ __('Remove') }} <span class="list_toggle" data-list-id="d{{ $contacts_list->id }}"></span>
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
@section('content')
|
||||
<header>
|
||||
<h1><i class="ph">trash</i> {{ __('Delete') }}</h1>
|
||||
<a href="{{ route('admin.contacts_lists.edit', $contacts_list->id) }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.contacts_lists.edit', $contacts_list->id) }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
<input form="delete" class="btn" type="submit" value="{{ __('Delete') }}">
|
||||
</header>
|
||||
<form id="delete" method="POST" action="{{ route('admin.contacts_lists.destroy', $contacts_list->id) }}" accept-charset="UTF-8">
|
||||
|
|
|
|||
|
|
@ -4,10 +4,10 @@
|
|||
|
||||
<header>
|
||||
<h1><i class="ph">flag</i> {{ __('Phone Countries') }}</h1>
|
||||
<a class="btn btn-secondary oppose" href="{{ route('admin.phone_countries.activate_all') }}">
|
||||
<a class="btn secondary oppose" href="{{ route('admin.phone_countries.activate_all') }}">
|
||||
<i class="ph">eye</i> {{ __('Activate All') }}
|
||||
</a>
|
||||
<a class="btn btn-secondary" href="{{ route('admin.phone_countries.deactivate_all') }}">
|
||||
<a class="btn secondary" href="{{ route('admin.phone_countries.deactivate_all') }}">
|
||||
<i class="ph">eye-closed</i> {{ __('Deactivate All') }}
|
||||
</a>
|
||||
</header>
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
<thead>
|
||||
<tr>
|
||||
<th style="width: 100%;">{{ __('Name') }}</th>
|
||||
<th>{{ __('Actions') }}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
|
@ -37,11 +37,11 @@
|
|||
</td>
|
||||
<td>
|
||||
@if ($phone_country->activated)
|
||||
<a class="btn btn-secondary small" href="{{ route('admin.phone_countries.deactivate', $phone_country->code) }}">
|
||||
<a class="btn secondary small" href="{{ route('admin.phone_countries.deactivate', $phone_country->code) }}">
|
||||
<i class="ph">eye-closed</i>
|
||||
</a>
|
||||
@else
|
||||
<a class="btn btn-secondary small" href="{{ route('admin.phone_countries.activate', $phone_country->code) }}">
|
||||
<a class="btn secondary small" href="{{ route('admin.phone_countries.activate', $phone_country->code) }}">
|
||||
<i class="ph">eye</i>
|
||||
</a>
|
||||
@endif
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
@section('content')
|
||||
<header>
|
||||
<h1><i class="ph">user-rectangle</i> {{ __('Create') }}</h1>
|
||||
<a href="{{ route('admin.spaces.index') }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.spaces.index') }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
</header>
|
||||
|
||||
<form method="POST"
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
@section('content')
|
||||
<header>
|
||||
<h1><i class="ph">trash</i> {{ __('Delete') }}</h1>
|
||||
<a href="{{ route('admin.spaces.edit', $space->id) }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.spaces.edit', $space->id) }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
</header>
|
||||
<form id="delete" method="POST" action="{{ route('admin.spaces.destroy', $space) }}" accept-charset="UTF-8">
|
||||
@csrf
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
<header>
|
||||
<h1><i class="ph">trash</i> {{ __('Delete') }}</h1>
|
||||
|
||||
<a href="{{ route('admin.spaces.integration', ['space' => $space]) }}" class="btn btn-secondary oppose">{{ __('Cancel') }}</a>
|
||||
<a href="{{ route('admin.spaces.integration', ['space' => $space]) }}" class="btn secondary oppose">{{ __('Cancel') }}</a>
|
||||
<input form="delete" class="btn" type="submit" value="{{ __('Delete') }}">
|
||||
</header>
|
||||
<form id="delete" method="POST" action="{{ route('admin.spaces.email.destroy', $space->id) }}" accept-charset="UTF-8">
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@
|
|||
@endif
|
||||
@if ($space->emailServer)
|
||||
<a class="btn oppose" href="{{ route('admin.spaces.email.show', $space) }}">{{ __('Edit') }}</a>
|
||||
<a class="btn oppose btn-tertiary" href="{{ route('admin.spaces.email.delete', $space) }}">{{ __('Delete') }}</a>
|
||||
<a class="btn oppose tertiary" href="{{ route('admin.spaces.email.delete', $space) }}">{{ __('Delete') }}</a>
|
||||
@else
|
||||
<a class="btn oppose btn-secondary" href="{{ route('admin.spaces.email.show', $space) }}">{{ __('Configure') }}</a>
|
||||
<a class="btn oppose secondary" href="{{ route('admin.spaces.email.show', $space) }}">{{ __('Configure') }}</a>
|
||||
@endif
|
||||
</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -14,12 +14,12 @@
|
|||
<header>
|
||||
<h1><i class="ph">globe-hemisphere-west</i> {{ $space->name }}</h1>
|
||||
|
||||
<a class="btn btn-secondary oppose" @if ($space->isFull())disabled @endif href="{{ route('admin.account.create', ['domain' => $space->domain]) }}">
|
||||
<a class="btn secondary oppose" @if ($space->isFull())disabled @endif href="{{ route('admin.account.create', ['domain' => $space->domain]) }}">
|
||||
<i class="ph">user-plus</i> {{ __('Create') }}
|
||||
</a>
|
||||
|
||||
@if (auth()->user()->superAdmin)
|
||||
<a class="btn btn-tertiary" href="{{ route('admin.spaces.delete', $space->id) }}">
|
||||
<a class="btn tertiary" href="{{ route('admin.spaces.delete', $space->id) }}">
|
||||
<i class="ph">trash</i>
|
||||
{{ __('Delete') }}
|
||||
</a>
|
||||
|
|
@ -55,7 +55,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<a class="btn btn-secondary oppose small" @if ($space->isFull())disabled @endif href="{{ route('admin.account.create', ['admin' => true, 'domain' => $space->domain]) }}"><i class="ph">user-plus</i> {{ __('New Admin') }}</a>
|
||||
<a class="btn secondary oppose small" @if ($space->isFull())disabled @endif href="{{ route('admin.account.create', ['admin' => true, 'domain' => $space->domain]) }}"><i class="ph">user-plus</i> {{ __('New Admin') }}</a>
|
||||
|
||||
<h2>Admins</h2>
|
||||
|
||||
|
|
@ -75,7 +75,7 @@
|
|||
@foreach ($space->admins as $admin)
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ route('admin.account.edit', $admin->id) }}">
|
||||
<a href="{{ route('admin.account.show', $admin->id) }}">
|
||||
{{ $admin->identifier }}
|
||||
</a>
|
||||
</td>
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@
|
|||
</div>
|
||||
|
||||
<div class="oppose large">
|
||||
<a class="btn btn-secondary" href="{{ route('admin.statistics.show') }}">{{ __('Reset') }}</a>
|
||||
<a class="btn btn-tertiary"
|
||||
<a class="btn secondary" href="{{ route('admin.statistics.show') }}">{{ __('Reset') }}</a>
|
||||
<a class="btn tertiary"
|
||||
href="{{ route('admin.statistics.show', ['by' => $request->get('by', 'day'), 'type' => $type, 'export' => true] + $request->only(['from', 'to', 'domain'])) }}">
|
||||
<i class="ph">download-simple</i> {{ __('Export') }}
|
||||
</a>
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
<div class="on_desktop"></div>
|
||||
|
||||
<div class="oppose">
|
||||
<a class="btn btn-secondary" href="{{ route('admin.statistics.show_call_logs') }}">{{ __('Reset') }}</a>
|
||||
<a class="btn secondary" href="{{ route('admin.statistics.show_call_logs') }}">{{ __('Reset') }}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<p class="text-center">
|
||||
@yield('message')
|
||||
<br /><br />
|
||||
<a class="btn btn-secondary mt-5" href="{{ route('account.home') }}">
|
||||
<a class="btn secondary mt-5" href="{{ route('account.home') }}">
|
||||
Go back to the homepage
|
||||
</a>
|
||||
</p>
|
||||
|
|
|
|||
20
flexiapi/resources/views/mails/provisioning.blade.php
Normal file
20
flexiapi/resources/views/mails/provisioning.blade.php
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Authenticate on {{ space()->name }}</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Hello,</p>
|
||||
<p>
|
||||
You are trying to authenticate to {{ space()->name }} using your device.<br />
|
||||
You can configure your new device by directly flashing the QRCode or using the provisioning link:<br />
|
||||
|
||||
<img src="{{ $provisioning_qrcode}}"><br />
|
||||
|
||||
Provisioning link: {{ $provisioning_link }}
|
||||
</p>
|
||||
<p>
|
||||
Regards,<br />
|
||||
{{ config('mail.signature') }}
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Authenticate on {{ space()->name }}</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Hello,</p>
|
||||
<p>
|
||||
You are trying to authenticate to {{ space()->name }} using your device.<br />
|
||||
You can configure your new device by directly flashing the QRCode or using the provisioning link:<br />
|
||||
|
||||
<img src="{{ $provisioning_qrcode}}"><br />
|
||||
Provisioning link: {{ $provisioning_link }}
|
||||
</p>
|
||||
<p>
|
||||
Regards,<br />
|
||||
{{ config('mail.signature') }}
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
10
flexiapi/resources/views/mails/provisioning_text.blade.php
Normal file
10
flexiapi/resources/views/mails/provisioning_text.blade.php
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
Hello,
|
||||
|
||||
You are trying to authenticate to {{ space()->name }} using your device.
|
||||
|
||||
You can configure your new device by using the provisioning link.
|
||||
|
||||
Provisioning link: {{ $provisioning_link }}
|
||||
|
||||
Regards,
|
||||
{{ config('mail.signature') }}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
Hello,
|
||||
|
||||
You are trying to authenticate to {{ space()->name }} using your device.
|
||||
|
||||
You can configure your new device by using the provisioning link.
|
||||
|
||||
Provisioning link: {{ $provisioning_link }}
|
||||
|
||||
Regards,
|
||||
{{ config('mail.signature') }}
|
||||
|
|
@ -41,6 +41,7 @@ use App\Http\Controllers\Admin\ContactsListContactController;
|
|||
use App\Http\Controllers\Admin\ContactsListController;
|
||||
use App\Http\Controllers\Admin\ExternalAccountController;
|
||||
use App\Http\Controllers\Admin\PhoneCountryController;
|
||||
use App\Http\Controllers\Admin\ProvisioningEmailController;
|
||||
use App\Http\Controllers\Admin\ResetPasswordEmailController;
|
||||
use App\Http\Controllers\Admin\Space\EmailServerController;
|
||||
use App\Http\Controllers\Admin\SpaceController;
|
||||
|
|
@ -203,36 +204,6 @@ Route::middleware(['web_panel_enabled', 'space.check'])->group(function () {
|
|||
});
|
||||
|
||||
Route::name('account.')->prefix('accounts')->group(function () {
|
||||
Route::controller(AdminAccountController::class)->group(function () {
|
||||
Route::get('{account_id}/provision', 'provision')->name('provision');
|
||||
|
||||
Route::get('create', 'create')->name('create');
|
||||
Route::post('accounts', 'store')->name('store');
|
||||
|
||||
Route::get('{account_id}/edit', 'edit')->name('edit');
|
||||
Route::put('{account_id}', 'update')->name('update');
|
||||
|
||||
Route::get('{account_id}/delete', 'delete')->name('delete');
|
||||
Route::delete('/', 'destroy')->name('destroy');
|
||||
|
||||
Route::get('/', 'index')->name('index');
|
||||
Route::post('search', 'search')->name('search');
|
||||
|
||||
Route::get('{account_id}/contacts_lists/detach', 'contactsListRemove')->name('contacts_lists.detach');
|
||||
Route::post('{account_id}/contacts_lists', 'contactsListAdd')->name('contacts_lists.attach');
|
||||
});
|
||||
|
||||
Route::name('reset_password_email.')->controller(ResetPasswordEmailController::class)->prefix('{account_id}/reset_password_emails')->group(function () {
|
||||
Route::get('create', 'create')->name('create');
|
||||
Route::get('send', 'send')->name('send');
|
||||
});
|
||||
|
||||
Route::name('import.')->prefix('import')->controller(AccountImportController::class)->group(function () {
|
||||
Route::get('/', 'create')->name('create');
|
||||
Route::post('/', 'store')->name('store');
|
||||
Route::post('handle', 'handle')->name('handle');
|
||||
});
|
||||
|
||||
Route::middleware(['intercom_features'])->group(function () {
|
||||
Route::name('type.')->prefix('types')->controller(AccountTypeController::class)->group(function () {
|
||||
Route::get('/', 'index')->name('index');
|
||||
|
|
@ -260,7 +231,44 @@ Route::middleware(['web_panel_enabled', 'space.check'])->group(function () {
|
|||
});
|
||||
});
|
||||
|
||||
Route::controller(AdminAccountController::class)->group(function () {
|
||||
Route::get('{account_id}/provision', 'provision')->name('provision');
|
||||
|
||||
Route::get('create', 'create')->name('create');
|
||||
Route::get('{account_id}', 'show')->name('show');
|
||||
Route::post('accounts', 'store')->name('store');
|
||||
|
||||
Route::get('{account_id}/edit', 'edit')->name('edit');
|
||||
Route::put('{account_id}', 'update')->name('update');
|
||||
|
||||
Route::get('{account_id}/delete', 'delete')->name('delete');
|
||||
Route::delete('/', 'destroy')->name('destroy');
|
||||
|
||||
Route::get('/', 'index')->name('index');
|
||||
Route::post('search', 'search')->name('search');
|
||||
|
||||
Route::get('{account_id}/contacts_lists/detach', 'contactsListRemove')->name('contacts_lists.detach');
|
||||
Route::post('{account_id}/contacts_lists', 'contactsListAdd')->name('contacts_lists.attach');
|
||||
});
|
||||
|
||||
Route::name('reset_password_email.')->controller(ResetPasswordEmailController::class)->prefix('{account_id}/reset_password_email')->group(function () {
|
||||
Route::get('create', 'create')->name('create');
|
||||
Route::get('send', 'send')->name('send');
|
||||
});
|
||||
|
||||
Route::name('provisioning_email.')->controller(ProvisioningEmailController::class)->prefix('{account_id}/provisioning_email')->group(function () {
|
||||
Route::get('create', 'create')->name('create');
|
||||
Route::get('send', 'send')->name('send');
|
||||
});
|
||||
|
||||
Route::name('import.')->prefix('import')->controller(AccountImportController::class)->group(function () {
|
||||
Route::get('/', 'create')->name('create');
|
||||
Route::post('/', 'store')->name('store');
|
||||
Route::post('handle', 'handle')->name('handle');
|
||||
});
|
||||
|
||||
Route::name('contact.')->prefix('{account}/contacts')->controller(AccountContactController::class)->group(function () {
|
||||
Route::get('/', 'index')->name('index');
|
||||
Route::get('create', 'create')->name('create');
|
||||
Route::post('/', 'store')->name('store');
|
||||
Route::get('{contact_id}/delete', 'delete')->name('delete');
|
||||
|
|
@ -268,13 +276,11 @@ Route::middleware(['web_panel_enabled', 'space.check'])->group(function () {
|
|||
});
|
||||
|
||||
Route::name('device.')->prefix('{account}/devices')->controller(AccountDeviceController::class)->group(function () {
|
||||
Route::get('/', 'index')->name('index');
|
||||
Route::get('{device_id}/delete', 'delete')->name('delete');
|
||||
Route::delete('/', 'destroy')->name('destroy');
|
||||
});
|
||||
|
||||
Route::name('dictionary.')->prefix('{account}/dictionary')->controller(AccountDictionaryController::class)->group(function () {
|
||||
Route::get('/', 'index')->name('index');
|
||||
Route::get('create', 'create')->name('create');
|
||||
Route::post('/', 'store')->name('store');
|
||||
Route::get('{entry}/edit', 'edit')->name('edit');
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue