Language editor refactoring part 3 (backend + frontend)

This commit is contained in:
Peter Papp
2021-04-01 07:50:01 +02:00
parent a8fa3694be
commit 5130082111
15 changed files with 448 additions and 903 deletions

View File

@@ -31,7 +31,7 @@ class LanguageController extends Controller
public function get_languages()
{
return response(
new LanguageCollection(Language::all()), 200
new LanguageCollection(Language::sortable(['created_at', 'DESC'])->get()), 200
);
}
@@ -40,12 +40,9 @@ class LanguageController extends Controller
*
* @param Language $language
*/
public function get_language_strings(Language $language)
public function get_language(Language $language)
{
return response([
'current' => $language->languageStrings,
'default' => get_default_language_strings()
], 200);
return response(new LanguageResource($language), 200);
}
/**

View File

@@ -201,8 +201,6 @@ class AppFunctionsController extends Controller
->languageStrings;
});
return $translations->map(function ($string) {
return [$string->key => $string->value];
})->collapse();
return map_language_translations($translations);
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Http\Resources;
use App\Models\Language;
use Illuminate\Http\Resources\Json\ResourceCollection;
class LanguageCollection extends ResourceCollection
@@ -16,10 +17,15 @@ class LanguageCollection extends ResourceCollection
*/
public function toArray($request)
{
$current_language = Language::with('languageStrings')
->whereLocale(get_setting('language') ?? 'en')
->first();
return [
'data' => $this->collection,
'meta' => [
'current_language' => get_setting('language') ?? 'en',
'current_language' => new LanguageResource($current_language),
'default_translations' => get_default_language_strings()
],
];
}

View File

@@ -19,10 +19,11 @@ class LanguageResource extends JsonResource
'id' => $this->id,
'type' => 'languages',
'attributes' => [
'name' => $this->name,
'locale' => $this->locale,
'updated_at' => $this->updated_at,
'created_at' => $this->created_at,
'name' => $this->name,
'locale' => $this->locale,
'translations' => map_language_translations($this->languageStrings),
'updated_at' => $this->updated_at,
'created_at' => $this->created_at,
]
],
];

View File

@@ -526,6 +526,18 @@ function get_file_type($file_mimetype)
}
}
/**
* It map language translations as language key and language value
*
* @param $translations
* @return mixed
*/
function map_language_translations($translations)
{
return $translations->map(function ($string) {
return [$string->key => $string->value];
})->collapse();
}
/**
* Get file type from mimetype

View File

@@ -6,9 +6,19 @@ use App\Services\HelperService;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Model;
use Kyslik\ColumnSortable\Sortable;
/**
* @method static whereLocale(string $param)
*/
class Language extends Model
{
use Sortable;
public $sortable = [
'created_at',
];
protected $guarded = [
'id'
];

View File

@@ -1,13 +1,14 @@
{
"/js/main.js": "/js/main.js",
"/css/app.css": "/css/app.css",
"/chunks/admin.js": "/chunks/admin.js?id=f52318f519af18cb8050",
"/chunks/admin.js": "/chunks/admin.js?id=72b9b9917f6cc48e8349",
"/chunks/admin-account.js": "/chunks/admin-account.js?id=3036df3e72596fabc42e",
"/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~9fa266bc.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~9fa266bc.js?id=ccdd01df520484db752a",
"/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js?id=62b552a0492fe95b2223",
"/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~a001bb84.js": "/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~a001bb84.js?id=0cad8279d29d79cd0e82",
"/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~eeab5771.js": "/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~eeab5771.js?id=99dbb760d4e3dd0acdbf",
"/chunks/admin~chunks/files~chunks/settings~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/admin~chunks/files~chunks/settings~chunks/shared-files~chunks/shared/file-browser.js?id=9b66c2dab4c6103bb53c",
"/chunks/admin~chunks/platform.js": "/chunks/admin~chunks/platform.js?id=5efddad1c72c0f672608",
"/chunks/admin~chunks/platform.js": "/chunks/admin~chunks/platform.js?id=861487bdb5c3a4fa3ff2",
"/chunks/admin~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/shared.js?id=12f0aaeb615c37d0515d",
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=ff4a6b02105eaac93dcd",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js?id=45c8f27411287c7bbf73",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js?id=7702f37f277478ad66c6",
@@ -15,6 +16,8 @@
"/chunks/app-billings.js": "/chunks/app-billings.js?id=82133cc16f55222bbbe6",
"/chunks/app-email.js": "/chunks/app-email.js?id=c578a85112c6a4b1ed0e",
"/chunks/app-index.js": "/chunks/app-index.js?id=7f07dceace5c9c8255bb",
"/chunks/app-language.js": "/chunks/app-language.js?id=218c5ee4bf34a6fdb487",
"/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~38c276fc.js": "/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~38c276fc.js?id=91d6a4649c9277a7bb29",
"/chunks/app-others.js": "/chunks/app-others.js?id=9156adba3b1697a8bf3e",
"/chunks/app-payments.js": "/chunks/app-payments.js?id=7e1a982c90174f568fb2",
"/chunks/app-settings.js": "/chunks/app-settings.js?id=bbf2a2e436d939f7fc07",
@@ -25,7 +28,6 @@
"/chunks/contact-us~chunks/dynamic-page~chunks/homepage.js": "/chunks/contact-us~chunks/dynamic-page~chunks/homepage.js?id=5814ff43ba7c67297af1",
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=48dc53ccbd502c2739ec",
"/chunks/dashboard.js": "/chunks/dashboard.js?id=d93f9d9fbc991dd6a080",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.js?id=177c14bbfda39282a380",
"/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js": "/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js?id=7540af768b1cfda01a13",
"/chunks/database.js": "/chunks/database.js?id=7374830dc3cbddf41abb",
"/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=6dccc2158cc6278f683d",
@@ -51,8 +53,8 @@
"/chunks/plan-settings.js": "/chunks/plan-settings.js?id=66123f72696b47a986a2",
"/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=08e2056bc3744b2ea8f9",
"/chunks/plans.js": "/chunks/plans.js?id=608bdbd5c041b728691a",
"/chunks/platform.js": "/chunks/platform.js?id=d01fa913eb61faa32f92",
"/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=4752741257e431e69704",
"/chunks/platform.js": "/chunks/platform.js?id=6900ccecf3a9a157be76",
"/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=3d5804463c897995e9d1",
"/chunks/profile.js": "/chunks/profile.js?id=fb4a46afdd09cdcdc7da",
"/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=d448806bfefc6cc43f0d",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=e00ee12cde704060e15b",
@@ -86,307 +88,7 @@
"/chunks/user-storage.js": "/chunks/user-storage.js?id=4aec2d7b60ec0bc35fb9",
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=99efdd410910267db66e",
"/chunks/users.js": "/chunks/users.js?id=f1057be5cf73ebc32c14",
"/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~68e3c6cf.js": "/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~68e3c6cf.js?id=b490efdc8470a6c2f625",
"/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~a4a4a595.js": "/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~a4a4a595.js?id=be99c10088b00578891b",
"/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~ch~52c14f2e.js": "/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~ch~52c14f2e.js?id=66afa0e341251a68c3d3",
"/js/main.72f0a691590d8f44f157.hot-update.js": "/js/main.72f0a691590d8f44f157.hot-update.js",
"/js/main.1f68b69727b9e3d27042.hot-update.js": "/js/main.1f68b69727b9e3d27042.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.7831b0195938e6264eb8.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.7831b0195938e6264eb8.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.986f5160c7754d265e84.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.986f5160c7754d265e84.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.9a812a909df92f6d32da.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.9a812a909df92f6d32da.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.c3867d1cd7c4181a21e3.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.c3867d1cd7c4181a21e3.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.c3867d1cd7c4181a21e3.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.c3867d1cd7c4181a21e3.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.e1f67c3f18cbb53803db.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.e1f67c3f18cbb53803db.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.3d7eb1e8c8210c3ee8f0.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.3d7eb1e8c8210c3ee8f0.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.9840fdda58f5b935da2f.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.9840fdda58f5b935da2f.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.9840fdda58f5b935da2f.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.9840fdda58f5b935da2f.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.db2a4ef70c44454e3465.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.db2a4ef70c44454e3465.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.a794ed149f704a490f8c.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.a794ed149f704a490f8c.hot-update.js",
"/chunks/platform~chunks/shared.a794ed149f704a490f8c.hot-update.js": "/chunks/platform~chunks/shared.a794ed149f704a490f8c.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.1e6e34f7d2ab0fd5427b.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.1e6e34f7d2ab0fd5427b.hot-update.js",
"/chunks/platform~chunks/shared.1e6e34f7d2ab0fd5427b.hot-update.js": "/chunks/platform~chunks/shared.1e6e34f7d2ab0fd5427b.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.c30ba9966a1e43efc4d5.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.c30ba9966a1e43efc4d5.hot-update.js",
"/chunks/platform~chunks/shared.c30ba9966a1e43efc4d5.hot-update.js": "/chunks/platform~chunks/shared.c30ba9966a1e43efc4d5.hot-update.js",
"/chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser.fd47538d52b72f3294f2.hot-update.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser.fd47538d52b72f3294f2.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.65532797efcc12385959.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.65532797efcc12385959.hot-update.js",
"/chunks/platform~chunks/shared.65532797efcc12385959.hot-update.js": "/chunks/platform~chunks/shared.65532797efcc12385959.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.6271012800583810345a.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.6271012800583810345a.hot-update.js",
"/chunks/platform~chunks/shared.6271012800583810345a.hot-update.js": "/chunks/platform~chunks/shared.6271012800583810345a.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.ee10b07c2298a884bfbc.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.ee10b07c2298a884bfbc.hot-update.js",
"/chunks/platform~chunks/shared.ee10b07c2298a884bfbc.hot-update.js": "/chunks/platform~chunks/shared.ee10b07c2298a884bfbc.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.5b4c8306b88a089c15f0.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.5b4c8306b88a089c15f0.hot-update.js",
"/chunks/platform~chunks/shared.5b4c8306b88a089c15f0.hot-update.js": "/chunks/platform~chunks/shared.5b4c8306b88a089c15f0.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.7709ce3e5e919205acf7.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.7709ce3e5e919205acf7.hot-update.js",
"/chunks/platform~chunks/shared.7709ce3e5e919205acf7.hot-update.js": "/chunks/platform~chunks/shared.7709ce3e5e919205acf7.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.b1a564c4e7e8a24e2a71.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.b1a564c4e7e8a24e2a71.hot-update.js",
"/chunks/platform~chunks/shared.b1a564c4e7e8a24e2a71.hot-update.js": "/chunks/platform~chunks/shared.b1a564c4e7e8a24e2a71.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.7d91685b5e69c3fa4fb3.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.7d91685b5e69c3fa4fb3.hot-update.js",
"/chunks/platform~chunks/shared.7d91685b5e69c3fa4fb3.hot-update.js": "/chunks/platform~chunks/shared.7d91685b5e69c3fa4fb3.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.fd994ab71f104cc92ef3.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.fd994ab71f104cc92ef3.hot-update.js",
"/chunks/platform~chunks/shared.fd994ab71f104cc92ef3.hot-update.js": "/chunks/platform~chunks/shared.fd994ab71f104cc92ef3.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.5d8c58abd1866409693e.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.5d8c58abd1866409693e.hot-update.js",
"/chunks/platform~chunks/shared.5d8c58abd1866409693e.hot-update.js": "/chunks/platform~chunks/shared.5d8c58abd1866409693e.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.8179a190056560b445ae.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.8179a190056560b445ae.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.def56808e4d294830370.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.def56808e4d294830370.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.a36ba60d667f61e9eec7.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.a36ba60d667f61e9eec7.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.e15f1fa548a93f65eb16.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.e15f1fa548a93f65eb16.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.c312ac01a49b929fba87.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.c312ac01a49b929fba87.hot-update.js",
"/chunks/platform~chunks/shared.c312ac01a49b929fba87.hot-update.js": "/chunks/platform~chunks/shared.c312ac01a49b929fba87.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.7453a9ff96009e423e9c.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.7453a9ff96009e423e9c.hot-update.js",
"/chunks/platform~chunks/shared.7453a9ff96009e423e9c.hot-update.js": "/chunks/platform~chunks/shared.7453a9ff96009e423e9c.hot-update.js",
"/chunks/app-appearance.486aa26f480ea05b1176.hot-update.js": "/chunks/app-appearance.486aa26f480ea05b1176.hot-update.js",
"/chunks/app-appearance.bc60f50b88f5a93e42f8.hot-update.js": "/chunks/app-appearance.bc60f50b88f5a93e42f8.hot-update.js",
"/chunks/app-appearance.fb0cb4011641be8de4f8.hot-update.js": "/chunks/app-appearance.fb0cb4011641be8de4f8.hot-update.js",
"/chunks/app-appearance.e815a589597dff4f5685.hot-update.js": "/chunks/app-appearance.e815a589597dff4f5685.hot-update.js",
"/chunks/app-appearance.44d5b8dcf013107a5294.hot-update.js": "/chunks/app-appearance.44d5b8dcf013107a5294.hot-update.js",
"/chunks/app-appearance.d3d27ea24498ba39c361.hot-update.js": "/chunks/app-appearance.d3d27ea24498ba39c361.hot-update.js",
"/chunks/app-appearance.844fe0955143cc8be1ed.hot-update.js": "/chunks/app-appearance.844fe0955143cc8be1ed.hot-update.js",
"/chunks/app-setup.1a41ce9be4b75218db5b.hot-update.js": "/chunks/app-setup.1a41ce9be4b75218db5b.hot-update.js",
"/js/main.6bae121ef6a8035d49a6.hot-update.js": "/js/main.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/admin.6bae121ef6a8035d49a6.hot-update.js": "/chunks/admin.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/admin-account.6bae121ef6a8035d49a6.hot-update.js": "/chunks/admin-account.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.6bae121ef6a8035d49a6.hot-update.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/app-language.js": "/chunks/app-language.js?id=f8203bca52494677f210",
"/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~38c276fc.js": "/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~38c276fc.js?id=91d6a4649c9277a7bb29",
"/chunks/app-setup.6bae121ef6a8035d49a6.hot-update.js": "/chunks/app-setup.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/billings-detail.6bae121ef6a8035d49a6.hot-update.js": "/chunks/billings-detail.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/create-new-password.6bae121ef6a8035d49a6.hot-update.js": "/chunks/create-new-password.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/database.6bae121ef6a8035d49a6.hot-update.js": "/chunks/database.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/environment-setup.6bae121ef6a8035d49a6.hot-update.js": "/chunks/environment-setup.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/files~chunks/settings~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/files~chunks/settings~chunks/shared-files~chunks/shared/file-browser.js?id=9824eedb24e6bfeef1ae",
"/chunks/forgotten-password.6bae121ef6a8035d49a6.hot-update.js": "/chunks/forgotten-password.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/installation-disclaimer.6bae121ef6a8035d49a6.hot-update.js": "/chunks/installation-disclaimer.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/page-edit.6bae121ef6a8035d49a6.hot-update.js": "/chunks/page-edit.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/plan-create.6bae121ef6a8035d49a6.hot-update.js": "/chunks/plan-create.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/profile.6bae121ef6a8035d49a6.hot-update.js": "/chunks/profile.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/profile~chunks/settings-password.6bae121ef6a8035d49a6.hot-update.js": "/chunks/profile~chunks/settings-password.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/settings-create-payment-methods.6bae121ef6a8035d49a6.hot-update.js": "/chunks/settings-create-payment-methods.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/settings-invoices.6bae121ef6a8035d49a6.hot-update.js": "/chunks/settings-invoices.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/settings-payment-methods.6bae121ef6a8035d49a6.hot-update.js": "/chunks/settings-payment-methods.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/settings-storage.6bae121ef6a8035d49a6.hot-update.js": "/chunks/settings-storage.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/settings-subscription.6bae121ef6a8035d49a6.hot-update.js": "/chunks/settings-subscription.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/sign-in.6bae121ef6a8035d49a6.hot-update.js": "/chunks/sign-in.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/sign-up.6bae121ef6a8035d49a6.hot-update.js": "/chunks/sign-up.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/stripe-credentials.6bae121ef6a8035d49a6.hot-update.js": "/chunks/stripe-credentials.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/subscription-plans.6bae121ef6a8035d49a6.hot-update.js": "/chunks/subscription-plans.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/upgrade-billing.6bae121ef6a8035d49a6.hot-update.js": "/chunks/upgrade-billing.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/user-create.6bae121ef6a8035d49a6.hot-update.js": "/chunks/user-create.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/user-detail.6bae121ef6a8035d49a6.hot-update.js": "/chunks/user-detail.6bae121ef6a8035d49a6.hot-update.js",
"/chunks/user-subscription.6bae121ef6a8035d49a6.hot-update.js": "/chunks/user-subscription.6bae121ef6a8035d49a6.hot-update.js",
"/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~96026abe.js": "/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~96026abe.js?id=36437b5b5c9f3949f1f9",
"/js/main.07fb5f2187ba01ab7de3.hot-update.js": "/js/main.07fb5f2187ba01ab7de3.hot-update.js",
"/chunks/admin.07fb5f2187ba01ab7de3.hot-update.js": "/chunks/admin.07fb5f2187ba01ab7de3.hot-update.js",
"/chunks/platform.07fb5f2187ba01ab7de3.hot-update.js": "/chunks/platform.07fb5f2187ba01ab7de3.hot-update.js",
"/chunks/admin.bfe85963adcdd74eee09.hot-update.js": "/chunks/admin.bfe85963adcdd74eee09.hot-update.js",
"/js/main.10e51312059b92b7fed6.hot-update.js": "/js/main.10e51312059b92b7fed6.hot-update.js",
"/js/main.92ddec9ebe187485a417.hot-update.js": "/js/main.92ddec9ebe187485a417.hot-update.js",
"/js/main.a48a803ca675201bb2c5.hot-update.js": "/js/main.a48a803ca675201bb2c5.hot-update.js",
"/js/main.44a3d4c8448d73f43276.hot-update.js": "/js/main.44a3d4c8448d73f43276.hot-update.js",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.44a3d4c8448d73f43276.hot-update.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.44a3d4c8448d73f43276.hot-update.js",
"/chunks/app-language.44a3d4c8448d73f43276.hot-update.js": "/chunks/app-language.44a3d4c8448d73f43276.hot-update.js",
"/chunks/dashboard.44a3d4c8448d73f43276.hot-update.js": "/chunks/dashboard.44a3d4c8448d73f43276.hot-update.js",
"/chunks/files.44a3d4c8448d73f43276.hot-update.js": "/chunks/files.44a3d4c8448d73f43276.hot-update.js",
"/chunks/invoices.44a3d4c8448d73f43276.hot-update.js": "/chunks/invoices.44a3d4c8448d73f43276.hot-update.js",
"/chunks/page-edit.44a3d4c8448d73f43276.hot-update.js": "/chunks/page-edit.44a3d4c8448d73f43276.hot-update.js",
"/chunks/pages.44a3d4c8448d73f43276.hot-update.js": "/chunks/pages.44a3d4c8448d73f43276.hot-update.js",
"/chunks/plan-create.44a3d4c8448d73f43276.hot-update.js": "/chunks/plan-create.44a3d4c8448d73f43276.hot-update.js",
"/chunks/plans.44a3d4c8448d73f43276.hot-update.js": "/chunks/plans.44a3d4c8448d73f43276.hot-update.js",
"/chunks/platform~chunks/shared.44a3d4c8448d73f43276.hot-update.js": "/chunks/platform~chunks/shared.44a3d4c8448d73f43276.hot-update.js",
"/chunks/profile~chunks/settings-password.44a3d4c8448d73f43276.hot-update.js": "/chunks/profile~chunks/settings-password.44a3d4c8448d73f43276.hot-update.js",
"/chunks/settings.44a3d4c8448d73f43276.hot-update.js": "/chunks/settings.44a3d4c8448d73f43276.hot-update.js",
"/chunks/settings-create-payment-methods.44a3d4c8448d73f43276.hot-update.js": "/chunks/settings-create-payment-methods.44a3d4c8448d73f43276.hot-update.js",
"/chunks/settings-subscription.44a3d4c8448d73f43276.hot-update.js": "/chunks/settings-subscription.44a3d4c8448d73f43276.hot-update.js",
"/chunks/shared.44a3d4c8448d73f43276.hot-update.js": "/chunks/shared.44a3d4c8448d73f43276.hot-update.js",
"/chunks/shared/single-file.44a3d4c8448d73f43276.hot-update.js": "/chunks/shared/single-file.44a3d4c8448d73f43276.hot-update.js",
"/chunks/subscription-plans.44a3d4c8448d73f43276.hot-update.js": "/chunks/subscription-plans.44a3d4c8448d73f43276.hot-update.js",
"/chunks/upgrade-billing~chunks/upgrade-plan.44a3d4c8448d73f43276.hot-update.js": "/chunks/upgrade-billing~chunks/upgrade-plan.44a3d4c8448d73f43276.hot-update.js",
"/chunks/user-create.44a3d4c8448d73f43276.hot-update.js": "/chunks/user-create.44a3d4c8448d73f43276.hot-update.js",
"/chunks/user-subscription.44a3d4c8448d73f43276.hot-update.js": "/chunks/user-subscription.44a3d4c8448d73f43276.hot-update.js",
"/chunks/users.44a3d4c8448d73f43276.hot-update.js": "/chunks/users.44a3d4c8448d73f43276.hot-update.js",
"/chunks/admin-account.8ddde69945402fc189b4.hot-update.js": "/chunks/admin-account.8ddde69945402fc189b4.hot-update.js",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.8ddde69945402fc189b4.hot-update.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.8ddde69945402fc189b4.hot-update.js",
"/chunks/app-language.8ddde69945402fc189b4.hot-update.js": "/chunks/app-language.8ddde69945402fc189b4.hot-update.js",
"/chunks/app-setup.8ddde69945402fc189b4.hot-update.js": "/chunks/app-setup.8ddde69945402fc189b4.hot-update.js",
"/chunks/billings-detail.8ddde69945402fc189b4.hot-update.js": "/chunks/billings-detail.8ddde69945402fc189b4.hot-update.js",
"/chunks/database.8ddde69945402fc189b4.hot-update.js": "/chunks/database.8ddde69945402fc189b4.hot-update.js",
"/chunks/environment-setup.8ddde69945402fc189b4.hot-update.js": "/chunks/environment-setup.8ddde69945402fc189b4.hot-update.js",
"/chunks/installation-disclaimer.8ddde69945402fc189b4.hot-update.js": "/chunks/installation-disclaimer.8ddde69945402fc189b4.hot-update.js",
"/chunks/page-edit.8ddde69945402fc189b4.hot-update.js": "/chunks/page-edit.8ddde69945402fc189b4.hot-update.js",
"/chunks/plan-create.8ddde69945402fc189b4.hot-update.js": "/chunks/plan-create.8ddde69945402fc189b4.hot-update.js",
"/chunks/profile~chunks/settings-password.8ddde69945402fc189b4.hot-update.js": "/chunks/profile~chunks/settings-password.8ddde69945402fc189b4.hot-update.js",
"/chunks/settings-create-payment-methods.8ddde69945402fc189b4.hot-update.js": "/chunks/settings-create-payment-methods.8ddde69945402fc189b4.hot-update.js",
"/chunks/settings-invoices.8ddde69945402fc189b4.hot-update.js": "/chunks/settings-invoices.8ddde69945402fc189b4.hot-update.js",
"/chunks/settings-payment-methods.8ddde69945402fc189b4.hot-update.js": "/chunks/settings-payment-methods.8ddde69945402fc189b4.hot-update.js",
"/chunks/settings-storage.8ddde69945402fc189b4.hot-update.js": "/chunks/settings-storage.8ddde69945402fc189b4.hot-update.js",
"/chunks/settings-subscription.8ddde69945402fc189b4.hot-update.js": "/chunks/settings-subscription.8ddde69945402fc189b4.hot-update.js",
"/chunks/stripe-credentials.8ddde69945402fc189b4.hot-update.js": "/chunks/stripe-credentials.8ddde69945402fc189b4.hot-update.js",
"/chunks/subscription-plans.8ddde69945402fc189b4.hot-update.js": "/chunks/subscription-plans.8ddde69945402fc189b4.hot-update.js",
"/chunks/upgrade-billing.8ddde69945402fc189b4.hot-update.js": "/chunks/upgrade-billing.8ddde69945402fc189b4.hot-update.js",
"/chunks/user-create.8ddde69945402fc189b4.hot-update.js": "/chunks/user-create.8ddde69945402fc189b4.hot-update.js",
"/chunks/user-subscription.8ddde69945402fc189b4.hot-update.js": "/chunks/user-subscription.8ddde69945402fc189b4.hot-update.js",
"/chunks/admin-account.02523e285411c4492fda.hot-update.js": "/chunks/admin-account.02523e285411c4492fda.hot-update.js",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.02523e285411c4492fda.hot-update.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.02523e285411c4492fda.hot-update.js",
"/chunks/app-language.02523e285411c4492fda.hot-update.js": "/chunks/app-language.02523e285411c4492fda.hot-update.js",
"/chunks/app-setup.02523e285411c4492fda.hot-update.js": "/chunks/app-setup.02523e285411c4492fda.hot-update.js",
"/chunks/billings-detail.02523e285411c4492fda.hot-update.js": "/chunks/billings-detail.02523e285411c4492fda.hot-update.js",
"/chunks/database.02523e285411c4492fda.hot-update.js": "/chunks/database.02523e285411c4492fda.hot-update.js",
"/chunks/environment-setup.02523e285411c4492fda.hot-update.js": "/chunks/environment-setup.02523e285411c4492fda.hot-update.js",
"/chunks/installation-disclaimer.02523e285411c4492fda.hot-update.js": "/chunks/installation-disclaimer.02523e285411c4492fda.hot-update.js",
"/chunks/page-edit.02523e285411c4492fda.hot-update.js": "/chunks/page-edit.02523e285411c4492fda.hot-update.js",
"/chunks/plan-create.02523e285411c4492fda.hot-update.js": "/chunks/plan-create.02523e285411c4492fda.hot-update.js",
"/chunks/profile~chunks/settings-password.02523e285411c4492fda.hot-update.js": "/chunks/profile~chunks/settings-password.02523e285411c4492fda.hot-update.js",
"/chunks/settings-create-payment-methods.02523e285411c4492fda.hot-update.js": "/chunks/settings-create-payment-methods.02523e285411c4492fda.hot-update.js",
"/chunks/settings-invoices.02523e285411c4492fda.hot-update.js": "/chunks/settings-invoices.02523e285411c4492fda.hot-update.js",
"/chunks/settings-payment-methods.02523e285411c4492fda.hot-update.js": "/chunks/settings-payment-methods.02523e285411c4492fda.hot-update.js",
"/chunks/settings-storage.02523e285411c4492fda.hot-update.js": "/chunks/settings-storage.02523e285411c4492fda.hot-update.js",
"/chunks/settings-subscription.02523e285411c4492fda.hot-update.js": "/chunks/settings-subscription.02523e285411c4492fda.hot-update.js",
"/chunks/stripe-credentials.02523e285411c4492fda.hot-update.js": "/chunks/stripe-credentials.02523e285411c4492fda.hot-update.js",
"/chunks/subscription-plans.02523e285411c4492fda.hot-update.js": "/chunks/subscription-plans.02523e285411c4492fda.hot-update.js",
"/chunks/upgrade-billing.02523e285411c4492fda.hot-update.js": "/chunks/upgrade-billing.02523e285411c4492fda.hot-update.js",
"/chunks/user-create.02523e285411c4492fda.hot-update.js": "/chunks/user-create.02523e285411c4492fda.hot-update.js",
"/chunks/user-subscription.02523e285411c4492fda.hot-update.js": "/chunks/user-subscription.02523e285411c4492fda.hot-update.js",
"/chunks/app-language.c8716262e93847f9fd31.hot-update.js": "/chunks/app-language.c8716262e93847f9fd31.hot-update.js",
"/chunks/app-language.b58d5d80370333ef35f0.hot-update.js": "/chunks/app-language.b58d5d80370333ef35f0.hot-update.js",
"/chunks/app-language.38d2a21a08247d1696e4.hot-update.js": "/chunks/app-language.38d2a21a08247d1696e4.hot-update.js",
"/js/main.d6c4bb9aff18595d3daa.hot-update.js": "/js/main.d6c4bb9aff18595d3daa.hot-update.js",
"/js/main.f62f909a87cf282c8c3d.hot-update.js": "/js/main.f62f909a87cf282c8c3d.hot-update.js",
"/js/main.d5320dff27364885b2ad.hot-update.js": "/js/main.d5320dff27364885b2ad.hot-update.js",
"/js/main.72da76c0d4f9a836d014.hot-update.js": "/js/main.72da76c0d4f9a836d014.hot-update.js",
"/js/main.10729f5c19355b549f49.hot-update.js": "/js/main.10729f5c19355b549f49.hot-update.js",
"/js/main.c2fea80b35358d7b859d.hot-update.js": "/js/main.c2fea80b35358d7b859d.hot-update.js",
"/js/main.f6b17630a977096356f0.hot-update.js": "/js/main.f6b17630a977096356f0.hot-update.js",
"/js/main.5876b8710dd46bc3aa10.hot-update.js": "/js/main.5876b8710dd46bc3aa10.hot-update.js",
"/js/main.7bb9166a9c24e78b0758.hot-update.js": "/js/main.7bb9166a9c24e78b0758.hot-update.js",
"/js/main.83ad71514c6960e9886c.hot-update.js": "/js/main.83ad71514c6960e9886c.hot-update.js",
"/js/main.3ba68bded39b935f4638.hot-update.js": "/js/main.3ba68bded39b935f4638.hot-update.js",
"/js/main.6e51a85243ead144abbb.hot-update.js": "/js/main.6e51a85243ead144abbb.hot-update.js",
"/js/main.1835342cfe8bd1e5d588.hot-update.js": "/js/main.1835342cfe8bd1e5d588.hot-update.js",
"/js/main.0ede215e9ff7c7da96db.hot-update.js": "/js/main.0ede215e9ff7c7da96db.hot-update.js",
"/js/main.240b44b249b29ae23a07.hot-update.js": "/js/main.240b44b249b29ae23a07.hot-update.js",
"/js/main.2f6367f55101bf82d44c.hot-update.js": "/js/main.2f6367f55101bf82d44c.hot-update.js",
"/js/main.4e9c07e35cb8b64730c8.hot-update.js": "/js/main.4e9c07e35cb8b64730c8.hot-update.js",
"/js/main.55ace7d973622e7a3b3d.hot-update.js": "/js/main.55ace7d973622e7a3b3d.hot-update.js",
"/js/main.b39147c7eb8e57812b7e.hot-update.js": "/js/main.b39147c7eb8e57812b7e.hot-update.js",
"/js/main.a135172ab0de5b0be3fc.hot-update.js": "/js/main.a135172ab0de5b0be3fc.hot-update.js",
"/js/main.6c7cd57cfab9e3fbfeb3.hot-update.js": "/js/main.6c7cd57cfab9e3fbfeb3.hot-update.js",
"/chunks/app-language.7a17dc97730856d8f00e.hot-update.js": "/chunks/app-language.7a17dc97730856d8f00e.hot-update.js",
"/chunks/app-language.c9c9e921c3fd5569074c.hot-update.js": "/chunks/app-language.c9c9e921c3fd5569074c.hot-update.js",
"/chunks/app-language.21043dd8ce9480e40e25.hot-update.js": "/chunks/app-language.21043dd8ce9480e40e25.hot-update.js",
"/chunks/app-language.2d3af715ee6df810a0f2.hot-update.js": "/chunks/app-language.2d3af715ee6df810a0f2.hot-update.js",
"/chunks/app-language.291a9c3748c17466a6bf.hot-update.js": "/chunks/app-language.291a9c3748c17466a6bf.hot-update.js",
"/chunks/app-language.b1f0a7a5c0c8cfae17df.hot-update.js": "/chunks/app-language.b1f0a7a5c0c8cfae17df.hot-update.js",
"/chunks/app-language.142bd08c814ef3ee93b7.hot-update.js": "/chunks/app-language.142bd08c814ef3ee93b7.hot-update.js",
"/chunks/app-language.682670b7f00787e62cce.hot-update.js": "/chunks/app-language.682670b7f00787e62cce.hot-update.js",
"/chunks/app-language.5a36f023c2a4e4d159aa.hot-update.js": "/chunks/app-language.5a36f023c2a4e4d159aa.hot-update.js",
"/chunks/app-language.95cc932bd06ddecce973.hot-update.js": "/chunks/app-language.95cc932bd06ddecce973.hot-update.js",
"/chunks/app-language.7b9e75abfe1177de4cab.hot-update.js": "/chunks/app-language.7b9e75abfe1177de4cab.hot-update.js",
"/chunks/app-language.0b5ef75da485aab561db.hot-update.js": "/chunks/app-language.0b5ef75da485aab561db.hot-update.js",
"/chunks/admin.cf15182869b124a46768.hot-update.js": "/chunks/admin.cf15182869b124a46768.hot-update.js",
"/js/main.5f22439b137aa576c9fe.hot-update.js": "/js/main.5f22439b137aa576c9fe.hot-update.js",
"/js/main.73cc0ba938f5bbbcfb7a.hot-update.js": "/js/main.73cc0ba938f5bbbcfb7a.hot-update.js",
"/js/main.25d741914ffe4a282e4e.hot-update.js": "/js/main.25d741914ffe4a282e4e.hot-update.js",
"/js/main.12c196e4398f7a20fa1f.hot-update.js": "/js/main.12c196e4398f7a20fa1f.hot-update.js",
"/js/main.24b9e39d89ae5b0fa313.hot-update.js": "/js/main.24b9e39d89ae5b0fa313.hot-update.js",
"/js/main.f51962c478c3f07fefb9.hot-update.js": "/js/main.f51962c478c3f07fefb9.hot-update.js",
"/js/main.5a2bf9b87650aff64fd5.hot-update.js": "/js/main.5a2bf9b87650aff64fd5.hot-update.js",
"/js/main.f054d8b8dd508b0f990c.hot-update.js": "/js/main.f054d8b8dd508b0f990c.hot-update.js",
"/js/main.68dfa850d922b0e6735e.hot-update.js": "/js/main.68dfa850d922b0e6735e.hot-update.js",
"/js/main.6503768e6598d7b0f613.hot-update.js": "/js/main.6503768e6598d7b0f613.hot-update.js",
"/js/main.ece1a3972ed2db71b251.hot-update.js": "/js/main.ece1a3972ed2db71b251.hot-update.js",
"/js/main.11de7137d4e877344840.hot-update.js": "/js/main.11de7137d4e877344840.hot-update.js",
"/js/main.fd1a2e92c26d75430cc0.hot-update.js": "/js/main.fd1a2e92c26d75430cc0.hot-update.js",
"/js/main.22a9d4bc8715e0d1e6f4.hot-update.js": "/js/main.22a9d4bc8715e0d1e6f4.hot-update.js",
"/js/main.5aee59e2daa05a84f23f.hot-update.js": "/js/main.5aee59e2daa05a84f23f.hot-update.js",
"/js/main.fcd523fdfaadc502165e.hot-update.js": "/js/main.fcd523fdfaadc502165e.hot-update.js",
"/js/main.5b815448277a546420bd.hot-update.js": "/js/main.5b815448277a546420bd.hot-update.js",
"/js/main.e8e018712bf8029e01c8.hot-update.js": "/js/main.e8e018712bf8029e01c8.hot-update.js",
"/js/main.c6691d9c45c307c43918.hot-update.js": "/js/main.c6691d9c45c307c43918.hot-update.js",
"/js/main.5cf4fd56f1898056455a.hot-update.js": "/js/main.5cf4fd56f1898056455a.hot-update.js",
"/js/main.658eb718f5a8cb57f236.hot-update.js": "/js/main.658eb718f5a8cb57f236.hot-update.js",
"/js/main.9773de534e46d93390ef.hot-update.js": "/js/main.9773de534e46d93390ef.hot-update.js",
"/js/main.bf30b07e4dd1995e85a0.hot-update.js": "/js/main.bf30b07e4dd1995e85a0.hot-update.js",
"/js/main.7ecc1b7aad3dc3021c98.hot-update.js": "/js/main.7ecc1b7aad3dc3021c98.hot-update.js",
"/js/main.4010b76509bf45947101.hot-update.js": "/js/main.4010b76509bf45947101.hot-update.js",
"/js/main.65a3d466223e5e6c1beb.hot-update.js": "/js/main.65a3d466223e5e6c1beb.hot-update.js",
"/js/main.3eb9149083fb318a0963.hot-update.js": "/js/main.3eb9149083fb318a0963.hot-update.js",
"/js/main.6ae22926ae15c1767990.hot-update.js": "/js/main.6ae22926ae15c1767990.hot-update.js",
"/js/main.9c5390bef5da0e9e6925.hot-update.js": "/js/main.9c5390bef5da0e9e6925.hot-update.js",
"/js/main.242ffff65076162bec7c.hot-update.js": "/js/main.242ffff65076162bec7c.hot-update.js",
"/js/main.3733c1423bed0ce7e0f9.hot-update.js": "/js/main.3733c1423bed0ce7e0f9.hot-update.js",
"/js/main.1c655c61e7eaa93d426b.hot-update.js": "/js/main.1c655c61e7eaa93d426b.hot-update.js",
"/js/main.8da9a71671e9894184cc.hot-update.js": "/js/main.8da9a71671e9894184cc.hot-update.js",
"/js/main.effea649478a1ff5afc3.hot-update.js": "/js/main.effea649478a1ff5afc3.hot-update.js",
"/js/main.2feca9387b29299382e8.hot-update.js": "/js/main.2feca9387b29299382e8.hot-update.js",
"/js/main.524799cef36fd2add28a.hot-update.js": "/js/main.524799cef36fd2add28a.hot-update.js",
"/js/main.321e16ed74b62b1bc65a.hot-update.js": "/js/main.321e16ed74b62b1bc65a.hot-update.js",
"/js/main.2d3b0e5931d977aeff92.hot-update.js": "/js/main.2d3b0e5931d977aeff92.hot-update.js",
"/js/main.78defc1a15bab59f210e.hot-update.js": "/js/main.78defc1a15bab59f210e.hot-update.js",
"/js/main.f52c39d754bee5a76d48.hot-update.js": "/js/main.f52c39d754bee5a76d48.hot-update.js",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.32a53e956e9fc646121b.hot-update.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.32a53e956e9fc646121b.hot-update.js",
"/js/main.f8f6d9903beeb494c2c4.hot-update.js": "/js/main.f8f6d9903beeb494c2c4.hot-update.js",
"/chunks/upgrade-billing.be406f8d88294226946e.hot-update.js": "/chunks/upgrade-billing.be406f8d88294226946e.hot-update.js",
"/js/main.bbdfe1e59fd5beefb761.hot-update.js": "/js/main.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/app-language.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/app-language.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/app-settings.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/app-settings.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/dashboard.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/dashboard.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/invoices.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/invoices.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/page-edit.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/page-edit.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/pages.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/pages.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/plan.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/plan.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/plan-create.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/plan-create.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/plans.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/plans.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/settings.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/settings.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/upgrade-plan.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/upgrade-plan.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/user.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/user.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/user-create.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/user-create.bbdfe1e59fd5beefb761.hot-update.js",
"/chunks/users.bbdfe1e59fd5beefb761.hot-update.js": "/chunks/users.bbdfe1e59fd5beefb761.hot-update.js",
"/js/main.01104cf99d2419e4cff5.hot-update.js": "/js/main.01104cf99d2419e4cff5.hot-update.js",
"/chunks/user-detail.70aa7cd8919409d5329d.hot-update.js": "/chunks/user-detail.70aa7cd8919409d5329d.hot-update.js",
"/chunks/user-detail.abab6cd92cf0ce6e5da1.hot-update.js": "/chunks/user-detail.abab6cd92cf0ce6e5da1.hot-update.js",
"/chunks/user-detail.3aeb7d2c0d711416d022.hot-update.js": "/chunks/user-detail.3aeb7d2c0d711416d022.hot-update.js",
"/js/main.c3bb4db3a10c3e7da846.hot-update.js": "/js/main.c3bb4db3a10c3e7da846.hot-update.js",
"/chunks/user-detail.b8273c0cbf64d8c37f0d.hot-update.js": "/chunks/user-detail.b8273c0cbf64d8c37f0d.hot-update.js",
"/js/main.8d2870a7f6cd043b1b56.hot-update.js": "/js/main.8d2870a7f6cd043b1b56.hot-update.js",
"/chunks/user-detail.481fcbccadf1d85bb84d.hot-update.js": "/chunks/user-detail.481fcbccadf1d85bb84d.hot-update.js",
"/chunks/user-create.21af3e31acb57affbb30.hot-update.js": "/chunks/user-create.21af3e31acb57affbb30.hot-update.js",
"/chunks/platform.82ef2de1f5d5a15e5446.hot-update.js": "/chunks/platform.82ef2de1f5d5a15e5446.hot-update.js",
"/js/main.d4655186eae7d4540c7f.hot-update.js": "/js/main.d4655186eae7d4540c7f.hot-update.js",
"/js/main.64ddd23eefa675cfaab6.hot-update.js": "/js/main.64ddd23eefa675cfaab6.hot-update.js",
"/chunks/platform.64ddd23eefa675cfaab6.hot-update.js": "/chunks/platform.64ddd23eefa675cfaab6.hot-update.js",
"/js/main.db75ecd9cb148f639799.hot-update.js": "/js/main.db75ecd9cb148f639799.hot-update.js",
"/chunks/platform.03e534084ee57f0df865.hot-update.js": "/chunks/platform.03e534084ee57f0df865.hot-update.js",
"/js/main.cad4d506db65c874752f.hot-update.js": "/js/main.cad4d506db65c874752f.hot-update.js",
"/js/main.e0ca35e6005ab952ca74.hot-update.js": "/js/main.e0ca35e6005ab952ca74.hot-update.js",
"/chunks/platform.c9ef0bbe6780298726c3.hot-update.js": "/chunks/platform.c9ef0bbe6780298726c3.hot-update.js",
"/js/main.ed1830b2e9923c4fc468.hot-update.js": "/js/main.ed1830b2e9923c4fc468.hot-update.js",
"/js/main.2f3472937802bef1d477.hot-update.js": "/js/main.2f3472937802bef1d477.hot-update.js",
"/js/main.72a0e44bc3f667c8827e.hot-update.js": "/js/main.72a0e44bc3f667c8827e.hot-update.js",
"/js/main.393fa5e7c6f032bd7ed3.hot-update.js": "/js/main.393fa5e7c6f032bd7ed3.hot-update.js",
"/chunks/platform.9c847b10ae42904ade0c.hot-update.js": "/chunks/platform.9c847b10ae42904ade0c.hot-update.js",
"/js/main.25e97be58e8ad534ac68.hot-update.js": "/js/main.25e97be58e8ad534ac68.hot-update.js",
"/chunks/platform.79c947683f7b736dfbf4.hot-update.js": "/chunks/platform.79c947683f7b736dfbf4.hot-update.js",
"/js/main.99a27194326c25d6c5f1.hot-update.js": "/js/main.99a27194326c25d6c5f1.hot-update.js",
"/js/main.76b686290715137fa46c.hot-update.js": "/js/main.76b686290715137fa46c.hot-update.js",
"/js/main.bff53b154a3a16bef585.hot-update.js": "/js/main.bff53b154a3a16bef585.hot-update.js",
"/js/main.d1bb5dc97a65d1a1a05e.hot-update.js": "/js/main.d1bb5dc97a65d1a1a05e.hot-update.js",
"/js/main.f873615bdd326afe3081.hot-update.js": "/js/main.f873615bdd326afe3081.hot-update.js",
"/js/main.048230621fbc0d8c6d6a.hot-update.js": "/js/main.048230621fbc0d8c6d6a.hot-update.js",
"/js/main.20aa3ff157dd70285d03.hot-update.js": "/js/main.20aa3ff157dd70285d03.hot-update.js",
"/vendors~chunks/admin-account~chunks/app-email~chunks/app-payments~chunks/app-setup~chunks/billings-d~23f47ab3.js": "/vendors~chunks/admin-account~chunks/app-email~chunks/app-payments~chunks/app-setup~chunks/billings-d~23f47ab3.js?id=6e0b5019781341c44a55",
"/js/main.2f5369d54fc47cc3613a.hot-update.js": "/js/main.2f5369d54fc47cc3613a.hot-update.js",
"/js/main.0b552d8a9f2f71d60a3f.hot-update.js": "/js/main.0b552d8a9f2f71d60a3f.hot-update.js",
"/js/main.b6d9a605b27d6f90d3fb.hot-update.js": "/js/main.b6d9a605b27d6f90d3fb.hot-update.js",
"/js/main.588244a8f38242c0f498.hot-update.js": "/js/main.588244a8f38242c0f498.hot-update.js",
"/js/main.625211bd2d49952ddaec.hot-update.js": "/js/main.625211bd2d49952ddaec.hot-update.js",
"/js/main.35317a4f599286d0cc33.hot-update.js": "/js/main.35317a4f599286d0cc33.hot-update.js",
"/js/main.a865b9e77d0cdb2d3b26.hot-update.js": "/js/main.a865b9e77d0cdb2d3b26.hot-update.js",
"/js/main.6da8349a3377d596fee1.hot-update.js": "/js/main.6da8349a3377d596fee1.hot-update.js",
"/js/main.2359a05cb36cbfe74a5d.hot-update.js": "/js/main.2359a05cb36cbfe74a5d.hot-update.js",
"/js/main.8afc74651778fba7ba28.hot-update.js": "/js/main.8afc74651778fba7ba28.hot-update.js",
"/js/main.434d7133378bdca4046d.hot-update.js": "/js/main.434d7133378bdca4046d.hot-update.js",
"/js/main.083f1ce04dbf53d25a69.hot-update.js": "/js/main.083f1ce04dbf53d25a69.hot-update.js",
"/js/main.5fd6b0c0ac064f4a2961.hot-update.js": "/js/main.5fd6b0c0ac064f4a2961.hot-update.js",
"/js/main.dfdfbf318f0ffeccb0f9.hot-update.js": "/js/main.dfdfbf318f0ffeccb0f9.hot-update.js",
"/js/main.80201fafcbad093d3a45.hot-update.js": "/js/main.80201fafcbad093d3a45.hot-update.js",
"/js/main.2083d295513550522f63.hot-update.js": "/js/main.2083d295513550522f63.hot-update.js"
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~0d496e20.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~0d496e20.js?id=a9facd8e57a0dd054f8c",
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~7afe9e20.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~7afe9e20.js?id=6d6e7e4191c9e2705c8a",
"/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~ch~52c14f2e.js": "/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~ch~52c14f2e.js?id=66afa0e341251a68c3d3"
}

View File

@@ -2,46 +2,46 @@
<PopupWrapper name="create-language">
<!--Title-->
<PopupHeader :title="'Create Language'" icon="edit" />
<!--TODO: jazyk-->
<PopupHeader title="Create Language" icon="edit" />
<!--Content-->
<PopupContent>
<!--Form to set sharing-->
<ValidationObserver @submit.prevent="createFolder" ref="createForm" v-slot="{ invalid }" tag="form" class="form-wrapper">
<ValidationObserver @submit.prevent="createLanguage" ref="createForm" v-slot="{ invalid }" tag="form" class="form-wrapper">
<!--Set password-->
<ValidationProvider tag="div" mode="passive" class="input-wrapper password" name="Language Name" rules="required" v-slot="{ errors }">
<label class="input-label">Type Name:</label>
<input v-model="name" :class="{'is-error': errors[0]}" type="text" ref="input" placeholder="Type Language Name">
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
<!--Set password-->
<ValidationProvider tag="div" mode="passive" class="input-wrapper password" name="Language Locale" rules="required" v-slot="{ errors }">
<label class="input-label">Select Locale:</label>
<SelectInput v-model="locale" :options="allLocals" placeholder="Select Language Locale" :isError="errors[0]"/>
<SelectInput v-model="form.locale" :options="locals" placeholder="Select Language Locale" :isError="errors[0]" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
<ValidationProvider tag="div" mode="passive" class="input-wrapper password" name="Language Name" rules="required" v-slot="{ errors }">
<label class="input-label">Type Name:</label>
<input v-model="form.name" :class="{'is-error': errors[0]}" type="text" ref="input" class="focus-border-theme" placeholder="Type Language Name">
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</ValidationObserver>
</PopupContent>
<!--Actions-->
<PopupActions>
<ButtonBase
class="popup-button"
@click.native="$closePopup()"
button-style="secondary"
>Cancel
class="popup-button"
@click.native="$closePopup()"
button-style="secondary"
>
Cancel
</ButtonBase>
<ButtonBase
class="popup-button"
@click.native="createLanguage"
button-style="theme"
:loading="isLoading"
:disabled="isLoading"
>Create Language
class="popup-button"
@click.native="createLanguage"
button-style="theme"
:loading="isLoading"
:disabled="isLoading"
>
Create Language
</ButtonBase>
</PopupActions>
</PopupWrapper>
@@ -74,10 +74,12 @@ export default {
},
data() {
return {
name: undefined,
locale: undefined,
form: {
name: undefined,
locale: undefined,
},
isLoading: false,
allLocals: [
locals: [
{
value: "ab",
label: "Abkhaz"
@@ -823,43 +825,43 @@ export default {
},
methods: {
async createLanguage() {
// Validate fields
const isValid = await this.$refs.createForm.validate();
if (isValid) {
this.isLoading = true
this.isLoading = true
axios.post('/api/languages', {
name: this.name,
locale: this.locale
})
.then((response) => {
axios.post('/api/admin/languages', this.form)
.then(response => {
events.$emit('reload:languages', response.data)
})
.catch(() => {
this.$isSomethingWrong()
})
.finally(() => {
events.$emit('add-language', response.data)
})
.catch(() => Vue.prototype.$isSomethingWrong())
.finally(() => {
this.form = {
name: undefined,
locale: undefined,
}
this.name = undefined
this.locale = undefined
this.isLoading = false
this.$closePopup()
})
this.isLoading = false
this.$closePopup()
})
}
},
},
mounted () {
mounted() {
this.name = undefined,
this.locale = undefined
this.locale = undefined
}
}
</script>
<style scoped lang="scss">
@import "@assets/vue-file-manager/_inapp-forms.scss";
@import '@assets/vue-file-manager/_forms';
@import "@assets/vuefilemanager/_inapp-forms.scss";
@import '@assets/vuefilemanager/_forms';
.item-thumbnail {
margin-bottom: 20px;

View File

@@ -0,0 +1,108 @@
<template>
<div class="search-bar">
<div v-if="!query" class="icon">
<search-icon size="19" />
</div>
<div @click="clearInput" v-if="query" class="icon">
<x-icon class="pointer" size="19"></x-icon>
</div>
<input
v-model="query"
@input="$emit('input', query)"
class="query"
type="text"
name="searchInput"
placeholder="Search Language Strings..."
/>
</div>
</template>
<script>
import {SearchIcon, XIcon} from 'vue-feather-icons'
export default {
name: 'SearchInput',
components: {
SearchIcon,
XIcon,
},
data() {
return {
query: undefined,
}
},
methods: {
clearInput() {
this.query = undefined
this.$emit('reset-query')
},
},
}
</script>
<style lang="scss" scoped>
@import '@assets/vuefilemanager/_variables';
@import '@assets/vuefilemanager/_mixins';
@import '@assets/vuefilemanager/_forms';
.search-bar {
padding: 7px 0px;
position: relative;
width: 100%;
border-radius: 8px;
input {
background: $light_background;
border-radius: 8px;
outline: 0;
padding: 9px 20px 9px 43px;
font-weight: 700;
@include font-size(16);
width: 100%;
height: 50px;
min-width: 175px;
transition: 0.15s all ease;
border: 1px solid transparent;
-webkit-appearance: none;
box-shadow: none;
&::placeholder {
color: $light_text;
@include font-size(14);
font-weight: 700;
}
&:focus {
border: 1px solid $theme;
box-shadow: 0 0 7px rgba($theme, 0.3);
}
&:focus + .icon {
path {
fill: $theme;
}
}
}
.icon {
height: 100%;
position: absolute;
top: 0;
left: 0;
padding: 11px 15px;
display: flex;
align-items: center;
circle,
line {
color: $light_text;
}
.pointer {
cursor: pointer;
}
}
}
</style>

View File

@@ -1,8 +1,14 @@
<template>
<section id="viewport">
<!--Confirm Popup-->
<Confirm />
<!-- Create language popup -->
<CreateLanguage/>
<!--Navigation Sidebar-->
<MenuBar />
<MenuBar/>
<ContentSidebar>
@@ -82,7 +88,9 @@
<script>
import { UsersIcon, SettingsIcon, FileTextIcon, CreditCardIcon, DatabaseIcon, BoxIcon, MonitorIcon, GlobeIcon } from 'vue-feather-icons'
import ContentSidebar from '@/components/Sidebar/ContentSidebar'
import CreateLanguage from '@/components/Others/CreateLanguage'
import ContentGroup from '@/components/Sidebar/ContentGroup'
import Confirm from '@/components/Others/Popup/Confirm'
import MenuBar from '@/components/Sidebar/MenuBar'
import { mapGetters } from 'vuex'
@@ -92,6 +100,7 @@
...mapGetters(['config']),
},
components: {
CreateLanguage,
ContentSidebar,
CreditCardIcon,
FileTextIcon,
@@ -100,9 +109,10 @@
SettingsIcon,
MonitorIcon,
UsersIcon,
GlobeIcon,
Confirm,
MenuBar,
BoxIcon,
GlobeIcon
},
}
</script>

View File

@@ -1,161 +1,246 @@
<template>
<div id="single-page">
<div id="page-content">
<MobileHeader :title="$t($router.currentRoute.meta.title)" />
<div class="wrapper">
<Spinner v-if="! isLoadedLanguages" />
<div v-if="isLoadedLanguages" class="side-content">
<PageHeader :can-back="true" :title="$t($router.currentRoute.meta.title)" />
<MobileHeader title="Languages" />
<PageHeader title="Languages" />
<div class="languages-wrapper page-tab from-fixed-width">
<div class="language-label-wrapper">
<label class="language-label">Languages</label>
</div>
<div v-if="languages" class="content-page">
<!-- Languages -->
<div class="all-language-wrapper">
<div @click="openLanguage(language)" v-for="language in languages" :key="language.id">
<div class="language">
<label class="name" :class="{'active' :activeLanguage.locale === language.locale}">
{{ language.name }}
<!--Sidebar-->
<div class="side-content">
<div class="sticky top-65">
<div class="languages-wrapper page-tab from-fixed-width">
<div class="language-label-wrapper">
<label class="language-label">Languages</label>
</div>
<!-- Languages -->
<div class="all-language-wrapper">
<div @click="getLanguage(language)" v-for="language in languages" :key="language.data.id" class="language">
<label class="name" :class="{'active': selectedLanguage && selectedLanguage.data.attributes.locale === language.data.attributes.locale}">
{{ language.data.attributes.name }}
</label>
<x-icon v-if="language.locale !== 'en' && language.locale !== current_language"
@click.stop="deleteLanguageConfirm(language)"
class="icon" size="17" />
<x-icon
v-if="language.data.attributes.locale !== 'en'"
@click.stop="deleteLanguage(language)"
class="icon"
size="17"
/>
</div>
</div>
</div>
</div>
<MobileActionButton @click.native="createLanguage" icon="plus" class="button-add-language">
Add Language
</MobileActionButton>
<MobileActionButton @click.native="createLanguage" icon="plus" class="button-add-language">
Add Language
</MobileActionButton>
</div>
</div>
<!-- Strings -->
<!--<LanguageStrings :active-language="activeLanguage" :set-language="current_language" />-->
<!--Content-->
<div class="form block-form content">
<div v-if="! selectedLanguage">
<Spinner />
</div>
<div v-if="selectedLanguage">
<FormLabel icon="settings">
Language Settings
</FormLabel>
<!--Set default language-->
<div class="block-wrapper">
<div class="input-wrapper">
<div class="inline-wrapper">
<div class="switch-label">
<label class="input-label">
Set as Default Language:
</label>
</div>
<SwitchInput
@input="$updateText(`/admin/languages/${selectedLanguage.data.id}`, 'language', selectedLanguage.data.attributes.locale)"
class="switch"
:class="{'disable-switch': selectedLanguage.data.attributes.locale !== }"
/>
</div>
</div>
</div>
<!--Language name-->
<div class="block-wrapper">
<label>Language Name:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="App Description" rules="required" v-slot="{ errors }">
<input @input="$updateText(`/admin/languages/${selectedLanguage.data.id}`, 'name', selectedLanguage.data.attributes.name)" v-model="selectedLanguage.data.attributes.name"
:placeholder="$t('admin_settings.appearance.description_plac')" type="text" :class="{'is-error': errors[0]}" class="focus-border-theme" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<!--Translations-->
<FormLabel class="mt-70">
Edit Translations
</FormLabel>
<!--Inline Search-->
<div class="block-wrapper sticky top-50 search-bar-wrapper">
<SearchInput v-model="query" @reset-query="query = ''" />
</div>
<div class="block-wrapper" v-for="(translation, key) in translationList" :key="key">
<label> {{ defaultTranslations[key] }}:</label>
<ValidationProvider tag="div" class="input-wrapper" name="Language string" rules="required" v-slot="{ errors }">
<input type="text"
:class="{'is-error': errors[0]}"
class="focus-border-theme"
@input="$updateText(`/admin/languages/${selectedLanguage.data.id}/strings`, key, selectedLanguage.data.attributes.translations[key])"
v-model="selectedLanguage.data.attributes.translations[key]"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
</div>
</div>
<Spinner v-if="! languages" />
</div>
</div>
</template>
<script>
import LanguageStrings from '@/views/Admin/Languages/LanguageStrings'
import MobileHeader from '@/components/Mobile/MobileHeader'
import ButtonBase from '@/components/FilesView/ButtonBase'
import MobileActionButton from '@/components/FilesView/MobileActionButton'
import PageHeader from '@/components/Others/PageHeader'
import Spinner from '@/components/FilesView/Spinner'
import {PlusIcon, XIcon} from 'vue-feather-icons'
import {events} from '@/bus'
import {ValidationProvider, ValidationObserver} from 'vee-validate/dist/vee-validate.full'
import MobileActionButton from '@/components/FilesView/MobileActionButton'
import SwitchInput from '@/components/Others/Forms/SwitchInput'
import SearchInput from '@/components/Others/Forms/SearchInput'
import FormLabel from '@/components/Others/Forms/FormLabel'
import MobileHeader from '@/components/Mobile/MobileHeader'
import ButtonBase from '@/components/FilesView/ButtonBase'
import PageHeader from '@/components/Others/PageHeader'
import Spinner from '@/components/FilesView/Spinner'
import {PlusIcon, XIcon} from 'vue-feather-icons'
import {debounce, omitBy} from 'lodash'
import {events} from '@/bus'
export default {
name: 'Language',
components: {
MobileActionButton,
LanguageStrings,
MobileHeader,
ButtonBase,
PageHeader,
PlusIcon,
Spinner,
XIcon
},
data() {
return {
languages: undefined,
activeLanguage: undefined,
languagesStrings: undefined,
current_language: undefined,
isLoadedLanguages: false,
}
},
methods: {
deleteLanguageConfirm(language) {
events.$emit('confirm:open', {
title: `Delete ${language.name} language?`,
message: 'Your language will be permanently deleted.',
buttonColor: 'danger-solid',
action: language
})
export default {
name: 'Language',
components: {
ValidationProvider,
ValidationObserver,
MobileActionButton,
MobileHeader,
SearchInput,
SwitchInput,
ButtonBase,
PageHeader,
FormLabel,
PlusIcon,
Spinner,
XIcon
},
deleteLanguage(language) {
axios.delete(`/api/admin/languages/${language.id}`)
.then(() => {
this.getLanguages()
})
data() {
return {
defaultTranslations: undefined,
selectedLanguage: undefined,
occurrences: undefined,
languages: undefined,
query: '',
}
},
createLanguage() {
events.$emit('popup:open', {name: 'create-language'})
watch: {
query: debounce(function (val) {
this.occurrences = omitBy(this.selectedLanguage.data.attributes.translations, (string, key) => {
return !string.toLowerCase().includes(val.toLowerCase())
})
}, 300),
},
getLanguages() {
axios
.get('/api/admin/languages')
.then(response => {
this.languages = response.data.data
this.activeLanguage = response.data.languages[0]
this.current_language = response.data.meta.current_language
})
.catch(() => {
this.$isSomethingWrong()
})
.finally(() => {
this.isLoadedLanguages = true
})
computed: {
translationList() {
return this.occurrences && this.query !== ''
? this.occurrences
: this.selectedLanguage.data.attributes.translations
}
},
openLanguage(language) {
this.activeLanguage = language
}
},
mounted() {
this.getLanguages()
methods: {
getLanguages() {
axios
.get('/api/admin/languages')
.then(response => {
this.languages = response.data.data
this.defaultTranslations = response.data.meta.default_translations
this.selectedLanguage = response.data.meta.current_language
})
.catch(() => {
this.$isSomethingWrong()
})
},
getLanguage(language) {
this.selectedLanguage = undefined
events.$on('add-language', () => {
axios
.get(`/api/admin/languages/${language.data.id}`)
.then(response => {
this.selectedLanguage = response.data
})
.catch(() => {
this.$isSomethingWrong()
})
},
deleteLanguage(language) {
events.$emit('confirm:open', {
title: `Delete "${language.data.attributes.name}" language?`,
message: 'Your language will be permanently deleted.',
buttonColor: 'danger-solid',
action: {
id: language.data.id,
operation: 'delete-language'
}
})
},
createLanguage() {
events.$emit('popup:open', {name: 'create-language'})
},
},
mounted() {
this.getLanguages()
})
events.$on('action:confirmed', language => {
this.deleteLanguage(language)
})
events.$on('reload:languages', () => this.getLanguages())
events.$on('language-name:update', (language) => {
events.$on('action:confirmed', data => {
let index = _.findIndex(this.languages, function (item) {
return item.id === language.id
if (data.operation === 'delete-language')
axios.delete(`/api/admin/languages/${data.id}`)
.then(() => this.getLanguages())
.catch(() => this.$isSomethingWrong())
})
this.languages[index].name = language.name
})
events.$on('language:set-as-default', (locale) => {
this.current_language = locale
})
},
destroyed() {
events.$off('action:confirmed')
},
}
},
destroyed() {
events.$off('action:confirmed')
},
}
</script>
<style lang="scss" scoped>
@import '@assets/vuefilemanager/_variables';
@import '@assets/vuefilemanager/_mixins';
@import '@assets/vuefilemanager/_forms';
@import '@assets/vuefilemanager/_vuewind';
#single-page {
height: 100%;
#page-content {
height: 100%;
}
.search-bar-wrapper {
background: white;
padding: 10px 10px 0 10px;
margin: 0 -10px;
}
.wrapper {
.content-page {
display: flex;
height: 100%;
max-width: 1000px;
margin: 20px auto 0;
.content {
width: 100%;
position: relative;
}
}
.side-content {
@@ -163,22 +248,9 @@ export default {
.button-add-language {
margin-top: 30px;
/deep/ .content {
display: flex;
align-items: center;
@include font-size(14);
font-weight: 700;
.icon {
margin-right: 10px;
}
}
}
.languages-wrapper {
margin-top: 70px;
.language-label-wrapper {
margin-bottom: 5px;
@@ -261,6 +333,7 @@ export default {
color: $dark_mode_text_primary !important;
}
}
.language-label {
color: $dark_mode_text_secondary !important;
}

View File

@@ -1,397 +0,0 @@
<template>
<!-- Serach bar -->
<div v-if="strings" class="language-strings-wrapper form">
<div class="search-bar-wrapper">
<div class="search-bar">
<div v-if="!searchInput" class="icon" >
<search-icon size="19"></search-icon>
</div>
<div @click="resetInput" v-if="searchInput" class="icon">
<x-icon class="pointer" size="19"></x-icon>
</div>
<input
v-model="searchInput"
@input="searchStrings"
class="query"
type="text"
name="searchInput"
placeholder="Search Language Strings..."
/>
</div>
</div>
<Spinner v-if="!loadedStrings"/>
<!-- Set Language as default switch -->
<div v-if="loadedStrings" class="form block-form">
<FormLabel class="mt-70" icon="settings">Language Settings</FormLabel>
<div class="block-wrapper">
<div class="input-wrapper">
<div class="inline-wrapper">
<div class="switch-label">
<label class="input-label">
Set as Default Language:
</label>
</div>
<SwitchInput
@input="updateLanguageSetting"
class="switch"
:class="{'disable-switch': languageSettingHandle }"
:state="languageSettingHandle"
/>
</div>
</div>
</div>
<!-- Language name -->
<div class="block-wrapper">
<label> Language Name:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Language Name" rules="required" v-slot="{ errors }">
<input type="text"
v-model="language.name"
@input="updateName"
:class="{'is-error': errors[0]}"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<!-- Strings -->
<FormLabel class="mt-70">Language Strings</FormLabel>
<div v-if="!loadSearch || filteredStrings.length === 0 && !searchInput" class="spinner-wrapper">
<Spinner class="spinner" />
</div>
<div v-if="loadSearch && filteredStrings.length > 0">
<div class="block-wrapper string" v-for="(string,index) in filteredStrings" :key="index">
<label> {{string.value}}:</label>
<ValidationProvider tag="div" class="input-wrapper" name="Language string" rules="required" v-slot="{ errors }">
<input type="text"
:class="{'is-error': errors[0]}"
@input="updateString(string.key)"
v-model="strings[getIndex(string.key)].value"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
<!-- Not Fount -->
<div class="not-found-wrapper" v-if="loadSearch && filteredStrings.length === 0 && searchInput">
<span class="not-found">Not Found</span>
</div>
</div>
</div>
</template>
<script>
import { ValidationProvider, ValidationObserver } from 'vee-validate/dist/vee-validate.full'
import SwitchInput from '@/components/Others/Forms/SwitchInput'
import FormLabel from '@/components/Others/Forms/FormLabel'
import { SearchIcon, XIcon } from 'vue-feather-icons'
import Spinner from '@/components/FilesView/Spinner'
import { events } from '@/bus'
import lodash from 'lodash'
export default {
name: 'LanguageStrings',
props: [ 'activeLanguage', 'setLanguage' ],
components: {
ValidationProvider,
ValidationObserver,
SwitchInput,
SearchIcon,
FormLabel,
Spinner,
XIcon,
},
computed: {
languageSettingHandle() {
return this.language.locale === this.setLanguage
},
},
data () {
return {
defaultStrings: [],
filteredStrings: [],
loadSearch: false,
loadedStrings: false,
strings: undefined,
language: undefined,
searchInput: '',
}
},
watch: {
activeLanguage () {
this.getLanguageStrings(this.activeLanguage)
this.searchInput = ''
}
},
methods: {
updateLanguageSetting() {
this.$updateText('/settings', 'language', this.language.locale)
events.$emit('language:set-as-default', this.language.locale)
this.$loadLanguage(this.language.locale)
},
resetInput(){
this.searchInput = ''
this.searchStrings()
},
getIndex(key){
if(this.strings)
return _.findIndex(this.strings, function(string) { return string.key === key })
},
updateName() {
this.$updateText(`/languages/${this.language.id}`, 'name', this.language.name)
events.$emit('language-name:update', this.language)
},
updateString (key) {
// Return if the input is empty
if(! this.strings[this.getIndex(key)].value) return
this.$updateText(
`/languages/${this.language.id}/string`, `${key}`, this.strings[this.getIndex(key)].value,
)
},
searchStrings() {
this.loadSearch = false
this.filteredStrings = []
this.filterStrings()
},
filterStrings: _.debounce(function () {
this.filteredStrings = this.defaultStrings.filter(string => string.value.toLowerCase().includes( this.searchInput.toLowerCase() ))
this.loadSearch = true
}, 200),
getLanguageStrings (language) {
this.loadedStrings = false
this.defaultStrings = []
this.filteredStrings= []
axios
.get(`/api/languages/${language.id}/strings`)
.then(response => {
this.strings = response.data.translated_strings.language_strings
this.language = {
'id': response.data.translated_strings.id,
'name': response.data.translated_strings.name,
'locale': response.data.translated_strings.locale,
}
// Make from JSON object array of objects
for (const [key, value] of Object.entries(response.data.default_strings)) {
this.defaultStrings.push({
'key': key,
'value': value,
})
}
this.filterStrings()
})
.catch(() => Vue.prototype.$isSomethingWrong())
.finally(() => {
this.loadedStrings = true
})
}
},
}
</script>
<style lang="scss" scoped>
@import '@assets/vuefilemanager/_variables';
@import '@assets/vuefilemanager/_mixins';
@import '@assets/vuefilemanager/_forms';
.spinner-wrapper {
position: relative;
height: 50%;
.spinner {
top: 60% !important;
}
}
.not-found-wrapper {
display: flex;
margin-top: 20%;
.not-found {
margin: auto;
font-weight: 700;
padding: 10px;
border-radius: 8px;
background: $light_background;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.12);
}
}
.string:last-child {
margin-bottom: 32px !important;
}
.block-form {
padding: 1px;
height: 100%;
}
.disable-switch {
cursor: not-allowed;
/deep/.text-right {
pointer-events: none;
}
}
.language-strings-wrapper {
width: 100%;
height: 100%;
margin: 0 auto;
display: flex;
flex-direction: column;
position: relative;
.block-form{
overflow-y: scroll;
overflow-x: hidden;
}
}
.search-bar-wrapper {
padding: 7px 0px;
}
.search-bar {
position: relative;
width: 100%;
border-radius: 8px;
input {
background: $light-background;
border-radius: 8px;
outline: 0;
padding: 9px 20px 9px 43px;
font-weight: 700;
@include font-size(16);
width: 100%;
height: 50px;
min-width: 175px;
transition: 0.15s all ease;
border: 1px solid transparent;
-webkit-appearance: none;
&::placeholder {
color: $light_text;
@include font-size(14);
font-weight: 700;
}
&:focus {
border: 1px solid $theme;
box-shadow: 0 0 7px rgba($theme, 0.3);
}
&:focus + .icon {
path {
fill: $theme;
}
}
}
.icon {
height: 100%;
position: absolute;
top: 0;
left: 0;
padding: 11px 15px;
display: flex;
align-items: center;
circle,
line {
color: $light_text;
}
.pointer {
cursor: pointer;
}
}
}
// @media only screen and (max-width: 1024px) {
// .search-bar input {
// max-width: 190px;
// padding-right: 0;
// }
// }
@media only screen and (max-width: 690px) {
// .search-bar {
// input {
// min-width: initial;
// width: 100%;
// max-width: initial;
// padding: 9px 20px 9px 30px;
// &:focus {
// box-shadow: none;
// }
// }
// .icon {
// padding: 11px 15px 11px 0;
// }
// }
}
@media (prefers-color-scheme: dark) {
.search-bar {
input {
background: $dark_mode_background ;
&::placeholder {
color: $dark_mode_text_secondary;
}
}
.icon {
circle,
line {
color: $dark_mode_text_secondary !important;
}
}
}
.not-found-wrapper {
.not-found {
background: $dark_mode_foreground !important;
}
}
}
</style>

View File

@@ -45,7 +45,7 @@
<keep-alive :include="['Admin', 'Users']">
<router-view :class="{'is-scaled-down': isScaledDown}" />
</keep-alive>
</div>
</div>
</template>
<script>

View File

@@ -0,0 +1,23 @@
.sticky {
position: sticky;
}
.top-10 {
top: 10px;
}
.top-30 {
top: 30px;
}
.top-50 {
top: 50px;
}
.top-65 {
top: 65px;
}
.top-80 {
top: 80px;
}

View File

@@ -60,7 +60,7 @@ Route::group(['prefix' => 'settings'], function () {
// Language
Route::group(['prefix' => 'languages'], function () {
Route::get('/{language}/strings', [LanguageController::class, 'get_language_strings']);
Route::get('/{language}', [LanguageController::class, 'get_language']);
Route::patch('/{language}/strings', [LanguageController::class, 'update_string']);
Route::delete('/{language}', [LanguageController::class, 'delete_language']);
Route::patch('/{language}', [LanguageController::class, 'update_language']);