backend update

This commit is contained in:
carodej
2020-06-09 18:06:04 +02:00
parent 0b7bc27a5f
commit 95bc310def
48 changed files with 1013 additions and 657 deletions

View File

@@ -13,6 +13,7 @@ use App\Http\Resources\InvoiceCollection;
use App\Http\Resources\UsersCollection;
use App\Http\Resources\UserResource;
use App\Http\Resources\UserStorageResource;
use App\Http\Resources\UserSubscription;
use App\Http\Tools\Demo;
use App\Share;
use App\User;
@@ -67,6 +68,19 @@ class UserController extends Controller
);
}
/**
* Get user subscription details
*
* @param $id
* @return UserSubscription
*/
public function subscription($id)
{
return new UserSubscription(
User::findOrFail($id)->subscription('main')
);
}
/**
* Get all users
*

View File

@@ -23,37 +23,9 @@ class AccountController extends Controller
/**
* Get all user data to frontend
*
* @return array
*/
public function user()
{
// Get User
$user = Auth::user();
// Get folder tree
$tree = FileManagerFolder::with(['folders.shared', 'shared:token,id,item_id,permission,protected'])
->where('parent_id', 0)
->where('user_id', $user->id)
->get();
return [
'user' => $user->only(['name', 'email', 'avatar', 'role']),
'favourites' => $user->favourite_folders->makeHidden(['pivot']),
'tree' => $tree,
'storage' => [
'used' => Metric::bytes($user->used_capacity)->format(),
'capacity' => format_gigabytes($user->settings->storage_capacity),
'percentage' => get_storage_fill_percentage($user->used_capacity, $user->settings->storage_capacity),
],
];
}
/**
* Get me
*
* @return UserResource
*/
public function me()
public function user()
{
return new UserResource(
Auth::user()

View File

@@ -26,10 +26,22 @@ class SubscriptionController extends Controller
$plan = app('rinvex.subscriptions.plan')
->find($request->input('plan.data.id'));
// Create subscription
$user->newSubscription('main', $plan);
// Check if user have subscription
if ($user->activeSubscriptions()->count() !== 0) {
// Update user storage limig
// Get old subscription
$subscription = $user->subscription('main');
// Change subscription plan
$subscription->changePlan($plan);
} else {
// Create subscription
$user->newSubscription('main', $plan);
}
// Update user storage limit
$user->settings()->update([
'storage_capacity' => $plan->features->first()->value
]);
@@ -41,4 +53,20 @@ class SubscriptionController extends Controller
return response('Done!', 204);
}
/**
* Cancel Subscription
*
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function cancel() {
// Get user
$user = Auth::user();
// Cancel subscription
$user->subscription('main')->cancel();
return response('Done!', 204);
}
}

View File

@@ -23,7 +23,8 @@ class PricingResource extends JsonResource
'description' => $this->description,
'price' => $this->price,
'capacity_formatted' => format_gigabytes($this->features->first()->value),
'capacity' => $this->features->first()->value,
'capacity' => (int) $this->features->first()->value,
'currency' => 'USD',
]
]
];

View File

@@ -33,6 +33,9 @@ class UserResource extends JsonResource
]
],
'relationships' => [
'subscription' => $this->activeSubscriptions()->count() !== 0
? new UserSubscription($this->subscription('main'))
: null,
'settings' => [
'data' => [
'id' => (string)$this->settings->id,
@@ -55,7 +58,24 @@ class UserResource extends JsonResource
'attributes' => $this->storage
]
],
'subscription' => $this->activeSubscriptions()->count() !== 0 ? new UserSubscription($this->subscription('main')) : null,
'favourites' => [
'data' => [
'id' => '1',
'type' => 'folders_favourite',
'attributes' => [
'folders' => $this->favourite_folders->makeHidden(['pivot'])
],
],
],
'tree' => [
'data' => [
'id' => '1',
'type' => 'folders_tree',
'attributes' => [
'folders' => $this->folder_tree
],
],
],
]
];
}

View File

@@ -19,10 +19,16 @@ class UserSubscription extends JsonResource
'id' => $this->id,
'type' => 'subscription',
'attributes' => [
'name' => $this->name,
'slug' => $this->slug,
'starts_at' => format_date($this->starts_at, '%d. %B. %Y'),
'ends_at' => format_date($this->ends_at, '%d. %B. %Y'),
'active' => $this->active(),
'canceled' => $this->canceled(),
'name' => $this->plan->name,
'capacity' => (int) $this->plan->features->first()->value,
'capacity_formatted' => format_gigabytes($this->plan->features->first()->value),
'slug' => $this->slug,
'canceled_at' => format_date($this->created_at, '%d. %B. %Y'),
'created_at' => format_date($this->created_at, '%d. %B. %Y'),
'starts_at' => format_date($this->starts_at, '%d. %B. %Y'),
'ends_at' => format_date($this->ends_at, '%d. %B. %Y'),
]
]
];

View File

@@ -21,7 +21,7 @@ function get_invoice_number()
$invoices = \App\Invoice::all();
if ($invoices->isEmpty()) {
return Carbon::now()->year . '00001';
return Carbon::now()->year . '001';
} else {
return (int)$invoices->last()->order + 1;
}

View File

@@ -100,7 +100,7 @@ class User extends Authenticatable
return [
'used' => (float) get_storage_fill_percentage($this->used_capacity, $this->settings->storage_capacity),
'capacity' => $this->settings->storage_capacity,
'capacity_formatted' => Metric::gigabytes($this->settings->storage_capacity)->format(),
'capacity_formatted' => format_gigabytes($this->settings->storage_capacity),
];
}
@@ -118,6 +118,13 @@ class User extends Authenticatable
return $user_capacity;
}
public function getFolderTreeAttribute() {
return FileManagerFolder::with(['folders.shared', 'shared:token,id,item_id,permission,protected'])
->where('parent_id', 0)
->where('user_id', $this->id)
->get();
}
/**
* Format avatar to full url
*

View File

@@ -1,353 +1,253 @@
{
"/js/main.js": "/js/main.js",
"/css/app.css": "/css/app.css",
"/js/main.60a83cde6ee2f68824da.hot-update.js": "/js/main.60a83cde6ee2f68824da.hot-update.js",
"/js/main.ef619783c500887ceffe.hot-update.js": "/js/main.ef619783c500887ceffe.hot-update.js",
"/js/main.c013b62eccdba33a9f76.hot-update.js": "/js/main.c013b62eccdba33a9f76.hot-update.js",
"/js/main.b69457f69553fafe8967.hot-update.js": "/js/main.b69457f69553fafe8967.hot-update.js",
"/js/main.873e7877b5a7297e1c17.hot-update.js": "/js/main.873e7877b5a7297e1c17.hot-update.js",
"/js/main.b9ddf454773dfc9a3cc4.hot-update.js": "/js/main.b9ddf454773dfc9a3cc4.hot-update.js",
"/js/main.02f346aa47ed2e2a0485.hot-update.js": "/js/main.02f346aa47ed2e2a0485.hot-update.js",
"/js/main.cc4e9ed6c16ce2b1299f.hot-update.js": "/js/main.cc4e9ed6c16ce2b1299f.hot-update.js",
"/js/main.7002551648c9c102b6ff.hot-update.js": "/js/main.7002551648c9c102b6ff.hot-update.js",
"/js/main.f5f21d04048492dbd747.hot-update.js": "/js/main.f5f21d04048492dbd747.hot-update.js",
"/js/main.0dbde133bdee5d63d609.hot-update.js": "/js/main.0dbde133bdee5d63d609.hot-update.js",
"/js/main.7261b8501bb32bb006f0.hot-update.js": "/js/main.7261b8501bb32bb006f0.hot-update.js",
"/js/main.27a706ad1b73d0697b2c.hot-update.js": "/js/main.27a706ad1b73d0697b2c.hot-update.js",
"/js/main.17b995f15aec112c8c5b.hot-update.js": "/js/main.17b995f15aec112c8c5b.hot-update.js",
"/js/main.8e55b60094bd1698c507.hot-update.js": "/js/main.8e55b60094bd1698c507.hot-update.js",
"/js/main.09e6bb0dc398c2959b26.hot-update.js": "/js/main.09e6bb0dc398c2959b26.hot-update.js",
"/js/main.fd71ac7e397883c5ad8b.hot-update.js": "/js/main.fd71ac7e397883c5ad8b.hot-update.js",
"/js/main.d370dc07147b907f62df.hot-update.js": "/js/main.d370dc07147b907f62df.hot-update.js",
"/js/main.c1b2482085d2dca6e959.hot-update.js": "/js/main.c1b2482085d2dca6e959.hot-update.js",
"/js/main.5e3ed25ff048539d7beb.hot-update.js": "/js/main.5e3ed25ff048539d7beb.hot-update.js",
"/js/main.a41a30032cd7c44f8961.hot-update.js": "/js/main.a41a30032cd7c44f8961.hot-update.js",
"/js/main.a9741a1d40de6f852246.hot-update.js": "/js/main.a9741a1d40de6f852246.hot-update.js",
"/js/main.be7b3011e661b4181e7a.hot-update.js": "/js/main.be7b3011e661b4181e7a.hot-update.js",
"/js/main.3db920f332bc3991dd5c.hot-update.js": "/js/main.3db920f332bc3991dd5c.hot-update.js",
"/js/main.5561ca4061079f16c0be.hot-update.js": "/js/main.5561ca4061079f16c0be.hot-update.js",
"/js/main.ffa5150f8c1cd7521dd2.hot-update.js": "/js/main.ffa5150f8c1cd7521dd2.hot-update.js",
"/js/main.5f28c31c15df2df73a2b.hot-update.js": "/js/main.5f28c31c15df2df73a2b.hot-update.js",
"/js/main.f9f3f6d9e87f5ecd0bb9.hot-update.js": "/js/main.f9f3f6d9e87f5ecd0bb9.hot-update.js",
"/js/main.44fecef6499fea67dc72.hot-update.js": "/js/main.44fecef6499fea67dc72.hot-update.js",
"/js/main.73c749e66d6c20809368.hot-update.js": "/js/main.73c749e66d6c20809368.hot-update.js",
"/js/main.7a6220ca40fd95b13a8b.hot-update.js": "/js/main.7a6220ca40fd95b13a8b.hot-update.js",
"/js/main.6be211db0853880da483.hot-update.js": "/js/main.6be211db0853880da483.hot-update.js",
"/js/main.ab94ff0b5c48f6a077dc.hot-update.js": "/js/main.ab94ff0b5c48f6a077dc.hot-update.js",
"/js/main.9afc512df05cd3a8ac58.hot-update.js": "/js/main.9afc512df05cd3a8ac58.hot-update.js",
"/js/main.43538fedff7023915e34.hot-update.js": "/js/main.43538fedff7023915e34.hot-update.js",
"/js/main.5f51a0e00cfd46bc8a1d.hot-update.js": "/js/main.5f51a0e00cfd46bc8a1d.hot-update.js",
"/js/main.126e706d99f33682b6d0.hot-update.js": "/js/main.126e706d99f33682b6d0.hot-update.js",
"/js/main.8daab36d29fdcdd8dc60.hot-update.js": "/js/main.8daab36d29fdcdd8dc60.hot-update.js",
"/js/main.7e2ebfecf4df5598079c.hot-update.js": "/js/main.7e2ebfecf4df5598079c.hot-update.js",
"/js/main.5ed6d6df0896b972a2f7.hot-update.js": "/js/main.5ed6d6df0896b972a2f7.hot-update.js",
"/js/main.2d2a1d857e6b40fba146.hot-update.js": "/js/main.2d2a1d857e6b40fba146.hot-update.js",
"/js/main.0ae791146f4cf6ddff27.hot-update.js": "/js/main.0ae791146f4cf6ddff27.hot-update.js",
"/js/main.0a07ef52e4609669974b.hot-update.js": "/js/main.0a07ef52e4609669974b.hot-update.js",
"/js/main.659024279a212defa9e5.hot-update.js": "/js/main.659024279a212defa9e5.hot-update.js",
"/js/main.f3d0eba7638f859fd680.hot-update.js": "/js/main.f3d0eba7638f859fd680.hot-update.js",
"/js/main.4d406bf1178f069aed95.hot-update.js": "/js/main.4d406bf1178f069aed95.hot-update.js",
"/js/main.8be8ab82ff63a98f578e.hot-update.js": "/js/main.8be8ab82ff63a98f578e.hot-update.js",
"/js/main.c0864b90fdd06b278c0a.hot-update.js": "/js/main.c0864b90fdd06b278c0a.hot-update.js",
"/js/main.bc7b433506f608a82a6b.hot-update.js": "/js/main.bc7b433506f608a82a6b.hot-update.js",
"/js/main.30d3b9977d3dc83ed57e.hot-update.js": "/js/main.30d3b9977d3dc83ed57e.hot-update.js",
"/js/main.ebec5f1efc4ff893de63.hot-update.js": "/js/main.ebec5f1efc4ff893de63.hot-update.js",
"/js/main.ebc12d34a4fba627c401.hot-update.js": "/js/main.ebc12d34a4fba627c401.hot-update.js",
"/js/main.ec5f3d6ea3f03f3bfe5d.hot-update.js": "/js/main.ec5f3d6ea3f03f3bfe5d.hot-update.js",
"/js/main.563f066659ae7a313dce.hot-update.js": "/js/main.563f066659ae7a313dce.hot-update.js",
"/js/main.2725f37a642b592af8c9.hot-update.js": "/js/main.2725f37a642b592af8c9.hot-update.js",
"/js/main.3a41edb1952f97e1cf0c.hot-update.js": "/js/main.3a41edb1952f97e1cf0c.hot-update.js",
"/js/main.4257072b4fa820520329.hot-update.js": "/js/main.4257072b4fa820520329.hot-update.js",
"/js/main.fd59b0473a4ddd58a231.hot-update.js": "/js/main.fd59b0473a4ddd58a231.hot-update.js",
"/js/main.40ce0c4e650274ca2e2e.hot-update.js": "/js/main.40ce0c4e650274ca2e2e.hot-update.js",
"/js/main.897246c769e983f3d989.hot-update.js": "/js/main.897246c769e983f3d989.hot-update.js",
"/js/main.521f0c97840da3481c94.hot-update.js": "/js/main.521f0c97840da3481c94.hot-update.js",
"/js/main.c154b9ae35a1f6a32e82.hot-update.js": "/js/main.c154b9ae35a1f6a32e82.hot-update.js",
"/js/main.8cf48f71db246ed8b9af.hot-update.js": "/js/main.8cf48f71db246ed8b9af.hot-update.js",
"/js/main.679e8b450323f00f16b1.hot-update.js": "/js/main.679e8b450323f00f16b1.hot-update.js",
"/js/main.0c75525a762b37a19ebb.hot-update.js": "/js/main.0c75525a762b37a19ebb.hot-update.js",
"/js/main.0a762f4b8d3e4ba3bf50.hot-update.js": "/js/main.0a762f4b8d3e4ba3bf50.hot-update.js",
"/js/main.8bb52c015cc5bf103a83.hot-update.js": "/js/main.8bb52c015cc5bf103a83.hot-update.js",
"/js/main.051c0994490dbf28d874.hot-update.js": "/js/main.051c0994490dbf28d874.hot-update.js",
"/js/main.c4fbb155df77a01cead2.hot-update.js": "/js/main.c4fbb155df77a01cead2.hot-update.js",
"/js/main.a89076bd7fc546c5bbba.hot-update.js": "/js/main.a89076bd7fc546c5bbba.hot-update.js",
"/js/main.469d258e2e2b007207e1.hot-update.js": "/js/main.469d258e2e2b007207e1.hot-update.js",
"/js/main.2fec9cd89f848ea0d839.hot-update.js": "/js/main.2fec9cd89f848ea0d839.hot-update.js",
"/js/main.5f0c685a4cd32095c161.hot-update.js": "/js/main.5f0c685a4cd32095c161.hot-update.js",
"/js/main.3ed4497a365f6d72dc7f.hot-update.js": "/js/main.3ed4497a365f6d72dc7f.hot-update.js",
"/js/main.0d3316553777396d8e49.hot-update.js": "/js/main.0d3316553777396d8e49.hot-update.js",
"/js/main.b967e5d0cd196a9cffe5.hot-update.js": "/js/main.b967e5d0cd196a9cffe5.hot-update.js",
"/js/main.7cb7cc650992de21a270.hot-update.js": "/js/main.7cb7cc650992de21a270.hot-update.js",
"/js/main.cbd0798033c61903982b.hot-update.js": "/js/main.cbd0798033c61903982b.hot-update.js",
"/js/main.f3cbf06b4bb700eed2ca.hot-update.js": "/js/main.f3cbf06b4bb700eed2ca.hot-update.js",
"/js/main.f23f1b2b13a97c24a12e.hot-update.js": "/js/main.f23f1b2b13a97c24a12e.hot-update.js",
"/js/main.260b86bb8c6137305d79.hot-update.js": "/js/main.260b86bb8c6137305d79.hot-update.js",
"/js/main.a64e08b37d0287f0fd3c.hot-update.js": "/js/main.a64e08b37d0287f0fd3c.hot-update.js",
"/js/main.5271952fd0528f004eb2.hot-update.js": "/js/main.5271952fd0528f004eb2.hot-update.js",
"/js/main.6bc1170583bfada6b03f.hot-update.js": "/js/main.6bc1170583bfada6b03f.hot-update.js",
"/js/main.97ce3d98957854961afa.hot-update.js": "/js/main.97ce3d98957854961afa.hot-update.js",
"/js/main.73536cf388d726112883.hot-update.js": "/js/main.73536cf388d726112883.hot-update.js",
"/js/main.443f226a178e6f696918.hot-update.js": "/js/main.443f226a178e6f696918.hot-update.js",
"/js/main.943771be6a55402c235f.hot-update.js": "/js/main.943771be6a55402c235f.hot-update.js",
"/js/main.38d64e59de4dac8d3a27.hot-update.js": "/js/main.38d64e59de4dac8d3a27.hot-update.js",
"/js/main.633ca2766892a4f86c06.hot-update.js": "/js/main.633ca2766892a4f86c06.hot-update.js",
"/js/main.7a1f97a5416bd2f7aa1d.hot-update.js": "/js/main.7a1f97a5416bd2f7aa1d.hot-update.js",
"/js/main.c94a5b2de6b87a0de111.hot-update.js": "/js/main.c94a5b2de6b87a0de111.hot-update.js",
"/js/main.23c164a13b2f0aa50f45.hot-update.js": "/js/main.23c164a13b2f0aa50f45.hot-update.js",
"/js/main.7acd02ffbc40e34b76b5.hot-update.js": "/js/main.7acd02ffbc40e34b76b5.hot-update.js",
"/js/main.e55585baebfa4ff40b96.hot-update.js": "/js/main.e55585baebfa4ff40b96.hot-update.js",
"/js/main.26f5e7e248e7a516fdeb.hot-update.js": "/js/main.26f5e7e248e7a516fdeb.hot-update.js",
"/js/main.a4354cf111d2f640de40.hot-update.js": "/js/main.a4354cf111d2f640de40.hot-update.js",
"/js/main.b7c598a2039ad757246c.hot-update.js": "/js/main.b7c598a2039ad757246c.hot-update.js",
"/js/main.76c1bb584af8d242650d.hot-update.js": "/js/main.76c1bb584af8d242650d.hot-update.js",
"/js/main.462992b527732ffaf011.hot-update.js": "/js/main.462992b527732ffaf011.hot-update.js",
"/js/main.c7aab6e1f0a415b086a2.hot-update.js": "/js/main.c7aab6e1f0a415b086a2.hot-update.js",
"/js/main.4f06914b44e0029a62f4.hot-update.js": "/js/main.4f06914b44e0029a62f4.hot-update.js",
"/js/main.1a3f610ba8ec3292f4dc.hot-update.js": "/js/main.1a3f610ba8ec3292f4dc.hot-update.js",
"/js/main.06895546a55022d7cc93.hot-update.js": "/js/main.06895546a55022d7cc93.hot-update.js",
"/js/main.40b86ee237657438cdaf.hot-update.js": "/js/main.40b86ee237657438cdaf.hot-update.js",
"/js/main.32e1f408e9b90f611a86.hot-update.js": "/js/main.32e1f408e9b90f611a86.hot-update.js",
"/js/main.67c28937753a28b1a5fe.hot-update.js": "/js/main.67c28937753a28b1a5fe.hot-update.js",
"/js/main.c77543d539285c1e543f.hot-update.js": "/js/main.c77543d539285c1e543f.hot-update.js",
"/js/main.87a307c96a03990ed2d2.hot-update.js": "/js/main.87a307c96a03990ed2d2.hot-update.js",
"/js/main.410431febebc49d899af.hot-update.js": "/js/main.410431febebc49d899af.hot-update.js",
"/js/main.bf80b81234310414d660.hot-update.js": "/js/main.bf80b81234310414d660.hot-update.js",
"/js/main.feafe99eed468b85dedf.hot-update.js": "/js/main.feafe99eed468b85dedf.hot-update.js",
"/js/main.aacf93c99eb8a3568989.hot-update.js": "/js/main.aacf93c99eb8a3568989.hot-update.js",
"/js/main.a65b1ed2d462cd1a763f.hot-update.js": "/js/main.a65b1ed2d462cd1a763f.hot-update.js",
"/js/main.fe60a69fef9957db3a1d.hot-update.js": "/js/main.fe60a69fef9957db3a1d.hot-update.js",
"/js/main.7b1a834a609da6a1b646.hot-update.js": "/js/main.7b1a834a609da6a1b646.hot-update.js",
"/js/main.242c7360b2a866a7a82d.hot-update.js": "/js/main.242c7360b2a866a7a82d.hot-update.js",
"/js/main.40b74c52c10319637483.hot-update.js": "/js/main.40b74c52c10319637483.hot-update.js",
"/js/main.c3b0523da3b9e289bafb.hot-update.js": "/js/main.c3b0523da3b9e289bafb.hot-update.js",
"/js/main.08be399733e6a3153176.hot-update.js": "/js/main.08be399733e6a3153176.hot-update.js",
"/js/main.0b308de86105413b8662.hot-update.js": "/js/main.0b308de86105413b8662.hot-update.js",
"/js/main.981f6f1ae8471e9ed315.hot-update.js": "/js/main.981f6f1ae8471e9ed315.hot-update.js",
"/js/main.53459c189d19f054afe7.hot-update.js": "/js/main.53459c189d19f054afe7.hot-update.js",
"/js/main.4169b15dfc28accd6d62.hot-update.js": "/js/main.4169b15dfc28accd6d62.hot-update.js",
"/js/main.c9200c7c0f92533c5873.hot-update.js": "/js/main.c9200c7c0f92533c5873.hot-update.js",
"/js/main.1c9488c999bafc17a89c.hot-update.js": "/js/main.1c9488c999bafc17a89c.hot-update.js",
"/js/main.045053c89e70c0acacf8.hot-update.js": "/js/main.045053c89e70c0acacf8.hot-update.js",
"/js/main.ba2e5630164a8646afdf.hot-update.js": "/js/main.ba2e5630164a8646afdf.hot-update.js",
"/js/main.46b19114682d5b1a735b.hot-update.js": "/js/main.46b19114682d5b1a735b.hot-update.js",
"/js/main.ec39e60cb391c413c34b.hot-update.js": "/js/main.ec39e60cb391c413c34b.hot-update.js",
"/js/main.da250e00235e15fd6f76.hot-update.js": "/js/main.da250e00235e15fd6f76.hot-update.js",
"/js/main.6dacc4854d335e05708d.hot-update.js": "/js/main.6dacc4854d335e05708d.hot-update.js",
"/js/main.dc90fa26fa365ecf5b2b.hot-update.js": "/js/main.dc90fa26fa365ecf5b2b.hot-update.js",
"/js/main.9502362a8afa7e2f5876.hot-update.js": "/js/main.9502362a8afa7e2f5876.hot-update.js",
"/js/main.802de52c0e8646bade98.hot-update.js": "/js/main.802de52c0e8646bade98.hot-update.js",
"/js/main.2934bf35e19f55ca56be.hot-update.js": "/js/main.2934bf35e19f55ca56be.hot-update.js",
"/js/main.bf13b7f4a625e248d25e.hot-update.js": "/js/main.bf13b7f4a625e248d25e.hot-update.js",
"/js/main.3c651f57e3b0e4962aed.hot-update.js": "/js/main.3c651f57e3b0e4962aed.hot-update.js",
"/js/main.fc3ac3dc56ed4c2b5a16.hot-update.js": "/js/main.fc3ac3dc56ed4c2b5a16.hot-update.js",
"/js/main.0ff8092f8d7ef902bdea.hot-update.js": "/js/main.0ff8092f8d7ef902bdea.hot-update.js",
"/js/main.99428fe036b8f1e6ec2a.hot-update.js": "/js/main.99428fe036b8f1e6ec2a.hot-update.js",
"/js/main.7af48b09abf42b1527d0.hot-update.js": "/js/main.7af48b09abf42b1527d0.hot-update.js",
"/js/main.7c2ec74ea1f2d2a64082.hot-update.js": "/js/main.7c2ec74ea1f2d2a64082.hot-update.js",
"/js/main.4b1af8e5fbdd42203bbd.hot-update.js": "/js/main.4b1af8e5fbdd42203bbd.hot-update.js",
"/js/main.6dfdd92d74d0221cb4cd.hot-update.js": "/js/main.6dfdd92d74d0221cb4cd.hot-update.js",
"/js/main.93c765fa5b5967778dbb.hot-update.js": "/js/main.93c765fa5b5967778dbb.hot-update.js",
"/js/main.145d13c9c0c8a48c8e21.hot-update.js": "/js/main.145d13c9c0c8a48c8e21.hot-update.js",
"/js/main.1ac11f50fac4ad096666.hot-update.js": "/js/main.1ac11f50fac4ad096666.hot-update.js",
"/js/main.cf5ad55fa219f6c47f6b.hot-update.js": "/js/main.cf5ad55fa219f6c47f6b.hot-update.js",
"/js/main.ddad7197a46610777620.hot-update.js": "/js/main.ddad7197a46610777620.hot-update.js",
"/js/main.e5b4b5c52b1117e66b89.hot-update.js": "/js/main.e5b4b5c52b1117e66b89.hot-update.js",
"/js/main.214828387e374ce49d4a.hot-update.js": "/js/main.214828387e374ce49d4a.hot-update.js",
"/js/main.be1180181c2d52cabd7a.hot-update.js": "/js/main.be1180181c2d52cabd7a.hot-update.js",
"/js/main.0ba2839f023a6d5c2d74.hot-update.js": "/js/main.0ba2839f023a6d5c2d74.hot-update.js",
"/js/main.d12911154ed30be00c3c.hot-update.js": "/js/main.d12911154ed30be00c3c.hot-update.js",
"/js/main.573ef61235e9257d0090.hot-update.js": "/js/main.573ef61235e9257d0090.hot-update.js",
"/js/main.45fec0e5951a53dbffac.hot-update.js": "/js/main.45fec0e5951a53dbffac.hot-update.js",
"/js/main.55f54baec0450f8de63b.hot-update.js": "/js/main.55f54baec0450f8de63b.hot-update.js",
"/js/main.6a353752cfa45cbaf1dd.hot-update.js": "/js/main.6a353752cfa45cbaf1dd.hot-update.js",
"/js/main.7b9038028478c4f76ffe.hot-update.js": "/js/main.7b9038028478c4f76ffe.hot-update.js",
"/js/main.23bd83f443e3593ecc35.hot-update.js": "/js/main.23bd83f443e3593ecc35.hot-update.js",
"/js/main.392dd076165cae4a780d.hot-update.js": "/js/main.392dd076165cae4a780d.hot-update.js",
"/js/main.49753cee6c18ab061e21.hot-update.js": "/js/main.49753cee6c18ab061e21.hot-update.js",
"/js/main.a73a514eb28a645adfea.hot-update.js": "/js/main.a73a514eb28a645adfea.hot-update.js",
"/js/main.6d18ebb5943b27562ba9.hot-update.js": "/js/main.6d18ebb5943b27562ba9.hot-update.js",
"/js/main.9d0d01b4e3c3fb47d4d5.hot-update.js": "/js/main.9d0d01b4e3c3fb47d4d5.hot-update.js",
"/js/main.7728e0d0bdca2c20f459.hot-update.js": "/js/main.7728e0d0bdca2c20f459.hot-update.js",
"/js/main.81d0db7b2f00813f74c7.hot-update.js": "/js/main.81d0db7b2f00813f74c7.hot-update.js",
"/js/main.a28cd765165d48725eca.hot-update.js": "/js/main.a28cd765165d48725eca.hot-update.js",
"/js/main.8de8c3e7c3b977cc6035.hot-update.js": "/js/main.8de8c3e7c3b977cc6035.hot-update.js",
"/js/main.782da6a66568bcd59743.hot-update.js": "/js/main.782da6a66568bcd59743.hot-update.js",
"/js/main.60b493308d7357839512.hot-update.js": "/js/main.60b493308d7357839512.hot-update.js",
"/js/main.33902c08d1e9836b964e.hot-update.js": "/js/main.33902c08d1e9836b964e.hot-update.js",
"/js/main.fe1d2a997ea2be557d9f.hot-update.js": "/js/main.fe1d2a997ea2be557d9f.hot-update.js",
"/js/main.766abe0541c6121e1924.hot-update.js": "/js/main.766abe0541c6121e1924.hot-update.js",
"/js/main.1bd0994d893a03186dfc.hot-update.js": "/js/main.1bd0994d893a03186dfc.hot-update.js",
"/js/main.b977ced9ab4081433316.hot-update.js": "/js/main.b977ced9ab4081433316.hot-update.js",
"/js/main.f80f8d4812f554d678ad.hot-update.js": "/js/main.f80f8d4812f554d678ad.hot-update.js",
"/js/main.113837549e4562048c31.hot-update.js": "/js/main.113837549e4562048c31.hot-update.js",
"/js/main.8efa86ec49d1abb3b1f9.hot-update.js": "/js/main.8efa86ec49d1abb3b1f9.hot-update.js",
"/js/main.4dc98433f633871bcc37.hot-update.js": "/js/main.4dc98433f633871bcc37.hot-update.js",
"/js/main.c1bdb95bec9f98ca3621.hot-update.js": "/js/main.c1bdb95bec9f98ca3621.hot-update.js",
"/js/main.4b537e8e13000cbe58a6.hot-update.js": "/js/main.4b537e8e13000cbe58a6.hot-update.js",
"/js/main.45c7868f8c1bcbd2447a.hot-update.js": "/js/main.45c7868f8c1bcbd2447a.hot-update.js",
"/js/main.71db541c42b4649a344d.hot-update.js": "/js/main.71db541c42b4649a344d.hot-update.js",
"/js/main.68624de1ade8d60b9e00.hot-update.js": "/js/main.68624de1ade8d60b9e00.hot-update.js",
"/js/main.aadae39c079f9b7a1ee6.hot-update.js": "/js/main.aadae39c079f9b7a1ee6.hot-update.js",
"/js/main.680573b5ab7f89edc08d.hot-update.js": "/js/main.680573b5ab7f89edc08d.hot-update.js",
"/js/main.43c573f053170ed1c62a.hot-update.js": "/js/main.43c573f053170ed1c62a.hot-update.js",
"/js/main.3953b45d826e1a49afcf.hot-update.js": "/js/main.3953b45d826e1a49afcf.hot-update.js",
"/js/main.5badeee6f9276e7b7c06.hot-update.js": "/js/main.5badeee6f9276e7b7c06.hot-update.js",
"/js/main.ddb99e8b37bc0e95411c.hot-update.js": "/js/main.ddb99e8b37bc0e95411c.hot-update.js",
"/js/main.f05d5a46f5caf1f2995d.hot-update.js": "/js/main.f05d5a46f5caf1f2995d.hot-update.js",
"/js/main.e32aaf5fb351a8406d51.hot-update.js": "/js/main.e32aaf5fb351a8406d51.hot-update.js",
"/js/main.f7a0069dfb0c28663a62.hot-update.js": "/js/main.f7a0069dfb0c28663a62.hot-update.js",
"/js/main.6d39e5cc8cb2e945d6b3.hot-update.js": "/js/main.6d39e5cc8cb2e945d6b3.hot-update.js",
"/js/main.24cc22fcf93008baf29d.hot-update.js": "/js/main.24cc22fcf93008baf29d.hot-update.js",
"/js/main.3516ce8b8eb43faf298c.hot-update.js": "/js/main.3516ce8b8eb43faf298c.hot-update.js",
"/js/main.b5292435a660203bf811.hot-update.js": "/js/main.b5292435a660203bf811.hot-update.js",
"/js/main.13989f10bc3239c4c41f.hot-update.js": "/js/main.13989f10bc3239c4c41f.hot-update.js",
"/js/main.8c3cab25947747b4b0b3.hot-update.js": "/js/main.8c3cab25947747b4b0b3.hot-update.js",
"/js/main.5c20da0efc58cc7ba8b3.hot-update.js": "/js/main.5c20da0efc58cc7ba8b3.hot-update.js",
"/js/main.66e5ed2e6cc14a0d36ae.hot-update.js": "/js/main.66e5ed2e6cc14a0d36ae.hot-update.js",
"/js/main.0c09a0e989bcc9758370.hot-update.js": "/js/main.0c09a0e989bcc9758370.hot-update.js",
"/js/main.ab58ad6e06d96cf8fa73.hot-update.js": "/js/main.ab58ad6e06d96cf8fa73.hot-update.js",
"/js/main.014ff3765c75eb61f1d4.hot-update.js": "/js/main.014ff3765c75eb61f1d4.hot-update.js",
"/js/main.bdeb8ceaa88f727f8fb6.hot-update.js": "/js/main.bdeb8ceaa88f727f8fb6.hot-update.js",
"/js/main.9973034b32ebdc63eb82.hot-update.js": "/js/main.9973034b32ebdc63eb82.hot-update.js",
"/js/main.9992685a6ae68c33b6c5.hot-update.js": "/js/main.9992685a6ae68c33b6c5.hot-update.js",
"/js/main.b760fcd3b586a00f06be.hot-update.js": "/js/main.b760fcd3b586a00f06be.hot-update.js",
"/js/main.9dc70b69960cc8fc63be.hot-update.js": "/js/main.9dc70b69960cc8fc63be.hot-update.js",
"/js/main.e54f1b41b0056df66ebe.hot-update.js": "/js/main.e54f1b41b0056df66ebe.hot-update.js",
"/js/main.b3d9c72543f1cc629eca.hot-update.js": "/js/main.b3d9c72543f1cc629eca.hot-update.js",
"/js/main.a6b5bc01c37b0b8c505a.hot-update.js": "/js/main.a6b5bc01c37b0b8c505a.hot-update.js",
"/js/main.37820b9541b87f46b5ab.hot-update.js": "/js/main.37820b9541b87f46b5ab.hot-update.js",
"/js/main.657bfe90614336953776.hot-update.js": "/js/main.657bfe90614336953776.hot-update.js",
"/js/main.c32cd8f6b2b69da9f69b.hot-update.js": "/js/main.c32cd8f6b2b69da9f69b.hot-update.js",
"/js/main.0f7a1e4328a6c4020b06.hot-update.js": "/js/main.0f7a1e4328a6c4020b06.hot-update.js",
"/js/main.6f7d46764921c16af0c3.hot-update.js": "/js/main.6f7d46764921c16af0c3.hot-update.js",
"/js/main.a640dda4a79379ab0d71.hot-update.js": "/js/main.a640dda4a79379ab0d71.hot-update.js",
"/js/main.9d51e284c5c6da62c608.hot-update.js": "/js/main.9d51e284c5c6da62c608.hot-update.js",
"/js/main.2175685495a1e1f69c7b.hot-update.js": "/js/main.2175685495a1e1f69c7b.hot-update.js",
"/js/main.2150d320284b6237889c.hot-update.js": "/js/main.2150d320284b6237889c.hot-update.js",
"/js/main.b8a254bed361a09ff366.hot-update.js": "/js/main.b8a254bed361a09ff366.hot-update.js",
"/js/main.0b3526ea8bfd5256691a.hot-update.js": "/js/main.0b3526ea8bfd5256691a.hot-update.js",
"/js/main.1cea96ea65fa4202ca3c.hot-update.js": "/js/main.1cea96ea65fa4202ca3c.hot-update.js",
"/js/main.8bad8f660e3c6f7bfc0f.hot-update.js": "/js/main.8bad8f660e3c6f7bfc0f.hot-update.js",
"/js/main.72b032a1aecb09cfe6a2.hot-update.js": "/js/main.72b032a1aecb09cfe6a2.hot-update.js",
"/js/main.02b3767fb3fe1ca0542e.hot-update.js": "/js/main.02b3767fb3fe1ca0542e.hot-update.js",
"/js/main.78cfd839671f52b65307.hot-update.js": "/js/main.78cfd839671f52b65307.hot-update.js",
"/js/main.d12832c9351968e74050.hot-update.js": "/js/main.d12832c9351968e74050.hot-update.js",
"/js/main.6d2c73ad0bf43e6bb5be.hot-update.js": "/js/main.6d2c73ad0bf43e6bb5be.hot-update.js",
"/js/main.9ad41591f7f3af3cecfe.hot-update.js": "/js/main.9ad41591f7f3af3cecfe.hot-update.js",
"/js/main.2215c5e36d89ce7a343e.hot-update.js": "/js/main.2215c5e36d89ce7a343e.hot-update.js",
"/js/main.6ff01a84a6d8c537ae38.hot-update.js": "/js/main.6ff01a84a6d8c537ae38.hot-update.js",
"/js/main.23840c43fe4cf577a15d.hot-update.js": "/js/main.23840c43fe4cf577a15d.hot-update.js",
"/js/main.5f0e5ecf4e8fe2ec096e.hot-update.js": "/js/main.5f0e5ecf4e8fe2ec096e.hot-update.js",
"/js/main.7131a1b0b9c7105ff539.hot-update.js": "/js/main.7131a1b0b9c7105ff539.hot-update.js",
"/js/main.d7309f447054aabfa409.hot-update.js": "/js/main.d7309f447054aabfa409.hot-update.js",
"/js/main.3ac39eb05bbd34bfac97.hot-update.js": "/js/main.3ac39eb05bbd34bfac97.hot-update.js",
"/js/main.b214f9b3b3ecc253ebf1.hot-update.js": "/js/main.b214f9b3b3ecc253ebf1.hot-update.js",
"/js/main.71a9533ff4ae330cccf3.hot-update.js": "/js/main.71a9533ff4ae330cccf3.hot-update.js",
"/js/main.ba1144e1135a00e461c7.hot-update.js": "/js/main.ba1144e1135a00e461c7.hot-update.js",
"/js/main.bf7c574279d8acce16aa.hot-update.js": "/js/main.bf7c574279d8acce16aa.hot-update.js",
"/js/main.2d291ea3de6f1da7058b.hot-update.js": "/js/main.2d291ea3de6f1da7058b.hot-update.js",
"/js/main.ba6d4d2a8857566c2ec5.hot-update.js": "/js/main.ba6d4d2a8857566c2ec5.hot-update.js",
"/js/main.5645b3eeecc1b560614b.hot-update.js": "/js/main.5645b3eeecc1b560614b.hot-update.js",
"/js/main.e84e10d63ed04fd272cc.hot-update.js": "/js/main.e84e10d63ed04fd272cc.hot-update.js",
"/js/main.f04fc23ca1938e02fecc.hot-update.js": "/js/main.f04fc23ca1938e02fecc.hot-update.js",
"/js/main.c8f623bc44d30e89ead8.hot-update.js": "/js/main.c8f623bc44d30e89ead8.hot-update.js",
"/js/main.0280d7a9b768ba9a2c93.hot-update.js": "/js/main.0280d7a9b768ba9a2c93.hot-update.js",
"/js/main.f8a594d8edfc9b0000f1.hot-update.js": "/js/main.f8a594d8edfc9b0000f1.hot-update.js",
"/js/main.ed950c2728a18e80ef97.hot-update.js": "/js/main.ed950c2728a18e80ef97.hot-update.js",
"/js/main.e5856a633b84a0158c7d.hot-update.js": "/js/main.e5856a633b84a0158c7d.hot-update.js",
"/js/main.0abc8a7cbdcf0be7da0e.hot-update.js": "/js/main.0abc8a7cbdcf0be7da0e.hot-update.js",
"/js/main.b2f5c2c22feadd2b4c0c.hot-update.js": "/js/main.b2f5c2c22feadd2b4c0c.hot-update.js",
"/js/main.4d8346cf984a588b6f13.hot-update.js": "/js/main.4d8346cf984a588b6f13.hot-update.js",
"/js/main.53c5573b85a9e73d1758.hot-update.js": "/js/main.53c5573b85a9e73d1758.hot-update.js",
"/js/main.95a3639e43650ef3faa5.hot-update.js": "/js/main.95a3639e43650ef3faa5.hot-update.js",
"/js/main.1d8220b4ab8ca4dc8a51.hot-update.js": "/js/main.1d8220b4ab8ca4dc8a51.hot-update.js",
"/js/main.7f9b84329de8111fae87.hot-update.js": "/js/main.7f9b84329de8111fae87.hot-update.js",
"/js/main.36b87f3da6ef386e6fc5.hot-update.js": "/js/main.36b87f3da6ef386e6fc5.hot-update.js",
"/js/main.71e32fb234f1fe2b8010.hot-update.js": "/js/main.71e32fb234f1fe2b8010.hot-update.js",
"/js/main.1b05b55650fcf1f390d3.hot-update.js": "/js/main.1b05b55650fcf1f390d3.hot-update.js",
"/js/main.fb5179244b436eaa3615.hot-update.js": "/js/main.fb5179244b436eaa3615.hot-update.js",
"/js/main.40fd3d4d2879012e29b8.hot-update.js": "/js/main.40fd3d4d2879012e29b8.hot-update.js",
"/js/main.4b9478fffdeba2a4b93b.hot-update.js": "/js/main.4b9478fffdeba2a4b93b.hot-update.js",
"/js/main.5af5027b0ae287a82f35.hot-update.js": "/js/main.5af5027b0ae287a82f35.hot-update.js",
"/js/main.52237080c7c31898ab5a.hot-update.js": "/js/main.52237080c7c31898ab5a.hot-update.js",
"/js/main.979c5eedc1444456464e.hot-update.js": "/js/main.979c5eedc1444456464e.hot-update.js",
"/js/main.9017fe0f3183ac0f365d.hot-update.js": "/js/main.9017fe0f3183ac0f365d.hot-update.js",
"/js/main.dfc8f8e1cd5a747133c9.hot-update.js": "/js/main.dfc8f8e1cd5a747133c9.hot-update.js",
"/js/main.054acdb0153a952d0c1b.hot-update.js": "/js/main.054acdb0153a952d0c1b.hot-update.js",
"/js/main.1b7b81d03c708864d83f.hot-update.js": "/js/main.1b7b81d03c708864d83f.hot-update.js",
"/js/main.0e1d7e4955c92a4a6433.hot-update.js": "/js/main.0e1d7e4955c92a4a6433.hot-update.js",
"/js/main.6d20f9f009d9fa3b6c33.hot-update.js": "/js/main.6d20f9f009d9fa3b6c33.hot-update.js",
"/js/main.29cb935e6d27bab5cc6f.hot-update.js": "/js/main.29cb935e6d27bab5cc6f.hot-update.js",
"/js/main.633978191e0ccd858642.hot-update.js": "/js/main.633978191e0ccd858642.hot-update.js",
"/js/main.faf763c5c889e90c24d3.hot-update.js": "/js/main.faf763c5c889e90c24d3.hot-update.js",
"/js/main.0ee392e693e07d2adc39.hot-update.js": "/js/main.0ee392e693e07d2adc39.hot-update.js",
"/js/main.f04167e5bde2e8ba1328.hot-update.js": "/js/main.f04167e5bde2e8ba1328.hot-update.js",
"/js/main.ad5ce2ace93bd4885e2d.hot-update.js": "/js/main.ad5ce2ace93bd4885e2d.hot-update.js",
"/js/main.0318bd00035642cab7dc.hot-update.js": "/js/main.0318bd00035642cab7dc.hot-update.js",
"/js/main.6f3d3c5df9f7de3bad94.hot-update.js": "/js/main.6f3d3c5df9f7de3bad94.hot-update.js",
"/js/main.cd07d28a55c157b257a0.hot-update.js": "/js/main.cd07d28a55c157b257a0.hot-update.js",
"/js/main.3ec8510bd27897443ad8.hot-update.js": "/js/main.3ec8510bd27897443ad8.hot-update.js",
"/js/main.b06803d15413598cf921.hot-update.js": "/js/main.b06803d15413598cf921.hot-update.js",
"/js/main.bb7669043d86cf1071be.hot-update.js": "/js/main.bb7669043d86cf1071be.hot-update.js",
"/js/main.7dfd9e155cee0aa2a655.hot-update.js": "/js/main.7dfd9e155cee0aa2a655.hot-update.js",
"/js/main.becd5b839417ba9cc61f.hot-update.js": "/js/main.becd5b839417ba9cc61f.hot-update.js",
"/js/main.3fa003535cf601923d82.hot-update.js": "/js/main.3fa003535cf601923d82.hot-update.js",
"/js/main.4a56e0b1dd3dbcc32341.hot-update.js": "/js/main.4a56e0b1dd3dbcc32341.hot-update.js",
"/js/main.0d7a61917a0a8974c35f.hot-update.js": "/js/main.0d7a61917a0a8974c35f.hot-update.js",
"/js/main.a091a3a1923781c21dc4.hot-update.js": "/js/main.a091a3a1923781c21dc4.hot-update.js",
"/js/main.38c7c1a4b64333d9f5c3.hot-update.js": "/js/main.38c7c1a4b64333d9f5c3.hot-update.js",
"/js/main.5aeb23d042dc02182f9d.hot-update.js": "/js/main.5aeb23d042dc02182f9d.hot-update.js",
"/js/main.626ffbf9740c4905f231.hot-update.js": "/js/main.626ffbf9740c4905f231.hot-update.js",
"/js/main.c7362f11fed7aafdb123.hot-update.js": "/js/main.c7362f11fed7aafdb123.hot-update.js",
"/js/main.b04a05c0843829183afe.hot-update.js": "/js/main.b04a05c0843829183afe.hot-update.js",
"/js/main.461fa5fdd23afe6d9fe6.hot-update.js": "/js/main.461fa5fdd23afe6d9fe6.hot-update.js",
"/js/main.e0a1840ae50bf07401a0.hot-update.js": "/js/main.e0a1840ae50bf07401a0.hot-update.js",
"/js/main.8b25371935db26e8c4b4.hot-update.js": "/js/main.8b25371935db26e8c4b4.hot-update.js",
"/js/main.b84c56a5501bf599ddef.hot-update.js": "/js/main.b84c56a5501bf599ddef.hot-update.js",
"/js/main.0ea41ac8e5a5b827183d.hot-update.js": "/js/main.0ea41ac8e5a5b827183d.hot-update.js",
"/js/main.328a6e59c166775f5876.hot-update.js": "/js/main.328a6e59c166775f5876.hot-update.js",
"/js/main.595a3d7a93987329ca5b.hot-update.js": "/js/main.595a3d7a93987329ca5b.hot-update.js",
"/js/main.ad79a5b7d119ed6c423d.hot-update.js": "/js/main.ad79a5b7d119ed6c423d.hot-update.js",
"/js/main.d08edda6d82bd9398e71.hot-update.js": "/js/main.d08edda6d82bd9398e71.hot-update.js",
"/js/main.66c83d5d6ff775619e6a.hot-update.js": "/js/main.66c83d5d6ff775619e6a.hot-update.js",
"/js/main.acc4d5e33a6f6db74e99.hot-update.js": "/js/main.acc4d5e33a6f6db74e99.hot-update.js",
"/js/main.c7608c4460d04dc68a7b.hot-update.js": "/js/main.c7608c4460d04dc68a7b.hot-update.js",
"/js/main.9560166479247c1360a4.hot-update.js": "/js/main.9560166479247c1360a4.hot-update.js",
"/js/main.2bfbfe88c7cbaa237cdf.hot-update.js": "/js/main.2bfbfe88c7cbaa237cdf.hot-update.js",
"/js/main.1727b96758d6ec12ec1a.hot-update.js": "/js/main.1727b96758d6ec12ec1a.hot-update.js",
"/js/main.18285ba868e3c2b26cdb.hot-update.js": "/js/main.18285ba868e3c2b26cdb.hot-update.js",
"/js/main.fca0118a70bd996c3a3a.hot-update.js": "/js/main.fca0118a70bd996c3a3a.hot-update.js",
"/js/main.adabd48fe18c1ed75a9f.hot-update.js": "/js/main.adabd48fe18c1ed75a9f.hot-update.js",
"/js/main.a86fbcc56fdd4977f174.hot-update.js": "/js/main.a86fbcc56fdd4977f174.hot-update.js",
"/js/main.9cd6b1916fdcf8b0e3e7.hot-update.js": "/js/main.9cd6b1916fdcf8b0e3e7.hot-update.js",
"/js/main.72419a76c9b4b47b6963.hot-update.js": "/js/main.72419a76c9b4b47b6963.hot-update.js",
"/js/main.4dea1104f50471aa6f64.hot-update.js": "/js/main.4dea1104f50471aa6f64.hot-update.js",
"/js/main.26154029797256dee15b.hot-update.js": "/js/main.26154029797256dee15b.hot-update.js",
"/js/main.f76525f7fe55e49591da.hot-update.js": "/js/main.f76525f7fe55e49591da.hot-update.js",
"/js/main.06e4485426b6a62d5fa2.hot-update.js": "/js/main.06e4485426b6a62d5fa2.hot-update.js",
"/js/main.e8d66784dbf3edfacc70.hot-update.js": "/js/main.e8d66784dbf3edfacc70.hot-update.js",
"/js/main.3d985e37671fe9bd3e0c.hot-update.js": "/js/main.3d985e37671fe9bd3e0c.hot-update.js",
"/js/main.44e26c8753354ab6eacc.hot-update.js": "/js/main.44e26c8753354ab6eacc.hot-update.js",
"/js/main.6aa622630357ff6b92bb.hot-update.js": "/js/main.6aa622630357ff6b92bb.hot-update.js",
"/js/main.36ee2cbe2e1cdf1d2db2.hot-update.js": "/js/main.36ee2cbe2e1cdf1d2db2.hot-update.js",
"/js/main.dff69ffc5c5136e8a59f.hot-update.js": "/js/main.dff69ffc5c5136e8a59f.hot-update.js",
"/js/main.74df9c1a881e7060c06a.hot-update.js": "/js/main.74df9c1a881e7060c06a.hot-update.js",
"/js/main.c71833bbfefbfa17deb0.hot-update.js": "/js/main.c71833bbfefbfa17deb0.hot-update.js",
"/js/main.ea3b3d11f5ba575cc1a9.hot-update.js": "/js/main.ea3b3d11f5ba575cc1a9.hot-update.js",
"/js/main.375a09e047f6de44b751.hot-update.js": "/js/main.375a09e047f6de44b751.hot-update.js",
"/js/main.b88e01086aff7e390931.hot-update.js": "/js/main.b88e01086aff7e390931.hot-update.js",
"/js/main.bdafae541f4950dfb102.hot-update.js": "/js/main.bdafae541f4950dfb102.hot-update.js",
"/js/main.2b4522ef2be08f9b6b2a.hot-update.js": "/js/main.2b4522ef2be08f9b6b2a.hot-update.js",
"/js/main.1cf0f751d686b23b4d9c.hot-update.js": "/js/main.1cf0f751d686b23b4d9c.hot-update.js",
"/js/main.7ad2beff93a3ccd5eecc.hot-update.js": "/js/main.7ad2beff93a3ccd5eecc.hot-update.js",
"/js/main.8d29944d11794f6008fc.hot-update.js": "/js/main.8d29944d11794f6008fc.hot-update.js",
"/js/main.14ac674beee1c96cc908.hot-update.js": "/js/main.14ac674beee1c96cc908.hot-update.js",
"/js/main.4df8db8fbc00f790b35f.hot-update.js": "/js/main.4df8db8fbc00f790b35f.hot-update.js",
"/js/main.83bd99ee8fab0305549a.hot-update.js": "/js/main.83bd99ee8fab0305549a.hot-update.js",
"/js/main.b98a50855de0e8b3f1d7.hot-update.js": "/js/main.b98a50855de0e8b3f1d7.hot-update.js",
"/js/main.f172526d87e5bcf4167f.hot-update.js": "/js/main.f172526d87e5bcf4167f.hot-update.js",
"/js/main.39f5347e2c133fadf7d9.hot-update.js": "/js/main.39f5347e2c133fadf7d9.hot-update.js",
"/js/main.294c300a035f6d93d7ee.hot-update.js": "/js/main.294c300a035f6d93d7ee.hot-update.js",
"/js/main.ebe948263e7b010f01c6.hot-update.js": "/js/main.ebe948263e7b010f01c6.hot-update.js",
"/js/main.2e664ac19e1847cd6cd4.hot-update.js": "/js/main.2e664ac19e1847cd6cd4.hot-update.js"
"/js/main.db73e300d42a147d92c9.hot-update.js": "/js/main.db73e300d42a147d92c9.hot-update.js",
"/js/main.0ea5df0b535e6454abdc.hot-update.js": "/js/main.0ea5df0b535e6454abdc.hot-update.js",
"/js/main.2cda68eaebe1626133c7.hot-update.js": "/js/main.2cda68eaebe1626133c7.hot-update.js",
"/js/main.88f0e74490296b17f12b.hot-update.js": "/js/main.88f0e74490296b17f12b.hot-update.js",
"/js/main.8ba41725bdb9b08ea41b.hot-update.js": "/js/main.8ba41725bdb9b08ea41b.hot-update.js",
"/js/main.7b5e66db24a0d8fffc66.hot-update.js": "/js/main.7b5e66db24a0d8fffc66.hot-update.js",
"/js/main.e44f7ecf17c7e0268ae4.hot-update.js": "/js/main.e44f7ecf17c7e0268ae4.hot-update.js",
"/js/main.6749d2651a3d98182751.hot-update.js": "/js/main.6749d2651a3d98182751.hot-update.js",
"/js/main.5c564e162157c5e6fb80.hot-update.js": "/js/main.5c564e162157c5e6fb80.hot-update.js",
"/js/main.c6a1574884392a89cbaa.hot-update.js": "/js/main.c6a1574884392a89cbaa.hot-update.js",
"/js/main.cdebd19025c701560b92.hot-update.js": "/js/main.cdebd19025c701560b92.hot-update.js",
"/js/main.f896b7d13aad9732ad0e.hot-update.js": "/js/main.f896b7d13aad9732ad0e.hot-update.js",
"/js/main.14e6ae82553043793d06.hot-update.js": "/js/main.14e6ae82553043793d06.hot-update.js",
"/js/main.e1d8968eaca9c7a94e14.hot-update.js": "/js/main.e1d8968eaca9c7a94e14.hot-update.js",
"/js/main.ee5e426715877748a226.hot-update.js": "/js/main.ee5e426715877748a226.hot-update.js",
"/js/main.54454754153a4b810c68.hot-update.js": "/js/main.54454754153a4b810c68.hot-update.js",
"/js/main.73250572619a4dca0d35.hot-update.js": "/js/main.73250572619a4dca0d35.hot-update.js",
"/js/main.4dbe97b31e06a3c1bebf.hot-update.js": "/js/main.4dbe97b31e06a3c1bebf.hot-update.js",
"/js/main.809268a1e86deba22298.hot-update.js": "/js/main.809268a1e86deba22298.hot-update.js",
"/js/main.4490e500053d12748641.hot-update.js": "/js/main.4490e500053d12748641.hot-update.js",
"/js/main.3953c82fcb9e8aa236f4.hot-update.js": "/js/main.3953c82fcb9e8aa236f4.hot-update.js",
"/js/main.90a12056f475838d806c.hot-update.js": "/js/main.90a12056f475838d806c.hot-update.js",
"/js/main.fba13eb0d8bdc2de63f9.hot-update.js": "/js/main.fba13eb0d8bdc2de63f9.hot-update.js",
"/js/main.2d77e5427d4b8b55419b.hot-update.js": "/js/main.2d77e5427d4b8b55419b.hot-update.js",
"/js/main.966dba3cdb08000411ae.hot-update.js": "/js/main.966dba3cdb08000411ae.hot-update.js",
"/js/main.8a320a785898586b8d10.hot-update.js": "/js/main.8a320a785898586b8d10.hot-update.js",
"/js/main.28edbc28a0031b3f4913.hot-update.js": "/js/main.28edbc28a0031b3f4913.hot-update.js",
"/js/main.79eb3750c72852c42485.hot-update.js": "/js/main.79eb3750c72852c42485.hot-update.js",
"/js/main.9703ef1a8f855482838f.hot-update.js": "/js/main.9703ef1a8f855482838f.hot-update.js",
"/js/main.1cbfcf8465e5d6aa0096.hot-update.js": "/js/main.1cbfcf8465e5d6aa0096.hot-update.js",
"/js/main.f1e7b129d14fc15d72e8.hot-update.js": "/js/main.f1e7b129d14fc15d72e8.hot-update.js",
"/js/main.58f0f9d441ec01c7d553.hot-update.js": "/js/main.58f0f9d441ec01c7d553.hot-update.js",
"/js/main.45858a0dfab5dd3a911a.hot-update.js": "/js/main.45858a0dfab5dd3a911a.hot-update.js",
"/js/main.ade5cf3ef31b2e506425.hot-update.js": "/js/main.ade5cf3ef31b2e506425.hot-update.js",
"/js/main.c4304b2de45e8f06f7b5.hot-update.js": "/js/main.c4304b2de45e8f06f7b5.hot-update.js",
"/js/main.0961cf18a9605cb65e3f.hot-update.js": "/js/main.0961cf18a9605cb65e3f.hot-update.js",
"/js/main.5a371d0e098a933c4640.hot-update.js": "/js/main.5a371d0e098a933c4640.hot-update.js",
"/js/main.d3c2f6bd4ce092746115.hot-update.js": "/js/main.d3c2f6bd4ce092746115.hot-update.js",
"/js/main.e191340cc52008653ed0.hot-update.js": "/js/main.e191340cc52008653ed0.hot-update.js",
"/js/main.3cb43f27a625a07fcc0b.hot-update.js": "/js/main.3cb43f27a625a07fcc0b.hot-update.js",
"/js/main.1410e64aed21b84592e7.hot-update.js": "/js/main.1410e64aed21b84592e7.hot-update.js",
"/js/main.08a6a51c0acea91879f7.hot-update.js": "/js/main.08a6a51c0acea91879f7.hot-update.js",
"/js/main.f3a5ecf31e3df2d23957.hot-update.js": "/js/main.f3a5ecf31e3df2d23957.hot-update.js",
"/js/main.7c67297040c94f2a585e.hot-update.js": "/js/main.7c67297040c94f2a585e.hot-update.js",
"/js/main.d7c58200175c3d4ab962.hot-update.js": "/js/main.d7c58200175c3d4ab962.hot-update.js",
"/js/main.58979cee95bba3ec04c5.hot-update.js": "/js/main.58979cee95bba3ec04c5.hot-update.js",
"/js/main.94f329f8b9d0aa2d4182.hot-update.js": "/js/main.94f329f8b9d0aa2d4182.hot-update.js",
"/js/main.23a1f3a1d28f2b39e1b7.hot-update.js": "/js/main.23a1f3a1d28f2b39e1b7.hot-update.js",
"/js/main.a7df7455225c5d05227f.hot-update.js": "/js/main.a7df7455225c5d05227f.hot-update.js",
"/js/main.7b16550bbd8be6cc9b8d.hot-update.js": "/js/main.7b16550bbd8be6cc9b8d.hot-update.js",
"/js/main.780968811eb17fef25a7.hot-update.js": "/js/main.780968811eb17fef25a7.hot-update.js",
"/js/main.aad31e3890b61350c4fa.hot-update.js": "/js/main.aad31e3890b61350c4fa.hot-update.js",
"/js/main.41b4b985c13b8890717d.hot-update.js": "/js/main.41b4b985c13b8890717d.hot-update.js",
"/js/main.e025100d60c74d0392d1.hot-update.js": "/js/main.e025100d60c74d0392d1.hot-update.js",
"/js/main.67661103ba5d1dd3cac6.hot-update.js": "/js/main.67661103ba5d1dd3cac6.hot-update.js",
"/js/main.4859f6f2e961eba13edf.hot-update.js": "/js/main.4859f6f2e961eba13edf.hot-update.js",
"/js/main.2412ccd7b9afcb3dd059.hot-update.js": "/js/main.2412ccd7b9afcb3dd059.hot-update.js",
"/js/main.0a9300e8875685257a5a.hot-update.js": "/js/main.0a9300e8875685257a5a.hot-update.js",
"/js/main.6e32369655d811852893.hot-update.js": "/js/main.6e32369655d811852893.hot-update.js",
"/js/main.07e4dcb8b14f80943019.hot-update.js": "/js/main.07e4dcb8b14f80943019.hot-update.js",
"/js/main.a970e8749724b2c1488f.hot-update.js": "/js/main.a970e8749724b2c1488f.hot-update.js",
"/js/main.26c44e4e22a245d1e8a9.hot-update.js": "/js/main.26c44e4e22a245d1e8a9.hot-update.js",
"/js/main.de6ddacb5c245c079fab.hot-update.js": "/js/main.de6ddacb5c245c079fab.hot-update.js",
"/js/main.564a42509ff2e25ba549.hot-update.js": "/js/main.564a42509ff2e25ba549.hot-update.js",
"/js/main.c63aad49b7cd674b91a7.hot-update.js": "/js/main.c63aad49b7cd674b91a7.hot-update.js",
"/js/main.81931bb64710a2f54368.hot-update.js": "/js/main.81931bb64710a2f54368.hot-update.js",
"/js/main.34efd0ebe70125b4d9cd.hot-update.js": "/js/main.34efd0ebe70125b4d9cd.hot-update.js",
"/js/main.3de56aa8af78d2912a79.hot-update.js": "/js/main.3de56aa8af78d2912a79.hot-update.js",
"/js/main.3492d8df8ba23f79e39f.hot-update.js": "/js/main.3492d8df8ba23f79e39f.hot-update.js",
"/js/main.1a1f505e34d61bf5c741.hot-update.js": "/js/main.1a1f505e34d61bf5c741.hot-update.js",
"/js/main.7d6fa20346e95f934020.hot-update.js": "/js/main.7d6fa20346e95f934020.hot-update.js",
"/js/main.e5fa1224b06e6203aaa4.hot-update.js": "/js/main.e5fa1224b06e6203aaa4.hot-update.js",
"/js/main.a2e4f55324730e0a1137.hot-update.js": "/js/main.a2e4f55324730e0a1137.hot-update.js",
"/js/main.82081e3a97b9075cbf38.hot-update.js": "/js/main.82081e3a97b9075cbf38.hot-update.js",
"/js/main.ab06dcdaa2fc897e4576.hot-update.js": "/js/main.ab06dcdaa2fc897e4576.hot-update.js",
"/js/main.8aee157f69acbf01d692.hot-update.js": "/js/main.8aee157f69acbf01d692.hot-update.js",
"/js/main.82087e18f1767795f3cc.hot-update.js": "/js/main.82087e18f1767795f3cc.hot-update.js",
"/js/main.f2c483d7d1261df861b3.hot-update.js": "/js/main.f2c483d7d1261df861b3.hot-update.js",
"/js/main.ef75264f1a02af5ca3cd.hot-update.js": "/js/main.ef75264f1a02af5ca3cd.hot-update.js",
"/js/main.cd61e67651fe4e61f358.hot-update.js": "/js/main.cd61e67651fe4e61f358.hot-update.js",
"/js/main.97ba89c984ffe538a333.hot-update.js": "/js/main.97ba89c984ffe538a333.hot-update.js",
"/js/main.a23de6f4cea6b80806b4.hot-update.js": "/js/main.a23de6f4cea6b80806b4.hot-update.js",
"/js/main.90440654186ae45a6f63.hot-update.js": "/js/main.90440654186ae45a6f63.hot-update.js",
"/js/main.483297e74b80dfdc50c3.hot-update.js": "/js/main.483297e74b80dfdc50c3.hot-update.js",
"/js/main.e2831389d5cdf78e4bd3.hot-update.js": "/js/main.e2831389d5cdf78e4bd3.hot-update.js",
"/js/main.3af60e2033e8130d75f6.hot-update.js": "/js/main.3af60e2033e8130d75f6.hot-update.js",
"/js/main.1b1ac80d4947b920ea2f.hot-update.js": "/js/main.1b1ac80d4947b920ea2f.hot-update.js",
"/js/main.8a52e7d2eff934f9de4d.hot-update.js": "/js/main.8a52e7d2eff934f9de4d.hot-update.js",
"/js/main.b67e5558feff737183b6.hot-update.js": "/js/main.b67e5558feff737183b6.hot-update.js",
"/js/main.2202ff72b0fe9ff3f0c2.hot-update.js": "/js/main.2202ff72b0fe9ff3f0c2.hot-update.js",
"/js/main.d9cb8d8e4ca7d410b22f.hot-update.js": "/js/main.d9cb8d8e4ca7d410b22f.hot-update.js",
"/js/main.a1d688c433c9fcf14bab.hot-update.js": "/js/main.a1d688c433c9fcf14bab.hot-update.js",
"/js/main.b2cf91ae6a0fbc682e64.hot-update.js": "/js/main.b2cf91ae6a0fbc682e64.hot-update.js",
"/js/main.63e1d96c978ec4ca4e3a.hot-update.js": "/js/main.63e1d96c978ec4ca4e3a.hot-update.js",
"/js/main.6e476cf8eabaf496f17a.hot-update.js": "/js/main.6e476cf8eabaf496f17a.hot-update.js",
"/js/main.fa9bfaf5cf5b454739e7.hot-update.js": "/js/main.fa9bfaf5cf5b454739e7.hot-update.js",
"/js/main.b246393843e1e04d1472.hot-update.js": "/js/main.b246393843e1e04d1472.hot-update.js",
"/js/main.cfeac3c0594ca2e18cbc.hot-update.js": "/js/main.cfeac3c0594ca2e18cbc.hot-update.js",
"/js/main.ffaf8712fd1cd702ea8a.hot-update.js": "/js/main.ffaf8712fd1cd702ea8a.hot-update.js",
"/js/main.1a9b77d1d99fa0cbe049.hot-update.js": "/js/main.1a9b77d1d99fa0cbe049.hot-update.js",
"/js/main.35f70fbeab261f617c64.hot-update.js": "/js/main.35f70fbeab261f617c64.hot-update.js",
"/js/main.2adec493e4879764b552.hot-update.js": "/js/main.2adec493e4879764b552.hot-update.js",
"/js/main.84e27e090764f99a5f8d.hot-update.js": "/js/main.84e27e090764f99a5f8d.hot-update.js",
"/js/main.d5fad1aae15440174c3b.hot-update.js": "/js/main.d5fad1aae15440174c3b.hot-update.js",
"/js/main.f082a5aa1a7d811653b0.hot-update.js": "/js/main.f082a5aa1a7d811653b0.hot-update.js",
"/js/main.cd15a772e4d701a910b1.hot-update.js": "/js/main.cd15a772e4d701a910b1.hot-update.js",
"/js/main.1e62178bd569cacdace7.hot-update.js": "/js/main.1e62178bd569cacdace7.hot-update.js",
"/js/main.19bca5f612f96fe6d127.hot-update.js": "/js/main.19bca5f612f96fe6d127.hot-update.js",
"/js/main.c775d381b77c164f7fc4.hot-update.js": "/js/main.c775d381b77c164f7fc4.hot-update.js",
"/js/main.f8c6cffd1559d9578b83.hot-update.js": "/js/main.f8c6cffd1559d9578b83.hot-update.js",
"/js/main.c7ff369b0854108f96c7.hot-update.js": "/js/main.c7ff369b0854108f96c7.hot-update.js",
"/js/main.062ff67378e519023a1e.hot-update.js": "/js/main.062ff67378e519023a1e.hot-update.js",
"/js/main.6e66fc4d78272a71315e.hot-update.js": "/js/main.6e66fc4d78272a71315e.hot-update.js",
"/js/main.a8e90242995935949f17.hot-update.js": "/js/main.a8e90242995935949f17.hot-update.js",
"/js/main.4e224f3aad42c7f5ed0b.hot-update.js": "/js/main.4e224f3aad42c7f5ed0b.hot-update.js",
"/js/main.385eb38db8eb0702b502.hot-update.js": "/js/main.385eb38db8eb0702b502.hot-update.js",
"/js/main.996d84214f93de3c1c0b.hot-update.js": "/js/main.996d84214f93de3c1c0b.hot-update.js",
"/js/main.38d70851a7c72784d66d.hot-update.js": "/js/main.38d70851a7c72784d66d.hot-update.js",
"/js/main.dbbfab82de065b7b60cd.hot-update.js": "/js/main.dbbfab82de065b7b60cd.hot-update.js",
"/js/main.574aea784108ee1eac07.hot-update.js": "/js/main.574aea784108ee1eac07.hot-update.js",
"/js/main.9de756c799555e75db7d.hot-update.js": "/js/main.9de756c799555e75db7d.hot-update.js",
"/js/main.83ab95777680fb06e0aa.hot-update.js": "/js/main.83ab95777680fb06e0aa.hot-update.js",
"/js/main.e666c42f96b6bdb22969.hot-update.js": "/js/main.e666c42f96b6bdb22969.hot-update.js",
"/js/main.03428097b17bfe163a16.hot-update.js": "/js/main.03428097b17bfe163a16.hot-update.js",
"/js/main.05d6a5f7f8c614a903e8.hot-update.js": "/js/main.05d6a5f7f8c614a903e8.hot-update.js",
"/js/main.7d8ff39260c5f281d28f.hot-update.js": "/js/main.7d8ff39260c5f281d28f.hot-update.js",
"/js/main.ad2349f007227d33ace3.hot-update.js": "/js/main.ad2349f007227d33ace3.hot-update.js",
"/js/main.61787afe25ca75dad5ec.hot-update.js": "/js/main.61787afe25ca75dad5ec.hot-update.js",
"/js/main.f130f7974630d2357291.hot-update.js": "/js/main.f130f7974630d2357291.hot-update.js",
"/js/main.194f15b84f0ba10c3558.hot-update.js": "/js/main.194f15b84f0ba10c3558.hot-update.js",
"/js/main.c9d4446b200a7919a284.hot-update.js": "/js/main.c9d4446b200a7919a284.hot-update.js",
"/js/main.a8a11f9957cb0472fcb1.hot-update.js": "/js/main.a8a11f9957cb0472fcb1.hot-update.js",
"/js/main.15201b3e0fd22133a26a.hot-update.js": "/js/main.15201b3e0fd22133a26a.hot-update.js",
"/js/main.24c3c7e84b88e524c006.hot-update.js": "/js/main.24c3c7e84b88e524c006.hot-update.js",
"/js/main.4a9d275860a5b9a8d2d2.hot-update.js": "/js/main.4a9d275860a5b9a8d2d2.hot-update.js",
"/js/main.1a78e45577ac640daa18.hot-update.js": "/js/main.1a78e45577ac640daa18.hot-update.js",
"/js/main.91f804d23d8cd6a0562e.hot-update.js": "/js/main.91f804d23d8cd6a0562e.hot-update.js",
"/js/main.37f4690a9d8970b2a997.hot-update.js": "/js/main.37f4690a9d8970b2a997.hot-update.js",
"/js/main.39cc460540d3e54e861d.hot-update.js": "/js/main.39cc460540d3e54e861d.hot-update.js",
"/js/main.97e2ae5d288287b185a4.hot-update.js": "/js/main.97e2ae5d288287b185a4.hot-update.js",
"/js/main.bcaa46e78128bc1ce527.hot-update.js": "/js/main.bcaa46e78128bc1ce527.hot-update.js",
"/js/main.f9b275607e4c5781a474.hot-update.js": "/js/main.f9b275607e4c5781a474.hot-update.js",
"/js/main.3625f6f0997dd72db8fb.hot-update.js": "/js/main.3625f6f0997dd72db8fb.hot-update.js",
"/js/main.8aac94e8b65eb3822505.hot-update.js": "/js/main.8aac94e8b65eb3822505.hot-update.js",
"/js/main.962286776eaf79087cff.hot-update.js": "/js/main.962286776eaf79087cff.hot-update.js",
"/js/main.a66ab1c4d2fa23744e67.hot-update.js": "/js/main.a66ab1c4d2fa23744e67.hot-update.js",
"/js/main.9a1ab04495b8495aa7a3.hot-update.js": "/js/main.9a1ab04495b8495aa7a3.hot-update.js",
"/js/main.394df0e7d4886f791e9a.hot-update.js": "/js/main.394df0e7d4886f791e9a.hot-update.js",
"/js/main.bbd2e296d4d14fafbc5c.hot-update.js": "/js/main.bbd2e296d4d14fafbc5c.hot-update.js",
"/js/main.c9330023b054be206d4d.hot-update.js": "/js/main.c9330023b054be206d4d.hot-update.js",
"/js/main.5d81a2f9c58ce58a43cd.hot-update.js": "/js/main.5d81a2f9c58ce58a43cd.hot-update.js",
"/js/main.86fa688fb982fbd12aca.hot-update.js": "/js/main.86fa688fb982fbd12aca.hot-update.js",
"/js/main.645f6368417b7c4fd590.hot-update.js": "/js/main.645f6368417b7c4fd590.hot-update.js",
"/js/main.6edba403d405425e87cf.hot-update.js": "/js/main.6edba403d405425e87cf.hot-update.js",
"/js/main.ca0cd44c7d8d17cc9991.hot-update.js": "/js/main.ca0cd44c7d8d17cc9991.hot-update.js",
"/js/main.b831183422933c78119c.hot-update.js": "/js/main.b831183422933c78119c.hot-update.js",
"/js/main.80db7eb954bc974b52ec.hot-update.js": "/js/main.80db7eb954bc974b52ec.hot-update.js",
"/js/main.8bee745b28ee104901f8.hot-update.js": "/js/main.8bee745b28ee104901f8.hot-update.js",
"/js/main.e0e4ec61d482c4f3dbe8.hot-update.js": "/js/main.e0e4ec61d482c4f3dbe8.hot-update.js",
"/js/main.bb3ed5bb83568a1abbda.hot-update.js": "/js/main.bb3ed5bb83568a1abbda.hot-update.js",
"/js/main.0fca3fcc3088a5f8b7e0.hot-update.js": "/js/main.0fca3fcc3088a5f8b7e0.hot-update.js",
"/js/main.fb7b96cb40ab22050c79.hot-update.js": "/js/main.fb7b96cb40ab22050c79.hot-update.js",
"/js/main.9348fa55f71efc5060b8.hot-update.js": "/js/main.9348fa55f71efc5060b8.hot-update.js",
"/js/main.0122b6629f01a705476d.hot-update.js": "/js/main.0122b6629f01a705476d.hot-update.js",
"/js/main.ffc029e04518fabf33cd.hot-update.js": "/js/main.ffc029e04518fabf33cd.hot-update.js",
"/js/main.0666ac365d039c279130.hot-update.js": "/js/main.0666ac365d039c279130.hot-update.js",
"/js/main.844c2113c0c54845083c.hot-update.js": "/js/main.844c2113c0c54845083c.hot-update.js",
"/js/main.04c649da59688caed7f4.hot-update.js": "/js/main.04c649da59688caed7f4.hot-update.js",
"/js/main.df8852739b6eb0d8ddd8.hot-update.js": "/js/main.df8852739b6eb0d8ddd8.hot-update.js",
"/js/main.2bb035b765159291e6d4.hot-update.js": "/js/main.2bb035b765159291e6d4.hot-update.js",
"/js/main.6eb45c6e294e847c45ea.hot-update.js": "/js/main.6eb45c6e294e847c45ea.hot-update.js",
"/js/main.c6070c2ada89c43fa419.hot-update.js": "/js/main.c6070c2ada89c43fa419.hot-update.js",
"/js/main.f828168b89124130bc68.hot-update.js": "/js/main.f828168b89124130bc68.hot-update.js",
"/js/main.e5eb5a13e710543f7bd9.hot-update.js": "/js/main.e5eb5a13e710543f7bd9.hot-update.js",
"/js/main.63b69c5bbda8f437d459.hot-update.js": "/js/main.63b69c5bbda8f437d459.hot-update.js",
"/js/main.a72c8891596b66b212b6.hot-update.js": "/js/main.a72c8891596b66b212b6.hot-update.js",
"/js/main.19e0710bc40f03b262e6.hot-update.js": "/js/main.19e0710bc40f03b262e6.hot-update.js",
"/js/main.0134afb94f91a4a36def.hot-update.js": "/js/main.0134afb94f91a4a36def.hot-update.js",
"/js/main.9a24933aefa3e49663f7.hot-update.js": "/js/main.9a24933aefa3e49663f7.hot-update.js",
"/js/main.cc27c9bc9c27f1b845bb.hot-update.js": "/js/main.cc27c9bc9c27f1b845bb.hot-update.js",
"/js/main.b93834f4ca3df91cd540.hot-update.js": "/js/main.b93834f4ca3df91cd540.hot-update.js",
"/js/main.5937cb7e39356fd7d4c4.hot-update.js": "/js/main.5937cb7e39356fd7d4c4.hot-update.js",
"/js/main.cea013f04296667aee3a.hot-update.js": "/js/main.cea013f04296667aee3a.hot-update.js",
"/js/main.bff0613b9adee03ca219.hot-update.js": "/js/main.bff0613b9adee03ca219.hot-update.js",
"/js/main.a43ba373208207664417.hot-update.js": "/js/main.a43ba373208207664417.hot-update.js",
"/js/main.4ff290116a377da3d41f.hot-update.js": "/js/main.4ff290116a377da3d41f.hot-update.js",
"/js/main.96a5134be5a0a98693e4.hot-update.js": "/js/main.96a5134be5a0a98693e4.hot-update.js",
"/js/main.e0432d1e9c7975c2ab9d.hot-update.js": "/js/main.e0432d1e9c7975c2ab9d.hot-update.js",
"/js/main.d62433ce757652be6f54.hot-update.js": "/js/main.d62433ce757652be6f54.hot-update.js",
"/js/main.fa91e0076416ce9b9eac.hot-update.js": "/js/main.fa91e0076416ce9b9eac.hot-update.js",
"/js/main.6791a0db3468e2abbb01.hot-update.js": "/js/main.6791a0db3468e2abbb01.hot-update.js",
"/js/main.f34c60f7b8d27d185789.hot-update.js": "/js/main.f34c60f7b8d27d185789.hot-update.js",
"/js/main.e0ac013a5685366884b0.hot-update.js": "/js/main.e0ac013a5685366884b0.hot-update.js",
"/js/main.45f929f9501bca0a3a2b.hot-update.js": "/js/main.45f929f9501bca0a3a2b.hot-update.js",
"/js/main.c17c98fa0aac463d62ec.hot-update.js": "/js/main.c17c98fa0aac463d62ec.hot-update.js",
"/js/main.0e03c020348420598462.hot-update.js": "/js/main.0e03c020348420598462.hot-update.js",
"/js/main.0a76373d676f6bc3f8b7.hot-update.js": "/js/main.0a76373d676f6bc3f8b7.hot-update.js",
"/js/main.7d0b5e6140d5a76d8a6e.hot-update.js": "/js/main.7d0b5e6140d5a76d8a6e.hot-update.js",
"/js/main.5faa42142a298e5ab92b.hot-update.js": "/js/main.5faa42142a298e5ab92b.hot-update.js",
"/js/main.3eaf20665f37c24473fd.hot-update.js": "/js/main.3eaf20665f37c24473fd.hot-update.js",
"/js/main.6d0cf380525ddd49bb4b.hot-update.js": "/js/main.6d0cf380525ddd49bb4b.hot-update.js",
"/js/main.96ceb1a99c9ccca2fbbe.hot-update.js": "/js/main.96ceb1a99c9ccca2fbbe.hot-update.js",
"/js/main.3557a28505eb1edad3c6.hot-update.js": "/js/main.3557a28505eb1edad3c6.hot-update.js",
"/js/main.f85533ba77bc9daa2b28.hot-update.js": "/js/main.f85533ba77bc9daa2b28.hot-update.js",
"/js/main.844ced51412415958d01.hot-update.js": "/js/main.844ced51412415958d01.hot-update.js",
"/js/main.4aef58634b3a86124e7f.hot-update.js": "/js/main.4aef58634b3a86124e7f.hot-update.js",
"/js/main.6de5f0faf8a05f2fc5a7.hot-update.js": "/js/main.6de5f0faf8a05f2fc5a7.hot-update.js",
"/js/main.c62abbf47cf5f738c9b5.hot-update.js": "/js/main.c62abbf47cf5f738c9b5.hot-update.js",
"/js/main.87c321a637ae5ab917ce.hot-update.js": "/js/main.87c321a637ae5ab917ce.hot-update.js",
"/js/main.90ad40b9a9f360d249f9.hot-update.js": "/js/main.90ad40b9a9f360d249f9.hot-update.js",
"/js/main.91b09e11f41e643af61b.hot-update.js": "/js/main.91b09e11f41e643af61b.hot-update.js",
"/js/main.6e993020f81c4506f7f1.hot-update.js": "/js/main.6e993020f81c4506f7f1.hot-update.js",
"/js/main.eb69554875d7f6f0af13.hot-update.js": "/js/main.eb69554875d7f6f0af13.hot-update.js",
"/js/main.b00263659caf576e365f.hot-update.js": "/js/main.b00263659caf576e365f.hot-update.js",
"/js/main.3731a12d7df03dd0b1ac.hot-update.js": "/js/main.3731a12d7df03dd0b1ac.hot-update.js",
"/js/main.14283c0c8928f2bac642.hot-update.js": "/js/main.14283c0c8928f2bac642.hot-update.js",
"/js/main.5d22154675bb7301f3c3.hot-update.js": "/js/main.5d22154675bb7301f3c3.hot-update.js",
"/js/main.68f901614ec25bb9be2e.hot-update.js": "/js/main.68f901614ec25bb9be2e.hot-update.js",
"/js/main.94b2828776f652bbecd1.hot-update.js": "/js/main.94b2828776f652bbecd1.hot-update.js",
"/js/main.a5193c2c4b1f57e843ac.hot-update.js": "/js/main.a5193c2c4b1f57e843ac.hot-update.js",
"/js/main.50b2e366bd6b72990a03.hot-update.js": "/js/main.50b2e366bd6b72990a03.hot-update.js",
"/js/main.f7a87e8ee0dc7a8c3d35.hot-update.js": "/js/main.f7a87e8ee0dc7a8c3d35.hot-update.js",
"/js/main.460fb4a8eadec50eafc0.hot-update.js": "/js/main.460fb4a8eadec50eafc0.hot-update.js",
"/js/main.b56efb8b6dda94e0e837.hot-update.js": "/js/main.b56efb8b6dda94e0e837.hot-update.js",
"/js/main.7696e7ea10b668afeccc.hot-update.js": "/js/main.7696e7ea10b668afeccc.hot-update.js",
"/js/main.7d32beb20b5719f11726.hot-update.js": "/js/main.7d32beb20b5719f11726.hot-update.js",
"/js/main.6325449e7341db20a9ce.hot-update.js": "/js/main.6325449e7341db20a9ce.hot-update.js",
"/js/main.2cc0ebd3eba768b8429c.hot-update.js": "/js/main.2cc0ebd3eba768b8429c.hot-update.js",
"/js/main.22edc66a07d0d7fc8d83.hot-update.js": "/js/main.22edc66a07d0d7fc8d83.hot-update.js",
"/js/main.60bed97815a1ea0a09d6.hot-update.js": "/js/main.60bed97815a1ea0a09d6.hot-update.js",
"/js/main.f6a63bab2aa5511566e7.hot-update.js": "/js/main.f6a63bab2aa5511566e7.hot-update.js",
"/js/main.121e2dd11bc35045482b.hot-update.js": "/js/main.121e2dd11bc35045482b.hot-update.js",
"/js/main.541def265ec163ed2d5f.hot-update.js": "/js/main.541def265ec163ed2d5f.hot-update.js",
"/js/main.c9814fe8d127f6265fdf.hot-update.js": "/js/main.c9814fe8d127f6265fdf.hot-update.js",
"/js/main.0c31610719dd6fbfd7ab.hot-update.js": "/js/main.0c31610719dd6fbfd7ab.hot-update.js",
"/js/main.73d20180f790009a0536.hot-update.js": "/js/main.73d20180f790009a0536.hot-update.js",
"/js/main.bd8cd2b0d65c5499a5fa.hot-update.js": "/js/main.bd8cd2b0d65c5499a5fa.hot-update.js",
"/js/main.4b941ee3158e8f359e0b.hot-update.js": "/js/main.4b941ee3158e8f359e0b.hot-update.js",
"/js/main.4eed502c18c3384e017c.hot-update.js": "/js/main.4eed502c18c3384e017c.hot-update.js",
"/js/main.0ff9c65b54e9f2fd3f09.hot-update.js": "/js/main.0ff9c65b54e9f2fd3f09.hot-update.js",
"/js/main.0c5bcf3373897713488f.hot-update.js": "/js/main.0c5bcf3373897713488f.hot-update.js",
"/js/main.5d00a679a40bb2c37b11.hot-update.js": "/js/main.5d00a679a40bb2c37b11.hot-update.js",
"/js/main.2559125fe1eef3ee7dd3.hot-update.js": "/js/main.2559125fe1eef3ee7dd3.hot-update.js",
"/js/main.55d5f2f55034cb7a4da6.hot-update.js": "/js/main.55d5f2f55034cb7a4da6.hot-update.js",
"/js/main.890897a7ce8479317a97.hot-update.js": "/js/main.890897a7ce8479317a97.hot-update.js",
"/js/main.988a45b98fc8b8c5e41c.hot-update.js": "/js/main.988a45b98fc8b8c5e41c.hot-update.js",
"/js/main.33577380f3a58be208ee.hot-update.js": "/js/main.33577380f3a58be208ee.hot-update.js",
"/js/main.ada254f372b54b162118.hot-update.js": "/js/main.ada254f372b54b162118.hot-update.js",
"/js/main.afa97b2d282c673884a9.hot-update.js": "/js/main.afa97b2d282c673884a9.hot-update.js"
}

View File

@@ -61,6 +61,14 @@
if (args.emoji) {
this.emoji = args.emoji
}
if (args.buttonStyle) {
this.buttonStyle = args.buttonStyle
}
if (args.button) {
this.button = args.button
}
})
// Show alert

View File

@@ -274,7 +274,10 @@
EyeIcon,
},
computed: {
...mapGetters(['app']),
...mapGetters(['user']),
favourites() {
return this.user.relationships.favourites.data.attributes.folders
},
isFolder() {
return this.item && this.item.type === 'folder'
},
@@ -285,7 +288,7 @@
return this.item && this.item.type === 'image'
},
isInFavourites() {
return this.app.favourites.find(el => el.unique_id == this.item.unique_id)
return this.favourites.find(el => el.unique_id == this.item.unique_id)
},
},
data() {
@@ -312,7 +315,7 @@
},
addToFavourites() {
// Check if folder is in favourites and then add/remove from favourites
if (this.app.favourites && !this.app.favourites.find(el => el.unique_id == this.item.unique_id)) {
if (this.favourites && !this.favourites.find(el => el.unique_id == this.item.unique_id)) {
this.$store.dispatch('addToFavourites', this.item)
} else {
this.$store.dispatch('removeFromFavourites', this.item)

View File

@@ -27,7 +27,7 @@
<!--Files controlls-->
<div class="toolbar-button-wrapper" v-if="$checkPermission(['master', 'editor'])">
<ToolbarButtonUpload
:class="{'is-inactive': canUploadInView}"
:class="{'is-inactive': canUploadInView || ! hasCapacity}"
:action="$t('actions.upload')"
/>
<ToolbarButton
@@ -109,6 +109,9 @@
'browseHistory',
'homeDirectory',
]),
hasCapacity() {
return this.$store.getters.user.relationships.storage.data.attributes.used <= 100
},
directoryName() {
return this.currentFolder ? this.currentFolder.name : this.homeDirectory.name
},

View File

@@ -288,6 +288,7 @@
bottom: 0;
@include transition;
overflow-y: auto;
overflow-x: hidden;
&.is-offset {
margin-top: 50px;

View File

@@ -1,7 +1,7 @@
<template>
<div class="file-info-content" v-if="fileInfoDetail">
<div class="file-headline" spellcheck="false">
<FilePreview />
<FilePreview/>
<!--File info-->
<div class="flex">
@@ -14,45 +14,38 @@
</div>
</div>
<div class="file-info">
<span ref="name" class="name">{{ fileInfoDetail.name }}</span>
<span ref="name" class="name">{{ fileInfoDetail.name }}</span>
<span class="mimetype" v-if="fileInfoDetail.mimetype">.{{ fileInfoDetail.mimetype }}</span>
</div>
</div>
</div>
<!--Info list-->
<ul class="list-info">
<ListInfo>
<ListInfoItem v-if="fileInfoDetail.filesize"
:title="$t('file_detail.size')"
:content="fileInfoDetail.filesize">
</ListInfoItem>
<!--Filesize-->
<li v-if="fileInfoDetail.filesize" class="list-info-item">
<b>{{ $t('file_detail.size') }}</b>
<span>{{ fileInfoDetail.filesize }}</span>
</li>
<ListInfoItem v-if="$checkPermission(['master']) && fileInfoDetail.user_scope !== 'master'"
:title="$t('file_detail.author')"
:content="$t('file_detail.author_participant')">
</ListInfoItem>
<!--Latest change-->
<li v-if="$checkPermission(['master']) && fileInfoDetail.user_scope !== 'master'" class="list-info-item">
<b>{{ $t('file_detail.author') }}</b>
<span>{{ $t('file_detail.author_participant') }}</span>
</li>
<ListInfoItem
:title="$t('file_detail.created_at')"
:content="fileInfoDetail.created_at">
</ListInfoItem>
<!--Latest change-->
<li class="list-info-item">
<b>{{ $t('file_detail.created_at') }}</b>
<span>{{ fileInfoDetail.created_at }}</span>
</li>
<!--Parent-->
<li v-if="$checkPermission(['master'])" class="list-info-item">
<b>{{ $t('file_detail.where') }}</b>
<ListInfoItem v-if="$checkPermission(['master'])"
:title="$t('file_detail.where')">
<div class="action-button" @click="moveItem">
<span>{{ fileInfoDetail.parent ? fileInfoDetail.parent.name : $t('locations.home') }}</span>
<edit-2-icon size="10" class="edit-icon"></edit-2-icon>
</div>
</li>
<!--Parent-->
<li v-if="$checkPermission('master') && fileInfoDetail.shared" class="list-info-item">
<b>{{ $t('file_detail.shared') }}</b>
</ListInfoItem>
<ListInfoItem v-if="$checkPermission('master') && fileInfoDetail.shared"
:title="$t('file_detail.shared')">
<div class="action-button" @click="shareItemOptions">
<span>{{ sharedInfo }}</span>
<edit-2-icon size="10" class="edit-icon"></edit-2-icon>
@@ -60,24 +53,27 @@
<div class="sharelink">
<lock-icon v-if="isLocked" @click="shareItemOptions" class="lock-icon" size="17"></lock-icon>
<unlock-icon v-if="! isLocked" @click="shareItemOptions" class="lock-icon" size="17"></unlock-icon>
<CopyInput class="copy-sharelink" size="small" :value="fileInfoDetail.shared.link" />
<CopyInput class="copy-sharelink" size="small" :value="fileInfoDetail.shared.link"/>
</div>
</li>
</ul>
</ListInfoItem>
</ListInfo>
</div>
</template>
<script>
import { Edit2Icon, LockIcon, UnlockIcon, ImageIcon, VideoIcon, FolderIcon, FileIcon } from 'vue-feather-icons'
import {Edit2Icon, LockIcon, UnlockIcon, ImageIcon, VideoIcon, FolderIcon, FileIcon} from 'vue-feather-icons'
import FilePreview from '@/components/FilesView/FilePreview'
import CopyInput from '@/components/Others/Forms/CopyInput'
import ListInfoItem from '@/components/Others/ListInfoItem'
import ListInfo from '@/components/Others/ListInfo'
import {mapGetters} from 'vuex'
import {events} from "@/bus"
export default {
name: 'FileInfoPanel',
components: {
ListInfoItem,
ListInfo,
FilePreview,
FolderIcon,
UnlockIcon,
@@ -92,23 +88,23 @@
...mapGetters(['fileInfoDetail', 'permissionOptions']),
fileType() {
return this.fileInfoDetail.type
/* switch () {
case 'folder':
return 'folder'
break;
case 'file':
return 'file'
break;
case 'image':
return 'file-image'
break;
case 'video':
return 'file-video'
break;
case 'file':
return 'file-audio'
break;
}*/
/* switch () {
case 'folder':
return 'folder'
break;
case 'file':
return 'file'
break;
case 'image':
return 'file-image'
break;
case 'video':
return 'file-video'
break;
case 'file':
return 'file-audio'
break;
}*/
},
sharedInfo() {
@@ -123,10 +119,10 @@
switch (this.fileInfoDetail.shared.permission) {
case 'editor':
return 'user-edit'
break
break
case 'visitor':
return 'user'
break
break
default:
return 'download'
}
@@ -199,41 +195,6 @@
}
}
.list-info {
.list-info-item {
display: block;
padding-top: 20px;
&:first-child {
padding-top: 0;
}
.action-button {
cursor: pointer;
.edit-icon {
display: inline-block;
margin-left: 3px;
}
}
b {
display: block;
@include font-size(13);
color: $theme;
margin-bottom: 2px;
}
span {
display: inline-block;
@include font-size(14);
font-weight: bold;
color: $text;
}
}
}
.sharelink {
display: flex;
width: 100%;
@@ -264,23 +225,6 @@
}
}
.list-info {
.list-info-item {
span {
color: $dark_mode_text_primary
}
.action-button {
.icon {
color: $dark_mode_text_primary;
}
}
}
}
.sharelink {
.lock-icon {

View File

@@ -258,9 +258,12 @@
EyeIcon,
},
computed: {
...mapGetters(['fileInfoDetail', 'app']),
...mapGetters(['fileInfoDetail', 'user']),
favourites() {
return this.user.relationships.favourites.data.attributes.folders
},
isInFavourites() {
return this.app.favourites.find(el => el.unique_id == this.fileInfoDetail.unique_id)
return this.favourites.find(el => el.unique_id == this.fileInfoDetail.unique_id)
},
isFile() {
return (this.fileInfoDetail && this.fileInfoDetail.type !== 'folder') && (this.fileInfoDetail && this.fileInfoDetail.type !== 'image')
@@ -292,7 +295,7 @@
}
},
addToFavourites() {
if (this.app.favourites && !this.app.favourites.find(el => el.unique_id == this.fileInfoDetail.unique_id)) {
if (this.favourites && !this.favourites.find(el => el.unique_id == this.fileInfoDetail.unique_id)) {
this.$store.dispatch('addToFavourites', this.fileInfoDetail)
} else {
this.$store.dispatch('removeFromFavourites', this.fileInfoDetail)

View File

@@ -18,7 +18,7 @@ export default {
.progress-bar {
width: 100%;
height: 5px;
background: $dark_background;
background: $light_background;
margin-top: 5px;
border-radius: 10px;

View File

@@ -115,7 +115,7 @@
}
.input-area {
border: 1px solid #ebebeb;
border: 1px solid transparent;
justify-content: space-between;
background: $light_mode_input_background;
@include transition(150ms);

View File

@@ -20,11 +20,13 @@
.setup-box {
padding: 20px;
border-radius: 8px;
margin-bottom: 30px;
.title {
@include font-size(19);
margin-bottom: 15px;
@include font-size(21);
margin-bottom: 5px;
display: block;
font-weight: 700;
}
.description {

View File

@@ -0,0 +1,16 @@
<template>
<ul class="list-info">
<slot></slot>
</ul>
</template>
<script>
export default {
name: 'ListInfo',
}
</script>
<style lang="scss" scoped>
@import '@assets/vue-file-manager/_variables';
@import '@assets/vue-file-manager/_mixins';
</style>

View File

@@ -0,0 +1,67 @@
<template>
<li class="list-info-item">
<b>{{ title }}</b>
<span v-if="content">{{ content }}</span>
<slot></slot>
</li>
</template>
<script>
export default {
name: 'ListInfoItem',
props: ['title', 'content']
}
</script>
<style lang="scss" scoped>
@import '@assets/vue-file-manager/_variables';
@import '@assets/vue-file-manager/_mixins';
.list-info-item {
display: block;
padding-bottom: 20px;
&:first-child {
padding-bottom: 0;
}
.action-button {
cursor: pointer;
.edit-icon {
display: inline-block;
margin-left: 3px;
}
}
b {
display: block;
@include font-size(13);
color: $theme;
margin-bottom: 2px;
}
span {
display: inline-block;
@include font-size(14);
font-weight: bold;
color: $text;
}
}
@media (prefers-color-scheme: dark) {
.list-info-item {
span {
color: $dark_mode_text_primary
}
.action-button {
.icon {
color: $dark_mode_text_primary;
}
}
}
}
</style>

View File

@@ -1,5 +1,5 @@
<template>
<div class="mobile-main-navigation" v-if="app">
<div class="mobile-main-navigation" v-if="user">
<transition name="context-menu">
<nav v-if="isVisible" class="mobile-navigation">
@@ -34,7 +34,7 @@
UserAvatar,
},
computed: {
...mapGetters(['app', 'homeDirectory']),
...mapGetters(['user', 'homeDirectory']),
navigation() {
return [
{
@@ -71,7 +71,7 @@
icon: 'settings',
title: this.$t('menu.admin'),
routeName: 'AdminMobileMenu',
isVisible: this.app.user.role === 'admin',
isVisible: this.user.data.attributes.role === 'admin',
},
{
icon: 'power',

View File

@@ -49,9 +49,15 @@
}
},
created() {
axios.get('/api/public/pricing')
.then(response => {
this.plans = response.data.data
this.plans = response.data.data.filter(plan => {
if (this.$store.getters.user.relationships.subscription)
return plan.data.attributes.capacity > this.$store.getters.user.relationships.subscription.data.attributes.capacity
return true
})
this.$emit('load', false)
})
}
@@ -133,6 +139,7 @@
display: flex;
flex-wrap: wrap;
margin: 0 -25px;
justify-content: center;
}
@media only screen and (max-width: 1024px) {

View File

@@ -97,7 +97,7 @@
required,
},
computed: {
...mapGetters(['app', 'permissionOptions']),
...mapGetters(['permissionOptions']),
itemTypeTitle() {
return this.pickedItem && this.pickedItem.type === 'folder' ? this.$t('types.folder') : this.$t('types.file')
},

View File

@@ -101,7 +101,7 @@
required,
},
computed: {
...mapGetters(['app', 'permissionOptions', 'currentFolder']),
...mapGetters(['user', 'permissionOptions', 'currentFolder']),
isFolder() {
return this.pickedItem && this.pickedItem.type === 'folder'
},

View File

@@ -8,6 +8,7 @@
@click="sort(column.field, column.sortable, index)"
:key="index"
:class="{ sortable: column.sortable }"
v-if="! column.hidden"
>
<span>{{ column.label }}</span>

View File

@@ -0,0 +1,98 @@
<template>
<div class="upgrade-banner">
<div class="header-title">
<hard-drive-icon size="19" class="icon"></hard-drive-icon>
<span class="title">{{ storage.used }}% From {{ storage.capacity_formatted }}</span>
</div>
<div class="content">
<p v-if="storage.used > 95" class="reach-capacity">You reach your storage capacity. Please upgrade.</p>
<p v-else class="reach-capacity">You nearly reach your storage capacity.</p>
</div>
<div class="footer">
<router-link :to="{name: 'UpgradePlan'}" class="button">
Upgrade
</router-link>
</div>
</div>
</template>
<script>
import ButtonBase from '@/components/FilesView/ButtonBase'
import { HardDriveIcon } from 'vue-feather-icons'
export default {
name: 'UpgradeSidebarBanner',
components: {
HardDriveIcon,
ButtonBase,
},
computed: {
storage() {
return this.$store.getters.user.relationships.storage.data.attributes
}
}
}
</script>
<style lang="scss" scoped>
@import '@assets/vue-file-manager/_variables';
@import '@assets/vue-file-manager/_mixins';
.upgrade-banner {
background: rgba($danger, 0.1);
padding: 10px;
border-radius: 6px;
margin: 0 16px;
}
.header-title {
margin-bottom: 12px;
display: flex;
align-items: center;
.icon {
margin-right: 10px;
line, path {
stroke: $danger;
}
}
.title {
@include font-size(13);
font-weight: 800;
color: $danger;
}
}
.content {
margin-bottom: 12px;
p {
@include font-size(12);
color: $danger;
font-weight: 700;
}
}
.button {
background: $danger;
border-radius: 50px;
padding: 6px 0;
width: 100%;
color: white;
text-align: center;
@include font-size(12);
font-weight: 700;
display: block;
box-shadow: 0 4px 10px rgba($danger, 0.35);
}
@media only screen and (max-width: 1024px) {
}
@media (prefers-color-scheme: dark) {
}
</style>

View File

@@ -1,6 +1,6 @@
<template>
<div class="user-avatar" :class="size">
<img :src="app.user.avatar" :alt="app.user.name">
<img :src="user.data.attributes.avatar" :alt="user.data.attributes.name">
</div>
</template>
@@ -13,7 +13,7 @@
'size'
],
computed: {
...mapGetters(['app']),
...mapGetters(['user']),
},
}
</script>

View File

@@ -1,5 +1,5 @@
<template>
<nav class="menu-bar" v-if="app">
<nav class="menu-bar" v-if="user">
<!--Navigation Icons-->
<div class="icon-navigation menu">
@@ -26,13 +26,13 @@
</div>
</router-link>
<router-link :to="{name: 'Profile'}" :class="{'is-active': $isThisRoute($route, ['Password', 'Profile', 'Storage'])}" class="icon-navigation-item settings">
<router-link :to="{name: 'Profile'}" :class="{'is-active': isUserProfileRoute}" class="icon-navigation-item settings">
<div class="button-icon">
<user-icon size="19"></user-icon>
</div>
</router-link>
<router-link v-if="app.user.role === 'admin'" :to="{name: 'Users'}" :class="{'is-active': $isThisRoute($route, adminRoutes)}" class="icon-navigation-item users">
<router-link v-if="user.data.attributes.role === 'admin'" :to="{name: 'Users'}" :class="{'is-active': $isThisRoute($route, adminRoutes)}" class="icon-navigation-item users">
<div class="button-icon">
<settings-icon size="19"></settings-icon>
</div>
@@ -74,24 +74,34 @@
UserIcon,
},
computed: {
...mapGetters(['app']),
...mapGetters(['user']),
isUserProfileRoute() {
return this.$isThisRoute(this.$route, ['Profile', 'Password', 'Storage', 'Invoice', 'Subscription'])
}
},
data() {
return {
adminRoutes: [
'PlanSubscribers',
'PlanSettings',
'PlanDelete',
'GatewayTransactions',
'GatewaySettings',
'UserInvoices',
'UserInvoices',
'UserPassword',
'UserStorage',
'PlanCreate',
'UserCreate',
'UserDelete',
'UserDetail',
'Invoices',
'Gateways',
'Gateway',
'Plans',
'Users',
'User',
'UserDetail',
'UserStorage',
'UserPassword',
'UserDelete',
'Plans',
'Invoices',
'UserInvoices',
'Gateway',
'Gateways',
'GatewaySettings',
'GatewayTransactions',
]
}
},

View File

@@ -1,7 +1,7 @@
<template>
<div class="user-meta" v-if="app">
<b class="name">{{ app.user.name }}</b>
<span class="email">{{ app.user.email }}</span>
<b class="name">{{ user.data.attributes.name }}</b>
<span class="email">{{ user.data.attributes.email }}</span>
</div>
</template>
@@ -12,7 +12,7 @@
export default {
name: 'UserHeadline',
computed: {
...mapGetters(['app']),
...mapGetters(['user']),
},
}
</script>

View File

@@ -51,6 +51,7 @@ import UserDelete from './views/Admin/Users/UserTabs/UserDelete'
import UserStorage from './views/Admin/Users/UserTabs/UserStorage'
import UserPassword from './views/Admin/Users/UserTabs/UserPassword'
import UserInvoices from './views/Admin/Users/UserTabs/UserInvoices'
import UserSubscription from './views/Admin/Users/UserTabs/UserSubscription'
Vue.use(Router)
@@ -151,6 +152,15 @@ const routesAdmin = [
title: i18n.t('routes_title.users_storage_usage')
},
},
{
name: 'UserSubscription',
path: '/admin/user/:id/subscription',
component: UserSubscription,
meta: {
requiresAuth: true,
title: 'Subscription'
},
},
{
name: 'UserInvoices',
path: '/admin/user/:id/invoices',

View File

@@ -6,7 +6,7 @@ import router from '@/router'
const defaultState = {
authorized: undefined,
permission: 'master', // master | editor | visitor
app: undefined,
user: undefined,
}
const actions = {
@@ -15,7 +15,7 @@ const actions = {
axios
.get(getters.api + '/user')
.then((response) => {
commit('RETRIEVE_APP_DATA', response.data)
commit('RETRIEVE_USER', response.data)
}).catch((error) => {
@@ -74,8 +74,8 @@ const actions = {
}
const mutations = {
RETRIEVE_APP_DATA(state, app) {
state.app = app
RETRIEVE_USER(state, user) {
state.user = user
},
SET_PERMISSION(state, role) {
state.permission = role
@@ -85,30 +85,23 @@ const mutations = {
state.app = undefined
},
ADD_TO_FAVOURITES(state, folder) {
state.app.favourites.push({
state.user.relationships.favourites.data.attributes.folders.push({
unique_id: folder.unique_id,
name: folder.name,
type: folder.type,
})
},
UPDATE_NAME(state, name) {
state.app.user.name = name
state.user.data.attributes.name = name
},
UPDATE_AVATAR(state, avatar) {
state.app.user.avatar = avatar
},
UPDATE_RECENT_UPLOAD(state, file) {
// Remove last file from altest uploads
if (state.app.latest_uploads.length === 7) state.app.latest_uploads.pop()
// Add new file to latest uploads
state.app.latest_uploads.unshift(file)
state.user.data.attributes.avatar = avatar
},
REMOVE_ITEM_FROM_FAVOURITES(state, item) {
state.app.favourites = state.app.favourites.filter(folder => folder.unique_id !== item.unique_id)
state.user.relationships.favourites.data.attributes.folders = state.user.relationships.favourites.data.attributes.folders.filter(folder => folder.unique_id !== item.unique_id)
},
UPDATE_NAME_IN_FAVOURITES(state, data) {
state.app.favourites.find(folder => {
state.user.relationships.favourites.data.attributes.folders.find(folder => {
if (folder.unique_id == data.unique_id) folder.name = data.name
})
}
@@ -118,7 +111,7 @@ const getters = {
permission: state => state.permission,
isGuest: state => ! state.authorized,
isLogged: state => state.authorized,
app: state => state.app,
user: state => state.user,
}
export default {

View File

@@ -2,8 +2,9 @@
<section id="viewport">
<ContentSidebar>
<!--SaaS-->
<ContentGroup title="SaaS" class="navigator">
<ContentGroup v-if="config.isSaaS" title="SaaS" class="navigator">
<div class="menu-list-wrapper vertical">
<router-link :to="{name: 'Plans'}" class="menu-list-item link">
<div class="icon">

View File

@@ -30,6 +30,11 @@
<SwitchInput @input="changeStatus($event, row.data.id)" class="switch" :state="row.data.attributes.status"/>
</span>
</td>
<td>
<span class="cell-item">
{{ row.data.attributes.subscribers }}
</span>
</td>
<td>
<span class="cell-item">
${{ row.data.attributes.price }}
@@ -40,11 +45,6 @@
{{ row.data.attributes.capacity_formatted }}
</span>
</td>
<td>
<span class="cell-item">
{{ row.data.attributes.subscribers }}
</span>
</td>
<td>
<div class="action-icons">
<router-link :to="{name: 'PlanSettings', params: {id: row.data.id}}">
@@ -109,6 +109,11 @@
field: 'attributes.status',
sortable: true
},
{
label: 'Subscribers',
field: 'attributes.subscribers',
sortable: true
},
{
label: 'Price',
field: 'attributes.price',
@@ -119,11 +124,6 @@
field: 'attributes.capacity',
sortable: true
},
{
label: 'Subscribers',
field: 'attributes.subscribers',
sortable: true
},
{
label: this.$t('admin_page_user.table.action'),
field: 'data.action',

View File

@@ -34,7 +34,7 @@
{{ row.data.attributes.role }}
</ColorLabel>
</td>
<td>
<td v-if="config.isSaaS">
<span class="cell-item" v-if="row.relationships.subscription">
{{ row.relationships.subscription.data.attributes.name }}
</span>
@@ -89,6 +89,7 @@
import PageHeader from '@/components/Others/PageHeader'
import ColorLabel from '@/components/Others/ColorLabel'
import Spinner from '@/components/FilesView/Spinner'
import {mapGetters} from "vuex"
import axios from 'axios'
export default {
@@ -106,6 +107,9 @@
Edit2Icon,
Spinner,
},
computed: {
...mapGetters(['config']),
},
data() {
return {
isLoading: true,
@@ -124,7 +128,8 @@
{
label: 'Subscription Plan',
field: 'data.attributes.role',
sortable: true
sortable: true,
hidden: true,
},
{
label: this.$t('admin_page_user.table.storage_used'),

View File

@@ -1,5 +1,5 @@
<template>
<div id="single-page" v-if="app">
<div id="single-page">
<div id="page-content" v-if="! isLoading">
<MobileHeader :title="$router.currentRoute.meta.title"/>
<PageHeader :can-back="true" :title="$router.currentRoute.meta.title"/>
@@ -42,7 +42,16 @@
</div>
</router-link>
<router-link replace :to="{name: 'UserInvoices'}" class="menu-list-item link">
<router-link v-if="config.isSaaS" replace :to="{name: 'UserSubscription'}" class="menu-list-item link">
<div class="icon">
<credit-card-icon size="17"></credit-card-icon>
</div>
<div class="label">
Subscription
</div>
</router-link>
<router-link v-if="config.isSaaS" replace :to="{name: 'UserInvoices'}" class="menu-list-item link">
<div class="icon">
<file-text-icon size="17"></file-text-icon>
</div>
@@ -60,7 +69,7 @@
</div>
</router-link>
<router-link replace :to="{name: 'UserDelete'}" v-if="user.data.attributes.name !== app.user.name"
<router-link replace :to="{name: 'UserDelete'}" v-if="user.data.attributes.name !== admin.name"
class="menu-list-item link">
<div class="icon">
<trash2-icon size="17"></trash2-icon>
@@ -82,7 +91,7 @@
</template>
<script>
import {UserIcon, HardDriveIcon, LockIcon, Trash2Icon, FileTextIcon} from 'vue-feather-icons'
import {UserIcon, HardDriveIcon, LockIcon, Trash2Icon, FileTextIcon, CreditCardIcon} from 'vue-feather-icons'
import StorageItemDetail from '@/components/Others/StorageItemDetail'
import MobileHeader from '@/components/Mobile/MobileHeader'
import SectionTitle from '@/components/Others/SectionTitle'
@@ -95,6 +104,7 @@
export default {
name: 'Profile',
components: {
CreditCardIcon,
HardDriveIcon,
StorageItemDetail,
SectionTitle,
@@ -108,7 +118,10 @@
Spinner,
},
computed: {
...mapGetters(['app']),
admin() {
return this.$store.getters.user ? this.$store.getters.user.data.attributes : undefined
},
...mapGetters(['config']),
},
data() {
return {

View File

@@ -1,6 +1,6 @@
<template>
<PageTab v-if="invoices">
<PageTabGroup>
<PageTabGroup v-if="invoices.length > 0">
<DatatableWrapper :paginator="true" :columns="columns" :data="invoices" class="table">
<template scope="{ row }">
<tr>
@@ -35,6 +35,9 @@
</template>
</DatatableWrapper>
</PageTabGroup>
<PageTabGroup v-else>
User don't have any invoices yet.
</PageTabGroup>
</PageTab>
</template>

View File

@@ -1,13 +1,8 @@
<template>
<PageTab v-if="storage">
<PageTabGroup>
<StorageItemDetail
type="disk"
:title="$t('storage.total_used', {used: storage.attributes.used})"
:percentage="storage.attributes.percentage"
:used="$t('storage.total_capacity', {capacity: storage.attributes.capacity})"
/>
<SetupBox
v-if="! config.isSaaS || ! user.relationships.subscription"
theme="base"
:title="$t('user_box_storage.title')"
:description="$t('user_box_storage.description')"
@@ -32,6 +27,12 @@
</ValidationProvider>
</ValidationObserver>
</SetupBox>
<StorageItemDetail
type="disk"
:title="$t('storage.total_used', {used: storage.attributes.used})"
:percentage="storage.attributes.percentage"
:used="$t('storage.total_capacity', {capacity: storage.attributes.capacity})"
/>
</PageTabGroup>
<PageTabGroup>
<b class="form-group-label">{{ $t('storage.sec_details') }}</b>
@@ -54,9 +55,11 @@
import {required} from 'vee-validate/dist/rules'
import {events} from "@/bus"
import axios from 'axios'
import {mapGetters} from "vuex";
export default {
name: 'UserStorage',
props: ['user'],
components: {
PageTabGroup,
PageTab,
@@ -67,6 +70,9 @@
SetupBox,
required,
},
computed: {
...mapGetters(['config']),
},
data() {
return {
isLoading: true,

View File

@@ -0,0 +1,105 @@
<template>
<PageTab>
<PageTabGroup v-if="subscription">
<!--Info about active subscription-->
<div v-if="! subscription.canceled" class="state active">
<ListInfo class="list-info">
<ListInfoItem class="list-item" title="Plan" :content="subscription.attributes.name + ' - ' + subscription.attributes.capacity_formatted"/>
<ListInfoItem class="list-item" title="Billed" content="Monthly"/>
<ListInfoItem class="list-item" title="Status" :content="status"/>
<ListInfoItem class="list-item" title="Created At" :content="subscription.attributes.created_at"/>
<ListInfoItem class="list-item" title="Renews At" :content="subscription.attributes.ends_at"/>
</ListInfo>
</div>
<!--Info about canceled subscription-->
<div v-if="subscription.attributes.canceled" class="state canceled">
<ListInfo class="list-info">
<ListInfoItem class="list-item" title="Plan" :content="subscription.attributes.name"/>
<ListInfoItem class="list-item" title="Status" :content="status"/>
<ListInfoItem class="list-item" title="Canceled At" :content="subscription.attributes.canceled_at"/>
<ListInfoItem class="list-item" title="Ends At" :content="subscription.attributes.ends_at"/>
</ListInfo>
</div>
</PageTabGroup>
<PageTabGroup v-else>
User don't have any subscription yet.
</PageTabGroup>
</PageTab>
</template>
<script>
import DatatableWrapper from '@/components/Others/Tables/DatatableWrapper'
import PageTabGroup from '@/components/Others/Layout/PageTabGroup'
import ListInfoItem from '@/components/Others/ListInfoItem'
import ButtonBase from '@/components/FilesView/ButtonBase'
import PageTab from '@/components/Others/Layout/PageTab'
import ListInfo from '@/components/Others/ListInfo'
import {ExternalLinkIcon} from "vue-feather-icons"
import { mapGetters } from 'vuex'
import {events} from "@/bus"
import axios from 'axios'
export default {
name: 'UserSubscription',
components: {
ExternalLinkIcon,
DatatableWrapper,
ListInfoItem,
PageTabGroup,
ButtonBase,
ListInfo,
PageTab,
},
computed: {
status() {
if (this.subscription.attributes.canceled) {
return 'Canceled'
}
if (this.subscription.attributes.active) {
return 'Active'
}
}
},
data() {
return {
subscription: undefined,
}
},
created() {
axios.get('/api/users/' + this.$route.params.id + '/subscription')
.then(response => {
this.subscription = response.data.data
this.isLoading = false
})
}
}
</script>
<style lang="scss" scoped>
@import '@assets/vue-file-manager/_variables';
@import '@assets/vue-file-manager/_mixins';
.cancel-plan {
margin-top: 10px;
}
.list-info {
display: flex;
flex-wrap: wrap;
.list-item {
flex: 0 0 50%;
}
}
@media only screen and (max-width: 960px) {
}
@media (prefers-color-scheme: dark) {
}
</style>

View File

@@ -88,6 +88,8 @@
checkedAccount: undefined,
loginPassword: 'vuefilemanager',
loginEmail: 'howdy@hi5ve.digital',
//loginPassword: '',
//loginEmail: '',
}
},
methods: {

View File

@@ -1,8 +1,12 @@
<template>
<section id="viewport" v-if="app">
<section id="viewport" v-if="user">
<ContentSidebar>
<ContentGroup v-if="config.isSaaS && storage.used > 95">
<UpgradeSidebarBanner />
</ContentGroup>
<!--Locations-->
<ContentGroup :title="$t('sidebar.locations_title')">
<div class="menu-list-wrapper vertical">
@@ -28,10 +32,10 @@
<!--Navigator-->
<ContentGroup :title="$t('sidebar.navigator_title')" class="navigator">
<span class="empty-note navigator" v-if="app.tree.length == 0">
<span class="empty-note navigator" v-if="tree.length == 0">
{{ $t('sidebar.folders_empty') }}
</span>
<TreeMenuNavigator class="folder-tree" :depth="0" :nodes="items" v-for="items in app.tree"
<TreeMenuNavigator class="folder-tree" :depth="0" :nodes="items" v-for="items in tree"
:key="items.unique_id"/>
</ContentGroup>
@@ -45,14 +49,14 @@
@drop="dragFinish($event)"
>
<transition-group tag="div" class="menu-list" name="folder-item">
<span class="empty-note favourites" v-if="app.favourites.length == 0" :key="0">
<span class="empty-note favourites" v-if="favourites.length == 0" :key="0">
{{ $t('sidebar.favourites_empty') }}
</span>
<a @click.stop="openFolder(folder)"
class="menu-list-item"
:class="{'is-current': (folder && currentFolder) && (currentFolder.unique_id === folder.unique_id)}"
v-for="folder in app.favourites"
v-for="folder in favourites"
:key="folder.unique_id">
<div>
<folder-icon size="17" class="folder-icon"></folder-icon>
@@ -70,6 +74,7 @@
</template>
<script>
import UpgradeSidebarBanner from '@/components/Others/UpgradeSidebarBanner'
import TreeMenuNavigator from '@/components/Others/TreeMenuNavigator'
import ContentFileView from '@/components/Others/ContentFileView'
import ContentSidebar from '@/components/Sidebar/ContentSidebar'
@@ -86,6 +91,7 @@
export default {
name: 'FilesView',
components: {
UpgradeSidebarBanner,
TreeMenuNavigator,
ContentFileView,
ContentSidebar,
@@ -96,7 +102,16 @@
XIcon,
},
computed: {
...mapGetters(['app', 'homeDirectory', 'currentFolder']),
...mapGetters(['user', 'homeDirectory', 'currentFolder', 'config']),
favourites() {
return this.user.relationships.favourites.data.attributes.folders
},
tree() {
return this.user.relationships.tree.data.attributes.folders
},
storage() {
return this.$store.getters.user.relationships.storage.data.attributes
}
},
data() {
return {
@@ -129,7 +144,7 @@
if (this.draggedItem && this.draggedItem.type !== 'folder') return
// Check if folder exist in favourites
if (this.app.favourites.find(folder => folder.unique_id == this.draggedItem.unique_id)) return
if (this.favourites.find(folder => folder.unique_id == this.draggedItem.unique_id)) return
// Store favourites folder
this.$store.dispatch('addToFavourites', this.draggedItem)

View File

@@ -1,5 +1,5 @@
<template>
<div id="single-page">
<div id="single-page" v-if="user">
<div id="page-content" class="medium-width" v-if="! isLoading">
<MobileHeader :title="$router.currentRoute.meta.title"/>
<PageHeader :title="$router.currentRoute.meta.title"/>
@@ -12,20 +12,20 @@
<div class="avatar">
<UserImageInput
v-model="avatar"
:avatar="profile.data.attributes.avatar"
:avatar="user.data.attributes.avatar"
/>
</div>
<div class="info">
<b class="name">
{{ profile.data.attributes.name }}
<ColorLabel :color="subscriptionColor">
{{ user.data.attributes.name }}
<ColorLabel v-if="config.isSaaS" :color="subscriptionColor">
{{ subscriptionStatus }}
</ColorLabel>
</b>
<span class="email">{{ profile.data.attributes.email }}</span>
<span class="email">{{ user.data.attributes.email }}</span>
</div>
</div>
<div class="headline-actions">
<div v-if="config.isSaaS" class="headline-actions">
<router-link :to="{name: 'UpgradePlan'}">
<ButtonBase button-style="secondary" type="button">
Upgrade Plan
@@ -54,7 +54,7 @@
</div>
</router-link>
<router-link replace :to="{name: 'Invoice'}" class="menu-list-item link">
<router-link v-if="config.isSaaS" replace :to="{name: 'Subscription'}" class="menu-list-item link">
<div class="icon">
<credit-card-icon size="17"></credit-card-icon>
</div>
@@ -63,7 +63,7 @@
</div>
</router-link>
<router-link replace :to="{name: 'Invoice'}" class="menu-list-item link">
<router-link v-if="config.isSaaS" replace :to="{name: 'Invoice'}" class="menu-list-item link">
<div class="icon">
<file-text-icon size="17"></file-text-icon>
</div>
@@ -80,19 +80,10 @@
{{ $t('menu.password') }}
</div>
</router-link>
<!--<router-link replace :to="{name: 'UserDelete'}" v-if="user.attributes.name !== app.user.name" class="menu-list-item link">
<div class="icon">
<trash2-icon size="17"></trash2-icon>
</div>
<div class="label">
{{ $t('admin_page_user.tabs.delete') }}
</div>
</router-link>-->
</div>
<!--Router Content-->
<router-view :user="profile" />
<router-view :user="user" />
</div>
</div>
<div id="loader" v-if="isLoading">
@@ -108,6 +99,7 @@
import PageHeader from '@/components/Others/PageHeader'
import ColorLabel from '@/components/Others/ColorLabel'
import Spinner from '@/components/FilesView/Spinner'
import { mapGetters } from 'vuex'
import axios from 'axios'
import {
CreditCardIcon,
@@ -133,26 +125,19 @@
LockIcon,
},
computed: {
...mapGetters(['user', 'config']),
subscriptionStatus() {
return this.profile.relationships.subscription ? 'Subscription' : 'Free'
return this.user.relationships.subscription ? 'Premium' : 'Free'
},
subscriptionColor() {
return this.profile.relationships.subscription ? 'green' : 'purple'
return this.user.relationships.subscription ? 'green' : 'purple'
},
},
data() {
return {
avatar: undefined,
profile: undefined,
isLoading: true,
isLoading: false,
}
},
created() {
axios.get('/api/profile')
.then(response => {
this.profile = response.data
this.isLoading = false
})
}
}
</script>

View File

@@ -206,11 +206,14 @@
// Send order request
axios
.post('/api/upgrade', {
.post('/api/subscription/upgrade', {
billing: this.billing,
plan: this.requestedPlan,
})
.then(response => {
.then(() => {
// Update user data
this.$store.dispatch('getAppData')
// End loading
this.isSubmitted = false
@@ -232,7 +235,7 @@
}
},
created() {
axios.get('/api/profile')
axios.get('/api/user')
.then(response => {
if (! this.requestedPlan) {

View File

@@ -1,6 +1,6 @@
<template>
<PageTab v-if="invoices">
<PageTabGroup>
<PageTabGroup v-if="invoices.length > 0">
<DatatableWrapper :paginator="true" :columns="columns" :data="invoices" class="table">
<template scope="{ row }">
<tr>
@@ -35,6 +35,9 @@
</template>
</DatatableWrapper>
</PageTabGroup>
<PageTabGroup v-else>
You don't have any invoices yet.
</PageTabGroup>
</PageTab>
</template>

View File

@@ -3,27 +3,27 @@
<PageTabGroup>
<ValidationObserver ref="password" @submit.prevent="resetPassword" v-slot="{ invalid }" tag="form"
class="form block-form">
<div class="block-wrapper">
<label>{{ $t('page_create_password.label_new_pass') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="New Password"
rules="required" v-slot="{ errors }">
<input v-model="newPassword" :placeholder="$t('page_create_password.label_new_pass')"
type="password"
:class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>{{ $t('page_create_password.label_confirm_pass') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Confirm Your Password"
rules="required" v-slot="{ errors }">
<input v-model="newPasswordConfirmation"
:placeholder="$t('page_create_password.label_confirm_pass')" type="password"
:class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
<div class="wrapper-inline">
<div class="block-wrapper">
<label>{{ $t('page_create_password.label_new_pass') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="New Password"
rules="required" v-slot="{ errors }">
<input v-model="newPassword" :placeholder="$t('page_create_password.label_new_pass')"
type="password"
:class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>{{ $t('page_create_password.label_confirm_pass') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Confirm Your Password"
rules="required" v-slot="{ errors }">
<input v-model="newPasswordConfirmation"
:placeholder="$t('page_create_password.label_confirm_pass')" type="password"
:class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
<div class="block-wrapper">
@@ -46,7 +46,6 @@
import PageHeader from '@/components/Others/PageHeader'
import ThemeLabel from '@/components/Others/ThemeLabel'
import {required} from 'vee-validate/dist/rules'
import {mapGetters} from 'vuex'
import {events} from '@/bus'
import axios from 'axios'
@@ -64,9 +63,6 @@
ThemeLabel,
required,
},
computed: {
...mapGetters(['app']),
},
data() {
return {
newPasswordConfirmation: '',
@@ -125,6 +121,10 @@
@import '@assets/vue-file-manager/_mixins';
@import '@assets/vue-file-manager/_forms';
.block-form {
max-width: 100%;
}
@media only screen and (max-width: 960px) {
.form {

View File

@@ -1,38 +1,130 @@
<template>
<PageTab>
<PageTabGroup>
<PageTabGroup v-if="subscription">
<!--Info about active subscription-->
<div v-if="! subscription.canceled" class="state active">
<ListInfo class="list-info">
<ListInfoItem class="list-item" title="Plan" :content="subscription.name + ' - ' + subscription.capacity_formatted"/>
<ListInfoItem class="list-item" title="Billed" content="Monthly"/>
<ListInfoItem class="list-item" title="Status" :content="status"/>
<ListInfoItem class="list-item" title="Created At" :content="subscription.created_at"/>
<ListInfoItem class="list-item" title="Renews At" :content="subscription.ends_at"/>
</ListInfo>
<div class="cancel-plan">
<ButtonBase
@click.native="cancelSubscription"
:button-style="cancelButtonStyle"
class="cancel-button">
{{ cancelButtonText }}
</ButtonBase>
</div>
</div>
<!--Info about canceled subscription-->
<div v-if="subscription.canceled" class="state canceled">
<ListInfo class="list-info">
<ListInfoItem class="list-item" title="Plan" :content="subscription.name"/>
<ListInfoItem class="list-item" title="Status" :content="status"/>
<ListInfoItem class="list-item" title="Canceled At" :content="subscription.canceled_at"/>
<ListInfoItem class="list-item" title="Ends At" :content="subscription.ends_at"/>
</ListInfo>
</div>
</PageTabGroup>
<PageTabGroup v-else>
You don't have any subscription yet.
</PageTabGroup>
</PageTab>
</template>
<script>
import PageTabGroup from '@/components/Others/Layout/PageTabGroup'
import PageTab from '@/components/Others/Layout/PageTab'
import DatatableWrapper from '@/components/Others/Tables/DatatableWrapper'
import {ExternalLinkIcon} from "vue-feather-icons";
import PageTabGroup from '@/components/Others/Layout/PageTabGroup'
import ListInfoItem from '@/components/Others/ListInfoItem'
import ButtonBase from '@/components/FilesView/ButtonBase'
import PageTab from '@/components/Others/Layout/PageTab'
import ListInfo from '@/components/Others/ListInfo'
import {ExternalLinkIcon} from "vue-feather-icons"
import { mapGetters } from 'vuex'
import {events} from "@/bus"
import axios from 'axios'
export default {
name: 'UserSubscription',
components: {
PageTabGroup,
PageTab,
DatatableWrapper,
ExternalLinkIcon,
DatatableWrapper,
ListInfoItem,
PageTabGroup,
ButtonBase,
ListInfo,
PageTab,
},
computed: {
cancelButtonText() {
return this.isConfirmedCancel ? this.$t('popup_share_edit.confirm') : 'Cancel Plan'
},
cancelButtonStyle() {
return this.isConfirmedCancel ? 'danger-solid' : 'danger'
},
subscription() {
return this.$store.getters.user.relationships.subscription
? this.$store.getters.user.relationships.subscription.data.attributes
: undefined
},
status() {
if (this.subscription.canceled) {
return 'Canceled'
}
if (this.subscription.active) {
return 'Active'
}
}
},
data() {
return {
isLoading: true,
invoices: undefined,
isConfirmedCancel: false,
isDeleting: false,
}
},
created() {
/* axios.get('/api/user/subscription')
.then(response => {
this.invoices = response.data.data
this.isLoading = false
})*/
methods: {
cancelSubscription() {
// Set confirm button
if (! this.isConfirmedCancel) {
this.isConfirmedCancel = true
} else {
// Start deleting spinner button
this.isDeleting = true
// Send delete request
axios
.post('/api/subscription/cancel')
.then(() => {
// Update user data
this.$store.dispatch('getAppData')
// End deleting spinner button
this.isDeleting = false
events.$emit('alert:open', {
emoji: '👍',
title: 'Subscription Was Canceled',
message: 'You\'ll continue to have access to the features you\'ve paid for until the end of your billing cycle.',
buttonStyle: 'theme',
button: 'I\'m done'
})
})
.catch(() => {
// End deleting spinner button
this.isDeleting = false
})
}
}
}
}
</script>
@@ -40,12 +132,19 @@
<style lang="scss" scoped>
@import '@assets/vue-file-manager/_variables';
@import '@assets/vue-file-manager/_mixins';
@import '@assets/vue-file-manager/_forms';
.block-form {
max-width: 100%;
.cancel-plan {
margin-top: 10px;
}
.list-info {
display: flex;
flex-wrap: wrap;
.list-item {
flex: 0 0 50%;
}
}
@media only screen and (max-width: 960px) {

View File

@@ -17,7 +17,7 @@ $light_background: #f4f5f6;
$dark_background: #EBEBEB;
$shadow: 0 7px 25px 1px rgba(0, 0, 0, 0.12);
$light_mode_input_background: #f4f5f6;
$light_mode_input_background: hsla(210, 10%, 98%, 1);
$light_mode_popup_shadow: 0 15px 50px 10px rgba(26,38,74,0.12);
$light_mode_vignette: rgba(9, 8, 12, 0.35);

View File

@@ -34,6 +34,7 @@
hasAuthCookie: {{ Cookie::has('token') ? 1 : 0 }},
userRegistration: {{ config('vuefilemanager.registration') ? 1 : 0 }},
storageLimit: {{ config('vuefilemanager.limit_storage_by_capacity') ? 1 : 0 }},
isSaaS: 1,
}
</script>

View File

@@ -59,10 +59,10 @@ Route::group(['middleware' => ['auth:api', 'auth.master', 'scope:master']], func
Route::get('/user/invoices', 'User\AccountController@invoices');
Route::get('/user/storage', 'User\AccountController@storage');
Route::get('/user', 'User\AccountController@user');
Route::get('/profile', 'User\AccountController@me');
// Subscription
Route::post('/upgrade', 'User\SubscriptionController@upgrade');
Route::post('/subscription/upgrade', 'User\SubscriptionController@upgrade');
Route::post('/subscription/cancel', 'User\SubscriptionController@cancel');
// Browse
Route::get('/participant-uploads', 'FileBrowser\BrowseController@participant_uploads');
@@ -97,6 +97,7 @@ Route::group(['middleware' => ['auth:api', 'auth.master', 'auth.admin', 'scope:m
// Get users info
Route::get('/users/{id}/storage', 'Admin\UserController@storage');
Route::get('/users/{id}/detail', 'Admin\UserController@details');
Route::get('/users/{id}/subscription', 'Admin\UserController@subscription');
Route::get('/users', 'Admin\UserController@users');
// Edit users