diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9692375..29b7c36 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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
----
diff --git a/flexiapi/app/Http/Controllers/Account/DeviceController.php b/flexiapi/app/Http/Controllers/Account/DeviceController.php
index 38ab6bb..879b64e 100644
--- a/flexiapi/app/Http/Controllers/Account/DeviceController.php
+++ b/flexiapi/app/Http/Controllers/Account/DeviceController.php
@@ -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;
diff --git a/flexiapi/app/Http/Controllers/Admin/AccountAccountTypeController.php b/flexiapi/app/Http/Controllers/Admin/AccountAccountTypeController.php
index b84ba61..110569e 100644
--- a/flexiapi/app/Http/Controllers/Admin/AccountAccountTypeController.php
+++ b/flexiapi/app/Http/Controllers/Admin/AccountAccountTypeController.php
@@ -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');
}
}
diff --git a/flexiapi/app/Http/Controllers/Admin/AccountActionController.php b/flexiapi/app/Http/Controllers/Admin/AccountActionController.php
index f890636..c3d1d1f 100644
--- a/flexiapi/app/Http/Controllers/Admin/AccountActionController.php
+++ b/flexiapi/app/Http/Controllers/Admin/AccountActionController.php
@@ -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');
}
}
diff --git a/flexiapi/app/Http/Controllers/Admin/AccountContactController.php b/flexiapi/app/Http/Controllers/Admin/AccountContactController.php
index d8df191..ff8c46e 100644
--- a/flexiapi/app/Http/Controllers/Admin/AccountContactController.php
+++ b/flexiapi/app/Http/Controllers/Admin/AccountContactController.php
@@ -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);
}
}
diff --git a/flexiapi/app/Http/Controllers/Admin/AccountController.php b/flexiapi/app/Http/Controllers/Admin/AccountController.php
index b52391b..91fb67f 100644
--- a/flexiapi/app/Http/Controllers/Admin/AccountController.php
+++ b/flexiapi/app/Http/Controllers/Admin/AccountController.php
@@ -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');
}
}
diff --git a/flexiapi/app/Http/Controllers/Admin/AccountDictionaryController.php b/flexiapi/app/Http/Controllers/Admin/AccountDictionaryController.php
index b87f78c..5c6112f 100644
--- a/flexiapi/app/Http/Controllers/Admin/AccountDictionaryController.php
+++ b/flexiapi/app/Http/Controllers/Admin/AccountDictionaryController.php
@@ -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);
}
}
diff --git a/flexiapi/app/Http/Controllers/Admin/ContactsListController.php b/flexiapi/app/Http/Controllers/Admin/ContactsListController.php
index bb00d54..4501c02 100644
--- a/flexiapi/app/Http/Controllers/Admin/ContactsListController.php
+++ b/flexiapi/app/Http/Controllers/Admin/ContactsListController.php
@@ -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', [
diff --git a/flexiapi/app/Http/Controllers/Admin/ExternalAccountController.php b/flexiapi/app/Http/Controllers/Admin/ExternalAccountController.php
index 67502dc..86afb4a 100644
--- a/flexiapi/app/Http/Controllers/Admin/ExternalAccountController.php
+++ b/flexiapi/app/Http/Controllers/Admin/ExternalAccountController.php
@@ -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);
}
}
diff --git a/flexiapi/app/Http/Controllers/Admin/ProvisioningEmailController.php b/flexiapi/app/Http/Controllers/Admin/ProvisioningEmailController.php
new file mode 100644
index 0000000..7fe0423
--- /dev/null
+++ b/flexiapi/app/Http/Controllers/Admin/ProvisioningEmailController.php
@@ -0,0 +1,37 @@
+ $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);
+ }
+}
diff --git a/flexiapi/app/Http/Controllers/Admin/ResetPasswordEmailController.php b/flexiapi/app/Http/Controllers/Admin/ResetPasswordEmailController.php
index ac56aba..953f7d0 100644
--- a/flexiapi/app/Http/Controllers/Admin/ResetPasswordEmailController.php
+++ b/flexiapi/app/Http/Controllers/Admin/ResetPasswordEmailController.php
@@ -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;
diff --git a/flexiapi/app/Mail/Provisioning.php b/flexiapi/app/Mail/Provisioning.php
new file mode 100644
index 0000000..85cc247
--- /dev/null
+++ b/flexiapi/app/Mail/Provisioning.php
@@ -0,0 +1,41 @@
+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
+ ])
+ ]);
+ }
+}
diff --git a/flexiapi/composer.lock b/flexiapi/composer.lock
index 633b1d6..f81e64f 100644
--- a/flexiapi/composer.lock
+++ b/flexiapi/composer.lock
@@ -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",
diff --git a/flexiapi/lang/fr.json b/flexiapi/lang/fr.json
index ce903a5..92ecb23 100644
--- a/flexiapi/lang/fr.json
+++ b/flexiapi/lang/fr.json
@@ -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",
diff --git a/flexiapi/public/css/form.css b/flexiapi/public/css/form.css
index 12474ac..42d842f 100644
--- a/flexiapi/public/css/form.css
+++ b/flexiapi/public/css/form.css
@@ -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);
}
diff --git a/flexiapi/public/css/style.css b/flexiapi/public/css/style.css
index 3520633..0bd4193 100644
--- a/flexiapi/public/css/style.css
+++ b/flexiapi/public/css/style.css
@@ -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;
}
diff --git a/flexiapi/resources/views/account/delete.blade.php b/flexiapi/resources/views/account/delete.blade.php
index a4f8dd6..919156a 100644
--- a/flexiapi/resources/views/account/delete.blade.php
+++ b/flexiapi/resources/views/account/delete.blade.php
@@ -8,7 +8,7 @@
trash Delete my account
- {{ __('Cancel') }}
+ {{ __('Cancel') }}
You didn't receive the code? - Resend a code + Resend a code
{{ __('No account yet?') }} - {{ __('Register') }} + {{ __('Register') }}
@endif diff --git a/flexiapi/resources/views/account/password.blade.php b/flexiapi/resources/views/account/password.blade.php index 87079a9..b0e8aab 100644 --- a/flexiapi/resources/views/account/password.blade.php +++ b/flexiapi/resources/views/account/password.blade.php @@ -12,7 +12,7 @@{{ __("You didn't receive the code?"") }} - {{ __('Resend') }} + {{ __('Resend') }}
{{ __('You already have an account?') }} - {{ __('Login') }} + {{ __('Login') }}
@include('parts.tabs.register') diff --git a/flexiapi/resources/views/account/register/phone.blade.php b/flexiapi/resources/views/account/register/phone.blade.php index 72e3b61..a00a6a4 100644 --- a/flexiapi/resources/views/account/register/phone.blade.php +++ b/flexiapi/resources/views/account/register/phone.blade.php @@ -5,7 +5,7 @@{{ __('You already have an account?') }} - {{ __('Login') }} + {{ __('Login') }}
@include('parts.tabs.register') diff --git a/flexiapi/resources/views/admin/account/account_type/create.blade.php b/flexiapi/resources/views/admin/account/account_type/create.blade.php index dc8db82..7e4a319 100644 --- a/flexiapi/resources/views/admin/account/account_type/create.blade.php +++ b/flexiapi/resources/views/admin/account/account_type/create.blade.php @@ -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])| {{ __('Code') }} | -{{ __('Created') }} | -{{ __('Used on') }} | -IP | -{{ __('Requests') }} | -
|---|---|---|---|---|
| - {{ $account->apiKey->key }} - | -- {{ $account->apiKey->created_at }} - | -- {{ $account->apiKey->last_used_at }} - | -- {{ $account->apiKey->ip ?? '*' }} - | -- {{ $account->apiKey->requests }} - | -
| {{ __('Created') }} | +Key | +
|---|---|
| + {{ $account->apiKey->created_at }} + + {{ __('Used on') }}: {{ $account->apiKey->last_used_at }} + + | ++ {{ $account->apiKey->key }} + + IP: {{ $account->apiKey->ip ?? '*' }} | + {{ __('Requests') }}: {{ $account->apiKey->requests }} + + | +
| {{ __('Code') }} | -{{ __('Created') }} | -{{ __('Used on') }} | -IP | -
|---|---|---|---|
| **** | -- {{ $account->accountCreationToken->created_at }} - | -- {{ $account->accountCreationToken->created_at != $account->accountCreationToken->updated_at ? $account->accountCreationToken->updated_at : '-' }} - | -- {{ $account->accountCreationToken->ip ? $account->accountCreationToken->ip : '-' }} - | -
| {{ __('Created') }} | +{{ __('Used on') }} | +
|---|---|
| + {{ $account->accountCreationToken->created_at }} + {{ $account->accountCreationToken->created_at ?? '-' }} + | ++ {{ $account->accountCreationToken->created_at != $account->accountCreationToken->updated_at ? $account->accountCreationToken->updated_at : '-' }} + + {{ \Illuminate\Support\Str::limit($account->accountCreationToken->user_agent, 20, $end='...') }} + + | +
| {{ __('Code') }} | -{{ __('Created') }} | -{{ __('Used on') }} | -IP | -||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| **** | -- {{ $recoveryCode->created_at }} - | -- {{ $recoveryCode->created_at != $recoveryCode->updated_at ? $recoveryCode->updated_at : '-' }} - | -- {{ $recoveryCode->ip ? $recoveryCode->ip : '-' }} - | + @if ($account->recoveryCodes->isNotEmpty()) +
| {{ __('Created') }} | +{{ __('Used on') }} | +
|---|---|
| + {{ $recoveryCode->created_at }} + | ++ {{ $recoveryCode->created_at != $recoveryCode->updated_at ? $recoveryCode->updated_at : '-' }} + + IP: {{ $recoveryCode->ip ?? '-' }} | + {{ \Illuminate\Support\Str::limit($recoveryCode->user_agent, 20, $end='...') }} + + | +
| {{ __('Created') }} | +{{ __('Phone number') }} | +{{ __('Used on') }} |
|---|
| {{ __('Phone number') }} | -{{ __('Code') }} | -{{ __('Created') }} | -{{ __('Used on') }} | -IP | -
|---|---|---|---|---|
| {{ $phoneChangeCode->phone }} | -{{ $phoneChangeCode->code ?? '-' }} | -- {{ $phoneChangeCode->created_at }} - | -- {{ $phoneChangeCode->created_at != $phoneChangeCode->updated_at ? $phoneChangeCode->updated_at : '-' }} - | -- {{ $phoneChangeCode->ip ? $phoneChangeCode->ip : '-' }} - | -
| {{ __('Created') }} | +{{ __('Email') }} | +{{ __('Used on') }} | +
|---|---|---|
| + {{ $emailChangeCode->created_at }} + | ++ {{ $emailChangeCode->email }} + {{ __('Code') }}: {{ $emailChangeCode->code ?? '-' }} + | ++ {{ $emailChangeCode->created_at != $emailChangeCode->updated_at ? $emailChangeCode->updated_at : '-' }} + + IP: {{ $emailChangeCode->ip ?? '-' }} | + {{ \Illuminate\Support\Str::limit($emailChangeCode->user_agent, 20, $end='...') }} + + | +
| {{ __('Email') }} | -{{ __('Code') }} | -{{ __('Created') }} | -{{ __('Used on') }} | -IP | -
|---|---|---|---|---|
| {{ $emailChangeCode->email }} | -{{ $emailChangeCode->code ?? '-' }} | -- {{ $emailChangeCode->created_at }} - | -- {{ $emailChangeCode->created_at != $emailChangeCode->updated_at ? $emailChangeCode->updated_at : '-' }} - | -- {{ $emailChangeCode->ip ? $emailChangeCode->ip : '-' }} - | -
| {{ __('Created') }} | +{{ __('Used on') }} | +
|---|---|
| + {{ $provisioningToken->created_at }} + | ++ {{ $provisioningToken->consumed() ? $provisioningToken->updated_at : '-' }} + + IP: {{ $provisioningToken->ip ?? '-' }} | + {{ \Illuminate\Support\Str::limit($provisioningToken->user_agent, 20, $end='...') }} + + | +
| Token | -{{ __('Created') }} | -{{ __('Used on') }} | -IP | -
|---|---|---|---|
| {{ $provisioningToken->token }} | -- {{ $provisioningToken->created_at }} - | -- {{ $provisioningToken->consumed() ? $provisioningToken->updated_at : '-' }} - | -- {{ $provisioningToken->ip ? $provisioningToken->ip : '-' }} - | -
| {{ __('Created') }} | +{{ __('Email') }} | +{{ __('Used on') }} | +
|---|---|---|
| + {{ $resetPasswordEmailToken->created_at }} + | ++ {{ $resetPasswordEmailToken->email }} + + {{ $resetPasswordEmailToken->token }} + + | ++ {{ $resetPasswordEmailToken->consumed() ? $resetPasswordEmailToken->updated_at : '-' }} + + IP: {{ $resetPasswordEmailToken->ip ?? '-' }} | + {{ $resetPasswordEmailToken->user_agent ? \Illuminate\Support\Str::limit($resetPasswordEmailToken->user_agent, 20, $end='...') : '-' }} + + | +
| Token | -{{ __('Created') }} | -{{ __('Used on') }} | -{{ __('Email') }} | -
|---|---|---|---|
| {{ $resetPasswordEmailToken->token }} | -- {{ $resetPasswordEmailToken->created_at }} - | -- {{ $resetPasswordEmailToken->consumed() ? $resetPasswordEmailToken->updated_at : '-' }} - | -- {{ $resetPasswordEmailToken->email }} - | -
- {{ $contact->identifier }} - - x - -
- @endforeach - - {{ __('Add') }} - -- {{ $contactsList->title }} - - x - -
- @endforeach - -| {{ $action->key }} | -{{ $action->code }} | -- {{ __('Edit') }} - {{ __('Delete') }} - | -
|---|
To manage actions, you must configure the DTMF protocol in the account settings.
- @endif - -| {{ $type->key }} | -
- |
-
|---|
| User Agent | -- | |
|---|---|---|
| {{ __('Empty') }} | -||
| {{ $device->user_agent }} | -- - {{ __('Delete') }} - - | -|
| {{ __('Key') }} | -{{ __('Value') }} | -- |
|---|---|---|
| {{ __('Empty') }} | -||
| {{ $dictionaryEntry->key }} | -{{ $dictionaryEntry->value }} | -- - {{ __('Edit') }} - - - {{ __('Delete') }} - - | -
{{ $accounts->count()}} / @if ($space->max_accounts > 0){{ $space->max_accounts }} @else infinity@endif
@endif - + download-simple {{ __('Import') }} @if (space()?->intercom_features) - + shapes {{ __('Types') }} @@ -52,7 +52,7 @@{{ __('An email will be sent to :email with a QR Code and provisioning link.', ['email' => $account->email]) }}
+ +@if (config('app.provisioning_token_expiration_minutes') > 0) +{{ __('This link will be available for :hours hours', ['hours' => config('app.provisioning_token_expiration_minutes')/60]) }}
+@endif + ++ + paper-plane-right {{ __('Send') }} + +
+ +@endsection \ No newline at end of file diff --git a/flexiapi/resources/views/admin/account/reset_password_email/create.blade.php b/flexiapi/resources/views/admin/account/reset_password_email/create.blade.php index 2815d0d..a9e86c6 100644 --- a/flexiapi/resources/views/admin/account/reset_password_email/create.blade.php +++ b/flexiapi/resources/views/admin/account/reset_password_email/create.blade.php @@ -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]){{ __('An email will be sent to :email with a unique link allowing the user to reset its password.', ['email' => $account->email]) }}
-{{ __('This link will be available for :hours hours.', ['hours' => config('app.reset_password_email_token_expiration_minutes')/60]) }}
+@if (config('app.reset_password_email_token_expiration_minutes') > 0) +{{ __('This link will be available for :hours hours', ['hours' => config('app.reset_password_email_token_expiration_minutes')/60]) }}
+@endif- + paper-plane-right {{ __('Send') }}
diff --git a/flexiapi/resources/views/admin/account/show.blade.php b/flexiapi/resources/views/admin/account/show.blade.php new file mode 100644 index 0000000..93a534d --- /dev/null +++ b/flexiapi/resources/views/admin/account/show.blade.php @@ -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') +user {{ __('SIP Adress') }}: sip:{{ $account->identifier }}
+ @if ($account->email) +envelope {{ __('Email') }}: {{ $account->email }}
+ @endif + @if ($account->phone) +phone {{ __('Phone') }}: {{ $account->phone }}
+ @endif + @if ($account->passwords()->count() > 0) +password {{ __('Password') }}: **********
+ @endif ++ @include('admin.account.parts.badges', ['account' => $account]) +
+| {{ __('Send an email to the user to reset the password') }} | ++ + paper-plane-right + + | +
| {{ __('Send an email to the user with provisioning information') }} | ++ + paper-plane-right + + | +
| + {{ __('Delete') }} + | ++ + trash + + | +
user {{ __('Usernale') }}: {{ $account->external->username }}
+ @endif + @if ($account->external->domain) +hard-drive {{ __('Domain') }}: {{ $account->external->domain }}
+ @endif + @if ($account->external->password) +password {{ __('Password') }}: **********
+ @endif + @else +{{ __('Empty') }}
+ @endif +| User Agent | ++ | |
|---|---|---|
| {{ __('Empty') }} | +||
| {{ $device->user_agent }} | ++ + trash + + | +|
| {{ __('Key') }} | +{{ __('Value') }} | ++ |
|---|---|---|
| {{ __('Empty') }} | +||
| {{ $dictionaryEntry->key }} | +{{ $dictionaryEntry->value }} | ++ + pencil + + + trash + + | +
| {{ __('Empty') }} | +||
| {{ $action->key }} | +{{ $action->code }} | ++ + pencil + + + trash + + | +
To manage actions, you must configure the DTMF protocol in the account settings.
+ @endif +| {{ __('Empty') }} | +|
| {{ $type->key }} | +
+ |
+
@yield('message')
-
+
Go back to the homepage
Hello,
+
+ You are trying to authenticate to {{ space()->name }} using your device.
+ You can configure your new device by directly flashing the QRCode or using the provisioning link:
+
+
+
+ Provisioning link: {{ $provisioning_link }}
+
+ Regards,
+ {{ config('mail.signature') }}
+
Hello,
+
+ You are trying to authenticate to {{ space()->name }} using your device.
+ You can configure your new device by directly flashing the QRCode or using the provisioning link:
+
+
+ Provisioning link: {{ $provisioning_link }}
+
+ Regards,
+ {{ config('mail.signature') }}
+