Page MenuHomePhorge

No OneTemporary

diff --git a/src/config/app.php b/src/config/app.php
index b55913b4..191ab120 100644
--- a/src/config/app.php
+++ b/src/config/app.php
@@ -1,284 +1,284 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Application Name
|--------------------------------------------------------------------------
|
| This value is the name of your application. This value is used when the
| framework needs to place the application's name in a notification or
| any other location as required by the application or its packages.
|
*/
'name' => env('APP_NAME', 'Laravel'),
/*
|--------------------------------------------------------------------------
| Application Environment
|--------------------------------------------------------------------------
|
| This value determines the "environment" your application is currently
| running in. This may determine how you prefer to configure various
| services the application utilizes. Set this in your ".env" file.
|
*/
'env' => env('APP_ENV', 'production'),
/*
|--------------------------------------------------------------------------
| Application Debug Mode
|--------------------------------------------------------------------------
|
| When your application is in debug mode, detailed error messages with
| stack traces will be shown on every error that occurs within your
| application. If disabled, a simple generic error page is shown.
|
*/
'debug' => env('APP_DEBUG', false),
/*
|--------------------------------------------------------------------------
| Application URL
|--------------------------------------------------------------------------
|
| This URL is used by the console to properly generate URLs when using
| the Artisan command line tool. You should set this to the root of
| your application so that it is used when running Artisan tasks.
*/
'url' => env('APP_URL', 'http://localhost'),
'passphrase' => env('APP_PASSPHRASE', null),
'public_url' => env('APP_PUBLIC_URL', env('APP_URL', 'http://localhost')),
'asset_url' => env('ASSET_URL'),
'support_url' => env('SUPPORT_URL', null),
'support_email' => env('SUPPORT_EMAIL', null),
'webmail_url' => env('WEBMAIL_URL', null),
'theme' => env('APP_THEME', 'default'),
'tenant_id' => env('APP_TENANT_ID', null),
'currency' => \strtoupper(env('APP_CURRENCY', 'CHF')),
/*
|--------------------------------------------------------------------------
| Application Domain
|--------------------------------------------------------------------------
|
| System domain used for user signup (kolab identity)
*/
'domain' => env('APP_DOMAIN', 'domain.tld'),
'website_domain' => env('APP_WEBSITE_DOMAIN', env('APP_DOMAIN', 'domain.tld')),
'services_domain' => env(
'APP_SERVICES_DOMAIN',
"services." . env('APP_WEBSITE_DOMAIN', env('APP_DOMAIN', 'domain.tld'))
),
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/
'timezone' => 'UTC',
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => env('APP_LOCALE', 'en'),
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',
/*
|--------------------------------------------------------------------------
| Faker Locale
|--------------------------------------------------------------------------
|
| This locale will be used by the Faker PHP library when generating fake
| data for your database seeds. For example, this will be used to get
| localized telephone numbers, street address information and more.
|
*/
'faker_locale' => 'en_US',
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| This key is used by the Illuminate encrypter service and should be set
| to a random, 32 character string, otherwise these encrypted strings
| will not be safe. Please do this before deploying an application!
|
*/
'key' => env('APP_KEY'),
'cipher' => 'AES-256-CBC',
/*
|--------------------------------------------------------------------------
| Autoloaded Service Providers
|--------------------------------------------------------------------------
|
| The service providers listed here will be automatically loaded on the
| request to your application. Feel free to add your own services to
| this array to grant expanded functionality to your applications.
|
*/
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\HorizonServiceProvider::class,
App\Providers\PassportServiceProvider::class,
App\Providers\RouteServiceProvider::class,
],
/*
|--------------------------------------------------------------------------
| Class Aliases
|--------------------------------------------------------------------------
|
| This array of class aliases will be registered when this application
| is started. However, feel free to register as many as you wish as
| the aliases are "lazy" loaded so they don't hinder performance.
|
*/
'aliases' => \Illuminate\Support\Facades\Facade::defaultAliases()->toArray(),
'headers' => [
'csp' => env('APP_HEADER_CSP', ""),
'xfo' => env('APP_HEADER_XFO', ""),
],
// Locations of knowledge base articles
'kb' => [
// An article about suspended accounts
'account_suspended' => env('KB_ACCOUNT_SUSPENDED'),
// An article about a way to delete an owned account
'account_delete' => env('KB_ACCOUNT_DELETE'),
// An article about the payment system
'payment_system' => env('KB_PAYMENT_SYSTEM'),
],
'company' => [
'name' => env('COMPANY_NAME'),
'address' => env('COMPANY_ADDRESS'),
'details' => env('COMPANY_DETAILS'),
'email' => env('COMPANY_EMAIL'),
'logo' => env('COMPANY_LOGO'),
'footer' => env('COMPANY_FOOTER', env('COMPANY_DETAILS')),
- 'copyright' => env('COMPANY_COPYRIGHT', env('COMPANY_NAME', 'Apheleia IT AG')),
+ 'copyright' => 'Apheleia IT AG',
],
'storage' => [
'min_qty' => (int) env('STORAGE_MIN_QTY', 5), // in GB
],
'vat' => [
'mode' => (int) env('VAT_MODE', 0),
],
'password_policy' => env('PASSWORD_POLICY') ?: 'min:6,max:255',
'payment' => [
'methods_oneoff' => env('PAYMENT_METHODS_ONEOFF', 'creditcard,paypal,banktransfer,bitcoin'),
'methods_recurring' => env('PAYMENT_METHODS_RECURRING', 'creditcard'),
],
'with_ldap' => (bool) env('APP_LDAP', true),
'with_imap' => (bool) env('APP_IMAP', false),
'with_admin' => (bool) env('APP_WITH_ADMIN', false),
'with_files' => (bool) env('APP_WITH_FILES', false),
'with_reseller' => (bool) env('APP_WITH_RESELLER', false),
'with_services' => (bool) env('APP_WITH_SERVICES', false),
'with_wallet' => (bool) env('APP_WITH_WALLET', true),
'with_signup' => (bool) env('APP_WITH_SIGNUP', true),
'signup' => [
'email_limit' => (int) env('SIGNUP_LIMIT_EMAIL', 0),
'ip_limit' => (int) env('SIGNUP_LIMIT_IP', 0),
],
'woat_ns1' => env('WOAT_NS1', 'ns01.' . env('APP_DOMAIN')),
'woat_ns2' => env('WOAT_NS2', 'ns02.' . env('APP_DOMAIN')),
'ratelimit_whitelist' => explode(',', env('RATELIMIT_WHITELIST', '')),
'companion_download_link' => env(
'COMPANION_DOWNLOAD_LINK',
"https://mirror.apheleia-it.ch/pub/companion-app-beta.apk"
)
];
diff --git a/src/resources/themes/default/images/favicon.ico b/src/resources/themes/default/images/favicon.ico
index 6848441b..a0cb8a60 100644
Binary files a/src/resources/themes/default/images/favicon.ico and b/src/resources/themes/default/images/favicon.ico differ
diff --git a/src/resources/themes/default/images/logo_footer.png b/src/resources/themes/default/images/logo_footer.png
index 60133384..5f650191 100644
Binary files a/src/resources/themes/default/images/logo_footer.png and b/src/resources/themes/default/images/logo_footer.png differ
diff --git a/src/resources/themes/default/images/logo_header.png b/src/resources/themes/default/images/logo_header.png
index 615f994d..bffcfe17 100644
Binary files a/src/resources/themes/default/images/logo_header.png and b/src/resources/themes/default/images/logo_header.png differ
diff --git a/src/resources/themes/default/images/logo_print.svg b/src/resources/themes/default/images/logo_print.svg
index 8acf94a7..360ff9e7 100644
--- a/src/resources/themes/default/images/logo_print.svg
+++ b/src/resources/themes/default/images/logo_print.svg
@@ -1,32 +1,74 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
- viewBox="0 0 1700.8 566.9" xml:space="preserve">
-<style type="text/css">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ viewBox="0 0 1000.7999 566.9"
+ xml:space="preserve"
+ id="svg20"
+ sodipodi:docname="logo_print.svg"
+ width="1000.8"
+ height="566.90002"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ inkscape:export-filename="logo_print.png"
+ inkscape:export-xdpi="56.444023"
+ inkscape:export-ydpi="56.444023"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"><defs
+ id="defs24" /><sodipodi:namedview
+ id="namedview22"
+ pagecolor="#ffffff"
+ bordercolor="#999999"
+ borderopacity="1"
+ inkscape:showpageshadow="0"
+ inkscape:pageopacity="0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ showgrid="false"
+ inkscape:zoom="0.80961898"
+ inkscape:cx="839.28368"
+ inkscape:cy="285.93697"
+ inkscape:window-width="2560"
+ inkscape:window-height="1398"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg20" />
+<style
+ type="text/css"
+ id="style2">
.st0{fill:#F3A628;}
.st1{fill:#575756;}
</style>
-<path class="st0" d="M97.8,197.2c0-3.4,2.6-6.4,6.4-6.4h7.7c3.4,0,6.4,2.9,6.4,6.4v74.9l82.6-78.6c1.1-1.3,3.4-2.6,5-2.6h13
- c4.8,0,7.4,5.3,3.2,9.3l-83.6,78.1l87.6,89.7c1.9,1.9,1.3,8.2-4.5,8.2h-13.5c-1.9,0-4.2-1.1-4.8-1.9l-85-88.7v84.2
- c0,3.4-2.9,6.4-6.4,6.4h-7.7c-3.7,0-6.4-2.9-6.4-6.4V197.2z"/>
-<path class="st0" d="M469.1,195.8c0-2.6,2.1-5,5-5h10.3c2.6,0,5,2.4,5,5v162.5h76.2c2.9,0,5,2.4,5,5v7.7c0,2.6-2.1,5-5,5H474
- c-2.9,0-5-2.4-5-5V195.8H469.1z"/>
-<path class="st0" d="M581.9,369.2l80.5-178.1c0.8-1.6,2.1-2.9,4.5-2.9h2.6c2.4,0,3.7,1.3,4.5,2.9l79.9,178.1
- c1.6,3.4-0.5,6.9-4.5,6.9h-10.6c-2.4,0-4-1.6-4.5-2.9l-19.6-43.7h-93.9l-19.3,43.7c-0.5,1.3-2.1,2.9-4.5,2.9h-10.6
- C582.4,376.1,580.3,372.6,581.9,369.2z M707.6,313.1c-13-28.8-25.7-58-38.6-86.8h-2.1l-38.6,86.8H707.6z"/>
-<path class="st0" d="M782.7,195.8c0-2.6,2.1-5,5-5h58c32.3,0,54.3,20.9,54.3,48.7c0,20.4-13.5,35.2-25.9,42.3
- c14,5.8,31.8,18.8,31.8,43.1c0,29.6-23.6,51.1-57.7,51.1h-60.3c-2.9,0-5-2.4-5-5V195.8H782.7z M850.2,358.3
- c19.3,0,33.3-14.6,33.3-33.6c0-18.8-17.2-32.6-37.8-32.6H802v66.2H850.2z M845.7,273.9c20.4,0,31.8-14.6,31.8-33.1
- c0-19.1-11.4-31.8-31.8-31.8h-43.1v64.8h43.1V273.9z"/>
-<path class="st1" d="M976.8,192.9c0-2.6,2.4-4.8,5-4.8h6.6l119.4,148.7c0.3,0,0.3,0,0.5,0v-141c0-2.6,2.1-5,5-5h9.3c2.6,0,5,2.4,5,5
- v178.1c0,2.6-2.4,4.8-5,4.8h-4.8L996.4,227.1h-0.3v144c0,2.6-2.1,5-5,5h-9.3c-2.6,0-5-2.4-5-5L976.8,192.9L976.8,192.9z"/>
-<path class="st1" d="M1263.2,188.2c52.9,0,95.3,42.6,95.3,95.5s-42.3,95-95.3,95s-95-42.1-95-95S1210.2,188.2,1263.2,188.2z
- M1263.2,360.2c42.1,0,76.7-34.4,76.7-76.5s-34.7-77-76.7-77s-76.5,34.9-76.5,77S1221.1,360.2,1263.2,360.2z"/>
-<path class="st1" d="M1380.7,197.2c-1.1-3.7,1.1-6.4,4.8-6.4h11.1c2.1,0,4.2,1.9,4.8,3.7l36.8,137.1h1.1l44.2-140.5
- c0.5-1.6,2.1-2.9,4.5-2.9h4.8c2.1,0,4,1.3,4.5,2.9l45,140.5h1.1l36-137.1c0.5-1.9,2.6-3.7,4.8-3.7h11.1c3.7,0,5.8,2.6,4.8,6.4
- l-50,177.8c-0.5,2.1-2.6,3.7-4.8,3.7h-4.2c-1.9,0-3.7-1.3-4.5-2.9l-45.8-143.2h-1.3l-45,143.2c-0.8,1.6-2.6,2.9-4.5,2.9h-4.2
- c-2.1,0-4.2-1.6-4.8-3.7L1380.7,197.2z"/>
-<path class="st0" d="M355,374.8c-4,0-7.7-2.7-8.7-6.8c-1.2-4.8,1.7-9.7,6.6-10.9c34.2-8.5,58.1-39.2,58.1-74.4
- c0-42.3-34.4-76.7-76.7-76.7s-76.7,34.4-76.7,76.7c0,35.3,23.9,65.9,58.1,74.4c4.8,1.2,7.8,6.1,6.6,10.9c-1.2,4.8-6.1,7.8-10.9,6.6
- c-42.2-10.5-71.7-48.4-71.7-91.9c0-52.2,42.5-94.8,94.8-94.8s94.8,42.5,94.8,94.8c0,43.6-29.5,81.4-71.7,91.9
- C356.5,374.7,355.8,374.8,355,374.8z"/>
+<path
+ class="st0"
+ d="m 97.8,197.2 c 0,-3.4 2.6,-6.4 6.4,-6.4 h 7.7 c 3.4,0 6.4,2.9 6.4,6.4 v 74.9 l 82.6,-78.6 c 1.1,-1.3 3.4,-2.6 5,-2.6 h 13 c 4.8,0 7.4,5.3 3.2,9.3 l -83.6,78.1 87.6,89.7 c 1.9,1.9 1.3,8.2 -4.5,8.2 h -13.5 c -1.9,0 -4.2,-1.1 -4.8,-1.9 l -85,-88.7 v 84.2 c 0,3.4 -2.9,6.4 -6.4,6.4 h -7.7 c -3.7,0 -6.4,-2.9 -6.4,-6.4 z"
+ id="path4"
+ style="fill:#65c2ee;fill-opacity:1"
+ inkscape:export-filename="logo_header.png"
+ inkscape:export-xdpi="15.294741"
+ inkscape:export-ydpi="15.294741" />
+<path
+ class="st0"
+ d="m 469.1,195.8 c 0,-2.6 2.1,-5 5,-5 h 10.3 c 2.6,0 5,2.4 5,5 v 162.5 h 76.2 c 2.9,0 5,2.4 5,5 v 7.7 c 0,2.6 -2.1,5 -5,5 H 474 c -2.9,0 -5,-2.4 -5,-5 V 195.8 Z"
+ id="path6"
+ style="fill:#65c2ee;fill-opacity:1" />
+<path
+ class="st0"
+ d="m 581.9,369.2 80.5,-178.1 c 0.8,-1.6 2.1,-2.9 4.5,-2.9 h 2.6 c 2.4,0 3.7,1.3 4.5,2.9 l 79.9,178.1 c 1.6,3.4 -0.5,6.9 -4.5,6.9 h -10.6 c -2.4,0 -4,-1.6 -4.5,-2.9 l -19.6,-43.7 h -93.9 l -19.3,43.7 c -0.5,1.3 -2.1,2.9 -4.5,2.9 h -10.6 c -4,0 -6.1,-3.5 -4.5,-6.9 z m 125.7,-56.1 c -13,-28.8 -25.7,-58 -38.6,-86.8 h -2.1 l -38.6,86.8 z"
+ id="path8"
+ style="fill:#65c2ee;fill-opacity:1" />
+<path
+ class="st0"
+ d="m 782.7,195.8 c 0,-2.6 2.1,-5 5,-5 h 58 c 32.3,0 54.3,20.9 54.3,48.7 0,20.4 -13.5,35.2 -25.9,42.3 14,5.8 31.8,18.8 31.8,43.1 0,29.6 -23.6,51.1 -57.7,51.1 h -60.3 c -2.9,0 -5,-2.4 -5,-5 V 195.8 Z m 67.5,162.5 c 19.3,0 33.3,-14.6 33.3,-33.6 0,-18.8 -17.2,-32.6 -37.8,-32.6 H 802 v 66.2 z m -4.5,-84.4 c 20.4,0 31.8,-14.6 31.8,-33.1 0,-19.1 -11.4,-31.8 -31.8,-31.8 h -43.1 v 64.8 h 43.1 z"
+ id="path10"
+ style="fill:#65c2ee;fill-opacity:1" />
+
+
+
+<path
+ class="st0"
+ d="m 355,374.8 c -4,0 -7.7,-2.7 -8.7,-6.8 -1.2,-4.8 1.7,-9.7 6.6,-10.9 34.2,-8.5 58.1,-39.2 58.1,-74.4 0,-42.3 -34.4,-76.7 -76.7,-76.7 -42.3,0 -76.7,34.4 -76.7,76.7 0,35.3 23.9,65.9 58.1,74.4 4.8,1.2 7.8,6.1 6.6,10.9 -1.2,4.8 -6.1,7.8 -10.9,6.6 -42.2,-10.5 -71.7,-48.4 -71.7,-91.9 0,-52.2 42.5,-94.8 94.8,-94.8 52.3,0 94.8,42.5 94.8,94.8 0,43.6 -29.5,81.4 -71.7,91.9 -1.1,0.1 -1.8,0.2 -2.6,0.2 z"
+ id="path18"
+ style="fill:#65c2ee;fill-opacity:1" />
</svg>
diff --git a/src/resources/themes/default/lang/en/support.php b/src/resources/themes/default/lang/en/support.php
index 13ad1d98..d2fb84a7 100644
--- a/src/resources/themes/default/lang/en/support.php
+++ b/src/resources/themes/default/lang/en/support.php
@@ -1,11 +1,11 @@
<?php
return [
- 'title' => "Contact Support",
- 'text1' => "Our technical support team is here to provide help, should you run into issues."
- . " You won’t have to talk to computers or navigate voice menus, but have actual human beings answering you personally.",
- 'text2' => "This support is already included in your subscription fee, so there are no further costs for you."
- . " If you have issues with your :site account, or questions about our product before you sign up, please contact us.",
+ 'doc1' => "Our documentation contains answers to most frequently asked questions and much more.",
+ 'doc2' => "Are you looking for an instant answer to your question or a quick solution for your problem, our Knowledgebase is where you will likely find it.",
+ 'documentation' => "Documentation",
+ 'support' => "Support",
+ 'search-kb' => "Search Knowledgebase",
];
diff --git a/src/resources/themes/default/pages/support.blade.php b/src/resources/themes/default/pages/support.blade.php
index f66c8068..6ca45d55 100644
--- a/src/resources/themes/default/pages/support.blade.php
+++ b/src/resources/themes/default/pages/support.blade.php
@@ -1,14 +1,13 @@
<div id="support" class="card">
<div class="card-body">
- <h3 class="card-title text-center">@lang('theme::support.title')</h3>
- <p class="card-text text-justify">
- @lang('theme::support.text1')
- <br />
- <br />
- @lang('theme::support.text2', ['site' => config('app.name')])
- </p>
+ <h3 class="card-title text-center">@lang('theme::support.documentation')</h3>
+ <p class="card-text">
+ @lang('theme::support.doc1')
+ <br><br>
+ @lang('theme::support.doc2')
+ </p>
</div>
<div class="card-footer text-center">
- <a href="/support/contact" class="btn btn-primary">@lang('theme::support.title')</a>
+ <a href="https://kb.kolab.org" class="btn btn-primary">@lang('theme::support.search-kb')</a>
</div>
</div>
diff --git a/src/resources/themes/default/theme.json b/src/resources/themes/default/theme.json
index c5e16aba..39e8c76d 100644
--- a/src/resources/themes/default/theme.json
+++ b/src/resources/themes/default/theme.json
@@ -1,49 +1,19 @@
{
"menu": [
- {
- "label": "explore",
- "location": "https://kolabnow.com/",
- "admin": true,
- "reseller": true
- },
- {
- "label": "blog",
- "location": "https://blogs.kolabnow.com/",
- "admin": true,
- "reseller": true
- },
{
"label": "support",
"location": "/support",
"page": "support",
"admin": true,
"reseller": true
- },
- {
- "label": "tos",
- "location": "https://kolabnow.com/tos",
- "footer": true,
- "reseller": true
}
],
"faq": {
"signup": [
- {
- "href": "https://kolabnow.com/tos",
- "label": "tos"
- },
- {
- "href": "https://kb.kolabnow.com/faq/can-i-upgrade-an-individual-account-to-a-group-account",
- "label": "account-upgrade"
- },
- {
- "href": "https://kb.kolabnow.com/faq/how-much-storage-comes-with-my-account",
- "label": "storage"
- },
{
"href": "/support",
"label": "support"
}
]
}
}
diff --git a/src/resources/themes/variables.scss b/src/resources/themes/variables.scss
index 1468b9e6..76fd662a 100644
--- a/src/resources/themes/variables.scss
+++ b/src/resources/themes/variables.scss
@@ -1,15 +1,22 @@
// Body
$body-bg: #fff;
// Typography
$font-family-sans-serif: 'Nunito', sans-serif;
$font-size-base: 0.9rem;
$line-height-base: 1.5;
-$main-color: #007bff;
+// Colors
+$kolab-blue: #65c2ee;
+$light: #f6f5f3;
+
+$main-color: $kolab-blue;
// App colors
-$menu-bg-color: #f8f9fa;
+$menu-bg-color: $light;
$menu-footer-color: #fff;
$menu-footer-bg-color: #aaa;
$menu-gray: #575656;
+
+$table-hover-bg: $menu-bg-color;
+$table-head-bg: $menu-bg-color;
diff --git a/src/tests/Browser/Admin/LogonTest.php b/src/tests/Browser/Admin/LogonTest.php
index 69d7cbbf..3a5f42ca 100644
--- a/src/tests/Browser/Admin/LogonTest.php
+++ b/src/tests/Browser/Admin/LogonTest.php
@@ -1,145 +1,145 @@
<?php
namespace Tests\Browser\Admin;
use Tests\Browser;
use Tests\Browser\Components\Menu;
use Tests\Browser\Components\Toast;
use Tests\Browser\Pages\Dashboard;
use Tests\Browser\Pages\Home;
use Tests\TestCaseDusk;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class LogonTest extends TestCaseDusk
{
/**
* {@inheritDoc}
*/
public function setUp(): void
{
parent::setUp();
self::useAdminUrl();
}
/**
* Test menu on logon page
*/
public function testLogonMenu(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->with(new Menu(), function ($browser) {
- $browser->assertMenuItems(['explore', 'blog', 'support', 'login', 'lang']);
+ $browser->assertMenuItems(['support', 'login', 'lang']);
})
->assertMissing('@second-factor-input')
->assertMissing('@forgot-password');
});
}
/**
* Test redirect to /login if user is unauthenticated
*/
public function testLogonRedirect(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/dashboard');
// Checks if we're really on the login page
$browser->waitForLocation('/login')
->on(new Home());
});
}
/**
* Logon with wrong password/user test
*/
public function testLogonWrongCredentials(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->submitLogon('jeroen@jeroen.jeroen', 'wrong')
// Error message
->assertToast(Toast::TYPE_ERROR, 'Invalid username or password.')
// Checks if we're still on the logon page
->on(new Home());
});
}
/**
* Successful logon test
*/
public function testLogonSuccessful(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->submitLogon('jeroen@jeroen.jeroen', \App\Utils::generatePassphrase(), true);
// Checks if we're really on Dashboard page
$browser->on(new Dashboard())
->within(new Menu(), function ($browser) {
- $browser->assertMenuItems(['explore', 'blog', 'support', 'dashboard', 'logout', 'lang']);
+ $browser->assertMenuItems(['support', 'dashboard', 'logout', 'lang']);
})
->assertUser('jeroen@jeroen.jeroen');
// Test that visiting '/' with logged in user does not open logon form
// but "redirects" to the dashboard
$browser->visit('/')->on(new Dashboard());
});
}
/**
* Logout test
*
* @depends testLogonSuccessful
*/
public function testLogout(): void
{
$this->browse(function (Browser $browser) {
$browser->on(new Dashboard());
// Click the Logout button
$browser->within(new Menu(), function ($browser) {
$browser->clickMenuItem('logout');
});
// We expect the logon page
$browser->waitForLocation('/login')
->on(new Home());
// with default menu
$browser->within(new Menu(), function ($browser) {
- $browser->assertMenuItems(['explore', 'blog', 'support', 'login', 'lang']);
+ $browser->assertMenuItems(['support', 'login', 'lang']);
});
// Success toast message
$browser->assertToast(Toast::TYPE_SUCCESS, 'Successfully logged out');
});
}
/**
* Logout by URL test
*/
public function testLogoutByURL(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->submitLogon('jeroen@jeroen.jeroen', \App\Utils::generatePassphrase(), true);
// Checks if we're really on Dashboard page
$browser->on(new Dashboard());
// Use /logout url, and expect the logon page
$browser->visit('/logout')
->waitForLocation('/login')
->on(new Home());
// with default menu
$browser->within(new Menu(), function ($browser) {
- $browser->assertMenuItems(['explore', 'blog', 'support', 'login', 'lang']);
+ $browser->assertMenuItems(['support', 'login', 'lang']);
});
// Success toast message
$browser->assertToast(Toast::TYPE_SUCCESS, 'Successfully logged out');
});
}
}
diff --git a/src/tests/Browser/FaqTest.php b/src/tests/Browser/FaqTest.php
index 20d485da..065ff207 100644
--- a/src/tests/Browser/FaqTest.php
+++ b/src/tests/Browser/FaqTest.php
@@ -1,27 +1,27 @@
<?php
namespace Tests\Browser;
use Tests\Browser;
use Tests\Browser\Pages\Signup;
use Tests\TestCaseDusk;
class FaqTest extends TestCaseDusk
{
/**
* Test FAQ widget
*/
public function testFaq(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Signup())
->whenAvailable('#faq', function ($browser) {
$browser->assertSeeIn('h5', 'FAQ')
- ->assertElementsCount('ul > li', 4)
+ ->assertElementsCount('ul > li', 1)
->assertSeeIn('li:last-child a', 'Need support?')
->click('li:last-child a');
})
->waitForLocation('/support');
});
}
}
diff --git a/src/tests/Browser/LogonTest.php b/src/tests/Browser/LogonTest.php
index 47c489be..85581558 100644
--- a/src/tests/Browser/LogonTest.php
+++ b/src/tests/Browser/LogonTest.php
@@ -1,292 +1,292 @@
<?php
namespace Tests\Browser;
use Tests\Browser;
use Tests\Browser\Components\Menu;
use Tests\Browser\Components\Toast;
use Tests\Browser\Pages\Dashboard;
use Tests\Browser\Pages\Home;
use Tests\Browser\Pages\UserProfile;
use Tests\TestCaseDusk;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class LogonTest extends TestCaseDusk
{
/**
* Test menu on logon page
*/
public function testLogonMenu(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->within(new Menu(), function ($browser) {
- $browser->assertMenuItems(['signup', 'explore', 'blog', 'support', 'login', 'lang'])
+ $browser->assertMenuItems(['signup', 'support', 'login', 'lang'])
->assertSeeIn('#footer-copyright', \config('app.company.copyright'))
->assertSeeIn('#footer-copyright', date('Y'));
});
if ($browser->isDesktop()) {
$browser->within(new Menu('footer'), function ($browser) {
- $browser->assertMenuItems(['signup', 'explore', 'blog', 'support', 'tos', 'login']);
+ $browser->assertMenuItems(['signup', 'support', 'login']);
});
} else {
$browser->assertMissing('#footer-menu .navbar-nav');
}
$browser->assertSeeLink('Forgot password?')
->assertSeeLink('Webmail');
});
}
/**
* Test language menu, and language change
*/
public function testLocales(): void
{
$this->browse(function (Browser $browser) {
if (!$browser->isDesktop()) {
$this->markTestIncomplete();
}
$browser->visit(new Home())
// ->plainCookie('language', '')
->within(new Menu(), function ($browser) {
$browser->assertSeeIn('@lang', 'EN')
->click('@lang');
})
// Switch English -> German
->whenAvailable('nav .dropdown-menu', function (Browser $browser) {
$browser->assertElementsCount('a', 3)
->assertSeeIn('a:nth-child(1)', 'EN - English')
->assertSeeIn('a:nth-child(2)', 'DE - German')
->assertSeeIn('a:nth-child(3)', 'FR - French')
->click('a:nth-child(2)');
})
->waitUntilMissing('nav .dropdown-menu')
->within(new Menu(), function ($browser) {
$browser->assertSeeIn('@lang', 'DE');
})
->waitForTextIn('#header-menu .link-login', 'EINLOGGEN')
->assertSeeIn('#footer-menu .link-login', 'Einloggen')
->assertSeeIn('@logon-button', 'Anmelden')
// refresh the page to see if it uses the lang previously set
->refresh()
->waitForTextIn('#header-menu .link-login', 'EINLOGGEN')
->assertSeeIn('#footer-menu .link-login', 'Einloggen')
->assertSeeIn('@logon-button', 'Anmelden')
->within(new Menu(), function ($browser) {
$browser->assertSeeIn('@lang', 'DE')
->click('@lang');
})
// Switch German -> English
->whenAvailable('nav .dropdown-menu', function (Browser $browser) {
$browser->assertSeeIn('a:nth-child(1)', 'Englisch')
->click('a:nth-child(1)');
})
->waitUntilMissing('nav .dropdown-menu')
->within(new Menu(), function ($browser) {
$browser->assertSeeIn('@lang', 'EN');
})
->waitForTextIn('#header-menu .link-login', 'LOGIN');
});
}
/**
* Test redirect to /login if user is unauthenticated
*/
public function testRequiredAuth(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/dashboard');
// Checks if we're really on the login page
$browser->waitForLocation('/login')
->on(new Home());
});
}
/**
* Logon with wrong password/user test
*/
public function testLogonWrongCredentials(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->submitLogon('john@kolab.org', 'wrong');
// Error message
$browser->assertToast(Toast::TYPE_ERROR, 'Invalid username or password.');
// Checks if we're still on the logon page
$browser->on(new Home());
});
}
/**
* Successful logon test
*/
public function testLogonSuccessful(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->submitLogon('john@kolab.org', 'simple123', true)
// Checks if we're really on Dashboard page
->on(new Dashboard())
->assertVisible('@links a.link-profile')
->assertVisible('@links a.link-domains')
->assertVisible('@links a.link-users')
->assertVisible('@links a.link-wallet')
->assertVisible('@links a.link-webmail')
->within(new Menu(), function ($browser) {
- $browser->assertMenuItems(['explore', 'blog', 'support', 'dashboard', 'logout', 'lang']);
+ $browser->assertMenuItems(['support', 'dashboard', 'logout', 'lang']);
});
if ($browser->isDesktop()) {
$browser->within(new Menu('footer'), function ($browser) {
- $browser->assertMenuItems(['explore', 'blog', 'support', 'tos', 'dashboard', 'logout']);
+ $browser->assertMenuItems(['support', 'dashboard', 'logout']);
});
} else {
$browser->assertMissing('#footer-menu .navbar-nav');
}
$browser->assertUser('john@kolab.org');
// Assert no "Account status" for this account
$browser->assertMissing('@status');
// Goto /domains and assert that the link on logo element
// leads to the dashboard
$browser->visit('/domains')
->waitForText('Domains')
->click('a.navbar-brand')
->on(new Dashboard());
// Test that visiting '/' with logged in user does not open logon form
// but "redirects" to the dashboard
$browser->visit('/')
->waitForLocation('/dashboard')
->on(new Dashboard());
});
}
/**
* Logout test
*
* @depends testLogonSuccessful
*/
public function testLogout(): void
{
$this->browse(function (Browser $browser) {
$browser->on(new Dashboard());
// Click the Logout button
$browser->within(new Menu(), function ($browser) {
$browser->clickMenuItem('logout');
});
// We expect the logon page
$browser->waitForLocation('/login')
->on(new Home());
// with default menu
$browser->within(new Menu(), function ($browser) {
- $browser->assertMenuItems(['signup', 'explore', 'blog', 'support', 'login', 'lang']);
+ $browser->assertMenuItems(['signup', 'support', 'login', 'lang']);
});
// Success toast message
$browser->assertToast(Toast::TYPE_SUCCESS, 'Successfully logged out');
});
}
/**
* Logout by URL test
*/
public function testLogoutByURL(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->submitLogon('john@kolab.org', 'simple123', true);
// Checks if we're really on Dashboard page
$browser->on(new Dashboard());
// Use /logout url, and expect the logon page
$browser->visit('/logout')
->waitForLocation('/login')
->on(new Home());
// with default menu
$browser->within(new Menu(), function ($browser) {
- $browser->assertMenuItems(['signup', 'explore', 'blog', 'support', 'login', 'lang']);
+ $browser->assertMenuItems(['signup', 'support', 'login', 'lang']);
});
// Success toast message
$browser->assertToast(Toast::TYPE_SUCCESS, 'Successfully logged out');
});
}
/**
* Test 2-Factor Authentication
*
* @depends testLogoutByURL
*/
public function test2FA(): void
{
$this->browse(function (Browser $browser) {
// Test missing 2fa code
$browser->on(new Home())
->type('@email-input', 'ned@kolab.org')
->type('@password-input', 'simple123')
->press('form button')
->waitFor('@second-factor-input.is-invalid + .invalid-feedback')
->assertSeeIn(
'@second-factor-input.is-invalid + .invalid-feedback',
'Second factor code is required.'
)
->assertFocused('@second-factor-input')
->assertToast(Toast::TYPE_ERROR, 'Form validation error');
// Test invalid code
$browser->type('@second-factor-input', '123456')
->press('form button')
->waitUntilMissing('@second-factor-input.is-invalid')
->waitFor('@second-factor-input.is-invalid + .invalid-feedback')
->assertSeeIn(
'@second-factor-input.is-invalid + .invalid-feedback',
'Second factor code is invalid.'
)
->assertFocused('@second-factor-input')
->assertToast(Toast::TYPE_ERROR, 'Form validation error');
$code = \App\Auth\SecondFactor::code('ned@kolab.org');
// Test valid (TOTP) code
$browser->type('@second-factor-input', $code)
->press('form button')
->waitUntilMissing('@second-factor-input.is-invalid')
->waitForLocation('/dashboard')
->on(new Dashboard());
});
}
/**
* Test redirect to the requested page after logon
*
* @depends test2FA
*/
public function testAfterLogonRedirect(): void
{
$this->browse(function (Browser $browser) {
// User is logged in
$browser->visit(new UserProfile());
// Test redirect if the token is invalid
$browser->script("localStorage.setItem('token', '123')");
$browser->refresh()
->on(new Home())
->submitLogon('john@kolab.org', 'simple123', false)
->waitForLocation('/profile');
});
}
}
diff --git a/src/tests/Browser/Reseller/LogonTest.php b/src/tests/Browser/Reseller/LogonTest.php
index 86ae87ac..9bcf3602 100644
--- a/src/tests/Browser/Reseller/LogonTest.php
+++ b/src/tests/Browser/Reseller/LogonTest.php
@@ -1,144 +1,144 @@
<?php
namespace Tests\Browser\Reseller;
use Tests\Browser;
use Tests\Browser\Components\Menu;
use Tests\Browser\Components\Toast;
use Tests\Browser\Pages\Dashboard;
use Tests\Browser\Pages\Home;
use Tests\TestCaseDusk;
class LogonTest extends TestCaseDusk
{
/**
* {@inheritDoc}
*/
public function setUp(): void
{
parent::setUp();
self::useResellerUrl();
}
/**
* Test menu on logon page
*/
public function testLogonMenu(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->with(new Menu(), function ($browser) {
- $browser->assertMenuItems(['explore', 'blog', 'support', 'login', 'lang']);
+ $browser->assertMenuItems(['support', 'login', 'lang']);
})
->assertMissing('@second-factor-input')
->assertMissing('@forgot-password');
});
}
/**
* Test redirect to /login if user is unauthenticated
*/
public function testLogonRedirect(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/dashboard');
// Checks if we're really on the login page
$browser->waitForLocation('/login')
->on(new Home());
});
}
/**
* Logon with wrong password/user test
*/
public function testLogonWrongCredentials(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->submitLogon('reseller@' . \config('app.domain'), 'wrong')
// Error message
->assertToast(Toast::TYPE_ERROR, 'Invalid username or password.')
// Checks if we're still on the logon page
->on(new Home());
});
}
/**
* Successful logon test
*/
public function testLogonSuccessful(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->submitLogon('reseller@' . \config('app.domain'), \App\Utils::generatePassphrase(), true);
// Checks if we're really on Dashboard page
$browser->on(new Dashboard())
->within(new Menu(), function ($browser) {
- $browser->assertMenuItems(['explore', 'blog', 'support', 'dashboard', 'logout', 'lang']);
+ $browser->assertMenuItems(['support', 'dashboard', 'logout', 'lang']);
})
->assertUser('reseller@' . \config('app.domain'));
// Test that visiting '/' with logged in user does not open logon form
// but "redirects" to the dashboard
$browser->visit('/')->on(new Dashboard());
});
}
/**
* Logout test
*
* @depends testLogonSuccessful
*/
public function testLogout(): void
{
$this->browse(function (Browser $browser) {
$browser->on(new Dashboard());
// Click the Logout button
$browser->within(new Menu(), function ($browser) {
$browser->clickMenuItem('logout');
});
// We expect the logon page
$browser->waitForLocation('/login')
->on(new Home());
// with default menu
$browser->within(new Menu(), function ($browser) {
- $browser->assertMenuItems(['explore', 'blog', 'support', 'login', 'lang']);
+ $browser->assertMenuItems(['support', 'login', 'lang']);
});
// Success toast message
$browser->assertToast(Toast::TYPE_SUCCESS, 'Successfully logged out');
});
}
/**
* Logout by URL test
*/
public function testLogoutByURL(): void
{
$this->browse(function (Browser $browser) {
$browser->visit(new Home())
->submitLogon('reseller@' . \config('app.domain'), \App\Utils::generatePassphrase(), true);
// Checks if we're really on Dashboard page
$browser->on(new Dashboard());
// Use /logout url, and expect the logon page
$browser->visit('/logout')
->waitForLocation('/login')
->on(new Home());
// with default menu
$browser->within(new Menu(), function ($browser) {
- $browser->assertMenuItems(['explore', 'blog', 'support', 'login', 'lang']);
+ $browser->assertMenuItems(['support', 'login', 'lang']);
});
// Success toast message
$browser->assertToast(Toast::TYPE_SUCCESS, 'Successfully logged out');
});
}
}

File Metadata

Mime Type
text/x-diff
Expires
Thu, Nov 21, 9:07 PM (10 h, 14 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
80048
Default Alt Text
(44 KB)

Event Timeline