This commit is contained in:
James Cole
2020-08-05 07:15:28 +02:00
parent 6ecbaf554b
commit 8f22b97905
52 changed files with 964 additions and 751 deletions

View File

@@ -1,6 +1,6 @@
<!--
- AuthorizedClients.vue
- Copyright (c) 2019 james@firefly-iii.org
- Copyright (c) 2020 james@firefly-iii.org
-
- This file is part of Firefly III (https://github.com/firefly-iii).
-
@@ -18,119 +18,114 @@
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-->
<!-- TODO REMOVE ME -->
<style scoped>
.action-link {
cursor: pointer;
}
.m-b-none {
margin-bottom: 0;
}
.action-link {
cursor: pointer;
}
</style>
<template>
<div>
<div v-if="tokens.length > 0">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">
{{ $t('firefly.profile_authorized_apps') }}
</h3>
</div>
<div class="box-body">
<!-- Authorized Tokens -->
<table class="table table-borderless m-b-none">
<caption>{{ $t('firefly.profile_authorized_clients') }}</caption>
<thead>
<tr>
<th scope="col">{{ $t('firefly.name') }}</th>
<th scope="col">{{ $t('firefly.profile_scopes') }}</th>
<th scope="col"></th>
</tr>
</thead>
<div>
<div v-if="tokens.length > 0">
<div class="box box-default">
<div class="box-header">
<h3 class="box-title">
{{ $t('firefly.profile_authorized_apps') }}
</h3>
</div>
<tbody>
<tr v-for="token in tokens">
<!-- Client Name -->
<td style="vertical-align: middle;">
{{ token.client.name }}
</td>
<div class="box-body">
<!-- Authorized Tokens -->
<table class="table table-responsive table-borderless mb-0">
<thead>
<tr>
<th>{{ $t('firefly.name') }}</th>
<th>{{ $t('firefly.profile_scopes') }}</th>
<th></th>
</tr>
</thead>
<!-- Scopes -->
<td style="vertical-align: middle;">
<tbody>
<tr v-for="token in tokens">
<!-- Client Name -->
<td style="vertical-align: middle;">
{{ token.client.name }}
</td>
<!-- Scopes -->
<td style="vertical-align: middle;">
<span v-if="token.scopes.length > 0">
{{ token.scopes.join(', ') }}
</span>
</td>
</td>
<!-- Revoke Button -->
<td style="vertical-align: middle;">
<a class="action-link btn btn-danger btn-xs" @click="revoke(token)">
{{ $t('firefly.profile_revoke') }}
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Revoke Button -->
<td style="vertical-align: middle;">
<a class="action-link text-danger" @click="revoke(token)">
{{ $t('firefly.profile_revoke') }}
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
/*
* The component's data.
*/
data() {
return {
tokens: []
};
},
export default {
/*
* The component's data.
*/
data() {
return {
tokens: []
};
},
/**
* Prepare the component (Vue 1.x).
*/
ready() {
this.prepareComponent();
},
/**
* Prepare the component (Vue 1.x).
*/
ready() {
this.prepareComponent();
},
/**
* Prepare the component (Vue 2.x).
*/
mounted() {
this.prepareComponent();
},
/**
* Prepare the component (Vue 2.x).
*/
mounted() {
this.prepareComponent();
},
methods: {
/**
* Prepare the component (Vue 2.x).
*/
prepareComponent() {
this.getTokens();
},
methods: {
/**
* Prepare the component (Vue 2.x).
*/
prepareComponent() {
this.getTokens();
},
/**
* Get all of the authorized tokens for the user.
*/
getTokens() {
axios.get('./oauth/tokens')
.then(response => {
this.tokens = response.data;
});
},
/**
* Get all of the authorized tokens for the user.
*/
getTokens() {
axios.get('/oauth/tokens')
.then(response => {
this.tokens = response.data;
});
},
/**
* Revoke the given token.
*/
revoke(token) {
axios.delete('./oauth/tokens/' + token.id)
.then(response => {
this.getTokens();
});
}
}
/**
* Revoke the given token.
*/
revoke(token) {
axios.delete('/oauth/tokens/' + token.id)
.then(response => {
this.getTokens();
});
}
}
}
</script>

View File

@@ -18,358 +18,424 @@
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-->
<!-- TODO REMOVE ME -->
<style scoped>
.action-link {
cursor: pointer;
}
.m-b-none {
margin-bottom: 0;
}
.action-link {
cursor: pointer;
}
</style>
<template>
<div>
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">
{{ $t('firefly.profile_oauth_clients') }}
</h3>
</div>
<div>
<div class="box box-default">
<div class="box-header with-border">
<h3 class="box-title">
{{ $t('firefly.profile_oauth_clients') }}
</h3>
<a class="btn btn-default pull-right" tabindex="-1" @click="showCreateClientForm">
{{ $t('firefly.profile_oauth_create_new_client') }}
</a>
</div>
<div class="box-body">
<!-- Current Clients -->
<p class="mb-0" v-if="clients.length === 0">
{{ $t('firefly.profile_oauth_no_clients') }}
</p>
<div class="box-body">
<!-- Current Clients -->
<p class="m-b-none" v-if="clients.length === 0">
{{ $t('firefly.profile_oauth_no_clients') }}
</p>
<table class="table table-responsive table-borderless mb-0" v-if="clients.length > 0">
<caption>{{ $t('firefly.profile_oauth_clients_header') }}</caption>
<thead>
<tr>
<th>{{ $t('firefly.profile_oauth_client_id') }}</th>
<th>{{ $t('firefly.name') }}</th>
<th>{{ $t('firefly.profile_oauth_client_secret') }}</th>
<th></th>
<th></th>
</tr>
</thead>
<table class="table table-borderless m-b-none" v-if="clients.length > 0">
<caption>{{ $t('firefly.profile_oauth_clients_header') }}</caption>
<thead>
<tr>
<th scope="col">{{ $t('firefly.profile_oauth_client_id') }}</th>
<th scope="col">{{ $t('firefly.name') }}</th>
<th scope="col">{{ $t('firefly.profile_oauth_client_secret') }}</th>
<th scope="col"></th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
<tr v-for="client in clients">
<!-- ID -->
<td style="vertical-align: middle;">
{{ client.id }}
</td>
<tbody>
<tr v-for="client in clients">
<!-- ID -->
<td style="vertical-align: middle;">
{{ client.id }}
</td>
<!-- Name -->
<td style="vertical-align: middle;">
{{ client.name }}
</td>
<!-- Name -->
<td style="vertical-align: middle;">
{{ client.name }}
</td>
<!-- Secret -->
<td style="vertical-align: middle;">
<code>{{ client.secret ? client.secret : '-' }}</code>
</td>
<!-- Secret -->
<td style="vertical-align: middle;">
<code>{{ client.secret }}</code>
</td>
<!-- Edit Button -->
<td style="vertical-align: middle;">
<a class="action-link" tabindex="-1" @click="edit(client)">
{{ $t('firefly.edit') }}
</a>
</td>
<!-- Edit Button -->
<td style="vertical-align: middle;">
<a class="action-link btn btn-default btn-xs" @click="edit(client)">
{{ $t('firefly.edit') }}
</a>
</td>
<!-- Delete Button -->
<td style="vertical-align: middle;">
<a class="action-link btn btn-danger btn-xs" @click="destroy(client)">
{{ $t('firefly.delete') }}
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="box-footer">
<a class="action-link btn btn-success" @click="showCreateClientForm">
{{ $t('firefly.profile_oauth_create_new_client') }}
</a>
</div>
</div>
<!-- Create Client Modal -->
<div class="modal fade" id="modal-create-client" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">
{{ $t('firefly.profile_oauth_create_client') }}
</h4>
</div>
<div class="modal-body">
<!-- Form Errors -->
<div class="alert alert-danger" v-if="createForm.errors.length > 0">
<p><strong>{{ $t('firefly.profile_whoops') }}</strong> {{ $t('firefly.profile_something_wrong') }}</p>
<br>
<ul>
<li v-for="error in createForm.errors">
{{ error }}
</li>
</ul>
</div>
<!-- Create Client Form -->
<form class="form-horizontal" role="form">
<!-- Name -->
<div class="form-group">
<label class="col-md-3 control-label">{{ $t('firefly.name') }}</label>
<div class="col-md-7">
<input id="create-client-name" type="text" class="form-control"
@keyup.enter="store" v-model="createForm.name">
<span class="help-block">
{{ $t('firefly.profile_oauth_name_help') }}
</span>
</div>
</div>
<!-- Redirect URL -->
<div class="form-group">
<label class="col-md-3 control-label">{{ $t('firefly.profile_oauth_redirect_url') }}</label>
<div class="col-md-7">
<input type="text" class="form-control" name="redirect"
@keyup.enter="store" v-model="createForm.redirect">
<span class="help-block">
{{ $t('firefly.profile_oauth_redirect_url_help') }}
</span>
</div>
</div>
</form>
</div>
<!-- Modal Actions -->
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $t('firefly.close') }}</button>
<button type="button" class="btn btn-primary" @click="store">
{{ $t('firefly.profile_create') }}
</button>
</div>
</div>
</div>
</div>
<!-- Edit Client Modal -->
<div class="modal fade" id="modal-edit-client" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">
{{ $t('firefly.profile_oauth_edit_client') }}
</h4>
</div>
<div class="modal-body">
<!-- Form Errors -->
<div class="alert alert-danger" v-if="editForm.errors.length > 0">
<p><strong>{{ $t('firefly.profile_whoops') }}</strong> {{ $t('firefly.profile_something_wrong') }}</p>
<br>
<ul>
<li v-for="error in editForm.errors">
{{ error }}
</li>
</ul>
</div>
<!-- Edit Client Form -->
<form class="form-horizontal" role="form">
<!-- Name -->
<div class="form-group">
<label class="col-md-3 control-label">{{ $t('firefly.name') }}</label>
<div class="col-md-7">
<input id="edit-client-name" type="text" class="form-control"
@keyup.enter="update" v-model="editForm.name">
<span class="help-block">
{{ $t('firefly.profile_oauth_name_help') }}
</span>
</div>
</div>
<!-- Redirect URL -->
<div class="form-group">
<label class="col-md-3 control-label">{{ $t('firefly.profile_oauth_redirect_url') }}</label>
<div class="col-md-7">
<input type="text" class="form-control" name="redirect"
@keyup.enter="update" v-model="editForm.redirect">
<span class="help-block">
{{ $t('firefly.profile_oauth_redirect_url_help') }}
</span>
</div>
</div>
</form>
</div>
<!-- Modal Actions -->
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $t('firefly.close') }}</button>
<button type="button" class="btn btn-primary" @click="update">
{{ $t('firefly.profile_save_changes') }}
</button>
</div>
</div>
</div>
</div>
<!-- Delete Button -->
<td style="vertical-align: middle;">
<a class="action-link text-danger" @click="destroy(client)">
{{ $t('firefly.delete') }}
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="box-footer">
<a class="btn btn-default pull-right" tabindex="-1" @click="showCreateClientForm">
{{ $t('firefly.profile_oauth_create_new_client') }}
</a>
</div>
</div>
<!-- Create Client Modal -->
<div class="modal fade" id="modal-create-client" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
{{ $t('firefly.profile_oauth_create_client') }}
</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<!-- Form Errors -->
<div class="alert alert-danger" v-if="createForm.errors.length > 0">
<p class="mb-0"><strong>{{ $t('firefly.profile_whoops') }}</strong> {{
$t('firefly.profile_something_wrong')
}}</p>
<br>
<ul>
<li v-for="error in createForm.errors">
{{ error }}
</li>
</ul>
</div>
<!-- Create Client Form -->
<form role="form">
<!-- Name -->
<div class="form-group row">
<label class="col-md-3 col-form-label">{{ $t('firefly.name') }}</label>
<div class="col-md-9">
<input id="create-client-name" type="text" class="form-control"
@keyup.enter="store" v-model="createForm.name">
<span class="form-text text-muted">
{{ $t('firefly.profile_oauth_name_help') }}
</span>
</div>
</div>
<!-- Redirect URL -->
<div class="form-group row">
<label class="col-md-3 col-form-label">{{ $t('firefly.profile_oauth_redirect_url') }}</label>
<div class="col-md-9">
<input type="text" class="form-control" name="redirect"
@keyup.enter="store" v-model="createForm.redirect">
<span class="form-text text-muted">
{{ $t('firefly.profile_oauth_redirect_url_help') }}
</span>
</div>
</div>
<!-- Confidential -->
<div class="form-group row">
<label class="col-md-3 col-form-label">{{ $t('firefly.profile_oauth_confidential') }}</label>
<div class="col-md-9">
<div class="checkbox">
<label>
<input type="checkbox" v-model="createForm.confidential">
</label>
</div>
<span class="form-text text-muted">
{{ $t('firefly.profile_oauth_confidential_help') }}
</span>
</div>
</div>
</form>
</div>
<!-- Modal Actions -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ $t('firefly.close') }}</button>
<button type="button" class="btn btn-primary" @click="store">
{{ $t('firefly.profile_create') }}
</button>
</div>
</div>
</div>
</div>
<!-- Edit Client Modal -->
<div class="modal fade" id="modal-edit-client" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
{{ $t('firefly.profile_oauth_edit_client') }}
</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<!-- Form Errors -->
<div class="alert alert-danger" v-if="editForm.errors.length > 0">
<p class="mb-0"><strong>{{ $t('firefly.profile_whoops') }}</strong> {{
$t('firefly.profile_something_wrong')
}}</p>
<br>
<ul>
<li v-for="error in editForm.errors">
{{ error }}
</li>
</ul>
</div>
<!-- Edit Client Form -->
<form role="form">
<!-- Name -->
<div class="form-group row">
<label class="col-md-3 col-form-label">{{ $t('firefly.name') }}</label>
<div class="col-md-9">
<input id="edit-client-name" type="text" class="form-control"
@keyup.enter="update" v-model="editForm.name">
<span class="form-text text-muted">
{{ $t('firefly.profile_oauth_name_help') }}
</span>
</div>
</div>
<!-- Redirect URL -->
<div class="form-group row">
<label class="col-md-3 col-form-label">{{ $t('firefly.profile_oauth_redirect_url') }}</label>
<div class="col-md-9">
<input type="text" class="form-control" name="redirect"
@keyup.enter="update" v-model="editForm.redirect">
<span class="form-text text-muted">
{{ $t('firefly.profile_oauth_redirect_url_help') }}
</span>
</div>
</div>
</form>
</div>
<!-- Modal Actions -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ $t('firefly.close') }}</button>
<button type="button" class="btn btn-primary" @click="update">
{{ $t('firefly.profile_save_changes') }}
</button>
</div>
</div>
</div>
</div>
<!-- Client Secret Modal -->
<div class="modal fade" id="modal-client-secret" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
{{ $t('firefly.profile_oauth_client_secret_title') }}
</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<p>
{{ $t('firefly.profile_oauth_client_secret_expl') }}
</p>
<input type="text" class="form-control" v-model="clientSecret">
</div>
<!-- Modal Actions -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ $t('firefly.close') }}</button>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
/*
* The component's data.
*/
data() {
return {
clients: [],
export default {
/*
* The component's data.
*/
data() {
return {
clients: [],
createForm: {
errors: [],
name: '',
redirect: ''
},
clientSecret: null,
editForm: {
errors: [],
name: '',
redirect: ''
}
};
},
createForm: {
errors: [],
name: '',
redirect: '',
confidential: true
},
/**
* Prepare the component (Vue 1.x).
*/
ready() {
this.prepareComponent();
},
editForm: {
errors: [],
name: '',
redirect: ''
}
};
},
/**
* Prepare the component (Vue 2.x).
*/
mounted() {
this.prepareComponent();
},
/**
* Prepare the component (Vue 1.x).
*/
ready() {
this.prepareComponent();
},
methods: {
/**
* Prepare the component.
*/
prepareComponent() {
this.getClients();
/**
* Prepare the component (Vue 2.x).
*/
mounted() {
this.prepareComponent();
},
$('#modal-create-client').on('shown.bs.modal', () => {
$('#create-client-name').focus();
});
methods: {
/**
* Prepare the component.
*/
prepareComponent() {
this.getClients();
$('#modal-edit-client').on('shown.bs.modal', () => {
$('#edit-client-name').focus();
});
},
$('#modal-create-client').on('shown.bs.modal', () => {
$('#create-client-name').focus();
});
/**
* Get all of the OAuth clients for the user.
*/
getClients() {
axios.get('./oauth/clients')
.then(response => {
this.clients = response.data;
});
},
$('#modal-edit-client').on('shown.bs.modal', () => {
$('#edit-client-name').focus();
});
},
/**
* Show the form for creating new clients.
*/
showCreateClientForm() {
$('#modal-create-client').modal('show');
},
/**
* Get all of the OAuth clients for the user.
*/
getClients() {
axios.get('/oauth/clients')
.then(response => {
this.clients = response.data;
});
},
/**
* Create a new OAuth client for the user.
*/
store() {
this.persistClient(
'post', './oauth/clients' + '?_token=' + document.head.querySelector('meta[name="csrf-token"]').content,
this.createForm, '#modal-create-client'
);
},
/**
* Show the form for creating new clients.
*/
showCreateClientForm() {
$('#modal-create-client').modal('show');
},
/**
* Edit the given client.
*/
edit(client) {
this.editForm.id = client.id;
this.editForm.name = client.name;
this.editForm.redirect = client.redirect;
/**
* Create a new OAuth client for the user.
*/
store() {
this.persistClient(
'post',
'/oauth/clients',
this.createForm,
'#modal-create-client'
);
},
$('#modal-edit-client').modal('show');
},
/**
* Edit the given client.
*/
edit(client) {
this.editForm.id = client.id;
this.editForm.name = client.name;
this.editForm.redirect = client.redirect;
/**
* Update the client being edited.
*/
update() {
this.persistClient(
'put', './oauth/clients/' + this.editForm.id + '?_token=' + document.head.querySelector('meta[name="csrf-token"]').content,
this.editForm, '#modal-edit-client'
);
},
$('#modal-edit-client').modal('show');
},
/**
* Persist the client to storage using the given form.
*/
persistClient(method, uri, form, modal) {
form.errors = [];
/**
* Update the client being edited.
*/
update() {
this.persistClient(
'put',
'/oauth/clients/' + this.editForm.id,
this.editForm,
'#modal-edit-client'
);
},
axios[method](uri, form)
.then(response => {
this.getClients();
/**
* Persist the client to storage using the given form.
*/
persistClient(method, uri, form, modal) {
form.errors = [];
form.name = '';
form.redirect = '';
form.errors = [];
axios[method](uri, form)
.then(response => {
this.getClients();
$(modal).modal('hide');
})
.catch(error => {
if (typeof error.response.data === 'object') {
form.errors = _.flatten(_.toArray(error.response.data));
} else {
form.errors = [$t('firefly.profile_try_again')];
}
});
},
form.name = '';
form.redirect = '';
form.errors = [];
/**
* Destroy the given client.
*/
destroy(client) {
axios.delete('./oauth/clients/' + client.id)
.then(response => {
this.getClients();
});
$(modal).modal('hide');
if (response.data.plainSecret) {
this.showClientSecret(response.data.plainSecret);
}
}
})
.catch(error => {
if (typeof error.response.data === 'object') {
form.errors = _.flatten(_.toArray(error.response.data.errors));
} else {
form.errors = ['Something went wrong. Please try again.'];
}
});
},
/**
* Show the given client secret to the user.
*/
showClientSecret(clientSecret) {
this.clientSecret = clientSecret;
$('#modal-client-secret').modal('show');
},
/**
* Destroy the given client.
*/
destroy(client) {
axios.delete('/oauth/clients/' + client.id)
.then(response => {
this.getClients();
});
}
}
}
</script>

View File

@@ -19,301 +19,299 @@
-->
<style scoped>
.action-link {
cursor: pointer;
}
.m-b-none {
margin-bottom: 0;
}
.action-link {
cursor: pointer;
}
</style>
<template>
<div>
<div>
<div>
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">
{{ $t('firefly.profile_personal_access_tokens') }}
</h3>
</div>
<div class="box-body">
<!-- No Tokens Notice -->
<p class="m-b-none" v-if="tokens.length === 0">
{{ $t('firefly.profile_no_personal_access_token') }}
</p>
<div class="box box-default">
<div class="box-header">
<h3 class="box-title">{{ $t('firefly.profile_personal_access_tokens') }}</h3>
<a class="btn btn-default pull-right" tabindex="-1" @click="showCreateTokenForm">
{{ $t('firefly.profile_create_new_token') }}
</a>
</div>
<!-- Personal Access Tokens -->
<table class="table table-borderless m-b-none" v-if="tokens.length > 0">
<caption>{{ $t('firefly.profile_personal_access_tokens') }}</caption>
<thead>
<tr>
<th scope="col">{{ $t('firefly.name') }}</th>
<th scope="col"></th>
</tr>
</thead>
<div class="box-body">
<!-- No Tokens Notice -->
<p class="mb-0" v-if="tokens.length === 0">
{{ $t('firefly.profile_no_personal_access_token') }}
</p>
<tbody>
<tr v-for="token in tokens">
<!-- Client Name -->
<td style="vertical-align: middle;">
{{ token.name }}
</td>
<!-- Personal Access Tokens -->
<table class="table table-responsive table-borderless mb-0" v-if="tokens.length > 0">
<thead>
<tr>
<th>{{ $t('firefly.name') }}</th>
<th></th>
</tr>
</thead>
<!-- Delete Button -->
<td style="vertical-align: middle;">
<a class="action-link text-danger" @click="revoke(token)">
{{ $t('firefly.delete') }}
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="box-footer">
<a class="action-link btn btn-success" @click="showCreateTokenForm">
{{ $t('firefly.profile_create_new_token') }}
</a>
</div>
</div>
<tbody>
<tr v-for="token in tokens">
<!-- Client Name -->
<td style="vertical-align: middle;">
{{ token.name }}
</td>
<!-- Delete Button -->
<td style="vertical-align: middle;">
<a class="action-link text-danger" @click="revoke(token)">
{{ $t('firefly.delete') }}
</a>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Create Token Modal -->
<div class="modal fade" id="modal-create-token" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">
{{ $t('firefly.profile_create_token') }}
</h4>
</div>
<div class="modal-body">
<!-- Form Errors -->
<div class="alert alert-danger" v-if="form.errors.length > 0">
<p><strong>{{ $t('firefly.profile_whoops') }}</strong> {{ $t('firefly.profile_something_wrong') }}</p>
<br>
<ul>
<li v-for="error in form.errors">
{{ error }}
</li>
</ul>
</div>
<!-- Create Token Form -->
<form class="form-horizontal" role="form" @submit.prevent="store">
<!-- Name -->
<div class="form-group">
<label class="col-md-4 control-label">{{ $t('firefly.name') }}</label>
<div class="col-md-6">
<input id="create-token-name" type="text" class="form-control" name="name" v-model="form.name">
</div>
</div>
<!-- Scopes -->
<div class="form-group" v-if="scopes.length > 0">
<label class="col-md-4 control-label">{{ $t('firefly.profile_scopes') }}</label>
<div class="col-md-6">
<div v-for="scope in scopes">
<div class="checkbox">
<label>
<input type="checkbox"
@click="toggleScope(scope.id)"
:checked="scopeIsAssigned(scope.id)">
{{ scope.id }}
</label>
</div>
</div>
</div>
</div>
</form>
</div>
<!-- Modal Actions -->
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $t('firefly.close') }}</button>
<button type="button" class="btn btn-primary" @click="store">
{{ $t('firefly.profile_create') }}
</button>
</div>
</div>
</div>
</div>
<!-- Access Token Modal -->
<div class="modal fade" id="modal-access-token" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">
{{ $t('firefly.profile_personal_access_token') }}
</h4>
</div>
<div class="modal-body">
<p>
{{ $t('firefly.profile_personal_access_token_explanation') }}
</p>
<pre><textarea readonly id="tokenHidden" style="width:100%;" rows="20" class="form-control">{{ accessToken }}</textarea></pre>
</div>
<!-- Modal Actions -->
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $t('firefly.close') }}</button>
</div>
</div>
</div>
<div class="box-footer">
<a class="btn btn-default pull-right" tabindex="-1" @click="showCreateTokenForm">
{{ $t('firefly.profile_create_new_token') }}
</a>
</div>
</div>
</div>
<!-- Create Token Modal -->
<div class="modal fade" id="modal-create-token" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
{{ $t('firefly.profile_create_token') }}
</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<!-- Form Errors -->
<div class="alert alert-danger" v-if="form.errors.length > 0">
<p class="mb-0"><strong>{{ $t('firefly.profile_whoops') }}</strong> {{ $t('firefly.profile_something_wrong') }}</p>
<br>
<ul>
<li v-for="error in form.errors">
{{ error }}
</li>
</ul>
</div>
<!-- Create Token Form -->
<form role="form" @submit.prevent="store">
<!-- Name -->
<div class="form-group row">
<label class="col-md-4 col-form-label">{{ $t('firefly.name') }}</label>
<div class="col-md-6">
<input id="create-token-name" type="text" class="form-control" name="name" v-model="form.name">
</div>
</div>
<!-- Scopes -->
<div class="form-group row" v-if="scopes.length > 0">
<label class="col-md-4 col-form-label">{{ $t('firefly.profile_scopes') }}</label>
<div class="col-md-6">
<div v-for="scope in scopes">
<div class="checkbox">
<label>
<input type="checkbox"
@click="toggleScope(scope.id)"
:checked="scopeIsAssigned(scope.id)">
{{ scope.id }}
</label>
</div>
</div>
</div>
</div>
</form>
</div>
<!-- Modal Actions -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ $t('firefly.close') }}</button>
<button type="button" class="btn btn-primary" @click="store">
Create
</button>
</div>
</div>
</div>
</div>
<!-- Access Token Modal -->
<div class="modal fade" id="modal-access-token" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
{{ $t('firefly.profile_personal_access_token') }}
</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<p>
{{ $t('firefly.profile_personal_access_token_explanation') }}
</p>
<textarea readonly style="width:100%;" rows="20" class="form-control">{{ accessToken }}</textarea>
</div>
<!-- Modal Actions -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ $t('firefly.close') }}</button>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
/*
* The component's data.
*/
data() {
return {
accessToken: null,
export default {
/*
* The component's data.
*/
data() {
return {
accessToken: null,
tokens: [],
scopes: [],
tokens: [],
scopes: [],
form: {
name: '',
scopes: [],
errors: []
}
};
},
form: {
name: '',
scopes: [],
errors: []
}
};
},
/**
* Prepare the component (Vue 1.x).
*/
ready() {
this.prepareComponent();
},
/**
* Prepare the component (Vue 1.x).
*/
ready() {
this.prepareComponent();
},
/**
* Prepare the component (Vue 2.x).
*/
mounted() {
this.prepareComponent();
},
/**
* Prepare the component (Vue 2.x).
*/
mounted() {
this.prepareComponent();
},
methods: {
/**
* Prepare the component.
*/
prepareComponent() {
this.getTokens();
this.getScopes();
methods: {
/**
* Prepare the component.
*/
prepareComponent() {
this.getTokens();
this.getScopes();
$('#modal-create-token').on('shown.bs.modal', () => {
$('#create-token-name').focus();
});
},
$('#modal-create-token').on('shown.bs.modal', () => {
$('#create-token-name').focus();
});
},
/**
* Get all of the personal access tokens for the user.
*/
getTokens() {
axios.get('./oauth/personal-access-tokens')
.then(response => {
this.tokens = response.data;
});
},
/**
* Get all of the personal access tokens for the user.
*/
getTokens() {
axios.get('/oauth/personal-access-tokens')
.then(response => {
this.tokens = response.data;
});
},
/**
* Get all of the available scopes.
*/
getScopes() {
axios.get('./oauth/scopes')
.then(response => {
this.scopes = response.data;
});
},
/**
* Get all of the available scopes.
*/
getScopes() {
axios.get('/oauth/scopes')
.then(response => {
this.scopes = response.data;
});
},
/**
* Show the form for creating new tokens.
*/
showCreateTokenForm() {
$('#modal-create-token').modal('show');
},
/**
* Show the form for creating new tokens.
*/
showCreateTokenForm() {
$('#modal-create-token').modal('show');
},
/**
* Create a new personal access token.
*/
store() {
this.accessToken = null;
/**
* Create a new personal access token.
*/
store() {
this.accessToken = null;
this.form.errors = [];
this.form.errors = [];
axios.post('./oauth/personal-access-tokens?_token=' + document.head.querySelector('meta[name="csrf-token"]').content, this.form)
.then(response => {
this.form.name = '';
this.form.scopes = [];
this.form.errors = [];
axios.post('/oauth/personal-access-tokens', this.form)
.then(response => {
this.form.name = '';
this.form.scopes = [];
this.form.errors = [];
this.tokens.push(response.data.token);
this.tokens.push(response.data.token);
this.showAccessToken(response.data.accessToken);
})
.catch(error => {
if (typeof error.response.data === 'object') {
this.form.errors = _.flatten(_.toArray(error.response.data));
} else {
this.form.errors = [ $t('firefly.profile_try_again') ];
}
});
},
/**
* Toggle the given scope in the list of assigned scopes.
*/
toggleScope(scope) {
if (this.scopeIsAssigned(scope)) {
this.form.scopes = _.reject(this.form.scopes, s => s == scope);
} else {
this.form.scopes.push(scope);
}
},
/**
* Determine if the given scope has been assigned to the token.
*/
scopeIsAssigned(scope) {
return _.indexOf(this.form.scopes, scope) >= 0;
},
/**
* Show the given access token to the user.
*/
showAccessToken(accessToken) {
$('#modal-create-token').modal('hide');
this.accessToken = accessToken;
$('#modal-access-token').modal('show');
},
/**
* Revoke the given token.
*/
revoke(token) {
axios.delete('./oauth/personal-access-tokens/' + token.id)
.then(response => {
this.getTokens();
});
this.showAccessToken(response.data.accessToken);
})
.catch(error => {
if (typeof error.response.data === 'object') {
this.form.errors = _.flatten(_.toArray(error.response.data.errors));
} else {
this.form.errors = ['Something went wrong. Please try again.'];
}
}
});
},
/**
* Toggle the given scope in the list of assigned scopes.
*/
toggleScope(scope) {
if (this.scopeIsAssigned(scope)) {
this.form.scopes = _.reject(this.form.scopes, s => s == scope);
} else {
this.form.scopes.push(scope);
}
},
/**
* Determine if the given scope has been assigned to the token.
*/
scopeIsAssigned(scope) {
return _.indexOf(this.form.scopes, scope) >= 0;
},
/**
* Show the given access token to the user.
*/
showAccessToken(accessToken) {
$('#modal-create-token').modal('hide');
this.accessToken = accessToken;
$('#modal-access-token').modal('show');
},
/**
* Revoke the given token.
*/
revoke(token) {
axios.delete('/oauth/personal-access-tokens/' + token.id)
.then(response => {
this.getTokens();
});
}
}
}
</script>

View File

@@ -77,7 +77,11 @@
"profile_create": "Create",
"profile_save_changes": "Save changes",
"default_group_title_name": "(ungrouped)",
"piggy_bank": "Pokladni\u010dka"
"piggy_bank": "Pokladni\u010dka",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "\u00darokov\u00e9 datum",

View File

@@ -77,7 +77,11 @@
"profile_create": "Erstellen",
"profile_save_changes": "\u00c4nderungen speichern",
"default_group_title_name": "(ohne Gruppierung)",
"piggy_bank": "Sparschwein"
"piggy_bank": "Sparschwein",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Zinstermin",

View File

@@ -7,7 +7,7 @@
"split_transaction_title": "\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc",
"errors_submission": "\u03a5\u03c0\u03ae\u03c1\u03be\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf \u03bb\u03ac\u03b8\u03bf\u03c2 \u03bc\u03b5 \u03c4\u03b7\u03bd \u03c5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae \u03c3\u03b1\u03c2. \u0395\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03b1 \u03c0\u03b1\u03c1\u03b1\u03ba\u03ac\u03c4\u03c9 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03b1.",
"split": "\u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2",
"single_split": "Split",
"single_split": "\u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0397 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae #{ID} (\"{title}\")<\/a> \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03c4\u03b5\u03af.",
"transaction_updated_link": "<a href=\"transactions\/show\/{ID}\">\u0397 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae #{ID}<\/a> \u03ad\u03c7\u03b5\u03b9 \u03b5\u03bd\u03b7\u03bc\u03b5\u03c1\u03c9\u03b8\u03b5\u03af.",
"transaction_new_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0397 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae #{ID}<\/a> \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03c4\u03b5\u03af.",
@@ -26,7 +26,7 @@
"date": "\u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1",
"tags": "\u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b5\u03c2",
"no_budget": "(\u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03cc)",
"no_bill": "(no bill)",
"no_bill": "(\u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03ac\u03b3\u03b9\u03bf \u03ad\u03be\u03bf\u03b4\u03bf)",
"category": "\u039a\u03b1\u03c4\u03b7\u03b3\u03bf\u03c1\u03af\u03b1",
"attachments": "\u03a3\u03c5\u03bd\u03b7\u03bc\u03bc\u03ad\u03bd\u03b1",
"notes": "\u03a3\u03b7\u03bc\u03b5\u03b9\u03ce\u03c3\u03b5\u03b9\u03c2",
@@ -77,7 +77,11 @@
"profile_create": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1",
"profile_save_changes": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ce\u03bd",
"default_group_title_name": "(\u03c7\u03c9\u03c1\u03af\u03c2 \u03bf\u03bc\u03ac\u03b4\u03b1)",
"piggy_bank": "\u039a\u03bf\u03c5\u03bc\u03c0\u03b1\u03c1\u03ac\u03c2"
"piggy_bank": "\u039a\u03bf\u03c5\u03bc\u03c0\u03b1\u03c1\u03ac\u03c2",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "\u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u03c4\u03bf\u03ba\u03b9\u03c3\u03bc\u03bf\u03cd",

View File

@@ -77,7 +77,11 @@
"profile_create": "Create",
"profile_save_changes": "Save changes",
"default_group_title_name": "(ungrouped)",
"piggy_bank": "Piggy bank"
"piggy_bank": "Piggy bank",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Interest date",

View File

@@ -77,7 +77,11 @@
"profile_create": "Crear",
"profile_save_changes": "Guardar cambios",
"default_group_title_name": "(sin agrupaci\u00f3n)",
"piggy_bank": "Alcanc\u00eda"
"piggy_bank": "Alcanc\u00eda",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Fecha de inter\u00e9s",

View File

@@ -77,7 +77,11 @@
"profile_create": "Luo",
"profile_save_changes": "Tallenna muutokset",
"default_group_title_name": "(ryhmittelem\u00e4tt\u00f6m\u00e4t)",
"piggy_bank": "S\u00e4\u00e4st\u00f6possu"
"piggy_bank": "S\u00e4\u00e4st\u00f6possu",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Korkop\u00e4iv\u00e4",

View File

@@ -77,7 +77,11 @@
"profile_create": "Cr\u00e9er",
"profile_save_changes": "Enregistrer les modifications",
"default_group_title_name": "(Sans groupement)",
"piggy_bank": "Tirelire"
"piggy_bank": "Tirelire",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Date de valeur (int\u00e9r\u00eats)",

View File

@@ -77,7 +77,11 @@
"profile_create": "Create",
"profile_save_changes": "Save changes",
"default_group_title_name": "(ungrouped)",
"piggy_bank": "Malacpersely"
"piggy_bank": "Malacpersely",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Kamatfizet\u00e9si id\u0151pont",

View File

@@ -77,7 +77,11 @@
"profile_create": "Create",
"profile_save_changes": "Save changes",
"default_group_title_name": "(ungrouped)",
"piggy_bank": "Celengan"
"piggy_bank": "Celengan",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Tanggal bunga",

View File

@@ -77,7 +77,11 @@
"profile_create": "Crea",
"profile_save_changes": "Salva modifiche",
"default_group_title_name": "(non in un gruppo)",
"piggy_bank": "Salvadanaio"
"piggy_bank": "Salvadanaio",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Data interesse",

View File

@@ -77,7 +77,11 @@
"profile_create": "Create",
"profile_save_changes": "Save changes",
"default_group_title_name": "(ungrouped)",
"piggy_bank": "Sparegris"
"piggy_bank": "Sparegris",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Rentedato",

View File

@@ -77,7 +77,11 @@
"profile_create": "Cre\u00ebr",
"profile_save_changes": "Aanpassingen opslaan",
"default_group_title_name": "(ongegroepeerd)",
"piggy_bank": "Spaarpotje"
"piggy_bank": "Spaarpotje",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Rentedatum",

View File

@@ -7,13 +7,13 @@
"split_transaction_title": "Opis podzielonej transakcji",
"errors_submission": "Co\u015b posz\u0142o nie tak w czasie zapisu. Prosz\u0119 sprawd\u017a b\u0142\u0119dy poni\u017cej.",
"split": "Podziel",
"single_split": "Split",
"single_split": "Podzia\u0142",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transakcja #{ID} (\"{title}\")<\/a> zosta\u0142a zapisana.",
"transaction_updated_link": "<a href=\"transactions\/show\/{ID}\">Transakcja #{ID}<\/a> zosta\u0142a zaktualizowana.",
"transaction_new_stored_link": "<a href=\"transactions\/show\/{ID}\">Transakcja #{ID}<\/a> zosta\u0142a zapisana.",
"transaction_journal_information": "Informacje o transakcji",
"no_budget_pointer": "Wygl\u0105da na to \u017ce nie masz jeszcze bud\u017cet\u00f3w. Powiniene\u015b utworzy\u0107 kilka na stronie <a href=\"\/budgets\">bud\u017cety<\/a>. Bud\u017cety mog\u0105 Ci pom\u00f3c \u015bledzi\u0107 wydatki.",
"no_bill_pointer": "You seem to have no bills yet. You should create some on the <a href=\"\/bills\">bills<\/a>-page. Bills can help you keep track of expenses.",
"no_bill_pointer": "Wygl\u0105da na to \u017ce nie masz jeszcze rachunk\u00f3w. Powiniene\u015b utworzy\u0107 kilka na stronie <a href=\"\/bills\">rachunk\u00f3w<\/a>. Rachunki mog\u0105 Ci pom\u00f3c \u015bledzi\u0107 wydatki.",
"source_account": "Konto \u017ar\u00f3d\u0142owe",
"hidden_fields_preferences": "Mo\u017cesz w\u0142\u0105czy\u0107 wi\u0119cej opcji transakcji w swoich <a href=\"\/preferences\">ustawieniach<\/a>.",
"destination_account": "Konto docelowe",
@@ -26,7 +26,7 @@
"date": "Data",
"tags": "Tagi",
"no_budget": "(brak bud\u017cetu)",
"no_bill": "(no bill)",
"no_bill": "(brak rachunku)",
"category": "Kategoria",
"attachments": "Za\u0142\u0105czniki",
"notes": "Notatki",
@@ -77,7 +77,11 @@
"profile_create": "Utw\u00f3rz",
"profile_save_changes": "Zapisz zmiany",
"default_group_title_name": "(bez grupy)",
"piggy_bank": "Skarbonka"
"piggy_bank": "Skarbonka",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Data odsetek",

View File

@@ -77,7 +77,11 @@
"profile_create": "Criar",
"profile_save_changes": "Salvar altera\u00e7\u00f5es",
"default_group_title_name": "(n\u00e3o agrupado)",
"piggy_bank": "Cofrinho"
"piggy_bank": "Cofrinho",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Data de interesse",

View File

@@ -77,7 +77,11 @@
"profile_create": "Creaz\u0103",
"profile_save_changes": "Salveaz\u0103 modific\u0103rile",
"default_group_title_name": "(ungrouped)",
"piggy_bank": "Pu\u0219culi\u021b\u0103"
"piggy_bank": "Pu\u0219culi\u021b\u0103",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Data de interes",

View File

@@ -77,7 +77,11 @@
"profile_create": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c",
"profile_save_changes": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f",
"default_group_title_name": "(\u0431\u0435\u0437 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438)",
"piggy_bank": "\u041a\u043e\u043f\u0438\u043b\u043a\u0430"
"piggy_bank": "\u041a\u043e\u043f\u0438\u043b\u043a\u0430",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "\u0414\u0430\u0442\u0430 \u0432\u044b\u043f\u043b\u0430\u0442\u044b",

View File

@@ -77,7 +77,11 @@
"profile_create": "Skapa",
"profile_save_changes": "Spara \u00e4ndringar",
"default_group_title_name": "(ungrouped)",
"piggy_bank": "Spargris"
"piggy_bank": "Spargris",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "R\u00e4ntedatum",

View File

@@ -77,7 +77,11 @@
"profile_create": "Create",
"profile_save_changes": "Save changes",
"default_group_title_name": "(ungrouped)",
"piggy_bank": "Kumbara"
"piggy_bank": "Kumbara",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Faiz tarihi",

View File

@@ -77,7 +77,11 @@
"profile_create": "T\u1ea1o",
"profile_save_changes": "L\u01b0u thay \u0111\u1ed5i",
"default_group_title_name": "(ch\u01b0a nh\u00f3m)",
"piggy_bank": "Heo \u0111\u1ea5t"
"piggy_bank": "Heo \u0111\u1ea5t",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "Ng\u00e0y l\u00e3i",

View File

@@ -77,7 +77,11 @@
"profile_create": "Create",
"profile_save_changes": "Save changes",
"default_group_title_name": "(ungrouped)",
"piggy_bank": "\u5b58\u94b1\u7f50"
"piggy_bank": "\u5b58\u94b1\u7f50",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "\u5229\u7387\u65e5\u671f",

View File

@@ -77,7 +77,11 @@
"profile_create": "Create",
"profile_save_changes": "Save changes",
"default_group_title_name": "(ungrouped)",
"piggy_bank": "\u5c0f\u8c6c\u64b2\u6eff"
"piggy_bank": "\u5c0f\u8c6c\u64b2\u6eff",
"profile_oauth_client_secret_title": "Client Secret",
"profile_oauth_client_secret_expl": "Here is your new client secret. This is the only time it will be shown so don't lose it! You may now use this secret to make API requests.",
"profile_oauth_confidential": "Confidential",
"profile_oauth_confidential_help": "Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely."
},
"form": {
"interest_date": "\u5229\u7387\u65e5\u671f",