Przeglądaj źródła

removed some serverside-routes and added clientside-routes

removed nearly all templates and view methods
implemented most components to have full functionality now
pull/1/head
DragonSkills99 5 lat temu
rodzic
commit
39bdedce7a
37 zmienionych plików z 685 dodań i 340 usunięć
  1. 11
    138
      Plugin.php
  2. 250
    2
      classes/MinecraftPayAPI.class.php
  3. 1
    0
      imgs/refresh.svg
  4. 2
    0
      mithril/components/AccountList.class.d.ts
  5. 7
    0
      mithril/components/AccountList.class.js
  6. 9
    1
      mithril/components/AccountList.class.ts
  7. 22
    10
      mithril/components/AccountList.template.html
  8. 6
    0
      mithril/components/AlterAccount.class.d.ts
  9. 19
    0
      mithril/components/AlterAccount.class.js
  10. 26
    0
      mithril/components/AlterAccount.class.ts
  11. 12
    15
      mithril/components/AlterAccount.template.html
  12. 4
    0
      mithril/components/GrantUser.class.d.ts
  13. 9
    0
      mithril/components/GrantUser.class.js
  14. 12
    0
      mithril/components/GrantUser.class.ts
  15. 25
    0
      mithril/components/GrantUser.template.html
  16. 9
    0
      mithril/components/MinecraftUsers.class.d.ts
  17. 43
    0
      mithril/components/MinecraftUsers.class.js
  18. 49
    0
      mithril/components/MinecraftUsers.class.ts
  19. 21
    0
      mithril/components/MinecraftUsers.template.html
  20. 1
    1
      mithril/components/SettingsList.template.html
  21. 0
    0
      mithril/components/Users.class.d.ts
  22. 0
    0
      mithril/components/Users.class.js
  23. 0
    0
      mithril/components/Users.class.ts
  24. 0
    0
      mithril/components/Users.template.html
  25. 5
    0
      mithril/components/UsersList.class.d.ts
  26. 11
    0
      mithril/components/UsersList.class.js
  27. 15
    0
      mithril/components/UsersList.class.ts
  28. 30
    0
      mithril/components/UsersList.template.html
  29. 9
    1
      mithril/lang/de.json
  30. 5
    0
      mithril/services/MinecraftPayService.d.ts
  31. 34
    2
      mithril/services/MinecraftPayService.js
  32. 38
    2
      mithril/services/MinecraftPayService.ts
  33. 0
    20
      templates/AccountList.Template.php
  34. 0
    40
      templates/AlterAccount.Template.php
  35. 0
    28
      templates/GrantUser.Template.php
  36. 0
    38
      templates/Users.Template.php
  37. 0
    42
      templates/UsersList.Template.php

+ 11
- 138
Plugin.php Wyświetl plik

@@ -14,16 +14,7 @@ class MinecraftPaymentPlugin extends Plugin {

public function get_page_path() {
return [
'/minecraft-pay/' => [
'users' => [
null => 'users_view',
'/*' => 'user_view'
],
'grant' => 'grant_view',
'settle' => 'settle_view',
'balance' => 'balance_view',
'acredit' => 'acredit_view'
]
'/minecraft-pay/settle' => 'settle_view'
];
}
@@ -32,33 +23,21 @@ class MinecraftPaymentPlugin extends Plugin {
$this->add_route( '/minecraft-pay/settings', 'SettingsList' );
$this->register_component_short( 'Settings' );
$this->add_route( '/minecraft-pay/settings/:id', 'Settings' );
$this->register_component_short( 'UsersList' );
$this->add_route( '/minecraft-pay/users', 'UsersList' );
$this->register_component_short( 'MinecraftUsers' );
$this->add_route( '/minecraft-pay/users/:id', 'MinecraftUsers' );
$this->register_component_short( 'AlterAccount' );
$this->add_route( '/minecraft-pay/acredit', 'AlterAccount' );
$this->register_component_short( 'AccountList' );
$this->add_route( '/minecraft-pay/balance', 'AccountList' );
$this->register_component_short( 'GrantUser' );
$this->add_route( '/minecraft-pay/grant', 'GrantUser' );
$this->require_class( 'MinecraftPayAPI' );
API::REGISTER_CLASS( new MinecraftPayAPI(), 3, 'minecraft-pay/' );
}

public function grant_view( string $url ) {
if ( !Permission::PERMITTED( 'Minecraft-Pay-Settings', 1 ) ) return;
$params = [];
if ( array_key_exists( 'GrantUserRights', $_POST ) && array_key_exists( 'ID', $_POST ) ) {
$u = User::GetByID( $_POST[ 'ID' ] );
$s = false;
if ( !is_null( $u ) ) {
$p = Permission::SEARCH( 'Minecraft-Possess-User' );
$s = $p->grant_user( $u->GetID(), true ); $s = true;
// echo $p;
// echo $s;
$params[ 'save_message' ] =
// $s ?
__( [ 'de' => 'Recht erfolgreich gewährt', 'en' => 'Right granted successfully' ] ); // :
// __( [ 'de' => 'Recht konnte nicht gewährt werden', 'en' => 'Right could not be granted' ] );
}
else $params[ 'save_message' ] = __( [ 'de' => 'Benutzer nicht gefunden', 'en' => 'Could not find user' ] );
$params[ 'save_success' ] = $s;
}
$this->show_template( 'GrantUser', $params );
}

private function settle( $m, $y ) {
$mp = MinecraftMonthPaid::GetByUnique( 0, $m ,$y );
if ( $mp ) {
@@ -156,112 +135,6 @@ class MinecraftPaymentPlugin extends Plugin {
}
}

public function acredit_view( string $url ) {
if ( !Permission::PERMITTED( 'Minecraft-Pay-Settings', 1 ) ) return;
$params = null;
if (
array_key_exists( 'AddAccountChange', $_POST ) &&
array_key_exists( 'Mod', $_POST ) &&
array_key_exists( 'DebtorID', $_POST ) &&
array_key_exists( 'Comment', $_POST )
) {
$ac = MinecraftUserAccount::FromPropertyArray( $_POST );
$ac->SetDebtor( User::GetByID( $_POST[ 'DebtorID' ] ) );
$params = [];
$params[ 'save_success' ] = $ac->Save();
$params[ 'save_message' ] =
$params[ 'save_success' ] ?
__( [ 'de' => 'Gutschrift erfolgreich', 'en' => 'Credit successful' ] ) :
__( [ 'de' => 'Gutschrift fehlgeschlagen', 'en' => 'Credit failed' ] );
}
$this->show_template( 'AlterAccount', $params );
}

public function balance_view( string $url ) {
if ( !Permission::PERMITTED( 'Minecraft-Possess-User', 1 ) ) return;
$this->show_template( 'AccountList', null );
}

public function users_view( string $url ) {
if ( !Permission::PERMITTED( 'Minecraft-Possess-User', 1 ) ) return;
if ( $url == '/minecraft-pay/users' ) {
$params = [];
if ( array_key_exists( 'CreateMinecraftUser', $_POST ) && array_key_exists( 'Username', $_POST ) ) {
$s = MinecraftUser::FromPropertyArray( $_POST );
$s->SetOwner( User::CURRENT() );
try {
$s->Save();
$params[ 'save_message' ] = __( [ 'de' => 'Minecraft Benutzer erfolgreich angelegt', 'en' => 'Created minecraft user successfully' ] );
$params[ 'save_success' ] = true;
} catch( Exception $ex ) {
$params[ 'save_message' ] = $ex->getMessage();
if ( startsWith( $params[ 'save_message' ], 'Duplicate entry' ) )
$params[ 'save_message' ] = __(
[
'de' => 'Doppelter Name oder es wurde bei einem anderen Server weder Domain noch Port angegeben',
'en' => 'Duplicated Name or another server has neither domain nor port'
]
);
$params[ 'save_success' ] = false;
}
}
if ( array_key_exists( 'DeleteMinecraftUser', $_POST ) && array_key_exists( 'ID', $_POST ) ) {
$s = MinecraftUser::GetByID( $_POST[ 'ID' ] );

if ( User::CURRENT()->GetID() != $s->GetOwner()->GetID() ) {
$params[ 'save_message' ] = __( [ 'de' => 'Dieser Benutzer gehöt Ihnen nicht!', 'en' => 'This user does not belong to you!' ] );
$params[ 'save_success' ] = false;
} else {
try {
$s->Delete();
$params[ 'save_message' ] = __( [ 'de' => 'Minecraft Benutzer erfolgreich gelöscht', 'en' => 'Deleted minecraft user successfully' ] );
$params[ 'save_success' ] = true;
} catch( Exception $ex ) {
$params[ 'save_message' ] = $ex->getMessage();
$params[ 'save_success' ] = false;
}
}
}
$this->show_template( 'UsersList', $params );
} else $this->user_view( $url );
}

public function user_view( string $url ) {
if ( !Permission::PERMITTED( 'Minecraft-Possess-User', 1 ) ) return;
if ( !preg_match( '/\/minecraft-pay\/users\/([0-9]+)/', $url, $m ) || is_null( MinecraftUser::GetByID( $m[ 1 ] ) ) ) {
Alert::SHOW( __( [ 'de' => 'Dieser Benutzer existiert nicht', 'en' => 'This user does not exist' ] ) );
return;
}

$params = [];

if ( array_key_exists( 'RUnlockUser', $_POST ) && array_key_exists( 'ID', $_POST ) ) {
$s = MinecraftServer::GetByID( $_POST[ 'ID' ] );
$u = MinecraftUser::GetByID( $m[ 1 ] );

if ( is_null( $s ) ) { $params[ 'save_message' ] = __( [ 'de' => 'Unbekannter Server', 'en' => 'Unknown server' ] ); $params[ 'save_success' ] = false; }
else if ( is_null( $u ) ) { $params[ 'save_message' ] = __( [ 'de' => 'Unbekannter Benutzer', 'en' => 'Unknown user' ] ); $params[ 'save_success' ] = false; }
else {
if ( $s->Unlock( $u ) ) {
if ( !$u->HasSubscripted( $s ) ) {
$ms = new MinecraftServerSubscription();
$ms->SetConcerningServer( $s );
$ms->SetUnlockedUser( $u );
$params[ 'save_success' ] = $ms->Save();
$params[ 'save_message' ] =
$params[ 'save_success' ] ?
__( [ 'de' => 'Erfolgreich freigeschaltet', 'en' => 'Unlock successful' ] ) :
__( [ 'de' => 'Freischaltung fehlgeschlagen', 'en' => 'Unlock failed' ] );
if ( !$params[ 'save_success' ] ) $s->Lock( $u );
} else { $params[ 'save_message' ] = __( [ 'de' => 'Erfolgreich freigeschaltet', 'en' => 'Unlock successful' ] ); $params[ 'save_success' ] = true; }
} else { $params[ 'save_message' ] = __( [ 'de' => 'Freischaltung fehlgeschlagen', 'en' => 'Unlock failed' ] ); $params[ 'save_success' ] = false; }
}
}

$params[ 'user' ] = MinecraftUser::GetByID( $m[ 1 ] );
$this->show_template( 'Users', $params );
}

public function load_plugin(): void {
if ( is_null( Permission::GetByUnique( 0, 'Minecraft-Pay-Settings' ) ) ) {
$p = Permission::FromArray( [], [] );

+ 250
- 2
classes/MinecraftPayAPI.class.php Wyświetl plik

@@ -22,7 +22,7 @@ class MinecraftPayAPI {
*
* @Parameterized
*
* @param MinecraftServer $seerver server to edit
* @param MinecraftServer $server server to edit
*
* @paramget id path id required int
* @paramget server post server required MinecraftServer
@@ -91,7 +91,7 @@ class MinecraftPayAPI {
*
* @return APIResult< MinecraftServer >
*/
public static function AddMinecraftServer( MinecraftServer $server ) {
public static function AddServer( MinecraftServer $server ) {
$o = new MinecraftServer();
$o->SetName( $server->GetName() );
@@ -100,4 +100,252 @@ class MinecraftPayAPI {
return new APIResult( $s ? 'Created server successfully' : 'The server could not be created', $s, $s ? $o : null );
}
/**
* @API-Callback
* @Path users
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @return MinecraftUser[]
*/
public function GetAllUsers() {
return MinecraftUser::GetAll( [ 'OwnerID' => API::$User->GetID() ] )->toArray();
}
/**
* @API-Callback
* @Path users/:id/subscription-states
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @Parameterized
*
* @paramget id path id required int
*
* @return Map< int, boolean >
*/
public function GetAllSubscriptionStates( int $id ) {
$user = MinecraftUser::GetByID( $id );
$data = [];
foreach( MinecraftServer::GetAll() as $server ) {
$data[] = [ $server->GetID() , $server->IsUnlocked( $user ) ];
}
return $data;
}
/**
* @API-Callback
* @Path users/:id/subscribe-server/:serverId
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @Parameterized
*
* @paramget id path id required int
* @paramget serverId path serverId required int
*
* @return APIResult< boolean >
*/
public function SubscribeServer( int $id, int $serverId ) {
$u = MinecraftUser::GetByID( $id );
$s = MinecraftServer::GetByID( $serverId );
$result = new APIResult( '', false, false );
if ( is_null( $s ) ) {
$result->Message( 'Unknown server' );
}
else if ( is_null( $u ) ) {
$result->Message( 'Unknown user' );
}
else {
if ( $s->Unlock( $u ) ) {
if ( !$u->HasSubscripted( $s ) ) {
$ms = new MinecraftServerSubscription();
$ms->SetConcerningServer( $s );
$ms->SetUnlockedUser( $u );
$result->Success( $ms->Save() );
$result->Message( $result->Success() ? 'Unlock successful' : 'Unlock failed' )->Obj( $result->Success() );
if ( !$result->Success() ) $s->Lock( $u );
} else {
$result->Message( 'Unlock successful' )->Success( true )->Obj( true );
}
} else {
$result->Message( 'Unlock failed' )->Success( false );
}
}
return $result;
}
// /**
// * @API-Callback
// * @Path users/:id
// * @Require-Login
// * @Require-Permission Minecraft-Possess-User
// *
// * @Request-Method PATCH
// *
// * @Parameterized
// *
// * @param MinecraftUser $user user to edit
// *
// * @paramget id path id required int
// * @paramget user post user required MinecraftUser
// *
// * @return APIResult< MinecraftUser >
// */
// public static function UpdateUser( int $id, MinecraftUser $user ) {
// $o = MinecraftUser::GetByID( $id );
// if ( $o == null ) {
// $results[] = new APIResult( 'Missing ID', false, $user );
// }
// if ( $user->GetUsername() != null ) $o->SetUsername( $user->GetUsername() );
// if ( API::$User->GetID() != $user->GetOwner()->GetID() ) {
// return new APIResult( 'This minecraft user does not belong to you', false, null );
// }
// $r = $o->Save();
// return new APIResult( $r ? 'Saved successfully' : 'Saving failed', $r, $r ? $o : MinecraftUser::GetByID( $id ) );
// }
/**
* @API-Callback
* @Path users/:id
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method DELETE
*
* @Parameterized
*
* @paramget id path id required int
*
* @return APIResult< MinecraftUser >
*/
public static function DeleteUser( int $id ) {
if ( !is_numeric( $id ) ) return new APIResult( 'Invalid ID', false, null );
$user = MinecraftUser::GetByID( $id );
$result = null;
if ( !$user ) {
$result = new APIResult( 'User does not exist', false, null );
} else if ( $user->DELETE() ) {
$result = new APIResult( 'Deleted user successfully', true, null );
} else {
$result = new APIResult( 'Deleting user failed', false, $user );
}
return $result;
}
/**
* @API-Callback
* @Path users
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method POST
*
* @Parameterized
*
* @param MinecraftUser $user to add
*
* @paramget user post user required MinecraftUser
*
* @return APIResult< MinecraftUser >
*/
public static function AddUser( MinecraftUser $user ) {
$o = new MinecraftUser();
$o->SetUsername( $user->GetUsername() );
$o->SetOwner( API::$User );
$s = $o->Save();
return new APIResult( $s ? 'Created user successfully' : 'The user could not be created', $s, $s ? $o : null );
}
/**
* @API-Callback
* @Path charges
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @return MinecraftUserAccount[]
*/
public function GetAllCharges() {
return MinecraftUserAccount::GetAll( [ 'DebtorID' => API::$User->GetID() ] )->toArray();
}
/**
* @API-Callback
* @Path users/:id/grant-user-right
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method POST
*
* @Parameterized
*
* @paramget id path id required int
*
* @return APIResult< boolean >
*/
public function GrantUserRight( int $id ) {
$u = User::GetByID( $id );
$r = new APIResult( '', false, false );
$s = false;
if ( !is_null( $u ) ) {
$p = Permission::SEARCH( 'Minecraft-Possess-User' );
$s = $p->grant_user( $u->GetID(), true );
$r->Message( 'Right granted successfully' )->Success( true )->Obj( true );
}
else $r->Message( 'Could not find user' );
return $r;
}
/**
* @API-Callback
* @Path users/:id/acredit
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method POST
*
* @Parameterized
*
* @paramget id path id required int
* @paramget credit post credit required MinecraftUserAccount
*
* @return APIResult< MinecraftUserAccount >
*/
public function Acredit( int $id, MinecraftUserAccount $credit ) {
$r = new APIResult( '', false, null );
$ac = new MinecraftUserAccount();
$u = User::GetByID( $id );
if ( is_null( $u ) ) {
$r->Message( 'Missing user' );
} else {
$ac->SetMod( $credit->GetMod() );
$ac->SetComment( $credit->GetComment() );
$ac->SetDebtor( $u );
$r->Success( !!$ac->Save() );
$r->Message( $r->Success() ? 'Credit successful' : 'Credit failed' );
if ( $r->Success() ) $r->Obj( $ac );
}
return $r;
}
}

+ 1
- 0
imgs/refresh.svg Wyświetl plik

@@ -0,0 +1 @@
<svg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'><title>ionicons-v5-b</title><path d='M256,48C141.31,48,48,141.32,48,256c0,114.86,93.14,208,208,208,114.69,0,208-93.31,208-208C464,141.13,370.87,48,256,48Zm94,219a94,94,0,1,1-94-94h4.21l-24-24L256,129.2,315.8,189,256,248.8,236.2,229l27.92-27.92C261.72,201,259,201,256,201a66,66,0,1,0,66,66V253h28Z'/></svg>

+ 2
- 0
mithril/components/AccountList.class.d.ts Wyświetl plik

@@ -1,2 +1,4 @@
declare class AccountList {
private refresh;
private getAccount;
}

+ 7
- 0
mithril/components/AccountList.class.js Wyświetl plik

@@ -1,2 +1,9 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class AccountList {
refresh() {
MinecraftPayService.RefreshCharges();
}
getAccount() {
return MinecraftPayService.UserAccounts.map(acc => acc.Mod).concat([0]).reduce((pre, nxt) => pre + nxt);
}
}

+ 9
- 1
mithril/components/AccountList.class.ts Wyświetl plik

@@ -1,3 +1,11 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }

class AccountList {
private refresh() {
MinecraftPayService.RefreshCharges();
}

private getAccount() {
return MinecraftPayService.UserAccounts.map( acc => acc.Mod ).concat( [ 0 ] ).reduce( ( pre, nxt ) => pre + nxt );
}
}

+ 22
- 10
mithril/components/AccountList.template.html Wyświetl plik

@@ -1,17 +1,29 @@
<meta log-in permission="Minecraft-Possess-User" />
<table class="table">
<div class="bg-primary w-100 d-flex justify-content-end p-2 rounded">
<span dval-innerText="__( 'Account' ) + ':&nbsp;'"></span>
<span dval-innerText="this.getAccount()"></span>
<span>&nbsp;&euro;</span>
</div>
<hr />
<table class="table table-hover table-striped">
<thead>
<tr>
<th dval-innerText="__( [ 'Date' )"></th>
<th style="width: 100%;" dval-innerText="__( 'Comment' )"></th>
<th dval-innerText="__( 'Amount' )"></th>
<tr class="table-primary">
<th class="align-middle" dval-innerText="__( 'Date' )"></th>
<th class="align-middle" style="width: 100%;" dval-innerText="__( 'Comment' )"></th>
<th class="align-middle" dval-innerText="__( 'Amount' )"></th>
<th>
<a class="btn btn-info p-0">
<img dval-src="Resources.GetImageUrl( 'refresh.svg', 'Minecraft-Payment' )"
style="filter: invert( 1 ); height: 2em;" dval-onclick="() => this.refresh()" />
</a>
</th>
</tr>
</thead>
<tbody>
<tr dyn-for="[ 'credit', 'MinecraftUserAccount::GetAll( [ \'DebtorID\' => User::CURRENT()->ID ] )' ]">
<td dval-innerText="credit.GetOccurence()"></td>
<td dval-innerText="credit.GetComment()"></td>
<td style="text-align: right;" dval-innerText="credit.GetMod() + '&nbsp;&euro;'"></td>
<tr m-for="MinecraftPayService.UserAccounts as credit">
<td class="align-middle" dval-innerText="credit.Occurence"></td>
<td class="align-middle" dval-innerText="credit.Comment"></td>
<td colspan="2" class="align-middle" style="text-align: right;"
dval-innerText="credit.Mod + '&nbsp;&euro;'"></td>
</tr>
</tbody>
</table>

+ 6
- 0
mithril/components/AlterAccount.class.d.ts Wyświetl plik

@@ -0,0 +1,6 @@
declare class AlterAccount {
private debtor;
private mod;
private comment;
private acredit;
}

+ 19
- 0
mithril/components/AlterAccount.class.js Wyświetl plik

@@ -0,0 +1,19 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
// MLQRequire: { "Plugin": "User-Manager", "Type": "Service", "Name": "UserData" }
class AlterAccount {
acredit() {
MinecraftPayAPI.Acredit({
params: {
id: this.debtor
},
post: {
credit: {
Comment: this.comment,
Mod: this.mod
}
}
}).then(r => {
Toasts.Messaged(r.Message, Toast.Load({ Type: r.Success ? 'success' : 'danger' }));
});
}
}

+ 26
- 0
mithril/components/AlterAccount.class.ts Wyświetl plik

@@ -0,0 +1,26 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
// MLQRequire: { "Plugin": "User-Manager", "Type": "Service", "Name": "UserData" }
class AlterAccount {
private debtor: number;
private mod: number;
private comment: string;
private acredit() {
MinecraftPayAPI.Acredit(
{
params: {
id: this.debtor
},
post: {
credit: {
Comment: this.comment,
Mod: this.mod
} as MinecraftUserAccount
}
}
).then( r => {
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
}

+ 12
- 15
mithril/components/AlterAccount.template.html Wyświetl plik

@@ -1,38 +1,35 @@
<meta log-in permission="Minecraft-Pay-Settings" />
<div dyn-if="isset( $save_message )">
<div dyn-type="alert" eval-value="$save_message" eval-type="$save_success ? ALERT_SUCCESS : ALERT_DANGER"></div>
</div>
<form method="POST">
<table>
<form m-form="this.acredit">
<table class="table table-striped table-hover">
<thead>
<tr>
<tr class="table-primary">
<th innerText="Minecraft Payment" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr>
<th eval-innerText="__([ 'de' => 'Benutzer', 'en' => 'User' ])"></th>
<th class="align-middle" dval-innerText="__( 'User' )"></th>
<td>
<select name="DebtorID">
<div dyn-for="[ 'user', 'User::GetAll()' ]"><option eval-value="$user->GetID()" eval-innerText="$user->GetUsername()"></option></div>
<select class="form-control" name="DebtorID" m-value="this.debtor">
<option dval-innerText="__( '-- Please select --' )"></option>
<option m-for="UserData.Users as user" dval-value="user.ID" dval-innerText="user.Username"></option>
</select>
</td>
</tr>
<tr>
<th eval-innerText="__([ 'de' => 'Menge', 'en' => 'Amount' ])"></th>
<th class="align-middle" dval-innerText="__( 'Amount' )"></th>
<td>
<input type="number" step="0.01" name="Mod" value="0.00" />
<input class="form-control" type="number" step="0.01" name="Mod" value="0.00" m-value="this.mod" />
</td>
</tr>
<tr>
<th eval-innerText="__([ 'de' => 'Kommentar', 'en' => 'Comment' ])"></th>
<th class="align-middle" dval-innerText="__( 'Comment' )"></th>
<td>
<input type="string" name="Comment" />
<input class="form-control" type="string" name="Comment" m-value="this.comment" />
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="AddAccountChange" eval-value="__([ 'de' => 'Gutschreiben', 'en' => 'Credit' ])" />
<input class="form-control btn-info" type="submit" name="AddAccountChange" dval-value="__( 'Credit' )" />
</td>
</tr>
</tbody>

+ 4
- 0
mithril/components/GrantUser.class.d.ts Wyświetl plik

@@ -0,0 +1,4 @@
declare class GrantUser {
private user;
private grant;
}

+ 9
- 0
mithril/components/GrantUser.class.js Wyświetl plik

@@ -0,0 +1,9 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
// MLQRequire: { "Plugin": "User-Manager", "Type": "Service", "Name": "UserData" }
class GrantUser {
grant() {
MinecraftPayAPI.GrantUserRight({ params: { id: this.user } }).then(r => {
Toasts.Messaged(r.Message, Toast.Load({ Type: r.Success ? 'success' : 'danger' }));
});
}
}

+ 12
- 0
mithril/components/GrantUser.class.ts Wyświetl plik

@@ -0,0 +1,12 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
// MLQRequire: { "Plugin": "User-Manager", "Type": "Service", "Name": "UserData" }
class GrantUser {
private user: number;
private grant() {
MinecraftPayAPI.GrantUserRight( { params: { id: this.user } } ).then( r => {
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
}

+ 25
- 0
mithril/components/GrantUser.template.html Wyświetl plik

@@ -0,0 +1,25 @@
<form m-form="this.grant">
<table class="table table-hover table-striped">
<thead>
<tr class="table-primary">
<th innerText="Minecraft Payment" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr>
<th class="align-middle" dval-innerText="__( 'User' )"></th>
<td>
<select class="form-control" name="ID" m-value="this.user">
<option dval-innerText="__( '-- Please select --' )"></option>
<option m-for="UserData.Users as user" dval-value="user.ID" dval-innerText="user.Username"></option>
</select>
</td>
</tr>
<tr>
<td colspan="2">
<input class="form-control btn-info" type="submit" name="GrantUserRights" dval-value="__( 'Mark as Minecraft Payment User' )" />
</td>
</tr>
</tbody>
</table>
</form>

+ 9
- 0
mithril/components/MinecraftUsers.class.d.ts Wyświetl plik

@@ -0,0 +1,9 @@
declare class MinecraftUsers {
private user;
private subscriptionsStates;
onview(vnode: any): void;
private loadUser;
private UnlockServer;
private unlockServer;
constructor();
}

+ 43
- 0
mithril/components/MinecraftUsers.class.js Wyświetl plik

@@ -0,0 +1,43 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class MinecraftUsers {
constructor() {
this.user = {};
this.subscriptionsStates = new Map();
}
onview(vnode) {
if (typeof (MinecraftUser) !== 'function')
LoadQueue.Start(() => { });
else
this.loadUser();
}
loadUser() {
var id = m.route.param('id');
if (id.match(/^[0-9]+$/))
id = +id;
else
return;
if (this.user.ID !== id) {
this.user = $.extend(true, new MinecraftUser(), MinecraftPayService.Users.find(o => o.ID === id)) || this.user;
if (this.user.ID) {
MinecraftPayAPI.GetAllSubscriptionStates({ params: { id } }).then(map => {
this.subscriptionsStates = map || this.subscriptionsStates;
});
}
m.redraw();
}
}
UnlockServer(serverId) {
if (!this.subscriptionsStates.get(serverId)) {
Modal.YesNo('Delete minecraft user', __('Do you really want to unlock this server for this minecraft user?'), (c, e) => this.unlockServer(this.user.ID, serverId, c)).Show();
}
}
unlockServer(userId, serverId, confirmed) {
if (confirmed) {
MinecraftPayAPI.SubscribeServer({ params: { id: userId, serverId } }).then(r => {
this.subscriptionsStates.set(serverId, r.Obj);
Toasts.Messaged(r.Message, Toast.Load({ Type: r.Success ? 'success' : 'danger' }));
});
}
return undefined;
}
}

+ 49
- 0
mithril/components/MinecraftUsers.class.ts Wyświetl plik

@@ -0,0 +1,49 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class MinecraftUsers {
private user: MinecraftUser = {} as MinecraftUser;
private subscriptionsStates: Map< number, boolean > = new Map();
public onview( vnode )
{
if ( typeof( MinecraftUser ) !== 'function' ) LoadQueue.Start( () => {} )
else this.loadUser();
}
private loadUser() {
var id: string | number = m.route.param( 'id' );
if ( id.match( /^[0-9]+$/ ) ) id = +id;
else return;
if ( this.user.ID !== id ) {
this.user = $.extend( true, new MinecraftUser(), MinecraftPayService.Users.find( o => o.ID === id ) ) || this.user;
if ( this.user.ID ) {
MinecraftPayAPI.GetAllSubscriptionStates( { params: { id } } ).then( map => {
this.subscriptionsStates = map || this.subscriptionsStates;
} );
}
m.redraw();
}
}
private UnlockServer( serverId: number ) {
if ( !this.subscriptionsStates.get( serverId ) ) {
Modal.YesNo(
'Delete minecraft user', __( 'Do you really want to unlock this server for this minecraft user?' ),
( c, e ) => this.unlockServer( this.user.ID, serverId, c )
).Show();
}
}
private unlockServer( userId: number, serverId: number, confirmed: boolean ): boolean {
if ( confirmed ) {
MinecraftPayAPI.SubscribeServer( { params: { id: userId, serverId } } ).then( r => {
this.subscriptionsStates.set( serverId, r.Obj );
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
return undefined;
}
public constructor() {
}
}

+ 21
- 0
mithril/components/MinecraftUsers.template.html Wyświetl plik

@@ -0,0 +1,21 @@
<table class="table table-striped table-hover">
<thead>
<tr class="table-primary">
<th dval-innerText="this.user.Username" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr class="table-primary">
<th colspan="2" dval-innerText="__('Server')"></th>
</tr>
<tr m-for="MinecraftPayService.Servers as server">
<td class="align-middle" style="vertical-align: middle; width: 100%" dval-innerText="server.Name"></td>
<td class="align-middle">
<span m-if="this.subscriptionsStates.has( server.ID )" dval-onclick="() => this.UnlockServer( server.ID )" dval-class="'d-flex align-items-center btn ' + ( this.subscriptionsStates.get( server.ID ) ? 'btn-success' : 'btn-danger' )">
<span m-if="!this.subscriptionsStates.get( server.ID )" dval-innerText="__( 'Unlock' ) + '&nbsp;~' + server.PerMonthPrice + '&nbsp;&euro;&nbsp;'"></span>
<img class="float-right" style="height: 1em; filter: invert( 1 ); vertical-align: middle;" dval-src="Resources.GetImageUrl( this.subscriptionsStates.get( server.ID ) ? 'unlock.svg' : 'lock.svg', 'Minecraft-Payment' )" />
</span>
</td>
</tr>
</tbody>
</table>

+ 1
- 1
mithril/components/SettingsList.template.html Wyświetl plik

@@ -19,7 +19,7 @@
</thead>
<tbody>
<tr m-for="MinecraftPayService.Servers as server">
<td dval-innerText="server.Name"></td>
<td class="align-middle" dval-innerText="server.Name"></td>
<td class="align-middle">
<a class="action_href action_delete btn btn-danger" style="cursor: pointer;" dval-onclick="() => Modal.YesNo( 'Delete server', __( 'Do you really want to delete this server?' ), ( c, e ) => this.deleteServer( server.ID, c, e ) ).Show()">&#x1F5D1;</a>
</td>

+ 0
- 0
mithril/components/Users.class.d.ts Wyświetl plik


+ 0
- 0
mithril/components/Users.class.js Wyświetl plik


+ 0
- 0
mithril/components/Users.class.ts Wyświetl plik


+ 0
- 0
mithril/components/Users.template.html Wyświetl plik


+ 5
- 0
mithril/components/UsersList.class.d.ts Wyświetl plik

@@ -0,0 +1,5 @@
declare class UsersList {
private username;
private addUser;
private deleteUser;
}

+ 11
- 0
mithril/components/UsersList.class.js Wyświetl plik

@@ -0,0 +1,11 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class UsersList {
addUser() {
MinecraftPayService.CreateUser({ Username: this.username });
}
deleteUser(id, confirm, event) {
if (confirm) {
MinecraftPayService.DeleteUser(id);
}
}
}

+ 15
- 0
mithril/components/UsersList.class.ts Wyświetl plik

@@ -0,0 +1,15 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class UsersList {
private username: string;
private addUser() {
MinecraftPayService.CreateUser( { Username: this.username } as MinecraftUser );
}
private deleteUser( id: number, confirm: boolean, event: any ) {
if ( confirm ) {
MinecraftPayService.DeleteUser( id );
}
}
}

+ 30
- 0
mithril/components/UsersList.template.html Wyświetl plik

@@ -0,0 +1,30 @@
<form m-form="this.addUser">
<table class="table table-hover table-striped">
<tbody>
<tr>
<td><input class="form-control" type="text" name="Username" dval-placeholder="__( 'Username' )" m-value="this.username" /></td>
<td><input class="form-control btn-info" type="submit" name="CreateMinecraftUser" dval-value="__( 'Add Minecraft User' )" /></td>
</tr>
</tbody>
</table>
</form>
<hr />
<table class="table">
<thead>
<tr class="table-primary">
<th style="width: 100%;">Name</th>
<th colspan="2"></th>
</tr>
</thead>
<tbody>
<tr m-for="MinecraftPayService.Users as user">
<td class="align-middle" dval-innerText="user.Username"></td>
<td class="align-middle">
<a class="action_href action_delete btn btn-danger" style="cursor: pointer;" dval-onclick="() => Modal.YesNo( 'Delete minecraft user', __( 'Do you really want to delete this minecraft user?' ), ( c, e ) => this.deleteUser( user.ID, c, e ) ).Show()">&#x1F5D1;</a>
</td>
<td class="align-middle">
<a class="action_href btn btn-outline-primary float-right" dval-m-href="'/minecraft-pay/users/' + user.ID">&gt;&gt;</a>
</td>
</tr>
</tbody>
</table>

+ 9
- 1
mithril/lang/de.json Wyświetl plik

@@ -12,5 +12,13 @@
"Delete server": "Server löschen",
"Do you really want to delete this server?": "Willst du diesen Server wirklich löschen?",
"Yes": "Ja",
"No": "Nein"
"No": "Nein",
"User": "Benutzer",
"Amount": "Menge",
"Comment": "Kommentar",
"Mark as Minecraft Payment User": "Als Minecraft Payment Nutzer markieren",
"Date": "Datum",
"Account": "Konto-Stand",
"-- Please select --": "-- Bitte auswählen --",
"Add Minecraft User": "Minecraft Benutzer hinzufügen"
}

+ 5
- 0
mithril/services/MinecraftPayService.d.ts Wyświetl plik

@@ -2,8 +2,13 @@
declare class MinecraftPayService {
static INSTANCE: MinecraftPayService;
static Servers: MinecraftServer[];
static Users: MinecraftUser[];
static UserAccounts: MinecraftUserAccount[];
private constructor();
static RefreshCharges(): void;
static CreateServer(server: MinecraftServer): void;
static UpdateServer(id: number, server: MinecraftServer): void;
static DeleteServer(id: number): void;
static CreateUser(user: MinecraftUser): void;
static DeleteUser(id: number): void;
}

+ 34
- 2
mithril/services/MinecraftPayService.js Wyświetl plik

@@ -5,11 +5,17 @@ class MinecraftPayService {
constructor() {
LoadQueue.Start(() => {
MinecraftPayAPI.GetAllServers().then(s => MinecraftPayService.Servers = s || []);
MinecraftPayAPI.GetAllUsers().then(u => MinecraftPayService.Users = u || []);
MinecraftPayAPI.GetAllCharges().then(mua => MinecraftPayService.UserAccounts = mua || []);
});
}
static RefreshCharges() {
LoadQueue.Start(() => {
MinecraftPayAPI.GetAllCharges().then(mua => MinecraftPayService.UserAccounts = mua || []);
});
}
static CreateServer(server) {
MinecraftPayAPI.AddMinecraftServer({ post: { server } }).then(r => {
console.warn(r);
MinecraftPayAPI.AddServer({ post: { server } }).then(r => {
if (r.Success) {
this.Servers.push(r.Obj);
}
@@ -32,6 +38,32 @@ class MinecraftPayService {
Toasts.Messaged(r.Message, Toast.Load({ Type: r.Success ? 'success' : 'danger' }));
});
}
static CreateUser(user) {
MinecraftPayAPI.AddUser({ post: { user } }).then(r => {
if (r.Success) {
this.Users.push(r.Obj);
}
Toasts.Messaged(r.Message, Toast.Load({ Type: r.Success ? 'success' : 'danger' }));
});
}
// public static UpdateUser( id: number, user: MinecraftUser ) {
// MinecraftPayAPI.UpdateUser( { post: { user }, params: { id } } ).then( r => {
// if ( r.Success ) {
// this.Users[ this.Users.findIndex( o => o.ID === r.Obj.ID ) ] = r.Obj;
// }
// Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
// } );
// }
static DeleteUser(id) {
MinecraftPayAPI.DeleteUser({ params: { id } }).then(r => {
if (r.Success) {
this.Users.splice(this.Users.findIndex(o => o.ID === id), 1);
}
Toasts.Messaged(r.Message, Toast.Load({ Type: r.Success ? 'success' : 'danger' }));
});
}
}
MinecraftPayService.INSTANCE = new MinecraftPayService();
MinecraftPayService.Servers = [];
MinecraftPayService.Users = [];
MinecraftPayService.UserAccounts = [];

+ 38
- 2
mithril/services/MinecraftPayService.ts Wyświetl plik

@@ -5,16 +5,25 @@
class MinecraftPayService {
public static INSTANCE: MinecraftPayService = new MinecraftPayService();
public static Servers: MinecraftServer[] = [];
public static Users: MinecraftUser[] = [];
public static UserAccounts: MinecraftUserAccount[] = [];
private constructor() {
LoadQueue.Start( () => {
MinecraftPayAPI.GetAllServers().then( s => MinecraftPayService.Servers = s || [] );
MinecraftPayAPI.GetAllUsers().then( u => MinecraftPayService.Users = u || [] );
MinecraftPayAPI.GetAllCharges().then( mua => MinecraftPayService.UserAccounts = mua || [] );
} );
}
public static RefreshCharges() {
LoadQueue.Start( () => {
MinecraftPayAPI.GetAllCharges().then( mua => MinecraftPayService.UserAccounts = mua || [] );
} );
}
public static CreateServer( server: MinecraftServer ) {
MinecraftPayAPI.AddMinecraftServer( { post: { server } } ).then( r => {
console.warn( r );
MinecraftPayAPI.AddServer( { post: { server } } ).then( r => {
if ( r.Success ) {
this.Servers.push( r.Obj );
}
@@ -39,4 +48,31 @@ class MinecraftPayService {
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
public static CreateUser( user: MinecraftUser ) {
MinecraftPayAPI.AddUser( { post: { user } } ).then( r => {
if ( r.Success ) {
this.Users.push( r.Obj );
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
// public static UpdateUser( id: number, user: MinecraftUser ) {
// MinecraftPayAPI.UpdateUser( { post: { user }, params: { id } } ).then( r => {
// if ( r.Success ) {
// this.Users[ this.Users.findIndex( o => o.ID === r.Obj.ID ) ] = r.Obj;
// }
// Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
// } );
// }
public static DeleteUser( id: number ) {
MinecraftPayAPI.DeleteUser( { params: { id } } ).then( r => {
if ( r.Success ) {
this.Users.splice( this.Users.findIndex( o => o.ID === id ), 1 );
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
}

+ 0
- 20
templates/AccountList.Template.php Wyświetl plik

@@ -1,20 +0,0 @@
<meta log-in permission="Minecraft-Possess-User" />
<div dyn-if="isset( $save_message )">
<div dyn-type="alert" eval-value="$save_message" eval-type="$save_success ? ALERT_SUCCESS : ALERT_DANGER"></div>
</div>
<table class="table">
<thead>
<tr>
<th eval-innerText="__( [ 'de' => 'Datum', 'en' => 'Date' ] )"></th>
<th style="width: 100%;" eval-innerText="__( [ 'de' => 'Kommentar', 'en' => 'Comment' ] )"></th>
<th eval-innerText="__( [ 'de' => 'Menge', 'en' => 'Amount' ] )"></th>
</tr>
</thead>
<tbody>
<tr dyn-for="[ 'credit', 'MinecraftUserAccount::GetAll( [ \'DebtorID\' => User::CURRENT()->ID ] )' ]">
<td eval-innerText="$credit->GetOccurence()"></td>
<td eval-innerText="$credit->GetComment()"></td>
<td style="text-align: right;" eval-innerText="$credit->GetMod() . '&nbsp;&euro;'"></td>
</tr>
</tbody>
</table>

+ 0
- 40
templates/AlterAccount.Template.php Wyświetl plik

@@ -1,40 +0,0 @@
<meta log-in permission="Minecraft-Pay-Settings" />
<div dyn-if="isset( $save_message )">
<div dyn-type="alert" eval-value="$save_message" eval-type="$save_success ? ALERT_SUCCESS : ALERT_DANGER"></div>
</div>
<form method="POST">
<table>
<thead>
<tr>
<th innerText="Minecraft Payment" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr>
<th eval-innerText="__([ 'de' => 'Benutzer', 'en' => 'User' ])"></th>
<td>
<select name="DebtorID">
<div dyn-for="[ 'user', 'User::GetAll()' ]"><option eval-value="$user->GetID()" eval-innerText="$user->GetUsername()"></option></div>
</select>
</td>
</tr>
<tr>
<th eval-innerText="__([ 'de' => 'Menge', 'en' => 'Amount' ])"></th>
<td>
<input type="number" step="0.01" name="Mod" value="0.00" />
</td>
</tr>
<tr>
<th eval-innerText="__([ 'de' => 'Kommentar', 'en' => 'Comment' ])"></th>
<td>
<input type="string" name="Comment" />
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="AddAccountChange" eval-value="__([ 'de' => 'Gutschreiben', 'en' => 'Credit' ])" />
</td>
</tr>
</tbody>
</table>
</form>

+ 0
- 28
templates/GrantUser.Template.php Wyświetl plik

@@ -1,28 +0,0 @@
<meta log-in permission="Minecraft-Pay-Settings" />
<div dyn-if="isset( $save_message )">
<div dyn-type="alert" eval-value="$save_message" eval-type="$save_success ? ALERT_SUCCESS : ALERT_DANGER"></div>
</div>
<form method="POST">
<table>
<thead>
<tr>
<th innerText="Minecraft Payment" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr>
<th eval-innerText="__([ 'de' => 'Benutzer', 'en' => 'User' ])"></th>
<td>
<select name="ID">
<div dyn-for="[ 'user', 'User::GetAll()' ]"><option eval-value="$user->GetID()" eval-innerText="$user->GetUsername()"></option></div>
</select>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="GrantUserRights" eval-value="__([ 'de' => 'Als Minecraft Nutzer eintragte', 'en' => 'Enter as Minecraft User' ])" />
</td>
</tr>
</tbody>
</table>
</form>

+ 0
- 38
templates/Users.Template.php Wyświetl plik

@@ -1,38 +0,0 @@
<meta log-in permission="Minecraft-Possess-User" />
<div dyn-if="isset( $save_message )">
<div dyn-type="alert" eval-value="$save_message" eval-type="$save_success ? ALERT_SUCCESS : ALERT_DANGER"></div>
</div>
<form method="POST">
<table class="table">
<thead>
<tr>
<th eval-innerText="$user->GetUsername()" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr>
<th colspan="2" eval-innerText="__([ 'de' => 'Server', 'en' => 'Server' ])"></th>
</tr>
<tr>
<td colspan="2">
<table class="table">
<tbody>
<tr dyn-for="[ 'server', 'MinecraftServer::GetAll()' ]">
<td style="vertical-align: middle; width: 100%" dyn-set="[ 'isUnlocked' => '$server->IsUnlocked( $user )' ]" eval-innerText="$server->GetName()"></td>
<td>
<form method="POST">
<input type="hidden" name="ID" eval-value="$server->GetID()" />
<input type="submit" dyn-if="!$isUnlocked" eval-name="( isset( $_POST[ 'UnlockUser' ] ) &amp;&amp; $_POST[ 'ID' ] == $server->GetID() ) ? 'RUnlockUser' : 'UnlockUser'"
eval-style="( isset( $_POST[ 'UnlockUser' ] ) &amp;&amp; $_POST[ 'ID' ] == $server->GetID() ) ? 'background-color: red' : ''"
eval-value="__( [ 'de' => 'Freischalten', 'en' => 'Unlock' ] ) . ' ~' . $server->GetPerMonthPrice() . ' &euro;'" />
</form>
</td>
<td><img style="height: 1em; filter: invert( 1 ); vertical-align: middle;" eval-src="HOME_URL . 'imgs/' . MinecraftPaymentPlugin::get_plugin_name() . '/' . ($isUnlocked ? 'unlock.svg' : 'lock.svg')" /></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</form>

+ 0
- 42
templates/UsersList.Template.php Wyświetl plik

@@ -1,42 +0,0 @@
<meta log-in permission="Minecraft-Possess-User" />
<div dyn-if="isset( $save_message )">
<div dyn-type="alert" eval-value="$save_message" eval-type="$save_success ? ALERT_SUCCESS : ALERT_DANGER"></div>
</div>
<form method="POST">
<table class="table">
<tbody>
<tr>
<td><input type="text" name="Username" eval-placeholder="__( [ 'de' => 'Benutzername', 'en' => 'Username' ] )" /></td>
<td><input type="submit" name="CreateMinecraftUser" eval-value="__( [ 'de' => 'Minecraft Benutzer hinzuf&uuml;gen', 'en' => 'Add Minecraft User' ] )" /></td>
</tr>
</tbody>
</table>
</form>
<hr />
<table class="table">
<thead>
<tr>
<th style="width: 100%;">Name</th>
<th colspan="2"></th>
</tr>
</thead>
<tbody>
<tr dyn-for="[ 'user', 'MinecraftUser::GetAll( [ \'OwnerID\' => User::CURRENT()->GetID() ] )' ]">
<td eval-innerText="$user->GetUsername()"></td>
<td>
<a style="cursor: pointer;" eval-href="HOME_URL . 'minecraft-pay/users/' . $user->GetID()">
<input style="cursor: pointer;" type="button" eval-value="__( [ 'de' => 'Bearbeiten', 'en' => 'Edit' ] )" />
</a>
</td>
<td>
<form method="POST">
<input type="hidden" name="ID" eval-value="$user->GetID()" />
<input type="submit" name="DeleteMinecraftUser" eval-value="__( [ 'de' => 'L&ouml;schen', 'en' => 'Delete' ] )" />
</form>
<a eval-href="">
</a>
</td>
</tr>
</tbody>
</table>

Ładowanie…
Anuluj
Zapisz