Merge pull request #339 from IceToast/servers-servercard

servers card UI redesign
This commit is contained in:
Dennis 2021-12-24 00:11:16 +01:00 committed by GitHub
commit 5b7374d41a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 676 additions and 458 deletions

1
.gitignore vendored
View file

@ -20,3 +20,4 @@ yarn-error.log
.env.testing
storage/invoices.zip
storage/app/public/logo.png
*vscode

View file

@ -4,6 +4,12 @@ When contributing to this repository, please go through the open issues to see i
Please note we have a code of conduct, please follow it in all your interactions with the project.
If you added any Strings which are displayed at the frontend please localize them (e.g. "New String" -> {{ __('New String') }}) and run the localization string generation:
```cmd
php artisan translatable:export en
```
## Pull request process
1. Give your PR a good descriptive title, so we can view immediately what the PR is about.

View file

@ -17,7 +17,7 @@ class Pterodactyl
/**
* @description per_page option to pull more than the default 50 from pterodactyl
*/
public CONST PER_PAGE = 200;
public const PER_PAGE = 200;
//TODO: Extend error handling (maybe logger for more errors when debugging)
@ -48,7 +48,11 @@ class Pterodactyl
*/
public static function getEggs(Nest $nest)
{
$response = self::client()->get("/application/nests/{$nest->id}/eggs?include=nest,variables&per_page=" . self::PER_PAGE);
try {
$response = self::client()->get("/application/nests/{$nest->id}/eggs?include=nest,variables&per_page=" . self::PER_PAGE);
} catch (Exception $e) {
throw self::getException();
}
if ($response->failed()) throw self::getException();
return $response->json()['data'];
}
@ -59,7 +63,11 @@ class Pterodactyl
*/
public static function getNodes()
{
$response = self::client()->get('/application/nodes?per_page=' . self::PER_PAGE);
try {
$response = self::client()->get('/application/nodes?per_page=' . self::PER_PAGE);
} catch (Exception $e) {
throw self::getException();
}
if ($response->failed()) throw self::getException();
return $response->json()['data'];
}
@ -70,7 +78,11 @@ class Pterodactyl
*/
public static function getNests()
{
$response = self::client()->get('/application/nests?per_page=' . self::PER_PAGE);
try {
$response = self::client()->get('/application/nests?per_page=' . self::PER_PAGE);
} catch (Exception $e) {
throw self::getException();
}
if ($response->failed()) throw self::getException();
return $response->json()['data'];
}
@ -81,8 +93,13 @@ class Pterodactyl
*/
public static function getLocations()
{
$response = self::client()->get('/application/locations?per_page=' . self::PER_PAGE);
try {
$response = self::client()->get('/application/locations?per_page=' . self::PER_PAGE);
} catch (Exception $e) {
throw self::getException();
}
if ($response->failed()) throw self::getException();
return $response->json()['data'];
}
@ -125,8 +142,13 @@ class Pterodactyl
public static function getAllocations(Node $node)
{
$per_page = Configuration::getValueByKey('ALLOCATION_LIMIT', 200);
$response = self::client()->get("/application/nodes/{$node->id}/allocations?per_page={$per_page}");
try {
$response = self::client()->get("/application/nodes/{$node->id}/allocations?per_page={$per_page}");
} catch (Exception $e) {
throw self::getException();
}
if ($response->failed()) throw self::getException();
return $response->json();
}
@ -171,20 +193,29 @@ class Pterodactyl
"default" => $allocationId
]
]);
}
public static function suspendServer(Server $server)
{
$response = self::client()->post("/application/servers/$server->pterodactyl_id/suspend");
try {
$response = self::client()->post("/application/servers/$server->pterodactyl_id/suspend");
} catch (Exception $e) {
throw self::getException();
}
if ($response->failed()) throw self::getException();
return $response;
}
public static function unSuspendServer(Server $server)
{
$response = self::client()->post("/application/servers/$server->pterodactyl_id/unsuspend");
try {
$response = self::client()->post("/application/servers/$server->pterodactyl_id/unsuspend");
} catch (Exception $e) {
throw self::getException();
}
if ($response->failed()) throw self::getException();
return $response;
}
@ -195,9 +226,29 @@ class Pterodactyl
*/
public function getUser(int $pterodactylId)
{
$response = self::client()->get("/application/users/{$pterodactylId}");
try {
$response = self::client()->get("/application/users/{$pterodactylId}");
} catch (Exception $e) {
throw self::getException();
}
if ($response->failed()) throw self::getException();
if ($response->failed()) return $response->json();
return $response->json()['attributes'];
}
/**
* Get serverAttributes by pterodactyl id
* @param int $pterodactylId
* @return mixed
*/
public static function getServerAttributes(string $pterodactylId)
{
try {
$response = self::client()->get("/application/servers/{$pterodactylId}?include=egg,node,nest,location");
} catch (Exception $e) {
throw self::getException();
}
if ($response->failed()) throw self::getException();
return $response->json()['attributes'];
}
}

View file

@ -24,8 +24,35 @@ class ServerController extends Controller
/** Display a listing of the resource. */
public function index()
{
$servers = Auth::user()->servers;
//Get and set server infos each server
foreach ($servers as $server) {
//Get server infos from ptero
$serverAttributes = Pterodactyl::getServerAttributes($server->pterodactyl_id);
$serverRelationships = $serverAttributes['relationships'];
$serverLocationAttributes = $serverRelationships['location']['attributes'];
//Set server infos
$server->location = $serverLocationAttributes['long'] ?
$serverLocationAttributes['long'] :
$serverLocationAttributes['short'];
$server->egg = $serverRelationships['egg']['attributes']['name'];
$server->nest = $serverRelationships['nest']['attributes']['name'];
$server->node = $serverRelationships['node']['attributes']['name'];
//get productname by product_id for server
$product = Product::find($server->product_id);
$server->product = $product;
}
return view('servers.index')->with([
'servers' => Auth::user()->Servers
'servers' => $servers
]);
}
@ -134,10 +161,11 @@ class ServerController extends Controller
$response = Pterodactyl::createServer($server, $egg, $allocationId);
if ($response->failed()) return $this->serverCreationFailed($response, $server);
$serverAttributes = $response->json()['attributes'];
//update server with pterodactyl_id
$server->update([
'pterodactyl_id' => $response->json()['attributes']['id'],
'identifier' => $response->json()['attributes']['identifier']
'pterodactyl_id' => $serverAttributes['id'],
'identifier' => $serverAttributes['identifier']
]);
if (Configuration::getValueByKey('SERVER_CREATE_CHARGE_FIRST_HOUR', 'true') == 'true') {

View file

@ -16,6 +16,7 @@
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.0.1",
"hidehalo/nanoid-php": "^1.1",
"kkomelin/laravel-translatable-string-exporter": "^1.14",
"laravel/framework": "^8.12",
"laravel/tinker": "^2.5",
"laravel/ui": "^3.2",

63
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "2d4d66f2322f8c630c609cf446f7c402",
"content-hash": "ed0357bbf827f4e6078d2ed41ce3fa17",
"packages": [
{
"name": "asm89/stack-cors",
@ -1697,6 +1697,67 @@
},
"time": "2020-12-11T09:24:45+00:00"
},
{
"name": "kkomelin/laravel-translatable-string-exporter",
"version": "1.14.0",
"source": {
"type": "git",
"url": "https://github.com/kkomelin/laravel-translatable-string-exporter.git",
"reference": "9dce1e5f8ed59a1b58e77ec7d84f1427d5e29f0a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/kkomelin/laravel-translatable-string-exporter/zipball/9dce1e5f8ed59a1b58e77ec7d84f1427d5e29f0a",
"reference": "9dce1e5f8ed59a1b58e77ec7d84f1427d5e29f0a",
"shasum": ""
},
"require": {
"ext-json": "*",
"illuminate/support": "^5.4|^6|^7|^8",
"illuminate/translation": "^5.4|^6|^7|^8",
"php": ">=5.4.0",
"symfony/finder": "^3.2|^4|^5"
},
"require-dev": {
"orchestra/testbench": "^3.4|^4.0|^5.0|^6.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"KKomelin\\TranslatableStringExporter\\Providers\\ExporterServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"KKomelin\\TranslatableStringExporter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Konstantin Komelin",
"email": "konstantin.komelin@gmail.com"
}
],
"description": "Translatable String Exporter for Laravel",
"keywords": [
"export",
"exporter",
"json",
"laravel",
"translations"
],
"support": {
"issues": "https://github.com/kkomelin/laravel-translatable-string-exporter/issues",
"source": "https://github.com/kkomelin/laravel-translatable-string-exporter/tree/1.14.0"
},
"time": "2021-08-08T06:48:21+00:00"
},
{
"name": "laravel/framework",
"version": "v8.76.2",

View file

@ -193,6 +193,9 @@ return [
App\Providers\RouteServiceProvider::class,
Yajra\DataTables\DataTablesServiceProvider::class,
KKomelin\TranslatableStringExporter\Providers\ExporterServiceProvider::class,
],
/*

View file

@ -1,338 +1,160 @@
{
"Activity Logs": "Activity Logs",
"No recent activity from cronjobs": "No recent activity from cronjobs",
"Check the docs for it here": "Check the docs for it here",
"Are cronjobs running?": "Are cronjobs running?",
"Causer": "Causer",
"Description": "Description",
"Created at": "Created at",
"Edit Configuration": "Edit Configuration",
"Text Field": "Text Field",
"Cancel": "Cancel",
"Close": "Close",
"Save": "Save",
"true": "true",
"false": "false",
"Configurations": "Configurations",
"Dashboard": "Dashboard",
"Key": "Key",
"Value": "Value",
"Type": "Type",
"Admin Overview": "Admin Overview",
"Support server": "Support server",
"Documentation": "Documentation",
"Github": "Github",
"Support ControlPanel": "Support ControlPanel",
"Servers": "Servers",
"Users": "Users",
"Total": "Total",
"Payments": "Payments",
"Pterodactyl": "Pterodactyl",
"Sync": "Sync",
"Resources": "Resources",
"Count": "Count",
"Locations": "Locations",
"Node": "Node",
"Nodes": "Nodes",
"Nests": "Nests",
"Eggs": "Eggs",
"Last updated :date": "Last updated :date",
"Purchase": "Purchase",
"ID": "ID",
"User": "User",
"Amount": "Amount",
"Product Price": "Product Price",
"Tax": "Tax",
"Total Price": "Total Price",
"Payment_ID": "Payment_ID",
"Payer_ID": "Payer_ID",
"Product": "Product",
"Products": "Products",
"Create": "Create",
"Product Details": "Product Details",
"Server Details": "Server Details",
"Product Linking": "Product Linking",
"Name": "Name",
"Price in": "Price in",
"Memory": "Memory",
"Cpu": "Cpu",
"Swap": "Swap",
"Disk": "Disk",
"Minimum": "Minimum",
"IO": "IO",
"Databases": "Databases",
"Database": "Database",
"Backups": "Backups",
"Allocations": "Allocations",
"Disabled": "Disabled",
"Submit": "Submit",
"This product will only be available for these nodes": "This product will only be available for these nodes",
"This product will only be available for these eggs": "This product will only be available for these eggs",
"Will hide this option from being selected": "Will hide this option from being selected",
"Link your products to nodes and eggs to create dynamic pricing for each option": "Link your products to nodes and eggs to create dynamic pricing for each option",
"Setting to -1 will use the value from configuration.": "Setting to -1 will use the value from configuration.",
"This is what the users sees": "This is what the users sees",
"Edit": "Edit",
"Price": "Price",
"Are you sure you wish to delete?": "Are you sure you wish to delete?",
"Create new": "Create new",
"Show": "Show",
"Updated at": "Updated at",
"Suspended at": "Suspended at",
"Settings": "Settings",
"Dashboard icons": "Dashboard icons",
"Select panel icon": "Select panel icon",
"Select panel favicon": "Select panel favicon",
"Token": "Token",
"Last used": "Last used",
"Store": "Store",
"Currency code": "Currency code",
"Checkout the paypal docs to select the appropriate code": "Checkout the paypal docs to select the appropriate code",
"Quantity": "Quantity",
"Amount given to the user after purchasing": "Amount given to the user after purchasing",
"Display": "Display",
"This is what the user sees at store and checkout": "This is what the user sees at store and checkout",
"This is what the user sees at checkout": "This is what the user sees at checkout",
"Adds 1000 credits to your account": "Adds 1000 credits to your account",
"Active": "Active",
"No payment method is configured.": "No payment method is configured.",
"To configure the payment methods, head to the .env and add the required options for your prefered payment method.": "To configure the payment methods, head to the .env and add the required options for your prefered payment method.",
"Useful Links": "Useful Links",
"Icon class name": "Icon class name",
"You can find available free icons": "You can find available free icons",
"Title": "Title",
"Link": "Link",
"Username": "Username",
"Email": "Email",
"Pterodactly ID": "Pterodactly ID",
"Server Limit": "Server Limit",
"Role": "Role",
"Administrator": "Administrator",
"Client": "Client",
"Member": "Member",
"New Password": "New Password",
"Confirm Password": "Confirm Password",
"This ID refers to the user account created on pterodactyls panel.": "This ID refers to the user account created on pterodactyls panel.",
"Only edit this if you know what youre doing :)": "Only edit this if you know what youre doing :)",
"Verified": "Verified",
"Last seen": "Last seen",
"Notify": "Notify",
"All": "All",
"Send via": "Send via",
"Content": "Content",
"Notifications": "Notifications",
"Usage": "Usage",
"Config": "Config",
"Vouchers": "Vouchers",
"Voucher details": "Voucher details",
"Memo": "Memo",
"Code": "Code",
"Uses": "Uses",
"Expires at": "Expires at",
"Max": "Max",
"Random": "Random",
"Status": "Status",
"Used / Uses": "Used / Uses",
"Expires": "Expires",
"Please confirm your password before continuing.": "Please confirm your password before continuing.",
"Password": "Password",
"Forgot Your Password?": "Forgot Your Password?",
"Sign in to start your session": "Sign in to start your session",
"Remember Me": "Remember Me",
"Sign In": "Sign In",
"Register a new membership": "Register a new membership",
"You forgot your password? Here you can easily retrieve a new password.": "You forgot your password? Here you can easily retrieve a new password.",
"Request new password": "Request new password",
"Login": "Login",
"You are only one step a way from your new password, recover your password now.": "You are only one step a way from your new password, recover your password now.",
"Retype password": "Retype password",
"Change password": "Change password",
"I already have a membership": "I already have a membership",
"Register": "Register",
"Verify Your Email Address": "Verify Your Email Address",
"A fresh verification link has been sent to your email address.": "A fresh verification link has been sent to your email address.",
"Before proceeding, please check your email for a verification link.": "Before proceeding, please check your email for a verification link.",
"If you did not receive the email": "If you did not receive the email",
"click here to request another": "click here to request another",
"Home": "Home",
"Languages": "Languages",
"See all Notifications": "See all Notifications",
"Profile": "Profile",
"Log back in": "Log back in",
"Logout": "Logout",
"Administration": "Administration",
"Overview": "Overview",
"Application API": "Application API",
"Management": "Management",
"Other": "Other",
"Logs": "Logs",
"Redeem code": "Redeem code",
"You have not yet verified your email address": "You have not yet verified your email address",
"Click here to resend verification email": "Click here to resend verification email",
"Please contact support If you didnt receive your verification email.": "Please contact support If you didnt receive your verification email.",
"Thank you for your purchase!": "Thank you for your purchase!",
"Your payment has been confirmed; Your credit balance has been updated.": "Your payment has been confirmed; Your credit balance has been updated.",
"Payment ID": "Payment ID",
"Balance": "Balance",
"User ID": "User ID",
"Thanks": "Thanks",
"Redeem voucher code": "Redeem voucher code",
"Redeem": "Redeem",
"All notifications": "All notifications",
"Required Email verification!": "Required Email verification!",
"Required Discord verification!": "Required Discord verification!",
"You have not yet verified your discord account": "You have not yet verified your discord account",
"Login with discord": "Login with discord",
"Please contact support If you face any issues.": "Please contact support If you face any issues.",
"Due to system settings you are required to verify your discord account!": "Due to system settings you are required to verify your discord account!",
"It looks like this hasnt been set-up correctly! Please contact support.": "It looks like this hasnt been set-up correctly! Please contact support.",
"Change Password": "Change Password",
"Current Password": "Current Password",
"Save Changes": "Save Changes",
"Re-Sync Discord": "Re-Sync Discord",
"You are verified!": "You are verified!",
"By verifying your discord account, you receive extra Credits and increased Server amounts": "By verifying your discord account, you receive extra Credits and increased Server amounts",
"Server configuration": "Server configuration",
"Error!": "Error!",
"Make sure to link your products to nodes and eggs.": "Make sure to link your products to nodes and eggs.",
"There has to be at least 1 valid product for server creation": "There has to be at least 1 valid product for server creation",
"No products available!": "No products available!",
"No nodes have been linked!": "No nodes have been linked!",
"No nests available!": "No nests available!",
"No eggs have been linked!": "No eggs have been linked!",
"Software / Games": "Software / Games",
"Please select software ...": "Please select software ...",
"Specification": "Specification",
"No selection": "No selection",
"per month": "per month",
"Not enough credits!": "Not enough credits!",
"Not enough" : "Not enough",
"Please select a configuration ...": "Please select a configuration ...",
"No resources found matching current configuration": "No resources found matching current configuration",
"No nodes found matching current configuration": "No nodes found matching current configuration",
"Please select a node ...": "Please select a node ...",
"Create server": "Create server",
"Use your servers on our": "Use your servers on our",
"pterodactyl panel": "pterodactyl panel",
"Server limit reached!": "Server limit reached!",
"Create Server": "Create Server",
"Manage": "Manage",
"Delete server": "Delete server",
"Price per Hour": "Price per Hour",
"Price per Month": "Price per Month",
"Date": "Date",
"To": "To",
"From": "From",
"Pending": "Pending",
"Subtotal": "Subtotal",
"Submit Payment": "Submit Payment",
"Payment Methods": "Payment Methods",
"Payment method": "Payment method",
"By purchasing this product you agree and accept our terms of service": "By purchasing this product you agree and accept our terms of service",
"There are no store products!": "There are no store products!",
"The store is not correctly configured!": "The store is not correctly configured!",
"Out of Credits in": "Out of Credits in",
"days": "days",
"hours": "hours",
"You ran out of Credits": "You ran out of Credits",
"Profile updated": "Profile updated",
"You are required to verify your email address before you can create a server.": "You are required to verify your email address before you can create a server.",
"You are required to link your discord account before you can create a server.": "You are required to link your discord account before you can create a server.",
"No allocations satisfying the requirements for automatic deployment on this node were found.": "No allocations satisfying the requirements for automatic deployment on this node were found.",
"Server removed": "Server removed",
"Server created": "Server created",
"An exception has occurred while trying to remove a resource \"": "An exception has occurred while trying to remove a resource \"",
"You are required to verify your email address before you can purchase credits.": "You are required to verify your email address before you can purchase credits.",
"You are required to link your discord account before you can purchase ": "You are required to link your discord account before you can purchase ",
"Warning!": "Warning!",
"api key created!": "api key created!",
"api key updated!": "api key updated!",
"api key has been removed!": "api key has been removed!",
"Edit": "Edit",
"Delete": "Delete",
"configuration has been updated!": "configuration has been updated!",
"Pterodactyl synced": "Pterodactyl synced",
"Your credit balance has been increased!": "Your credit balance has been increased!",
"Payment was Canceled": "Payment was Canceled",
"Store item has been created!": "Store item has been created!",
"Store item has been updated!": "Store item has been updated!",
"Product has been updated!": "Product has been updated!",
"Store item has been removed!": "Store item has been removed!",
"unknown": "unknown",
"Pterodactyl synced": "Pterodactyl synced",
"Your credit balance has been increased!": "Your credit balance has been increased!",
"Your payment is being processed!": "Your payment is being processed!",
"Your payment has been canceled!": "Your payment has been canceled!",
"Payment method": "Payment method",
"Invoice": "Invoice",
"Product has been created!": "Product has been created!",
"Product has been removed!": "Product has been removed!",
"Show": "Show",
"Clone": "Clone",
"Server removed": "Server removed",
"An exception has occurred while trying to remove a resource \"": "An exception has occurred while trying to remove a resource \"",
"Server has been updated!": "Server has been updated!",
"Unsuspend": "Unsuspend",
"Suspend": "Suspend",
"Icons updated!": "Icons updated!",
"link has been created!": "link has been created!",
"link has been updated!": "link has been updated!",
"product has been removed!": "product has been removed!",
"User does not exists on pterodactyl's panel": "User does not exists on pterodactyl's panel",
"user has been removed!": "user has been removed!",
"Notification sent!": "Notification sent!",
"User has been updated!": "User has been updated!",
"User does not exists on pterodactyl's panel": "User does not exists on pterodactyl's panel",
"Login as User": "Login as User",
"voucher has been created!": "voucher has been created!",
"voucher has been updated!": "voucher has been updated!",
"voucher has been removed!": "voucher has been removed!",
"This voucher has reached the maximum amount of uses": "This voucher has reached the maximum amount of uses",
"This voucher has expired": "This voucher has expired",
"You already redeemed this voucher code": "You already redeemed this voucher code",
"You can't redeem this voucher because you would exceed the limit of ": "You can't redeem this voucher because you would exceed the limit of ",
"have been added to your balance!": "have been added to your balance!",
"Invoice": "Invoice",
"Serial No.": "Serial No.",
"Invoice date": "Invoice date",
"Seller": "Seller",
"Buyer": "Buyer",
"Address": "Address",
"VAT code": "VAT code",
"Phone": "Phone",
"Units": "Units",
"Qty": "Qty",
"Discount": "Discount",
"Sub total": "Sub total",
"Total discount": "Total discount",
"Taxable amount": "Taxable amount",
"Total taxes": "Total taxes",
"Tax rate": "Tax rate",
"Total amount": "Total amount",
"Please pay until": "Please pay until",
"Amount in words": "Amount in words",
"Notes": "Notes",
"Shipping": "Shipping",
"Paid": "Paid",
"Due:": "Due:",
"Users": "Users",
"VALID": "VALID",
"days": "days",
"hours": "hours",
"You ran out of Credits": "You ran out of Credits",
"Profile updated": "Profile updated",
"Server limit reached!": "Server limit reached!",
"You are required to verify your email address before you can create a server.": "You are required to verify your email address before you can create a server.",
"You are required to link your discord account before you can create a server.": "You are required to link your discord account before you can create a server.",
"Server created": "Server created",
"No allocations satisfying the requirements for automatic deployment on this node were found.": "No allocations satisfying the requirements for automatic deployment on this node were found.",
"You are required to verify your email address before you can purchase credits.": "You are required to verify your email address before you can purchase credits.",
"You are required to link your discord account before you can purchase Credits": "You are required to link your discord account before you can purchase Credits",
"EXPIRED": "EXPIRED",
"Payment Confirmation": "Payment Confirmation",
"Payment Confirmed!": "Payment Confirmed!",
"Your Payment was successful!": "Your Payment was successful!",
"Hello": "Hello",
"Your payment was processed successfully!": "Your payment was processed successfully!",
"Status": "Status",
"Price": "Price",
"Type": "Type",
"Amount": "Amount",
"Balance": "Balance",
"User ID": "User ID",
"Server Creation Error": "Server Creation Error",
"Your servers have been suspended!": "Your servers have been suspended!",
"To automatically re-enable your server\/s, you need to purchase more credits.": "To automatically re-enable your server\/s, you need to purchase more credits.",
"Purchase credits": "Purchase credits",
"If you have any questions please let us know.": "If you have any questions please let us know.",
"Regards": "Regards",
"Getting started!": "Getting started!",
"Activity Logs": "Activity Logs",
"Dashboard": "Dashboard",
"No recent activity from cronjobs": "No recent activity from cronjobs",
"Are cronjobs running?": "Are cronjobs running?",
"Check the docs for it here": "Check the docs for it here",
"Causer": "Causer",
"Description": "Description",
"Created at": "Created at",
"Application API": "Application API",
"Create": "Create",
"Memo": "Memo",
"Submit": "Submit",
"Create new": "Create new",
"Token": "Token",
"Last used": "Last used",
"Are you sure you wish to delete?": "Are you sure you wish to delete?",
"Edit Configuration": "Edit Configuration",
"Text Field": "Text Field",
"Cancel": "Cancel",
"Save": "Save",
"Configurations": "Configurations",
"Key": "Key",
"Value": "Value",
"Nests": "Nests",
"Sync": "Sync",
"Active": "Active",
"ID": "ID",
"eggs": "eggs",
"Name": "Name",
"Nodes": "Nodes",
"Location": "Location",
"Admin Overview": "Admin Overview",
"Support server": "Support server",
"Documentation": "Documentation",
"Github": "Github",
"Support ControlPanel": "Support ControlPanel",
"Servers": "Servers",
"Total": "Total",
"Payments": "Payments",
"Pterodactyl": "Pterodactyl",
"Resources": "Resources",
"Count": "Count",
"Locations": "Locations",
"Eggs": "Eggs",
"Last updated :date": "Last updated :date",
"Product Price": "Product Price",
"Tax Value": "Tax Value",
"Tax Percentage": "Tax Percentage",
"Total Price": "Total Price",
"Payment ID": "Payment ID",
"Payment Method": "Payment Method",
"Products": "Products",
"Product Details": "Product Details",
"Disabled": "Disabled",
"Will hide this option from being selected": "Will hide this option from being selected",
"Price in": "Price in",
"Memory": "Memory",
"Cpu": "Cpu",
"Swap": "Swap",
"This is what the users sees": "This is what the users sees",
"Disk": "Disk",
"Minimum": "Minimum",
"Setting to -1 will use the value from configuration.": "Setting to -1 will use the value from configuration.",
"IO": "IO",
"Databases": "Databases",
"Backups": "Backups",
"Allocations": "Allocations",
"Product Linking": "Product Linking",
"Link your products to nodes and eggs to create dynamic pricing for each option": "Link your products to nodes and eggs to create dynamic pricing for each option",
"This product will only be available for these nodes": "This product will only be available for these nodes",
"This product will only be available for these eggs": "This product will only be available for these eggs",
"Product": "Product",
"CPU": "CPU",
"Updated at": "Updated at",
"User": "User",
"Config": "Config",
"Suspended at": "Suspended at",
"Settings": "Settings",
"Dashboard icons": "Dashboard icons",
"Invoice Settings": "Invoice Settings",
"Select panel icon": "Select panel icon",
"Select panel favicon": "Select panel favicon",
"Download all Invoices": "Download all Invoices",
"Enter your companys name": "Enter your companys name",
"Enter your companys address": "Enter your companys address",
@ -341,30 +163,187 @@
"Enter your companys email address": "Enter your companys email address",
"Enter your companys website": "Enter your companys website",
"Enter your custom invoice prefix": "Enter your custom invoice prefix",
"Logo": "Logo",
"Select Invoice Logo": "Select Invoice Logo",
"Payment Confirmation": "Payment Confirmation",
"Payment Confirmed!": "Payment Confirmed!",
"Server Creation Error": "Server Creation Error",
"Your servers have been suspended!": "Your servers have been suspended!",
"To automatically re-enable your server/s, you need to purchase more credits.": "To automatically re-enable your server/s, you need to purchase more credits.",
"Purchase credits": "Purchase credits",
"If you have any questions please let us know.": "If you have any questions please let us know.",
"Regards": "Regards",
"Getting started!": "Getting started!",
"EXPIRED": "EXPIRED",
"VALID": "VALID",
"Unsuspend": "Unsuspend",
"Suspend": "Suspend",
"Delete": "Delete",
"Login as User": "Login as User",
"Clone": "Clone",
"Amount due": "Amount due",
"Your Payment was successful!": "Your Payment was successful!",
"Hello": "Hello",
"Your payment was processed successfully!": "Your payment was processed successfully!"
}
"Store": "Store",
"Currency code": "Currency code",
"Checkout the paypal docs to select the appropriate code": "Checkout the paypal docs to select the appropriate code",
"Quantity": "Quantity",
"Amount given to the user after purchasing": "Amount given to the user after purchasing",
"Display": "Display",
"This is what the user sees at store and checkout": "This is what the user sees at store and checkout",
"Adds 1000 credits to your account": "Adds 1000 credits to your account",
"This is what the user sees at checkout": "This is what the user sees at checkout",
"No payment method is configured.": "No payment method is configured.",
"To configure the payment methods, head to the .env and add the required options for your prefered payment method.": "To configure the payment methods, head to the .env and add the required options for your prefered payment method.",
"Useful Links": "Useful Links",
"Icon class name": "Icon class name",
"You can find available free icons": "You can find available free icons",
"Title": "Title",
"Link": "Link",
"description": "description",
"Icon": "Icon",
"Username": "Username",
"Email": "Email",
"Pterodactyl ID": "Pterodactyl ID",
"This ID refers to the user account created on pterodactyls panel.": "This ID refers to the user account created on pterodactyls panel.",
"Only edit this if you know what youre doing :)": "Only edit this if you know what youre doing :)",
"Server Limit": "Server Limit",
"Role": "Role",
" Administrator": " Administrator",
"Client": "Client",
"Member": "Member",
"New Password": "New Password",
"Confirm Password": "Confirm Password",
"Notify": "Notify",
"Avatar": "Avatar",
"Verified": "Verified",
"Last seen": "Last seen",
"Notifications": "Notifications",
"All": "All",
"Send via": "Send via",
"Database": "Database",
"Content": "Content",
"Server limit": "Server limit",
"Discord": "Discord",
"Usage": "Usage",
"IP": "IP",
"Vouchers": "Vouchers",
"Voucher details": "Voucher details",
"Summer break voucher": "Summer break voucher",
"Code": "Code",
"Random": "Random",
"Uses": "Uses",
"A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.",
"Max": "Max",
"Expires at": "Expires at",
"Used \/ Uses": "Used \/ Uses",
"Expires": "Expires",
"Sign in to start your session": "Sign in to start your session",
"Password": "Password",
"Remember Me": "Remember Me",
"Sign In": "Sign In",
"Forgot Your Password?": "Forgot Your Password?",
"Register a new membership": "Register a new membership",
"Please confirm your password before continuing.": "Please confirm your password before continuing.",
"You forgot your password? Here you can easily retrieve a new password.": "You forgot your password? Here you can easily retrieve a new password.",
"Request new password": "Request new password",
"Login": "Login",
"You are only one step a way from your new password, recover your password now.": "You are only one step a way from your new password, recover your password now.",
"Retype password": "Retype password",
"Change password": "Change password",
"Register": "Register",
"I already have a membership": "I already have a membership",
"Verify Your Email Address": "Verify Your Email Address",
"A fresh verification link has been sent to your email address.": "A fresh verification link has been sent to your email address.",
"Before proceeding, please check your email for a verification link.": "Before proceeding, please check your email for a verification link.",
"If you did not receive the email": "If you did not receive the email",
"click here to request another": "click here to request another",
"per month": "per month",
"Out of Credits in": "Out of Credits in",
"Home": "Home",
"See all Notifications": "See all Notifications",
"Redeem code": "Redeem code",
"Profile": "Profile",
"Log back in": "Log back in",
"Logout": "Logout",
"Administration": "Administration",
"Overview": "Overview",
"Management": "Management",
"Other": "Other",
"Logs": "Logs",
"Warning!": "Warning!",
"You have not yet verified your email address": "You have not yet verified your email address",
"Click here to resend verification email": "Click here to resend verification email",
"Please contact support If you didnt receive your verification email.": "Please contact support If you didnt receive your verification email.",
"Thank you for your purchase!": "Thank you for your purchase!",
"Your payment has been confirmed; Your credit balance has been updated.": "Your payment has been confirmed; Your credit balance has been updated.",
"Thanks": "Thanks",
"Redeem voucher code": "Redeem voucher code",
"Close": "Close",
"Redeem": "Redeem",
"All notifications": "All notifications",
"Required Email verification!": "Required Email verification!",
"Required Discord verification!": "Required Discord verification!",
"You have not yet verified your discord account": "You have not yet verified your discord account",
"Login with discord": "Login with discord",
"Please contact support If you face any issues.": "Please contact support If you face any issues.",
"Due to system settings you are required to verify your discord account!": "Due to system settings you are required to verify your discord account!",
"It looks like this hasnt been set-up correctly! Please contact support.": "It looks like this hasnt been set-up correctly! Please contact support.",
"Change Password": "Change Password",
"Current Password": "Current Password",
"Link your discord account!": "Link your discord account!",
"By verifying your discord account, you receive extra Credits and increased Server amounts": "By verifying your discord account, you receive extra Credits and increased Server amounts",
"Login with Discord": "Login with Discord",
"You are verified!": "You are verified!",
"Re-Sync Discord": "Re-Sync Discord",
"Save Changes": "Save Changes",
"Server configuration": "Server configuration",
"Error!": "Error!",
"Make sure to link your products to nodes and eggs.": "Make sure to link your products to nodes and eggs.",
"There has to be at least 1 valid product for server creation": "There has to be at least 1 valid product for server creation",
"No products available!": "No products available!",
"No nodes have been linked!": "No nodes have been linked!",
"No nests available!": "No nests available!",
"No eggs have been linked!": "No eggs have been linked!",
"Software \/ Games": "Software \/ Games",
"Please select software ...": "Please select software ...",
"---": "---",
"Specification ": "Specification ",
"Node": "Node",
"Resource Data:": "Resource Data:",
"MB": "MB",
"MySQL": "MySQL",
"ports": "ports",
"Not enough": "Not enough",
"Create server": "Create server",
"Please select a node ...": "Please select a node ...",
"No nodes found matching current configuration": "No nodes found matching current configuration",
"Please select a resource ...": "Please select a resource ...",
"No resources found matching current configuration": "No resources found matching current configuration",
"Please select a configuration ...": "Please select a configuration ...",
"Not enough credits!": "Not enough credits!",
"Create Server": "Create Server",
"Software": "Software",
"Specification": "Specification",
"Resource plan": "Resource plan",
"per Hour": "per Hour",
"per Month": "per Month",
"Manage": "Manage",
"Are you sure?": "Are you sure?",
"This is an irreversible action, all files of this server will be removed.": "This is an irreversible action, all files of this server will be removed.",
"Yes, delete it!": "Yes, delete it!",
"No, cancel!": "No, cancel!",
"Canceled ...": "Canceled ...",
"Deletion has been canceled.": "Deletion has been canceled.",
"Date": "Date",
"To": "To",
"From": "From",
"Pending": "Pending",
"Subtotal": "Subtotal",
"Payment Methods": "Payment Methods",
"Amount Due": "Amount Due",
"Tax": "Tax",
"Submit Payment": "Submit Payment",
"Purchase": "Purchase",
"There are no store products!": "There are no store products!",
"The store is not correctly configured!": "The store is not correctly configured!",
"Serial No.": "Serial No.",
"Invoice date": "Invoice date",
"Seller": "Seller",
"Buyer": "Buyer",
"Address": "Address",
"VAT Code": "VAT Code",
"Phone": "Phone",
"Units": "Units",
"Discount": "Discount",
"Total discount": "Total discount",
"Taxable amount": "Taxable amount",
"Tax rate": "Tax rate",
"Total taxes": "Total taxes",
"Shipping": "Shipping",
"Total amount": "Total amount",
"Notes": "Notes",
"Amount in words": "Amount in words",
"Please pay until": "Please pay until"
}

View file

@ -1,8 +1,7 @@
// Fonts
@import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback');
@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback");
// Bootstrap
@import '../css/stylesheet.css';
@import '../css/adminlte.min.css';
@import '../css/slim.min.css';
@import "../css/stylesheet.css";
@import "../css/adminlte.min.css";
@import "../css/slim.min.css";

View file

@ -6,12 +6,13 @@
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1>{{__('Servers')}}</h1>
<h1>{{ __('Servers') }}</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="{{route('home')}}">{{__('Dashboard')}}</a></li>
<li class="breadcrumb-item"><a class="text-muted" href="{{route('servers.index')}}">{{__('Servers')}}</a>
<li class="breadcrumb-item"><a href="{{ route('home') }}">{{ __('Dashboard') }}</a></li>
<li class="breadcrumb-item"><a class="text-muted"
href="{{ route('servers.index') }}">{{ __('Servers') }}</a>
</li>
</ol>
</div>
@ -25,96 +26,184 @@
<div class="container-fluid">
<!-- CUSTOM CONTENT -->
<div class="d-flex justify-content-between mb-3">
<p>{{__('Use your servers on our')}} <a href="{{env('PTERODACTYL_URL' , 'http://localhost')}}">{{__('pterodactyl panel')}}</a></p>
<a @if(Auth::user()->Servers->count() >= Auth::user()->server_limit) disabled="disabled" title="{{__('Server limit reached!')}}" @endif href="{{route('servers.create')}}" class="btn @if(Auth::user()->Servers->count() >= Auth::user()->server_limit) disabled @endif btn-primary"><i class="fa fa-plus mr-2"></i>{{__('Create Server')}}</a>
<div class="d-flex justify-content-md-start justify-content-center mb-3 ">
<a @if (Auth::user()->Servers->count() >= Auth::user()->server_limit)
disabled="disabled" title="Server limit reached!"
@endif href="{{ route('servers.create') }}"
class="btn
@if (Auth::user()->Servers->count() >= Auth::user()->server_limit) disabled
@endif btn-primary"><i
class="fa fa-plus mr-2"></i>
{{ __('Create Server') }}
</a>
</div>
<div class="row">
@foreach($servers as $server)
<div class="col-lg-4">
<div class="card">
<div class="card-header ">
<div class="d-flex justify-content-between">
<h5 class="card-title"><i class="fas {{$server->isSuspended() ? 'text-danger' : 'text-success'}} fa-circle mr-2"></i>{{$server->name}}</h5>
<div class="card-tools">
<div class="dropdown no-arrow">
<a href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v fa-sm fa-fw text-white-50"></i>
</a>
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
<a href="{{env('PTERODACTYL_URL' , 'http://localhost')}}/server/{{$server->identifier}}" target="__blank" class="dropdown-item text-info"><i title="manage" class="fas fa-tasks mr-2"></i><span>{{__('Manage')}}</span></a>
@if(!empty(env('PHPMYADMIN_URL')))
<a href="{{env('PHPMYADMIN_URL' , 'http://localhost')}}" class="dropdown-item text-info" target="__blank"><i title="manage" class="fas fa-database mr-2"></i><span>{{__('Database')}}</span></a>
@endif
<form method="post" onsubmit="return submitResult();" action="{{route('servers.destroy' , $server->id)}}">
@csrf
@method('DELETE')
<button class="dropdown-item text-danger"><i title="delete" class="fas fa-trash mr-2"></i><span>{{__('Delete server')}}</span></button>
</form>
<div class="dropdown-divider"></div>
<span class="dropdown-item"><i title="Created at" class="fas fa-sync-alt mr-2"></i><span>{{$server->created_at->isoFormat('LL')}}</span></span>
<div class="row d-flex flex-row justify-content-center justify-content-md-start">
@foreach ($servers as $server)
<div class="col-xl-3 col-lg-5 col-md-6 col-sm-6 col-xs-12 card pr-0 pl-0 ml-sm-2 mr-sm-3"
style="max-width: 350px">
<div class="card-header">
<div class="d-flex justify-content-between align-items-center">
<h5 class="card-title mt-1">{{ $server->name }}
</h5>
<div class="card-tools mt-1">
<div class="dropdown no-arrow">
<a href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v fa-sm fa-fw text-white-50"></i>
</a>
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in"
aria-labelledby="dropdownMenuLink">
@if (!empty(env('PHPMYADMIN_URL')))
<a href="{{ env('PHPMYADMIN_URL', 'http://localhost') }}"
class="dropdown-item text-info" target="__blank"><i title="manage"
class="fas fa-database mr-2"></i><span>{{ __('Database') }}</span></a>
@endif
<div class="dropdown-divider"></div>
<span class="dropdown-item"><i title="Created at"
class="fas fa-sync-alt mr-2"></i><span>{{ $server->created_at->isoFormat('LL') }}</span></span>
</div>
</div>
</div>
</div>
</div>
<div class="card-body">
<div class="container mt-1">
<div class="row mb-3">
<div class="col my-auto">{{ __('Status') }}:</div>
<div class="col-7 my-auto">
<i
class="fas {{ $server->isSuspended() ? 'text-danger' : 'text-success' }} fa-circle mr-2"></i>
{{ $server->isSuspended() ? 'Suspended' : 'Active' }}
</div>
</div>
<div class="row mb-2">
<div class="col-5">
{{ __('Location') }}:
</div>
<div class="col-7 d-flex justify-content-between align-items-center">
<span class="">{{ $server->location }}</span>
<i data-toggle="popover" data-trigger="hover"
data-content="{{ __('Node') }}: {{ $server->node }}"
class="fas fa-info-circle"></i>
</div>
</div>
<div class="row mb-2">
<div class="col-5 ">
{{ __('Software') }}:
</div>
<div class="col-7 text-wrap">
<span>{{ $server->nest }}</span>
</div>
</div>
<div class="row mb-2">
<div class="col-5 ">
{{ __('Specification') }}:
</div>
<div class="col-7 text-wrap">
<span>{{ $server->egg }}</span>
</div>
</div>
<div class="row mb-4">
<div class="col-5 ">
{{ __('Resource plan') }}:
</div>
<div class="col-7 text-wrap d-flex justify-content-between align-items-center">
<span>{{ $server->product->name }}
</span>
<i data-toggle="popover" data-trigger="hover" data-html="true"
data-content="{{ __('CPU') }}: {{ $server->product->cpu / 100 }} {{ __('vCores') }} <br/>{{ __('RAM') }}: {{ $server->product->memory }} MB <br/>{{ __('Disk') }}: {{ $server->product->disk }} MB <br/>{{ __('Backups') }}: {{ $server->product->backups }} <br/> {{ __('MySQL Databases') }}: {{ $server->product->databases }} <br/> {{ __('Allocations') }}: {{ $server->product->allocations }} <br/>"
class="fas fa-info-circle"></i>
</div>
</div>
<div class="row mb-2">
<div class="col-4">
{{ __('Price') }}:
<span class="text-muted">
({{ CREDITS_DISPLAY_NAME }})
</span>
</div>
<div class="col-8">
<div class="row">
<div class="col-6 text-center">
<div class="text-muted">{{ __('per Hour') }}</div>
<span>
{{ number_format($server->product->getHourlyPrice(), 2, '.', '') }}
</span>
</div>
<div class="col-6 text-center">
<div class="text-muted">{{ __('per Month') }}
</div>
<span>
{{ $server->product->getHourlyPrice() * 24 * 30 }}
</span>
</div>
</div>
</div>
</div>
</div>
<div class="card-body">
<span class="text-muted">{{__('Server Details')}}</span>
<table class="table">
<tr>
<td>{{__('Cpu')}}</td>
<td>{{$server->product->cpu}} %</td>
</tr>
<tr>
<td>{{__('Memory')}}</td>
<td>{{$server->product->memory}} MB</td>
</tr>
<tr>
<td>{{__('Disk')}}</td>
<td>{{$server->product->disk}} MB</td>
</tr>
<tr>
<td>{{__('Databases')}}</td>
<td>{{$server->product->databases}} MySQL</td>
</tr>
<tr>
<td>{{__('Backups')}}</td>
<td>{{$server->product->backups}}</td>
</tr>
<tr>
<td>{{__('Price per Hour')}}</td>
<td>{{number_format($server->product->getHourlyPrice(),2,".", "")}} {{CREDITS_DISPLAY_NAME}}</td>
</tr>
<tr>
<td>{{__('Price per Month')}}</td>
<td>{{$server->product->getHourlyPrice()*24*30}} {{CREDITS_DISPLAY_NAME}}</td>
</tr>
</table>
</div>
<div class="card-footer d-flex justify-content-between">
<a href="{{env('PTERODACTYL_URL' , 'http://localhost')}}/server/{{$server->identifier}}" target="__blank" class="btn btn-info mx-3 w-100"><i class="fas fa-tasks mr-2"></i>{{__('Manage')}}</a>
@if(!empty(env('PHPMYADMIN_URL')))
<a href="{{env('PHPMYADMIN_URL' , 'http://localhost')}}" target="__blank" class="btn btn-info mx-3 w-100" ><i class="fas fa-database mr-2"></i>{{__('Database')}}</a>
@endif
</div>
</div>
<div class="card-footer d-flex align-items-center justify-content-between">
<a href="{{ env('PTERODACTYL_URL', 'http://localhost') }}/server/{{ $server->identifier }}"
target="__blank"
class="btn btn-info mx-3 w-100 align-items-center justify-content-center d-flex">
<i class="fas fa-tools mr-2"></i>
<span>{{ __('Manage') }}</span>
</a>
<button onclick="confirmSubmit('{{ $server->id }}', handleServerDelete);" target="__blank"
class="btn btn-danger mx-3 w-100 align-items-center justify-content-center d-flex">
<i class="fas fa-trash mr-2"></i>
<span>{{ __('Delete') }}</span>
</button>
</div>
</div>
@endforeach
</div>
<!-- END CUSTOM CONTENT -->
</div>
</section>
<!-- END CONTENT -->
<script>
function submitResult() {
return confirm("{{__('Are you sure you wish to delete?')}}") !== false;
const confirmSubmit = (serverId, handleServerDelete) => {
// Confirm delete submit with sweetalert
Swal.fire({
title: "{{ __('Are you sure?') }}",
text: "{{ __('This is an irreversible action, all files of this server will be removed.') }}",
icon: 'warning',
confirmButtonColor: '#d9534f',
showCancelButton: true,
confirmButtonText: "{{ __('Yes, delete it!') }}",
cancelButtonText: "{{ __('No, cancel!') }}",
reverseButtons: true
}).then((result) => {
if (result.value) {
handleServerDelete(serverId);
return
}
Swal.fire("{{ __('Canceled ...') }}", `{{ __('Deletion has been canceled.') }}`, 'info');
});
}
const handleServerDelete = (serverId) => {
// Delete server
fetch("{{ route('servers.destroy', '') }}" + '/' + serverId, {
method: 'DELETE',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
}
}).then(() => {
window.location.reload();
});
}
document.addEventListener('DOMContentLoaded', () => {
$('[data-toggle="popover"]').popover();
});
</script>
@endsection

View file

@ -364,15 +364,15 @@
@if($invoice->notes)
<p>
{{ trans('Notes') }}:<br/> {!! $invoice->notes !!}
{{ __('Notes') }}: {!! $invoice->notes !!}
</p>
@endif
<p>
{{ trans('Amount in words') }}: {{ $invoice->getTotalAmountInWords() }}
{{ __('Amount in words') }}: {{ $invoice->getTotalAmountInWords() }}
</p>
<p>
{{ trans('Please pay until') }}: {{ $invoice->getPayUntilDate() }}
{{ __('Please pay until') }}: {{ $invoice->getPayUntilDate() }}
</p>
<script type="text/php">

View file

@ -152,8 +152,8 @@
<strong>{{ $invoice->status }}</strong>
</h4>
@endif
<p>{{ __('invoices::invoice.serial') }} <strong>{{ $invoice->getSerialNumber() }}</strong></p>
<p>{{ __('invoices::invoice.date') }}: <strong>{{ $invoice->getDate() }}</strong></p>
<p>{{ trans('invoices::invoice.serial') }} <strong>{{ $invoice->getSerialNumber() }}</strong></p>
<p>{{ trans('invoices::invoice.date') }}: <strong>{{ $invoice->getDate() }}</strong></p>
</td>
</tr>
</tbody>
@ -164,11 +164,11 @@
<thead>
<tr>
<th class="border-0 pl-0 party-header" width="48.5%">
{{ __('invoices::invoice.seller') }}
{{ trans('invoices::invoice.seller') }}
</th>
<th class="border-0" width="3%"></th>
<th class="border-0 pl-0 party-header">
{{ __('invoices::invoice.buyer') }}
{{ trans('invoices::invoice.buyer') }}
</th>
</tr>
</thead>
@ -183,25 +183,25 @@
@if($invoice->seller->address)
<p class="seller-address">
{{ __('invoices::invoice.address') }}: {{ $invoice->seller->address }}
{{ trans('invoices::invoice.address') }}: {{ $invoice->seller->address }}
</p>
@endif
@if($invoice->seller->code)
<p class="seller-code">
{{ __('invoices::invoice.code') }}: {{ $invoice->seller->code }}
{{ trans('invoices::invoice.code') }}: {{ $invoice->seller->code }}
</p>
@endif
@if($invoice->seller->vat)
<p class="seller-vat">
{{ __('invoices::invoice.vat') }}: {{ $invoice->seller->vat }}
{{ trans('invoices::invoice.vat') }}: {{ $invoice->seller->vat }}
</p>
@endif
@if($invoice->seller->phone)
<p class="seller-phone">
{{ __('invoices::invoice.phone') }}: {{ $invoice->seller->phone }}
{{ trans('invoices::invoice.phone') }}: {{ $invoice->seller->phone }}
</p>
@endif
@ -221,25 +221,25 @@
@if($invoice->buyer->address)
<p class="buyer-address">
{{ __('invoices::invoice.address') }}: {{ $invoice->buyer->address }}
{{ trans('invoices::invoice.address') }}: {{ $invoice->buyer->address }}
</p>
@endif
@if($invoice->buyer->code)
<p class="buyer-code">
{{ __('invoices::invoice.code') }}: {{ $invoice->buyer->code }}
{{ trans('invoices::invoice.code') }}: {{ $invoice->buyer->code }}
</p>
@endif
@if($invoice->buyer->vat)
<p class="buyer-vat">
{{ __('invoices::invoice.vat') }}: {{ $invoice->buyer->vat }}
{{ trans('invoices::invoice.vat') }}: {{ $invoice->buyer->vat }}
</p>
@endif
@if($invoice->buyer->phone)
<p class="buyer-phone">
{{ __('invoices::invoice.phone') }}: {{ $invoice->buyer->phone }}
{{ trans('invoices::invoice.phone') }}: {{ $invoice->buyer->phone }}
</p>
@endif
@ -257,19 +257,19 @@
<table class="table table-items">
<thead>
<tr>
<th scope="col" class="border-0 pl-0">{{ __('invoices::invoice.description') }}</th>
<th scope="col" class="border-0 pl-0">{{ trans('invoices::invoice.description') }}</th>
@if($invoice->hasItemUnits)
<th scope="col" class="text-center border-0">{{ __('invoices::invoice.units') }}</th>
<th scope="col" class="text-center border-0">{{ trans('invoices::invoice.units') }}</th>
@endif
<th scope="col" class="text-center border-0">{{ __('invoices::invoice.quantity') }}</th>
<th scope="col" class="text-right border-0">{{ __('invoices::invoice.price') }}</th>
<th scope="col" class="text-center border-0">{{ trans('invoices::invoice.quantity') }}</th>
<th scope="col" class="text-right border-0">{{ trans('invoices::invoice.price') }}</th>
@if($invoice->hasItemDiscount)
<th scope="col" class="text-right border-0">{{ __('invoices::invoice.discount') }}</th>
<th scope="col" class="text-right border-0">{{ trans('invoices::invoice.discount') }}</th>
@endif
@if($invoice->hasItemTax)
<th scope="col" class="text-right border-0">{{ __('invoices::invoice.tax') }}</th>
<th scope="col" class="text-right border-0">{{ trans('invoices::invoice.tax') }}</th>
@endif
<th scope="col" class="text-right border-0 pr-0">{{ __('invoices::invoice.sub_total') }}</th>
<th scope="col" class="text-right border-0 pr-0">{{ trans('invoices::invoice.sub_total') }}</th>
</tr>
</thead>
<tbody>
@ -310,7 +310,7 @@
@if($invoice->hasItemOrInvoiceDiscount())
<tr>
<td colspan="{{ $invoice->table_columns - 2 }}" class="border-0"></td>
<td class="text-right pl-0">{{ __('invoices::invoice.total_discount') }}</td>
<td class="text-right pl-0">{{ trans('invoices::invoice.total_discount') }}</td>
<td class="text-right pr-0">
{{ $invoice->formatCurrency($invoice->total_discount) }}
</td>
@ -319,7 +319,7 @@
@if($invoice->taxable_amount)
<tr>
<td colspan="{{ $invoice->table_columns - 2 }}" class="border-0"></td>
<td class="text-right pl-0">{{ __('invoices::invoice.taxable_amount') }}</td>
<td class="text-right pl-0">{{ trans('invoices::invoice.taxable_amount') }}</td>
<td class="text-right pr-0">
{{ $invoice->formatCurrency($invoice->taxable_amount) }}
</td>
@ -328,7 +328,7 @@
@if($invoice->tax_rate)
<tr>
<td colspan="{{ $invoice->table_columns - 2 }}" class="border-0"></td>
<td class="text-right pl-0">{{ __('invoices::invoice.tax_rate') }}</td>
<td class="text-right pl-0">{{ trans('invoices::invoice.tax_rate') }}</td>
<td class="text-right pr-0">
{{ $invoice->tax_rate }}%
</td>
@ -337,7 +337,7 @@
@if($invoice->hasItemOrInvoiceTax())
<tr>
<td colspan="{{ $invoice->table_columns - 2 }}" class="border-0"></td>
<td class="text-right pl-0">{{ __('invoices::invoice.total_taxes') }}</td>
<td class="text-right pl-0">{{ trans('invoices::invoice.total_taxes') }}</td>
<td class="text-right pr-0">
{{ $invoice->formatCurrency($invoice->total_taxes) }}
</td>
@ -346,7 +346,7 @@
@if($invoice->shipping_amount)
<tr>
<td colspan="{{ $invoice->table_columns - 2 }}" class="border-0"></td>
<td class="text-right pl-0">{{ __('invoices::invoice.shipping') }}</td>
<td class="text-right pl-0">{{ trans('invoices::invoice.shipping') }}</td>
<td class="text-right pr-0">
{{ $invoice->formatCurrency($invoice->shipping_amount) }}
</td>
@ -354,7 +354,7 @@
@endif
<tr>
<td colspan="{{ $invoice->table_columns - 2 }}" class="border-0"></td>
<td class="text-right pl-0">{{ __('invoices::invoice.total_amount') }}</td>
<td class="text-right pl-0">{{ trans('invoices::invoice.total_amount') }}</td>
<td class="text-right pr-0 total-amount">
{{ $invoice->formatCurrency($invoice->total_amount) }}
</td>