Compare commits

..

19 Commits

Author SHA1 Message Date
github-actions
5bf4df9ad8 Auto commit for release 'develop' on 2024-05-06 2024-05-06 05:10:30 +02:00
James Cole
07db6b59ce Fix webhooks overview. 2024-05-02 06:15:41 +02:00
github-actions
e16f1cf4ee Auto commit for release 'develop' on 2024-05-02 2024-05-02 05:10:23 +02:00
James Cole
4c80d929ca Possible division by zero? 2024-05-01 06:29:28 +02:00
github-actions
16364d9859 Auto commit for release 'develop' on 2024-04-30 2024-04-30 20:33:00 +02:00
James Cole
c24f6acb2c Fix styles 2024-04-30 20:26:05 +02:00
James Cole
4bd19e0627 Expand and fix sort columns 2024-04-30 20:22:31 +02:00
James Cole
69d839997a Fix sorting and order for account lists. 2024-04-29 20:20:11 +02:00
github-actions
c02c027f4f Auto commit for release 'develop' on 2024-04-29 2024-04-29 06:36:36 +02:00
James Cole
b14606625e Upload corrected file 2024-04-29 06:31:18 +02:00
James Cole
222d7b56c7 Merge pull request #8835 from firefly-iii/dependabot/npm_and_yarn/develop/chartjs-chart-sankey-0.12.1 2024-04-29 06:07:17 +02:00
James Cole
b7f7bf42b2 Merge pull request #8834 from firefly-iii/dependabot/composer/develop/ramsey/uuid-4.7.6 2024-04-29 06:07:09 +02:00
dependabot[bot]
0cbd64d31a Bump chartjs-chart-sankey from 0.12.0 to 0.12.1
Bumps [chartjs-chart-sankey](https://github.com/kurkle/chartjs-chart-sankey) from 0.12.0 to 0.12.1.
- [Release notes](https://github.com/kurkle/chartjs-chart-sankey/releases)
- [Commits](https://github.com/kurkle/chartjs-chart-sankey/compare/v0.12.0...v0.12.1)

---
updated-dependencies:
- dependency-name: chartjs-chart-sankey
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-29 03:55:28 +00:00
dependabot[bot]
60bdae47c4 Bump ramsey/uuid from 4.7.5 to 4.7.6
Bumps [ramsey/uuid](https://github.com/ramsey/uuid) from 4.7.5 to 4.7.6.
- [Release notes](https://github.com/ramsey/uuid/releases)
- [Changelog](https://github.com/ramsey/uuid/blob/4.x/CHANGELOG.md)
- [Commits](https://github.com/ramsey/uuid/compare/4.7.5...4.7.6)

---
updated-dependencies:
- dependency-name: ramsey/uuid
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-29 03:34:37 +00:00
James Cole
ca4b38d905 Add debug thing for tables. 2024-04-28 20:20:18 +02:00
James Cole
3674465f53 Translate stuff 2024-04-28 14:43:23 +02:00
James Cole
b951d4130c Allow account grouping 2024-04-28 14:40:22 +02:00
James Cole
7992b810fd Expand view with several new options. Move cache to api endpoints. 2024-04-28 13:30:42 +02:00
James Cole
c1c0afa40b Expand account index overview. 2024-04-28 09:54:28 +02:00
209 changed files with 2718 additions and 1183 deletions

View File

@@ -226,16 +226,16 @@
},
{
"name": "friendsofphp/php-cs-fixer",
"version": "v3.54.0",
"version": "v3.55.0",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08"
"reference": "c9eeacb559bfa0bcc7f778cfb7b42715c83d2c7e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2aecbc8640d7906c38777b3dcab6f4ca79004d08",
"reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/c9eeacb559bfa0bcc7f778cfb7b42715c83d2c7e",
"reference": "c9eeacb559bfa0bcc7f778cfb7b42715c83d2c7e",
"shasum": ""
},
"require": {
@@ -307,7 +307,7 @@
],
"support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.54.0"
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.55.0"
},
"funding": [
{
@@ -315,7 +315,7 @@
"type": "github"
}
],
"time": "2024-04-17T08:12:13+00:00"
"time": "2024-05-06T00:10:15+00:00"
},
{
"name": "psr/container",
@@ -539,16 +539,16 @@
},
{
"name": "symfony/console",
"version": "v7.0.6",
"version": "v7.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5"
"reference": "c981e0e9380ce9f146416bde3150c79197ce9986"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/fde915cd8e7eb99b3d531d3d5c09531429c3f9e5",
"reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5",
"url": "https://api.github.com/repos/symfony/console/zipball/c981e0e9380ce9f146416bde3150c79197ce9986",
"reference": "c981e0e9380ce9f146416bde3150c79197ce9986",
"shasum": ""
},
"require": {
@@ -612,7 +612,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v7.0.6"
"source": "https://github.com/symfony/console/tree/v7.0.7"
},
"funding": [
{
@@ -628,20 +628,20 @@
"type": "tidelift"
}
],
"time": "2024-04-01T11:04:53+00:00"
"time": "2024-04-18T09:29:19+00:00"
},
{
"name": "symfony/deprecation-contracts",
"version": "v3.4.0",
"version": "v3.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"shasum": ""
},
"require": {
@@ -650,7 +650,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.4-dev"
"dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -679,7 +679,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
},
"funding": [
{
@@ -695,20 +695,20 @@
"type": "tidelift"
}
],
"time": "2023-05-23T14:45:45+00:00"
"time": "2024-04-18T09:32:20+00:00"
},
{
"name": "symfony/event-dispatcher",
"version": "v7.0.3",
"version": "v7.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "834c28d533dd0636f910909d01b9ff45cc094b5e"
"reference": "db2a7fab994d67d92356bb39c367db115d9d30f9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/834c28d533dd0636f910909d01b9ff45cc094b5e",
"reference": "834c28d533dd0636f910909d01b9ff45cc094b5e",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db2a7fab994d67d92356bb39c367db115d9d30f9",
"reference": "db2a7fab994d67d92356bb39c367db115d9d30f9",
"shasum": ""
},
"require": {
@@ -759,7 +759,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v7.0.3"
"source": "https://github.com/symfony/event-dispatcher/tree/v7.0.7"
},
"funding": [
{
@@ -775,20 +775,20 @@
"type": "tidelift"
}
],
"time": "2024-01-23T15:02:46+00:00"
"time": "2024-04-18T09:29:19+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v3.4.2",
"version": "v3.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "4e64b49bf370ade88e567de29465762e316e4224"
"reference": "8f93aec25d41b72493c6ddff14e916177c9efc50"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224",
"reference": "4e64b49bf370ade88e567de29465762e316e4224",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50",
"reference": "8f93aec25d41b72493c6ddff14e916177c9efc50",
"shasum": ""
},
"require": {
@@ -798,7 +798,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.4-dev"
"dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -835,7 +835,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2"
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0"
},
"funding": [
{
@@ -851,26 +851,27 @@
"type": "tidelift"
}
],
"time": "2024-01-23T14:51:35+00:00"
"time": "2024-04-18T09:32:20+00:00"
},
{
"name": "symfony/filesystem",
"version": "v7.0.6",
"version": "v7.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "408105dff4c104454100730bdfd1a9cdd993f04d"
"reference": "cc168be6fbdcdf3401f50ae863ee3818ed4338f5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/408105dff4c104454100730bdfd1a9cdd993f04d",
"reference": "408105dff4c104454100730bdfd1a9cdd993f04d",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/cc168be6fbdcdf3401f50ae863ee3818ed4338f5",
"reference": "cc168be6fbdcdf3401f50ae863ee3818ed4338f5",
"shasum": ""
},
"require": {
"php": ">=8.2",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8"
"symfony/polyfill-mbstring": "~1.8",
"symfony/process": "^6.4|^7.0"
},
"type": "library",
"autoload": {
@@ -898,7 +899,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v7.0.6"
"source": "https://github.com/symfony/filesystem/tree/v7.0.7"
},
"funding": [
{
@@ -914,20 +915,20 @@
"type": "tidelift"
}
],
"time": "2024-03-21T19:37:36+00:00"
"time": "2024-04-18T09:29:19+00:00"
},
{
"name": "symfony/finder",
"version": "v7.0.0",
"version": "v7.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56"
"reference": "4d58f0f4fe95a30d7b538d71197135483560b97c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/6e5688d69f7cfc4ed4a511e96007e06c2d34ce56",
"reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56",
"url": "https://api.github.com/repos/symfony/finder/zipball/4d58f0f4fe95a30d7b538d71197135483560b97c",
"reference": "4d58f0f4fe95a30d7b538d71197135483560b97c",
"shasum": ""
},
"require": {
@@ -962,7 +963,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/finder/tree/v7.0.0"
"source": "https://github.com/symfony/finder/tree/v7.0.7"
},
"funding": [
{
@@ -978,20 +979,20 @@
"type": "tidelift"
}
],
"time": "2023-10-31T17:59:56+00:00"
"time": "2024-04-28T11:44:19+00:00"
},
{
"name": "symfony/options-resolver",
"version": "v7.0.0",
"version": "v7.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
"reference": "700ff4096e346f54cb628ea650767c8130f1001f"
"reference": "23cc173858776ad451e31f053b1c9f47840b2cfa"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/700ff4096e346f54cb628ea650767c8130f1001f",
"reference": "700ff4096e346f54cb628ea650767c8130f1001f",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/23cc173858776ad451e31f053b1c9f47840b2cfa",
"reference": "23cc173858776ad451e31f053b1c9f47840b2cfa",
"shasum": ""
},
"require": {
@@ -1029,7 +1030,7 @@
"options"
],
"support": {
"source": "https://github.com/symfony/options-resolver/tree/v7.0.0"
"source": "https://github.com/symfony/options-resolver/tree/v7.0.7"
},
"funding": [
{
@@ -1045,7 +1046,7 @@
"type": "tidelift"
}
],
"time": "2023-08-08T10:20:21+00:00"
"time": "2024-04-18T09:29:19+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -1523,16 +1524,16 @@
},
{
"name": "symfony/process",
"version": "v7.0.4",
"version": "v7.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9"
"reference": "3839e56b94dd1dbd13235d27504e66baf23faba0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/0e7727191c3b71ebec6d529fa0e50a01ca5679e9",
"reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9",
"url": "https://api.github.com/repos/symfony/process/zipball/3839e56b94dd1dbd13235d27504e66baf23faba0",
"reference": "3839e56b94dd1dbd13235d27504e66baf23faba0",
"shasum": ""
},
"require": {
@@ -1564,7 +1565,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v7.0.4"
"source": "https://github.com/symfony/process/tree/v7.0.7"
},
"funding": [
{
@@ -1580,25 +1581,26 @@
"type": "tidelift"
}
],
"time": "2024-02-22T20:27:20+00:00"
"time": "2024-04-18T09:29:19+00:00"
},
{
"name": "symfony/service-contracts",
"version": "v3.4.2",
"version": "v3.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "11bbf19a0fb7b36345861e85c5768844c552906e"
"reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e",
"reference": "11bbf19a0fb7b36345861e85c5768844c552906e",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
"reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
"shasum": ""
},
"require": {
"php": ">=8.1",
"psr/container": "^1.1|^2.0"
"psr/container": "^1.1|^2.0",
"symfony/deprecation-contracts": "^2.5|^3"
},
"conflict": {
"ext-psr": "<1.1|>=2"
@@ -1606,7 +1608,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.4-dev"
"dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -1646,7 +1648,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v3.4.2"
"source": "https://github.com/symfony/service-contracts/tree/v3.5.0"
},
"funding": [
{
@@ -1662,20 +1664,20 @@
"type": "tidelift"
}
],
"time": "2023-12-19T21:51:00+00:00"
"time": "2024-04-18T09:32:20+00:00"
},
{
"name": "symfony/stopwatch",
"version": "v7.0.3",
"version": "v7.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
"reference": "983900d6fddf2b0cbaacacbbad07610854bd8112"
"reference": "41a7a24aa1dc82adf46a06bc292d1923acfe6b84"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/983900d6fddf2b0cbaacacbbad07610854bd8112",
"reference": "983900d6fddf2b0cbaacacbbad07610854bd8112",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/41a7a24aa1dc82adf46a06bc292d1923acfe6b84",
"reference": "41a7a24aa1dc82adf46a06bc292d1923acfe6b84",
"shasum": ""
},
"require": {
@@ -1708,7 +1710,7 @@
"description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/stopwatch/tree/v7.0.3"
"source": "https://github.com/symfony/stopwatch/tree/v7.0.7"
},
"funding": [
{
@@ -1724,20 +1726,20 @@
"type": "tidelift"
}
],
"time": "2024-01-23T15:02:46+00:00"
"time": "2024-04-18T09:29:19+00:00"
},
{
"name": "symfony/string",
"version": "v7.0.4",
"version": "v7.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "f5832521b998b0bec40bee688ad5de98d4cf111b"
"reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b",
"reference": "f5832521b998b0bec40bee688ad5de98d4cf111b",
"url": "https://api.github.com/repos/symfony/string/zipball/e405b5424dc2528e02e31ba26b83a79fd4eb8f63",
"reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63",
"shasum": ""
},
"require": {
@@ -1794,7 +1796,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v7.0.4"
"source": "https://github.com/symfony/string/tree/v7.0.7"
},
"funding": [
{
@@ -1810,7 +1812,7 @@
"type": "tidelift"
}
],
"time": "2024-02-01T13:17:36+00:00"
"time": "2024-04-18T09:29:19+00:00"
}
],
"packages-dev": [],

View File

@@ -188,8 +188,6 @@ Please find below all the people who contributed to the Firefly III code. Their
## 2014
- Stewart Malik
- Graham Campbell
- Sander Dorigo
- James Cole
Thank you for all your support!

View File

@@ -157,6 +157,9 @@ class Controller extends BaseController
{
$manager = new Manager();
$baseUrl = request()->getSchemeAndHttpHost().'/api/v2';
// TODO add stuff to path?
$manager->setSerializer(new JsonApiSerializer($baseUrl));
$objects = $paginator->getCollection();

View File

@@ -57,21 +57,34 @@ class IndexController extends Controller
}
/**
* TODO the sort instructions need proper repeatable documentation.
* TODO see autocomplete/account controller for list.
*/
public function index(IndexRequest $request): JsonResponse
{
$this->repository->resetAccountOrder();
$types = $request->getAccountTypes();
$instructions = $request->getSortInstructions('accounts');
$accounts = $this->repository->getAccountsByType($types, $instructions);
$pageSize = $this->parameters->get('limit');
$count = $accounts->count();
$accounts = $accounts->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page'));
$transformer = new AccountTransformer();
$types = $request->getAccountTypes();
$sorting = $request->getSortInstructions('accounts');
$filters = $request->getFilterInstructions('accounts');
$accounts = $this->repository->getAccountsByType($types, $sorting, $filters);
$pageSize = $this->parameters->get('limit');
$count = $accounts->count();
$this->parameters->set('sort', $instructions);
// depending on the sort parameters, this list must not be split, because the
// order is calculated in the account transformer and by that time it's too late.
$first = array_key_first($sorting);
$disablePagination = in_array($first, ['last_activity', 'balance', 'balance_difference'], true);
if (!$disablePagination) {
$accounts = $accounts->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
}
$paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page'));
$transformer = new AccountTransformer();
$this->parameters->set('disablePagination', $disablePagination);
$this->parameters->set('pageSize', $pageSize);
$this->parameters->set('sort', $sorting);
$this->parameters->set('filters', $filters);
$transformer->setParameters($this->parameters); // give params to transformer
return response()

View File

@@ -27,6 +27,7 @@ use Carbon\Carbon;
use FireflyIII\Support\Http\Api\AccountFilter;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\Support\Request\GetFilterInstructions;
use FireflyIII\Support\Request\GetSortInstructions;
use Illuminate\Foundation\Http\FormRequest;
@@ -40,6 +41,7 @@ class IndexRequest extends FormRequest
use AccountFilter;
use ChecksLogin;
use ConvertsDataTypes;
use GetFilterInstructions;
use GetSortInstructions;
public function getAccountTypes(): array

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Repositories\UserGroups\Account;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\ObjectGroup;
use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Services\Internal\Update\AccountUpdateService;
@@ -240,7 +241,7 @@ class AccountRepository implements AccountRepositoryInterface
}
}
public function getAccountsByType(array $types, ?array $sort = []): Collection
public function getAccountsByType(array $types, ?array $sort = [], ?array $filters = []): Collection
{
$sortable = ['name', 'active']; // TODO yes this is a duplicate array.
$res = array_intersect([AccountType::ASSET, AccountType::MORTGAGE, AccountType::LOAN, AccountType::DEBT], $types);
@@ -249,6 +250,22 @@ class AccountRepository implements AccountRepositoryInterface
$query->accountTypeIn($types);
}
// process filters
// TODO this should be repeatable, it feels like a hack when you do it here.
// TODO some fields cannot be filtered using the query, and a second filter must be applied on the collection.
foreach ($filters as $column => $value) {
// filter on NULL values
if (null === $value) {
continue;
}
if ('active' === $column) {
$query->where('accounts.active', $value);
}
if ('name' === $column) {
$query->where('accounts.name', 'LIKE', sprintf('%%%s%%', $value));
}
}
// add sort parameters. At this point they're filtered to allowed fields to sort by:
$hasActiveColumn = array_key_exists('active', $sort);
if (count($sort) > 0) {
@@ -337,4 +354,34 @@ class AccountRepository implements AccountRepositoryInterface
->get(['transactions.account_id', DB::raw('MAX(transaction_journals.date) as date_max')])->toArray() // @phpstan-ignore-line
;
}
#[\Override]
public function getObjectGroups(Collection $accounts): array
{
$groupIds = [];
$return = [];
$set = DB::table('object_groupables')->where('object_groupable_type', Account::class)
->whereIn('object_groupable_id', $accounts->pluck('id')->toArray())->get()
;
/** @var \stdClass $row */
foreach ($set as $row) {
$groupIds[] = $row->object_group_id;
}
$groupIds = array_unique($groupIds);
$groups = ObjectGroup::whereIn('id', $groupIds)->get();
/** @var \stdClass $row */
foreach ($set as $row) {
if (!array_key_exists($row->object_groupable_id, $return)) {
/** @var null|ObjectGroup $group */
$group = $groups->firstWhere('id', '=', $row->object_group_id);
if (null !== $group) {
$return[$row->object_groupable_id] = ['title' => $group->title, 'order' => $group->order, 'id' => $group->id];
}
}
}
return $return;
}
}

View File

@@ -55,7 +55,7 @@ interface AccountRepositoryInterface
public function getAccountsById(array $accountIds): Collection;
public function getAccountsByType(array $types, ?array $sort = []): Collection;
public function getAccountsByType(array $types, ?array $sort = [], ?array $filters = []): Collection;
/**
* Used in the infinite accounts list.
@@ -69,6 +69,8 @@ interface AccountRepositoryInterface
*/
public function getMetaValue(Account $account, string $field): ?string;
public function getObjectGroups(Collection $accounts): array;
public function getUserGroup(): UserGroup;
/**

View File

@@ -0,0 +1,77 @@
<?php
/*
* GetFilterInstructions.php
* Copyright (c) 2024 james@firefly-iii.org.
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Request;
trait GetFilterInstructions
{
private const string INVALID_FILTER = '%INVALID_JAMES_%';
final public function getFilterInstructions(string $key): array
{
$config = config(sprintf('firefly.filters.allowed.%s', $key));
$allowed = array_keys($config);
$set = $this->get('filters', []);
$result = [];
if (0 === count($set)) {
return [];
}
foreach ($set as $info) {
$column = $info['column'] ?? 'NOPE';
$filterValue = (string) ($info['filter'] ?? self::INVALID_FILTER);
if (false === in_array($column, $allowed, true)) {
// skip invalid column
continue;
}
$filterType = $config[$column] ?? false;
switch ($filterType) {
default:
exit(sprintf('Do not support filter type "%s"', $filterType));
case 'boolean':
$filterValue = $this->booleanInstruction($filterValue);
break;
case 'string':
break;
}
$result[$column] = $filterValue;
}
return $result;
}
public function booleanInstruction(string $filterValue): ?bool
{
if ('true' === $filterValue) {
return true;
}
if ('false' === $filterValue) {
return false;
}
return null;
}
}

View File

@@ -41,11 +41,13 @@ class AccountTransformer extends AbstractTransformer
{
private array $accountMeta;
private array $accountTypes;
private array $fullTypes;
private array $balanceDifferences;
private array $convertedBalances;
private array $currencies;
private TransactionCurrency $default;
private array $lastActivity;
private array $objectGroups;
/**
* This method collects meta-data for one or all accounts in the transformer's collection.
@@ -55,10 +57,16 @@ class AccountTransformer extends AbstractTransformer
$this->currencies = [];
$this->accountMeta = [];
$this->accountTypes = [];
$this->fullTypes = [];
$this->lastActivity = [];
$this->objectGroups = [];
$this->convertedBalances = [];
$this->balanceDifferences = [];
// first collect all the "heavy" stuff that relies on ALL data to be present.
// get last activity:
$this->getLastActivity($objects);
// get balances of all accounts
$this->getMetaBalances($objects);
@@ -71,15 +79,25 @@ class AccountTransformer extends AbstractTransformer
// get account types:
$this->collectAccountTypes($objects);
// get last activity:
$this->getLastActivity($objects);
// TODO add balance difference
// add balance difference
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$this->getBalanceDifference($objects, $this->parameters->get('start'), $this->parameters->get('end'));
}
return $this->sortAccounts($objects);
// get object groups
$this->getObjectGroups($objects);
// sort:
$objects = $this->sortAccounts($objects);
// if pagination is disabled, do it now:
if (true === $this->parameters->get('disablePagination')) {
$page = (int) $this->parameters->get('page');
$size = (int) $this->parameters->get('pageSize');
$objects = $objects->slice(($page - 1) * $size, $size);
}
return $objects;
}
private function getDate(): Carbon
@@ -97,32 +115,44 @@ class AccountTransformer extends AbstractTransformer
*/
public function transform(Account $account): array
{
$id = $account->id;
$id = $account->id;
// various meta
$accountRole = $this->accountMeta[$id]['account_role'] ?? null;
$accountType = $this->accountTypes[$id];
$order = $account->order;
$accountRole = $this->accountMeta[$id]['account_role'] ?? null;
$accountType = $this->accountTypes[$id];
$order = $account->order;
// liability type
$liabilityType = 'liabilities' === $accountType ? $this->fullTypes[$id] : null;
$liabilityDirection = $this->accountMeta[$id]['liability_direction'] ?? null;
$interest = $this->accountMeta[$id]['interest'] ?? null;
$interestPeriod = $this->accountMeta[$id]['interest_period'] ?? null;
$currentDebt = $this->accountMeta[$id]['current_debt'] ?? null;
// no currency? use default
$currency = $this->default;
$currency = $this->default;
if (array_key_exists($id, $this->accountMeta) && 0 !== (int) ($this->accountMeta[$id]['currency_id'] ?? 0)) {
$currency = $this->currencies[(int) $this->accountMeta[$id]['currency_id']];
}
// amounts and calculation.
$balance = $this->balances[$id]['balance'] ?? null;
$nativeBalance = $this->convertedBalances[$id]['native_balance'] ?? null;
$balance = $this->balances[$id]['balance'] ?? null;
$nativeBalance = $this->convertedBalances[$id]['native_balance'] ?? null;
// no order for some accounts:
if (!in_array(strtolower($accountType), ['liability', 'liabilities', 'asset'], true)) {
$order = null;
}
// object group
$objectGroupId = $this->objectGroups[$id]['id'] ?? null;
$objectGroupOrder = $this->objectGroups[$id]['order'] ?? null;
$objectGroupTitle = $this->objectGroups[$id]['title'] ?? null;
// balance difference
$diffStart = null;
$diffEnd = null;
$balanceDiff = null;
$nativeBalanceDiff = null;
$diffStart = null;
$diffEnd = null;
$balanceDiff = null;
$nativeBalanceDiff = null;
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$diffStart = $this->parameters->get('start')->toAtomString();
$diffEnd = $this->parameters->get('end')->toAtomString();
@@ -165,19 +195,25 @@ class AccountTransformer extends AbstractTransformer
// more meta
'last_activity' => array_key_exists($id, $this->lastActivity) ? $this->lastActivity[$id]->toAtomString() : null,
// liability stuff
'liability_type' => $liabilityType,
'liability_direction' => $liabilityDirection,
'interest' => $interest,
'interest_period' => $interestPeriod,
'current_debt' => $currentDebt,
// object group
'object_group_id' => null !== $objectGroupId ? (string) $objectGroupId : null,
'object_group_order' => $objectGroupOrder,
'object_group_title' => $objectGroupTitle,
// 'notes' => $this->repository->getNoteText($account),
// 'monthly_payment_date' => $monthlyPaymentDate,
// 'credit_card_type' => $creditCardType,
// 'account_number' => $this->repository->getMetaValue($account, 'account_number'),
// 'bic' => $this->repository->getMetaValue($account, 'BIC'),
// 'virtual_balance' => number_format((float) $account->virtual_balance, $decimalPlaces, '.', ''),
// 'opening_balance' => $openingBalance,
// 'opening_balance_date' => $openingBalanceDate,
// 'liability_type' => $liabilityType,
// 'liability_direction' => $liabilityDirection,
// 'interest' => $interest,
// 'interest_period' => $interestPeriod,
// 'current_debt' => $this->repository->getMetaValue($account, 'current_debt'),
// 'include_net_worth' => $includeNetWorth,
// 'longitude' => $longitude,
// 'latitude' => $latitude,
@@ -212,7 +248,7 @@ class AccountTransformer extends AbstractTransformer
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
$metaFields = $accountRepository->getMetaValues($accounts, ['currency_id', 'account_role', 'account_number']);
$metaFields = $accountRepository->getMetaValues($accounts, ['currency_id', 'account_role', 'account_number', 'liability_direction', 'interest', 'interest_period', 'current_debt']);
$currencyIds = $metaFields->where('name', 'currency_id')->pluck('data')->toArray();
$currencies = $repository->getByIds($currencyIds);
@@ -235,6 +271,7 @@ class AccountTransformer extends AbstractTransformer
/** @var AccountType $row */
foreach ($accountTypes as $row) {
$this->accountTypes[$row->id] = (string) config(sprintf('firefly.shortNamesByFullName.%s', $row->type));
$this->fullTypes[$row->id] = $row->type;
}
}
@@ -275,6 +312,9 @@ class AccountTransformer extends AbstractTransformer
if ('balance_difference' === $column) {
$accounts = $this->sortByBalanceDifference($accounts, $direction);
}
if ('current_debt' === $column) {
$accounts = $this->sortByCurrentDebt($accounts, $direction);
}
}
return $accounts;
@@ -365,4 +405,26 @@ class AccountTransformer extends AbstractTransformer
return $rightBalance <=> $leftBalance;
});
}
private function sortByCurrentDebt(Collection $accounts, string $direction): Collection
{
$amounts = $this->accountMeta;
return $accounts->sort(function (Account $left, Account $right) use ($amounts, $direction) {
$leftCurrent = (float) ($amounts[$left->id]['current_debt'] ?? 0);
$rightCurrent = (float) ($amounts[$right->id]['current_debt'] ?? 0);
if ('asc' === $direction) {
return $leftCurrent <=> $rightCurrent;
}
return $rightCurrent <=> $leftCurrent;
});
}
private function getObjectGroups(Collection $accounts): void
{
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
$this->objectGroups = $accountRepository->getObjectGroups($accounts);
}
}

482
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -117,7 +117,7 @@ return [
'expression_engine' => false,
// see cer.php for exchange rates feature flag.
],
'version' => 'develop/2024-04-26',
'version' => 'develop/2024-05-06',
'api_version' => '2.0.14',
'db_version' => 24,
@@ -920,11 +920,25 @@ return [
// preselected account lists possibilities:
'preselected_accounts' => ['all', 'assets', 'liabilities'],
// allowed sort columns for API's
// allowed filters (search) for APIs
'filters' => [
'allowed' => [
'accounts' => [
'name' => 'string',
'active' => 'boolean',
'iban' => 'iban',
'balance' => 'numeric',
'last_activity' => 'date',
'balance_difference' => 'numeric',
],
],
],
// allowed sort columns for APIs
'sorting' => [
'allowed' => [
'transactions' => ['description', 'amount'],
'accounts' => ['name', 'active', 'iban', 'balance', 'last_activity', 'balance_difference'],
'accounts' => ['name', 'active', 'iban', 'balance', 'last_activity', 'balance_difference', 'current_debt'],
],
],
];

View File

@@ -52,6 +52,15 @@ return [
'bad_type_destination',
],
'firefly' => [
'liability_direction_debit_short',
'liability_direction_credit_short',
'interest_calc_yearly',
'interest_calc_',
'interest_calc_daily',
'interest_calc_monthly',
'interest_calc_weekly',
'interest_calc_half-year',
'interest_calc_quarterly',
'spent',
'administration_owner',
'administration_you',

586
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "\u0414\u044a\u043b\u0436\u0430 \u0434\u044a\u043b\u0433",
"liability_direction_credit_short": "\u0414\u044a\u043b\u0436\u044a\u0442 \u043c\u0438 \u0434\u044a\u043b\u0433",
"interest_calc_yearly": "\u0413\u043e\u0434\u0438\u0448\u043d\u043e",
"interest_calc_": "\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430",
"interest_calc_daily": "\u041d\u0430 \u0434\u0435\u043d",
"interest_calc_monthly": "\u041d\u0430 \u043c\u0435\u0441\u0435\u0446",
"interest_calc_weekly": "\u0421\u0435\u0434\u043c\u0438\u0447\u043d\u043e",
"interest_calc_half-year": "\u0417\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d \u0433\u043e\u0434\u0438\u043d\u0430",
"interest_calc_quarterly": "\u0417\u0430 \u0442\u0440\u0438\u043c\u0435\u0441\u0435\u0447\u0438\u0435",
"spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "\u0414\u044a\u043b\u0436\u0430 \u0434\u044a\u043b\u0433",
"liability_direction_credit_short": "\u0414\u044a\u043b\u0436\u044a\u0442 \u043c\u0438 \u0434\u044a\u043b\u0433",
"interest_calc_yearly": "\u0413\u043e\u0434\u0438\u0448\u043d\u043e",
"interest_calc_": "\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430",
"interest_calc_daily": "\u041d\u0430 \u0434\u0435\u043d",
"interest_calc_monthly": "\u041d\u0430 \u043c\u0435\u0441\u0435\u0446",
"interest_calc_weekly": "\u0421\u0435\u0434\u043c\u0438\u0447\u043d\u043e",
"interest_calc_half-year": "\u0417\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d \u0433\u043e\u0434\u0438\u043d\u0430",
"interest_calc_quarterly": "\u0417\u0430 \u0442\u0440\u0438\u043c\u0435\u0441\u0435\u0447\u0438\u0435",
"spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -10,23 +10,32 @@
"title": "T\u00edtol"
},
"list": {
"drag_and_drop": "Drag and drop",
"drag_and_drop": "Arrossega i deixa anar",
"active": "Est\u00e0 actiu?",
"name": "Nom",
"type": "Tipus",
"number": "Account number",
"number": "N\u00famero de compte",
"liability_type": "Tipus de passiu",
"current_balance": "Current balance",
"last_activity": "Last activity",
"amount_due": "Amount due",
"balance_difference": "Balance difference",
"menu": "Menu"
"current_balance": "Balan\u00e7 actual",
"last_activity": "Darrera activitat",
"amount_due": "Import pendent",
"balance_difference": "Difer\u00e8ncia de saldo",
"menu": "Men\u00fa"
},
"validation": {
"bad_type_source": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte font.",
"bad_type_destination": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte de dest\u00ed."
},
"firefly": {
"liability_direction_debit_short": "Ho dec",
"liability_direction_credit_short": "Se'm deu",
"interest_calc_yearly": "Per any",
"interest_calc_": "desconegut",
"interest_calc_daily": "Per dia",
"interest_calc_monthly": "Per mes",
"interest_calc_weekly": "Per setmana",
"interest_calc_half-year": "Cada mig any",
"interest_calc_quarterly": "Per quadrimestre",
"spent": "Gastat",
"administration_owner": "Propietari de l'administraci\u00f3: {{email}}",
"administration_you": "El teu rol: {{role}}",

View File

@@ -10,23 +10,32 @@
"title": "T\u00edtol"
},
"list": {
"drag_and_drop": "Drag and drop",
"drag_and_drop": "Arrossega i deixa anar",
"active": "Est\u00e0 actiu?",
"name": "Nom",
"type": "Tipus",
"number": "Account number",
"number": "N\u00famero de compte",
"liability_type": "Tipus de passiu",
"current_balance": "Current balance",
"last_activity": "Last activity",
"amount_due": "Amount due",
"balance_difference": "Balance difference",
"menu": "Menu"
"current_balance": "Balan\u00e7 actual",
"last_activity": "Darrera activitat",
"amount_due": "Import pendent",
"balance_difference": "Difer\u00e8ncia de saldo",
"menu": "Men\u00fa"
},
"validation": {
"bad_type_source": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte font.",
"bad_type_destination": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte de dest\u00ed."
},
"firefly": {
"liability_direction_debit_short": "Ho dec",
"liability_direction_credit_short": "Se'm deu",
"interest_calc_yearly": "Per any",
"interest_calc_": "desconegut",
"interest_calc_daily": "Per dia",
"interest_calc_monthly": "Per mes",
"interest_calc_weekly": "Per setmana",
"interest_calc_half-year": "Cada mig any",
"interest_calc_quarterly": "Per quadrimestre",
"spent": "Gastat",
"administration_owner": "Propietari de l'administraci\u00f3: {{email}}",
"administration_you": "El teu rol: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Za rok",
"interest_calc_": "nezn\u00e1m\u00e9",
"interest_calc_daily": "Za den",
"interest_calc_monthly": "Za m\u011bs\u00edc",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Utraceno",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Za rok",
"interest_calc_": "nezn\u00e1m\u00e9",
"interest_calc_daily": "Za den",
"interest_calc_monthly": "Za m\u011bs\u00edc",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Utraceno",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III kan ikke bestemme transaktionstypen baseret p\u00e5 denne destinationskonto."
},
"firefly": {
"liability_direction_debit_short": "Ejer denne g\u00e6ld",
"liability_direction_credit_short": "Ejer denne g\u00e6ld",
"interest_calc_yearly": "Pr. \u00e5r",
"interest_calc_": "ukendt",
"interest_calc_daily": "Pr. dag",
"interest_calc_monthly": "Pr. m\u00e5ned",
"interest_calc_weekly": "Pr. uge",
"interest_calc_half-year": "Hvert halve \u00e5r",
"interest_calc_quarterly": "Pr. kvartal",
"spent": "Spent",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III kan ikke bestemme transaktionstypen baseret p\u00e5 denne destinationskonto."
},
"firefly": {
"liability_direction_debit_short": "Ejer denne g\u00e6ld",
"liability_direction_credit_short": "Ejer denne g\u00e6ld",
"interest_calc_yearly": "Pr. \u00e5r",
"interest_calc_": "ukendt",
"interest_calc_daily": "Pr. dag",
"interest_calc_monthly": "Pr. m\u00e5ned",
"interest_calc_weekly": "Pr. uge",
"interest_calc_half-year": "Hvert halve \u00e5r",
"interest_calc_quarterly": "Pr. kvartal",
"spent": "Spent",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III kann die Buchungsart anhand dieses Zielkontos nicht ermitteln."
},
"firefly": {
"liability_direction_debit_short": "Schuldiger Betrag",
"liability_direction_credit_short": "Geschuldeter Betrag",
"interest_calc_yearly": "J\u00e4hrlich",
"interest_calc_": "Unbekannt",
"interest_calc_daily": "T\u00e4glich",
"interest_calc_monthly": "Monatlich",
"interest_calc_weekly": "Pro Woche",
"interest_calc_half-year": "Halbj\u00e4hrlich",
"interest_calc_quarterly": "Viertelj\u00e4hrlich",
"spent": "Ausgegeben",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Ihre Funktion: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III kann die Buchungsart anhand dieses Zielkontos nicht ermitteln."
},
"firefly": {
"liability_direction_debit_short": "Schuldiger Betrag",
"liability_direction_credit_short": "Geschuldeter Betrag",
"interest_calc_yearly": "J\u00e4hrlich",
"interest_calc_": "Unbekannt",
"interest_calc_daily": "T\u00e4glich",
"interest_calc_monthly": "Monatlich",
"interest_calc_weekly": "Pro Woche",
"interest_calc_half-year": "Halbj\u00e4hrlich",
"interest_calc_quarterly": "Viertelj\u00e4hrlich",
"spent": "Ausgegeben",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Ihre Funktion: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "\u03a4\u03bf Firefly III \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd."
},
"firefly": {
"liability_direction_debit_short": "\u039f\u03c6\u03b5\u03af\u03bb\u03c9 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03c1\u03ad\u03bf\u03c2",
"liability_direction_credit_short": "\u039c\u03bf\u03c5 \u03bf\u03c6\u03b5\u03af\u03bb\u03bf\u03c5\u03bd \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03c1\u03ad\u03bf\u03c2",
"interest_calc_yearly": "\u0391\u03bd\u03ac \u03ad\u03c4\u03bf\u03c2",
"interest_calc_": "\u03ac\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf",
"interest_calc_daily": "\u0391\u03bd\u03ac \u03b7\u03bc\u03ad\u03c1\u03b1",
"interest_calc_monthly": "\u0391\u03bd\u03ac \u03bc\u03ae\u03bd\u03b1",
"interest_calc_weekly": "\u0391\u03bd\u03ac \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1",
"interest_calc_half-year": "\u0391\u03bd\u03ac \u03b5\u03be\u03ac\u03bc\u03b7\u03bd\u03bf",
"interest_calc_quarterly": "\u0391\u03bd\u03ac \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf",
"spent": "\u0394\u03b1\u03c0\u03b1\u03bd\u03ae\u03b8\u03b7\u03ba\u03b1\u03bd",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "\u03a4\u03bf Firefly III \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd."
},
"firefly": {
"liability_direction_debit_short": "\u039f\u03c6\u03b5\u03af\u03bb\u03c9 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03c1\u03ad\u03bf\u03c2",
"liability_direction_credit_short": "\u039c\u03bf\u03c5 \u03bf\u03c6\u03b5\u03af\u03bb\u03bf\u03c5\u03bd \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c7\u03c1\u03ad\u03bf\u03c2",
"interest_calc_yearly": "\u0391\u03bd\u03ac \u03ad\u03c4\u03bf\u03c2",
"interest_calc_": "\u03ac\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf",
"interest_calc_daily": "\u0391\u03bd\u03ac \u03b7\u03bc\u03ad\u03c1\u03b1",
"interest_calc_monthly": "\u0391\u03bd\u03ac \u03bc\u03ae\u03bd\u03b1",
"interest_calc_weekly": "\u0391\u03bd\u03ac \u03b5\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1",
"interest_calc_half-year": "\u0391\u03bd\u03ac \u03b5\u03be\u03ac\u03bc\u03b7\u03bd\u03bf",
"interest_calc_quarterly": "\u0391\u03bd\u03ac \u03c4\u03c1\u03af\u03bc\u03b7\u03bd\u03bf",
"spent": "\u0394\u03b1\u03c0\u03b1\u03bd\u03ae\u03b8\u03b7\u03ba\u03b1\u03bd",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Per year",
"interest_calc_": "unknown",
"interest_calc_daily": "Per day",
"interest_calc_monthly": "Per month",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Spent",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Per year",
"interest_calc_": "unknown",
"interest_calc_daily": "Per day",
"interest_calc_monthly": "Per month",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Spent",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Per year",
"interest_calc_": "unknown",
"interest_calc_daily": "Per day",
"interest_calc_monthly": "Per month",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Spent",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Per year",
"interest_calc_": "unknown",
"interest_calc_daily": "Per day",
"interest_calc_monthly": "Per month",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Spent",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III no puede determinar el tipo de transacci\u00f3n basado en esta cuenta de destino."
},
"firefly": {
"liability_direction_debit_short": "Tiene esta deuda",
"liability_direction_credit_short": "Ten\u00eda esta deuda",
"interest_calc_yearly": "Por a\u00f1o",
"interest_calc_": "desconocido",
"interest_calc_daily": "Por dia",
"interest_calc_monthly": "Por mes",
"interest_calc_weekly": "Por semana",
"interest_calc_half-year": "Por semestre",
"interest_calc_quarterly": "Por trimestre",
"spent": "Gastado",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III no puede determinar el tipo de transacci\u00f3n basado en esta cuenta de destino."
},
"firefly": {
"liability_direction_debit_short": "Tiene esta deuda",
"liability_direction_credit_short": "Ten\u00eda esta deuda",
"interest_calc_yearly": "Por a\u00f1o",
"interest_calc_": "desconocido",
"interest_calc_daily": "Por dia",
"interest_calc_monthly": "Por mes",
"interest_calc_weekly": "Por semana",
"interest_calc_half-year": "Por semestre",
"interest_calc_quarterly": "Por trimestre",
"spent": "Gastado",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Olen velkaa",
"liability_direction_credit_short": "Minulle ollaan velkaa",
"interest_calc_yearly": "Vuodessa",
"interest_calc_": "tuntematon",
"interest_calc_daily": "P\u00e4iv\u00e4ss\u00e4",
"interest_calc_monthly": "Kuukaudessa",
"interest_calc_weekly": "Viikossa",
"interest_calc_half-year": "Puolessa vuodessa",
"interest_calc_quarterly": "Nelj\u00e4nnest\u00e4 kohden",
"spent": "K\u00e4ytetty",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Olen velkaa",
"liability_direction_credit_short": "Minulle ollaan velkaa",
"interest_calc_yearly": "Vuodessa",
"interest_calc_": "tuntematon",
"interest_calc_daily": "P\u00e4iv\u00e4ss\u00e4",
"interest_calc_monthly": "Kuukaudessa",
"interest_calc_weekly": "Viikossa",
"interest_calc_half-year": "Puolessa vuodessa",
"interest_calc_quarterly": "Nelj\u00e4nnest\u00e4 kohden",
"spent": "K\u00e4ytetty",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III ne peut pas d\u00e9terminer le type de transaction bas\u00e9 sur ce compte de destination."
},
"firefly": {
"liability_direction_debit_short": "Pr\u00eateur",
"liability_direction_credit_short": "Emprunteur",
"interest_calc_yearly": "Par an",
"interest_calc_": "inconnu",
"interest_calc_daily": "Par jour",
"interest_calc_monthly": "Par mois",
"interest_calc_weekly": "Par semaine",
"interest_calc_half-year": "Par semestre",
"interest_calc_quarterly": "Par trimestre",
"spent": "D\u00e9pens\u00e9",
"administration_owner": "Propri\u00e9taire de l'administration : {{email}}",
"administration_you": "Votre r\u00f4le : {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III ne peut pas d\u00e9terminer le type de transaction bas\u00e9 sur ce compte de destination."
},
"firefly": {
"liability_direction_debit_short": "Pr\u00eateur",
"liability_direction_credit_short": "Emprunteur",
"interest_calc_yearly": "Par an",
"interest_calc_": "inconnu",
"interest_calc_daily": "Par jour",
"interest_calc_monthly": "Par mois",
"interest_calc_weekly": "Par semaine",
"interest_calc_half-year": "Par semestre",
"interest_calc_quarterly": "Par trimestre",
"spent": "D\u00e9pens\u00e9",
"administration_owner": "Propri\u00e9taire de l'administration : {{email}}",
"administration_you": "Votre r\u00f4le : {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "A Firefly III nem tudja eld\u00f6nteni a tranzakci\u00f3 t\u00edpus\u00e1t a c\u00e9lsz\u00e1mla alapj\u00e1n."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "\u00c9vente",
"interest_calc_": "ismeretlen",
"interest_calc_daily": "Naponta",
"interest_calc_monthly": "Havonta",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Elk\u00f6lt\u00f6tt",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "A Firefly III nem tudja eld\u00f6nteni a tranzakci\u00f3 t\u00edpus\u00e1t a c\u00e9lsz\u00e1mla alapj\u00e1n."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "\u00c9vente",
"interest_calc_": "ismeretlen",
"interest_calc_daily": "Naponta",
"interest_calc_monthly": "Havonta",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Elk\u00f6lt\u00f6tt",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Per year",
"interest_calc_": "unknown",
"interest_calc_daily": "Per day",
"interest_calc_monthly": "Per month",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Menghabiskan",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Per year",
"interest_calc_": "unknown",
"interest_calc_daily": "Per day",
"interest_calc_monthly": "Per month",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Menghabiskan",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III non pu\u00f2 determinare il tipo di transazione in base a questo account di destinazione."
},
"firefly": {
"liability_direction_debit_short": "Devo questo debito",
"liability_direction_credit_short": "Mi devono questo debito",
"interest_calc_yearly": "All'anno",
"interest_calc_": "sconosciuto",
"interest_calc_daily": "Al giorno",
"interest_calc_monthly": "Al mese",
"interest_calc_weekly": "Settimanale",
"interest_calc_half-year": "Semestrale",
"interest_calc_quarterly": "Trimestrale",
"spent": "Speso",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III non pu\u00f2 determinare il tipo di transazione in base a questo account di destinazione."
},
"firefly": {
"liability_direction_debit_short": "Devo questo debito",
"liability_direction_credit_short": "Mi devono questo debito",
"interest_calc_yearly": "All'anno",
"interest_calc_": "sconosciuto",
"interest_calc_daily": "Al giorno",
"interest_calc_monthly": "Al mese",
"interest_calc_weekly": "Settimanale",
"interest_calc_half-year": "Semestrale",
"interest_calc_quarterly": "Trimestrale",
"spent": "Speso",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "\u3053\u306e\u8ca0\u50b5\u3092\u8ca0\u3046",
"liability_direction_credit_short": "\u3053\u306e\u8ca0\u50b5\u3092\u8ca0\u3063\u3066\u3044\u308b",
"interest_calc_yearly": "1\u5e74\u3042\u305f\u308a",
"interest_calc_": "\u4e0d\u660e",
"interest_calc_daily": "1\u65e5\u3042\u305f\u308a",
"interest_calc_monthly": "1\u30f6\u6708\u3042\u305f\u308a",
"interest_calc_weekly": "1\u9031\u3042\u305f\u308a",
"interest_calc_half-year": "\u534a\u5e74\u3042\u305f\u308a",
"interest_calc_quarterly": "\u56db\u534a\u671f\u3042\u305f\u308a",
"spent": "\u652f\u51fa",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "\u3053\u306e\u8ca0\u50b5\u3092\u8ca0\u3046",
"liability_direction_credit_short": "\u3053\u306e\u8ca0\u50b5\u3092\u8ca0\u3063\u3066\u3044\u308b",
"interest_calc_yearly": "1\u5e74\u3042\u305f\u308a",
"interest_calc_": "\u4e0d\u660e",
"interest_calc_daily": "1\u65e5\u3042\u305f\u308a",
"interest_calc_monthly": "1\u30f6\u6708\u3042\u305f\u308a",
"interest_calc_weekly": "1\u9031\u3042\u305f\u308a",
"interest_calc_half-year": "\u534a\u5e74\u3042\u305f\u308a",
"interest_calc_quarterly": "\u56db\u534a\u671f\u3042\u305f\u308a",
"spent": "\u652f\u51fa",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "\uc774 \ube5a\uc744 \uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4",
"liability_direction_credit_short": "\uc774 \ube5a\uc744 \uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4",
"interest_calc_yearly": "\uc5f0\uac04",
"interest_calc_": "\uc54c \uc218 \uc5c6\uc74c",
"interest_calc_daily": "\uc77c\ubcc4",
"interest_calc_monthly": "\uc6d4\ubcc4",
"interest_calc_weekly": "\uc8fc\ub2f9",
"interest_calc_half-year": "\ubc18\uae30\ub2f9",
"interest_calc_quarterly": "\ubd84\uae30\ub2f9",
"spent": "\uc9c0\ucd9c",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "\uc774 \ube5a\uc744 \uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4",
"liability_direction_credit_short": "\uc774 \ube5a\uc744 \uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4",
"interest_calc_yearly": "\uc5f0\uac04",
"interest_calc_": "\uc54c \uc218 \uc5c6\uc74c",
"interest_calc_daily": "\uc77c\ubcc4",
"interest_calc_monthly": "\uc6d4\ubcc4",
"interest_calc_weekly": "\uc8fc\ub2f9",
"interest_calc_half-year": "\ubc18\uae30\ub2f9",
"interest_calc_quarterly": "\ubd84\uae30\ub2f9",
"spent": "\uc9c0\ucd9c",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Skylder denne gjelden",
"liability_direction_credit_short": "Jeg skuldet denne gjelden",
"interest_calc_yearly": "Per \u00e5r",
"interest_calc_": "ukjent",
"interest_calc_daily": "Per dag",
"interest_calc_monthly": "Per m\u00e5ned",
"interest_calc_weekly": "Per uke",
"interest_calc_half-year": "Per halv\u00e5r",
"interest_calc_quarterly": "Per kvartal",
"spent": "Brukt",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Skylder denne gjelden",
"liability_direction_credit_short": "Jeg skuldet denne gjelden",
"interest_calc_yearly": "Per \u00e5r",
"interest_calc_": "ukjent",
"interest_calc_daily": "Per dag",
"interest_calc_monthly": "Per m\u00e5ned",
"interest_calc_weekly": "Per uke",
"interest_calc_half-year": "Per halv\u00e5r",
"interest_calc_quarterly": "Per kvartal",
"spent": "Brukt",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III kan het transactietype niet bepalen op basis van deze doelrekening."
},
"firefly": {
"liability_direction_debit_short": "Schuldenaar",
"liability_direction_credit_short": "Schuldeiser",
"interest_calc_yearly": "Per jaar",
"interest_calc_": "onbekend",
"interest_calc_daily": "Per dag",
"interest_calc_monthly": "Per maand",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half jaar",
"interest_calc_quarterly": "Per kwartaal",
"spent": "Uitgegeven",
"administration_owner": "Grootboekeigenaar: {{email}}",
"administration_you": "Jouw rol: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III kan het transactietype niet bepalen op basis van deze doelrekening."
},
"firefly": {
"liability_direction_debit_short": "Schuldenaar",
"liability_direction_credit_short": "Schuldeiser",
"interest_calc_yearly": "Per jaar",
"interest_calc_": "onbekend",
"interest_calc_daily": "Per dag",
"interest_calc_monthly": "Per maand",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half jaar",
"interest_calc_quarterly": "Per kwartaal",
"spent": "Uitgegeven",
"administration_owner": "Grootboekeigenaar: {{email}}",
"administration_you": "Jouw rol: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Jeg skuldet denne gjelda",
"interest_calc_yearly": "Per \u00e5r",
"interest_calc_": "ukjent",
"interest_calc_daily": "Per dag",
"interest_calc_monthly": "Per m\u00e5nad",
"interest_calc_weekly": "Per veke",
"interest_calc_half-year": "Per halv\u00e5r",
"interest_calc_quarterly": "Per kvartal",
"spent": "Brukt",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Jeg skuldet denne gjelda",
"interest_calc_yearly": "Per \u00e5r",
"interest_calc_": "ukjent",
"interest_calc_daily": "Per dag",
"interest_calc_monthly": "Per m\u00e5nad",
"interest_calc_weekly": "Per veke",
"interest_calc_half-year": "Per halv\u00e5r",
"interest_calc_quarterly": "Per kvartal",
"spent": "Brukt",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -10,16 +10,16 @@
"title": "Tytu\u0142"
},
"list": {
"drag_and_drop": "Drag and drop",
"drag_and_drop": "Przeci\u0105gnij i upu\u015b\u0107",
"active": "Jest aktywny?",
"name": "Nazwa",
"type": "Typ",
"number": "Account number",
"number": "Numer konta",
"liability_type": "Rodzaj zobowi\u0105zania",
"current_balance": "Current balance",
"last_activity": "Last activity",
"amount_due": "Amount due",
"balance_difference": "Balance difference",
"current_balance": "Bie\u017c\u0105ce saldo",
"last_activity": "Ostatnia aktywno\u015b\u0107",
"amount_due": "Do zap\u0142aty",
"balance_difference": "R\u00f3\u017cnica salda",
"menu": "Menu"
},
"validation": {
@@ -27,22 +27,31 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Jeste\u015b d\u0142u\u017cny",
"liability_direction_credit_short": "D\u0142ug wobec Ciebie",
"interest_calc_yearly": "Co rok",
"interest_calc_": "nieznany",
"interest_calc_daily": "Co dzie\u0144",
"interest_calc_monthly": "Co miesi\u0105c",
"interest_calc_weekly": "Tygodniowo",
"interest_calc_half-year": "Co p\u00f3\u0142 roku",
"interest_calc_quarterly": "Kwartalnie",
"spent": "Wydano",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",
"administration_role_owner": "Owner",
"administration_role_ro": "Read-only",
"administration_role_mng_trx": "Manage transactions",
"administration_role_mng_meta": "Manage classification and meta-data",
"administration_role_mng_budgets": "Manage budgets",
"administration_role_mng_piggies": "Manage piggy banks",
"administration_role_mng_subscriptions": "Manage subscriptions",
"administration_role_mng_rules": "Manage rules",
"administration_role_mng_recurring": "Manage recurring transactions ",
"administration_you": "Twoja rola: {{role}}",
"administration_role_owner": "W\u0142a\u015bciciel",
"administration_role_ro": "Tylko odczyt",
"administration_role_mng_trx": "Zarz\u0105dzanie transakcjami",
"administration_role_mng_meta": "Zarz\u0105dzanie klasyfikacj\u0105 i meta-danymi",
"administration_role_mng_budgets": "Zarz\u0105dzanie bud\u017cetami",
"administration_role_mng_piggies": "Zarz\u0105dzanie skarbonkami",
"administration_role_mng_subscriptions": "Zarz\u0105dzanie subskrypcjami",
"administration_role_mng_rules": "Zarz\u0105dzanie regu\u0142ami",
"administration_role_mng_recurring": "Zarz\u0105dzanie transakcjami cyklicznymi ",
"administration_role_mng_webhooks": "Manage webhooks",
"administration_role_mng_currencies": "Manage currencies",
"administration_role_view_reports": "View reports",
"administration_role_full": "Full access",
"administration_role_mng_currencies": "Zarz\u0105dzanie walutami",
"administration_role_view_reports": "Przegl\u0105danie raport\u00f3w",
"administration_role_full": "Pe\u0142ny dost\u0119p",
"new_administration_created": "New financial administration \"{{title}}\" has been created",
"left": "Pozosta\u0142o",
"paid": "Zap\u0142acone",
@@ -61,10 +70,10 @@
"unknown_dest_plain": "Nieznane konto docelowe",
"unknown_any_plain": "Nieznane konto",
"unknown_budget_plain": "Brak bud\u017cetu",
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
"stored_journal_js": "Pomy\u015blnie utworzono now\u0105 transakcj\u0119 \"{{description}}\"",
"wait_loading_transaction": "Poczekaj na za\u0142adowanie formularza",
"nothing_found": "(nic nie znaleziono)",
"wait_loading_data": "Please wait for your information to load...",
"wait_loading_data": "Prosz\u0119 poczeka\u0107 na za\u0142adowanie informacji...",
"Transfer": "Transfer",
"Withdrawal": "Wyp\u0142ata",
"Deposit": "Wp\u0142ata",

View File

@@ -10,16 +10,16 @@
"title": "Tytu\u0142"
},
"list": {
"drag_and_drop": "Drag and drop",
"drag_and_drop": "Przeci\u0105gnij i upu\u015b\u0107",
"active": "Jest aktywny?",
"name": "Nazwa",
"type": "Typ",
"number": "Account number",
"number": "Numer konta",
"liability_type": "Rodzaj zobowi\u0105zania",
"current_balance": "Current balance",
"last_activity": "Last activity",
"amount_due": "Amount due",
"balance_difference": "Balance difference",
"current_balance": "Bie\u017c\u0105ce saldo",
"last_activity": "Ostatnia aktywno\u015b\u0107",
"amount_due": "Do zap\u0142aty",
"balance_difference": "R\u00f3\u017cnica salda",
"menu": "Menu"
},
"validation": {
@@ -27,22 +27,31 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Jeste\u015b d\u0142u\u017cny",
"liability_direction_credit_short": "D\u0142ug wobec Ciebie",
"interest_calc_yearly": "Co rok",
"interest_calc_": "nieznany",
"interest_calc_daily": "Co dzie\u0144",
"interest_calc_monthly": "Co miesi\u0105c",
"interest_calc_weekly": "Tygodniowo",
"interest_calc_half-year": "Co p\u00f3\u0142 roku",
"interest_calc_quarterly": "Kwartalnie",
"spent": "Wydano",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",
"administration_role_owner": "Owner",
"administration_role_ro": "Read-only",
"administration_role_mng_trx": "Manage transactions",
"administration_role_mng_meta": "Manage classification and meta-data",
"administration_role_mng_budgets": "Manage budgets",
"administration_role_mng_piggies": "Manage piggy banks",
"administration_role_mng_subscriptions": "Manage subscriptions",
"administration_role_mng_rules": "Manage rules",
"administration_role_mng_recurring": "Manage recurring transactions ",
"administration_you": "Twoja rola: {{role}}",
"administration_role_owner": "W\u0142a\u015bciciel",
"administration_role_ro": "Tylko odczyt",
"administration_role_mng_trx": "Zarz\u0105dzanie transakcjami",
"administration_role_mng_meta": "Zarz\u0105dzanie klasyfikacj\u0105 i meta-danymi",
"administration_role_mng_budgets": "Zarz\u0105dzanie bud\u017cetami",
"administration_role_mng_piggies": "Zarz\u0105dzanie skarbonkami",
"administration_role_mng_subscriptions": "Zarz\u0105dzanie subskrypcjami",
"administration_role_mng_rules": "Zarz\u0105dzanie regu\u0142ami",
"administration_role_mng_recurring": "Zarz\u0105dzanie transakcjami cyklicznymi ",
"administration_role_mng_webhooks": "Manage webhooks",
"administration_role_mng_currencies": "Manage currencies",
"administration_role_view_reports": "View reports",
"administration_role_full": "Full access",
"administration_role_mng_currencies": "Zarz\u0105dzanie walutami",
"administration_role_view_reports": "Przegl\u0105danie raport\u00f3w",
"administration_role_full": "Pe\u0142ny dost\u0119p",
"new_administration_created": "New financial administration \"{{title}}\" has been created",
"left": "Pozosta\u0142o",
"paid": "Zap\u0142acone",
@@ -61,10 +70,10 @@
"unknown_dest_plain": "Nieznane konto docelowe",
"unknown_any_plain": "Nieznane konto",
"unknown_budget_plain": "Brak bud\u017cetu",
"stored_journal_js": "Successfully created new transaction \"{{description}}\"",
"stored_journal_js": "Pomy\u015blnie utworzono now\u0105 transakcj\u0119 \"{{description}}\"",
"wait_loading_transaction": "Poczekaj na za\u0142adowanie formularza",
"nothing_found": "(nic nie znaleziono)",
"wait_loading_data": "Please wait for your information to load...",
"wait_loading_data": "Prosz\u0119 poczeka\u0107 na za\u0142adowanie informacji...",
"Transfer": "Transfer",
"Withdrawal": "Wyp\u0142ata",
"Deposit": "Wp\u0142ata",

View File

@@ -10,16 +10,16 @@
"title": "T\u00edtulo"
},
"list": {
"drag_and_drop": "Drag and drop",
"drag_and_drop": "Arrastar e soltar",
"active": "Est\u00e1 ativo?",
"name": "Nome",
"type": "Tipo",
"number": "Account number",
"number": "N\u00famero da conta",
"liability_type": "Tipo de passivo",
"current_balance": "Current balance",
"last_activity": "Last activity",
"amount_due": "Amount due",
"balance_difference": "Balance difference",
"current_balance": "Saldo atual",
"last_activity": "\u00daltima atividade",
"amount_due": "Valor devido",
"balance_difference": "Diferen\u00e7a de saldo",
"menu": "Menu"
},
"validation": {
@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III n\u00e3o conseguiu determinar o tipo de transa\u00e7\u00e3o baseado nesta conta destino."
},
"firefly": {
"liability_direction_debit_short": "Devo essa d\u00edvida",
"liability_direction_credit_short": "Devo receber essa d\u00edvida",
"interest_calc_yearly": "Por ano",
"interest_calc_": "desconhecido",
"interest_calc_daily": "Por dia",
"interest_calc_monthly": "Por m\u00eas",
"interest_calc_weekly": "Por semana",
"interest_calc_half-year": "Por semestre",
"interest_calc_quarterly": "Por trimestre",
"spent": "Gasto",
"administration_owner": "Propriet\u00e1rio da administra\u00e7\u00e3o: {{email}}",
"administration_you": "Sua fun\u00e7\u00e3o: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "O Firefly III n\u00e3o consegue determinar o tipo de transa\u00e7\u00e3o baseado nesta conta de destino."
},
"firefly": {
"liability_direction_debit_short": "Devo esta d\u00edvida",
"liability_direction_credit_short": "Devem-me esta d\u00edvida",
"interest_calc_yearly": "Por ano",
"interest_calc_": "desconhecido",
"interest_calc_daily": "Por dia",
"interest_calc_monthly": "Por m\u00eas",
"interest_calc_weekly": "Por semana",
"interest_calc_half-year": "Por semestre",
"interest_calc_quarterly": "Por trimestre",
"spent": "Gasto",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -10,16 +10,16 @@
"title": "T\u00edtulo"
},
"list": {
"drag_and_drop": "Drag and drop",
"drag_and_drop": "Arrastar e soltar",
"active": "Est\u00e1 ativo?",
"name": "Nome",
"type": "Tipo",
"number": "Account number",
"number": "N\u00famero da conta",
"liability_type": "Tipo de passivo",
"current_balance": "Current balance",
"last_activity": "Last activity",
"amount_due": "Amount due",
"balance_difference": "Balance difference",
"current_balance": "Saldo atual",
"last_activity": "\u00daltima atividade",
"amount_due": "Valor devido",
"balance_difference": "Diferen\u00e7a de saldo",
"menu": "Menu"
},
"validation": {
@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III n\u00e3o conseguiu determinar o tipo de transa\u00e7\u00e3o baseado nesta conta destino."
},
"firefly": {
"liability_direction_debit_short": "Devo essa d\u00edvida",
"liability_direction_credit_short": "Devo receber essa d\u00edvida",
"interest_calc_yearly": "Por ano",
"interest_calc_": "desconhecido",
"interest_calc_daily": "Por dia",
"interest_calc_monthly": "Por m\u00eas",
"interest_calc_weekly": "Por semana",
"interest_calc_half-year": "Por semestre",
"interest_calc_quarterly": "Por trimestre",
"spent": "Gasto",
"administration_owner": "Propriet\u00e1rio da administra\u00e7\u00e3o: {{email}}",
"administration_you": "Sua fun\u00e7\u00e3o: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "O Firefly III n\u00e3o consegue determinar o tipo de transa\u00e7\u00e3o baseado nesta conta de destino."
},
"firefly": {
"liability_direction_debit_short": "Devo esta d\u00edvida",
"liability_direction_credit_short": "Devem-me esta d\u00edvida",
"interest_calc_yearly": "Por ano",
"interest_calc_": "desconhecido",
"interest_calc_daily": "Por dia",
"interest_calc_monthly": "Por m\u00eas",
"interest_calc_weekly": "Por semana",
"interest_calc_half-year": "Por semestre",
"interest_calc_quarterly": "Por trimestre",
"spent": "Gasto",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III nu poate determina tipul de tranzac\u021bie bazat pe acest cont de destina\u021bie."
},
"firefly": {
"liability_direction_debit_short": "Creditor",
"liability_direction_credit_short": "\u00cendatorat",
"interest_calc_yearly": "Pe an",
"interest_calc_": "necunoscut",
"interest_calc_daily": "Pe zi",
"interest_calc_monthly": "Pe lun\u0103",
"interest_calc_weekly": "Pe s\u0103pt\u0103m\u00e2n\u0103",
"interest_calc_half-year": "Pe jum\u0103tate de an",
"interest_calc_quarterly": "Pe trimestru",
"spent": "Cheltuit",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III nu poate determina tipul de tranzac\u021bie bazat pe acest cont de destina\u021bie."
},
"firefly": {
"liability_direction_debit_short": "Creditor",
"liability_direction_credit_short": "\u00cendatorat",
"interest_calc_yearly": "Pe an",
"interest_calc_": "necunoscut",
"interest_calc_daily": "Pe zi",
"interest_calc_monthly": "Pe lun\u0103",
"interest_calc_weekly": "Pe s\u0103pt\u0103m\u00e2n\u0103",
"interest_calc_half-year": "Pe jum\u0103tate de an",
"interest_calc_quarterly": "Pe trimestru",
"spent": "Cheltuit",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430."
},
"firefly": {
"liability_direction_debit_short": "\u042f \u0434\u043e\u043b\u0436\u0435\u043d",
"liability_direction_credit_short": "\u041c\u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b",
"interest_calc_yearly": "\u0412 \u0433\u043e\u0434",
"interest_calc_": "\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e",
"interest_calc_daily": "\u0412 \u0434\u0435\u043d\u044c",
"interest_calc_monthly": "\u0412 \u043c\u0435\u0441\u044f\u0446",
"interest_calc_weekly": "\u0417\u0430 \u043d\u0435\u0434\u0435\u043b\u044e",
"interest_calc_half-year": "\u0417\u0430 \u043f\u043e\u043b\u0433\u043e\u0434\u0430",
"interest_calc_quarterly": "\u0417\u0430 \u043a\u0432\u0430\u0440\u0442\u0430\u043b",
"spent": "\u0420\u0430\u0441\u0445\u043e\u0434",
"administration_owner": "\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f: {{email}}",
"administration_you": "\u0412\u0430\u0448\u0430 \u0440\u043e\u043b\u044c: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430."
},
"firefly": {
"liability_direction_debit_short": "\u042f \u0434\u043e\u043b\u0436\u0435\u043d",
"liability_direction_credit_short": "\u041c\u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b",
"interest_calc_yearly": "\u0412 \u0433\u043e\u0434",
"interest_calc_": "\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e",
"interest_calc_daily": "\u0412 \u0434\u0435\u043d\u044c",
"interest_calc_monthly": "\u0412 \u043c\u0435\u0441\u044f\u0446",
"interest_calc_weekly": "\u0417\u0430 \u043d\u0435\u0434\u0435\u043b\u044e",
"interest_calc_half-year": "\u0417\u0430 \u043f\u043e\u043b\u0433\u043e\u0434\u0430",
"interest_calc_quarterly": "\u0417\u0430 \u043a\u0432\u0430\u0440\u0442\u0430\u043b",
"spent": "\u0420\u0430\u0441\u0445\u043e\u0434",
"administration_owner": "\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f: {{email}}",
"administration_you": "\u0412\u0430\u0448\u0430 \u0440\u043e\u043b\u044c: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Za rok",
"interest_calc_": "nezn\u00e1me",
"interest_calc_daily": "Za de\u0148",
"interest_calc_monthly": "Za mesiac",
"interest_calc_weekly": "Za t\u00fd\u017ede\u0148",
"interest_calc_half-year": "Za polrok",
"interest_calc_quarterly": "Za \u0161tvr\u0165rok",
"spent": "Utraten\u00e9",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Za rok",
"interest_calc_": "nezn\u00e1me",
"interest_calc_daily": "Za de\u0148",
"interest_calc_monthly": "Za mesiac",
"interest_calc_weekly": "Za t\u00fd\u017ede\u0148",
"interest_calc_half-year": "Za polrok",
"interest_calc_quarterly": "Za \u0161tvr\u0165rok",
"spent": "Utraten\u00e9",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -10,23 +10,32 @@
"title": "Naslov"
},
"list": {
"drag_and_drop": "Drag and drop",
"drag_and_drop": "Povleci in spusti",
"active": "Aktiviran?",
"name": "ime",
"type": "Vrsta",
"number": "Account number",
"number": "\u0160tevilka ra\u010duna",
"liability_type": "Vrsta obveznost",
"current_balance": "Current balance",
"last_activity": "Last activity",
"amount_due": "Amount due",
"balance_difference": "Balance difference",
"menu": "Menu"
"current_balance": "Trenutno stanje",
"last_activity": "Zadnja aktivnost",
"amount_due": "Dolgovani znesek",
"balance_difference": "Bilan\u010dna razlika",
"menu": "Meni"
},
"validation": {
"bad_type_source": "Na podlagi tega izvornega ra\u010duna Firefly III ne more dolo\u010diti vrste transakcije.",
"bad_type_destination": "Na podlagi tega ciljnega ra\u010duna Firefly III ne more dolo\u010diti vrste transakcije."
},
"firefly": {
"liability_direction_debit_short": "Dolgujem",
"liability_direction_credit_short": "Ta dolg je bil dolgovan",
"interest_calc_yearly": "Na leto",
"interest_calc_": "neznano",
"interest_calc_daily": "Na dan",
"interest_calc_monthly": "Na mesec",
"interest_calc_weekly": "Tedensko",
"interest_calc_half-year": "Na pol leta",
"interest_calc_quarterly": "Na \u010detrtletje",
"spent": "Porabljeno",
"administration_owner": "Lastnik administracije: {{email}}",
"administration_you": "Va\u0161a vloga: {{role}}",

View File

@@ -10,23 +10,32 @@
"title": "Naslov"
},
"list": {
"drag_and_drop": "Drag and drop",
"drag_and_drop": "Povleci in spusti",
"active": "Aktiviran?",
"name": "ime",
"type": "Vrsta",
"number": "Account number",
"number": "\u0160tevilka ra\u010duna",
"liability_type": "Vrsta obveznost",
"current_balance": "Current balance",
"last_activity": "Last activity",
"amount_due": "Amount due",
"balance_difference": "Balance difference",
"menu": "Menu"
"current_balance": "Trenutno stanje",
"last_activity": "Zadnja aktivnost",
"amount_due": "Dolgovani znesek",
"balance_difference": "Bilan\u010dna razlika",
"menu": "Meni"
},
"validation": {
"bad_type_source": "Na podlagi tega izvornega ra\u010duna Firefly III ne more dolo\u010diti vrste transakcije.",
"bad_type_destination": "Na podlagi tega ciljnega ra\u010duna Firefly III ne more dolo\u010diti vrste transakcije."
},
"firefly": {
"liability_direction_debit_short": "Dolgujem",
"liability_direction_credit_short": "Ta dolg je bil dolgovan",
"interest_calc_yearly": "Na leto",
"interest_calc_": "neznano",
"interest_calc_daily": "Na dan",
"interest_calc_monthly": "Na mesec",
"interest_calc_weekly": "Tedensko",
"interest_calc_half-year": "Na pol leta",
"interest_calc_quarterly": "Na \u010detrtletje",
"spent": "Porabljeno",
"administration_owner": "Lastnik administracije: {{email}}",
"administration_you": "Va\u0161a vloga: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "\u00c4ger denna skuld",
"liability_direction_credit_short": "\u00c4gde denna skuld",
"interest_calc_yearly": "Per \u00e5r",
"interest_calc_": "ok\u00e4nd",
"interest_calc_daily": "Per dag",
"interest_calc_monthly": "Per m\u00e5nad",
"interest_calc_weekly": "Per vecka",
"interest_calc_half-year": "Per halv\u00e5r",
"interest_calc_quarterly": "Per kvartal",
"spent": "Spenderat",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Din roll: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "\u00c4ger denna skuld",
"liability_direction_credit_short": "\u00c4gde denna skuld",
"interest_calc_yearly": "Per \u00e5r",
"interest_calc_": "ok\u00e4nd",
"interest_calc_daily": "Per dag",
"interest_calc_monthly": "Per m\u00e5nad",
"interest_calc_weekly": "Per vecka",
"interest_calc_half-year": "Per halv\u00e5r",
"interest_calc_quarterly": "Per kvartal",
"spent": "Spenderat",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Din roll: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Per year",
"interest_calc_": "unknown",
"interest_calc_daily": "Per day",
"interest_calc_monthly": "Per month",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Harcanan",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Per year",
"interest_calc_": "unknown",
"interest_calc_daily": "Per day",
"interest_calc_monthly": "Per month",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Harcanan",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Per year",
"interest_calc_": "unknown",
"interest_calc_daily": "\u0417\u0430 \u0434\u0435\u043d\u044c",
"interest_calc_monthly": "\u0417\u0430 \u043c\u0456\u0441\u044f\u0446\u044c",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Spent",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "Per year",
"interest_calc_": "unknown",
"interest_calc_daily": "\u0417\u0430 \u0434\u0435\u043d\u044c",
"interest_calc_monthly": "\u0417\u0430 \u043c\u0456\u0441\u044f\u0446\u044c",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "Spent",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "M\u1ed7i n\u0103m",
"interest_calc_": "kh\u00f4ng x\u00e1c \u0111\u1ecbnh",
"interest_calc_daily": "M\u1ed7i ng\u00e0y",
"interest_calc_monthly": "M\u1ed7i th\u00e1ng",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "\u0110\u00e3 chi",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "M\u1ed7i n\u0103m",
"interest_calc_": "kh\u00f4ng x\u00e1c \u0111\u1ecbnh",
"interest_calc_daily": "M\u1ed7i ng\u00e0y",
"interest_calc_monthly": "M\u1ed7i th\u00e1ng",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "\u0110\u00e3 chi",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III \u65e0\u6cd5\u786e\u5b9a\u57fa\u4e8e\u6b64\u76ee\u6807\u5e10\u6237\u7684\u4ea4\u6613\u7c7b\u578b\u3002"
},
"firefly": {
"liability_direction_debit_short": "\u6b20\u6b3e",
"liability_direction_credit_short": "\u501f\u6b3e",
"interest_calc_yearly": "\u6bcf\u5e74",
"interest_calc_": "\u672a\u77e5",
"interest_calc_daily": "\u6bcf\u65e5",
"interest_calc_monthly": "\u6bcf\u6708",
"interest_calc_weekly": "\u6bcf\u5468",
"interest_calc_half-year": "\u6bcf\u534a\u5e74",
"interest_calc_quarterly": "\u6bcf\u5b63\u5ea6",
"spent": "\u652f\u51fa",
"administration_owner": "\u7ba1\u7406\u5458\u5f52\u5c5e: {{email}}",
"administration_you": "\u4f60\u7684\u89d2\u8272: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "\u6bcf\u5e74",
"interest_calc_": "\u672a\u77e5",
"interest_calc_daily": "\u6bcf\u65e5",
"interest_calc_monthly": "\u6bcf\u6708",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "\u652f\u51fa",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III \u65e0\u6cd5\u786e\u5b9a\u57fa\u4e8e\u6b64\u76ee\u6807\u5e10\u6237\u7684\u4ea4\u6613\u7c7b\u578b\u3002"
},
"firefly": {
"liability_direction_debit_short": "\u6b20\u6b3e",
"liability_direction_credit_short": "\u501f\u6b3e",
"interest_calc_yearly": "\u6bcf\u5e74",
"interest_calc_": "\u672a\u77e5",
"interest_calc_daily": "\u6bcf\u65e5",
"interest_calc_monthly": "\u6bcf\u6708",
"interest_calc_weekly": "\u6bcf\u5468",
"interest_calc_half-year": "\u6bcf\u534a\u5e74",
"interest_calc_quarterly": "\u6bcf\u5b63\u5ea6",
"spent": "\u652f\u51fa",
"administration_owner": "\u7ba1\u7406\u5458\u5f52\u5c5e: {{email}}",
"administration_you": "\u4f60\u7684\u89d2\u8272: {{role}}",

View File

@@ -27,6 +27,15 @@
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": {
"liability_direction_debit_short": "Owe this debt",
"liability_direction_credit_short": "Owed this debt",
"interest_calc_yearly": "\u6bcf\u5e74",
"interest_calc_": "\u672a\u77e5",
"interest_calc_daily": "\u6bcf\u65e5",
"interest_calc_monthly": "\u6bcf\u6708",
"interest_calc_weekly": "Per week",
"interest_calc_half-year": "Per half year",
"interest_calc_quarterly": "Per quarter",
"spent": "\u652f\u51fa",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",

View File

@@ -1,58 +0,0 @@
/*!
* _variables.scss
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/* TODO REMOVE ME */
// Body
$body-bg: #f5f8fa;
// Borders
$laravel-border-color: darken($body-bg, 10%);
$list-group-border: $laravel-border-color;
$navbar-default-border: $laravel-border-color;
$panel-default-border: $laravel-border-color;
$panel-inner-border: $laravel-border-color;
// Brands
$brand-primary: #3097D1;
$brand-info: #8eb4cb;
$brand-success: #2ab27b;
$brand-warning: #cbb956;
$brand-danger: #bf5329;
// Typography
$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/";
$font-family-sans-serif: "Raleway", sans-serif;
$font-size-base: 14px;
$line-height-base: 1.6;
$text-color: #636b6f;
// Navbar
$navbar-default-bg: #fff;
// Buttons
$btn-default-color: $text-color;
// Inputs
$input-border: lighten($text-color, 40%);
$input-border-focus: lighten($brand-primary, 25%);
$input-color-placeholder: lighten($text-color, 30%);
// Panels
$panel-default-heading-bg: #fff;

View File

@@ -4,20 +4,16 @@
"/build/create_transaction.js": "/build/create_transaction.js",
"/build/edit_transaction.js": "/build/edit_transaction.js",
"/build/profile.js": "/build/profile.js",
"/build/index.js": "/build/index.js",
"/build/create.js": "/build/create.js",
"/build/edit.js": "/build/edit.js",
"/build/show.js": "/build/show.js",
"/build/webhooks/index.js": "/build/webhooks/index.js",
"/build/webhooks/create.js": "/build/webhooks/create.js",
"/build/webhooks/edit.js": "/build/webhooks/edit.js",
"/build/webhooks/show.js": "/build/webhooks/show.js",
"/public/v1/js/app.js": "/public/v1/js/app.js",
"/public/v1/js/app.js.LICENSE.txt": "/public/v1/js/app.js.LICENSE.txt",
"/public/v1/js/app_vue.js": "/public/v1/js/app_vue.js",
"/public/v1/js/app_vue.js.LICENSE.txt": "/public/v1/js/app_vue.js.LICENSE.txt",
"/public/v1/js/create.js": "/public/v1/js/create.js",
"/public/v1/js/create.js.LICENSE.txt": "/public/v1/js/create.js.LICENSE.txt",
"/public/v1/js/create_transaction.js": "/public/v1/js/create_transaction.js",
"/public/v1/js/create_transaction.js.LICENSE.txt": "/public/v1/js/create_transaction.js.LICENSE.txt",
"/public/v1/js/edit.js": "/public/v1/js/edit.js",
"/public/v1/js/edit.js.LICENSE.txt": "/public/v1/js/edit.js.LICENSE.txt",
"/public/v1/js/edit_transaction.js": "/public/v1/js/edit_transaction.js",
"/public/v1/js/edit_transaction.js.LICENSE.txt": "/public/v1/js/edit_transaction.js.LICENSE.txt",
"/public/v1/js/ff/accounts/create.js": "/public/v1/js/ff/accounts/create.js",
@@ -88,8 +84,6 @@
"/public/v1/js/ff/transactions/mass/edit-bulk.js": "/public/v1/js/ff/transactions/mass/edit-bulk.js",
"/public/v1/js/ff/transactions/mass/edit.js": "/public/v1/js/ff/transactions/mass/edit.js",
"/public/v1/js/ff/transactions/show.js": "/public/v1/js/ff/transactions/show.js",
"/public/v1/js/index.js": "/public/v1/js/index.js",
"/public/v1/js/index.js.LICENSE.txt": "/public/v1/js/index.js.LICENSE.txt",
"/public/v1/js/lib/Chart.bundle.min.js": "/public/v1/js/lib/Chart.bundle.min.js",
"/public/v1/js/lib/accounting.min.js": "/public/v1/js/lib/accounting.min.js",
"/public/v1/js/lib/bootstrap-multiselect.js": "/public/v1/js/lib/bootstrap-multiselect.js",
@@ -148,6 +142,12 @@
"/public/v1/js/lib/vue.js": "/public/v1/js/lib/vue.js",
"/public/v1/js/profile.js": "/public/v1/js/profile.js",
"/public/v1/js/profile.js.LICENSE.txt": "/public/v1/js/profile.js.LICENSE.txt",
"/public/v1/js/show.js": "/public/v1/js/show.js",
"/public/v1/js/show.js.LICENSE.txt": "/public/v1/js/show.js.LICENSE.txt"
"/public/v1/js/webhooks/create.js": "/public/v1/js/webhooks/create.js",
"/public/v1/js/webhooks/create.js.LICENSE.txt": "/public/v1/js/webhooks/create.js.LICENSE.txt",
"/public/v1/js/webhooks/edit.js": "/public/v1/js/webhooks/edit.js",
"/public/v1/js/webhooks/edit.js.LICENSE.txt": "/public/v1/js/webhooks/edit.js.LICENSE.txt",
"/public/v1/js/webhooks/index.js": "/public/v1/js/webhooks/index.js",
"/public/v1/js/webhooks/index.js.LICENSE.txt": "/public/v1/js/webhooks/index.js.LICENSE.txt",
"/public/v1/js/webhooks/show.js": "/public/v1/js/webhooks/show.js",
"/public/v1/js/webhooks/show.js.LICENSE.txt": "/public/v1/js/webhooks/show.js.LICENSE.txt"
}

View File

@@ -97,25 +97,25 @@
"multi_account_warning_withdrawal": "Sonraki b\u00f6l\u00fcnmelerin kaynak hesab\u0131n\u0131n, geri \u00e7ekilmenin ilk b\u00f6l\u00fcnmesinde tan\u0131mlanan herhangi bir \u015fey taraf\u0131ndan reddedilece\u011fini unutmay\u0131n.",
"multi_account_warning_deposit": "Sonraki b\u00f6l\u00fcnmelerin hedef hesab\u0131n\u0131n, mevduat\u0131n ilk b\u00f6l\u00fcnmesinde tan\u0131mlanan herhangi bir \u015fey taraf\u0131ndan iptal edilece\u011fini unutmay\u0131n.",
"multi_account_warning_transfer": "Sonraki b\u00f6l\u00fcnmelerin kaynak + hedef hesab\u0131n\u0131n, aktar\u0131m\u0131n ilk b\u00f6l\u00fcnmesinde tan\u0131mlanan her \u015fey taraf\u0131ndan ge\u00e7ersiz k\u0131l\u0131naca\u011f\u0131n\u0131 unutmay\u0131n.",
"webhook_trigger_STORE_TRANSACTION": "After transaction creation",
"webhook_trigger_UPDATE_TRANSACTION": "After transaction update",
"webhook_trigger_DESTROY_TRANSACTION": "After transaction delete",
"webhook_response_TRANSACTIONS": "Transaction details",
"webhook_response_ACCOUNTS": "Account details",
"webhook_response_none_NONE": "No details",
"webhook_trigger_STORE_TRANSACTION": "\u0130\u015flem olu\u015fturma sonras\u0131",
"webhook_trigger_UPDATE_TRANSACTION": "\u0130\u015flem g\u00fcncelleme sonras\u0131",
"webhook_trigger_DESTROY_TRANSACTION": "\u0130\u015flem silme sonras\u0131",
"webhook_response_TRANSACTIONS": "\u0130\u015flem detaylar\u0131",
"webhook_response_ACCOUNTS": "Hesap detaylar\u0131",
"webhook_response_none_NONE": "Detay yok",
"webhook_delivery_JSON": "JSON",
"actions": "Eylemler",
"meta_data": "Meta veri",
"webhook_messages": "Webhook message",
"inactive": "Etkisiz",
"no_webhook_messages": "There are no webhook messages",
"inspect": "Inspect",
"create_new_webhook": "Create new webhook",
"no_webhook_messages": "Webhook mesaj\u0131 yok",
"inspect": "\u0130ncele",
"create_new_webhook": "Yeni webhook olu\u015ftur",
"webhooks": "Web kancalar\u0131",
"webhook_trigger_form_help": "Indicate on what event the webhook will trigger",
"webhook_response_form_help": "Indicate what the webhook must submit to the URL.",
"webhook_delivery_form_help": "Which format the webhook must deliver data in.",
"webhook_active_form_help": "The webhook must be active or it won't be called.",
"webhook_trigger_form_help": "Webhook'un hangi olay\u0131 tetikleyece\u011fini belirtin",
"webhook_response_form_help": "Webhook'un URL'ye ne g\u00f6ndermesi gerekti\u011fini belirleyin.",
"webhook_delivery_form_help": "Webhook'un verileri hangi formatta iletmesi gerek.",
"webhook_active_form_help": "Webhook'un etkin olmas\u0131 gerekir, aksi takdirde \u00e7a\u011fr\u0131lmaz.",
"edit_webhook_js": "Edit webhook \"{title}\"",
"webhook_was_triggered": "The webhook was triggered on the indicated transaction. Please wait for results to appear.",
"view_message": "View message",

View File

@@ -42,7 +42,7 @@ mix.js('src/edit_transaction.js', 'build').vue({version: 2});
mix.js('src/profile.js', 'build').vue({version: 2});
//
// // webhooks
mix.js('src/webhooks/index.js', 'build').vue({version: 2});
mix.js('src/webhooks/create.js', 'build').vue({version: 2});
mix.js('src/webhooks/edit.js', 'build').vue({version: 2});
mix.js('src/webhooks/show.js', 'build').vue({version: 2}).copy('build','../../../public/v1/js')
mix.js('src/webhooks/index.js', 'build/webhooks').vue({version: 2});
mix.js('src/webhooks/create.js', 'build/webhooks').vue({version: 2});
mix.js('src/webhooks/edit.js', 'build/webhooks').vue({version: 2});
mix.js('src/webhooks/show.js', 'build/webhooks').vue({version: 2}).copy('build','../../../public/v1/js')

View File

@@ -29,7 +29,7 @@
"bootstrap5-tags": "^1.6.15",
"chart.js": "^4.4.0",
"chartjs-adapter-date-fns": "^3.0.0",
"chartjs-chart-sankey": "^0.12.0",
"chartjs-chart-sankey": "^0.12.1",
"date-fns": "^3.6.0",
"i18next": "^23.11.2",
"i18next-chained-backend": "^4.6.2",

View File

@@ -20,6 +20,7 @@
import {api} from "../../../../boot/axios";
import format from "date-fns/format";
import {getCacheKey} from "../../../../support/get-cache-key.js";
export default class Get {
@@ -39,7 +40,24 @@ export default class Get {
* @returns {Promise<AxiosResponse<any>>}
*/
index(params) {
return api.get('/api/v2/accounts', {params: params});
// first, check API in some consistent manner.
// then, load if necessary.
const cacheKey = getCacheKey('/api/v2/accounts', params);
const cacheValid = window.store.get('cacheValid');
let cachedData = window.store.get(cacheKey);
if (cacheValid && typeof cachedData !== 'undefined') {
console.log('Cache is valid, return cache.');
return Promise.resolve(cachedData);
}
// if not, store in cache and then return res.
return api.get('/api/v2/accounts', {params: params}).then(response => {
console.log('Cache is invalid, return fresh.');
window.store.set(cacheKey, response.data);
return Promise.resolve({data: response.data.data, meta: response.data.meta});
});
}
/**

View File

@@ -43,6 +43,7 @@ store.addPlugin(observePlugin);
window.bootstrapped = false;
window.store = store;
window.bootstrap = bootstrap;

View File

@@ -24,16 +24,14 @@ import i18next from "i18next";
import {format} from "date-fns";
import formatMoney from "../../util/format-money.js";
import '@ag-grid-community/styles/ag-grid.css';
import '@ag-grid-community/styles/ag-theme-alpine.css';
import '../../css/grid-ff3-theme.css';
import Get from "../../api/v2/model/account/get.js";
import Put from "../../api/v2/model/account/put.js";
import AccountRenderer from "../../support/renderers/AccountRenderer.js";
import {showInternalsButton} from "../../support/page-settings/show-internals-button.js";
import {showWizardButton} from "../../support/page-settings/show-wizard-button.js";
import {getVariable} from "../../store/get-variable.js";
import {setVariable} from "../../store/set-variable.js";
import {getVariables} from "../../store/get-variables.js";
import pageNavigation from "../../support/page-navigation.js";
// set type from URL
@@ -43,6 +41,7 @@ const type = urlParts[urlParts.length - 1];
let sortingColumn = '';
let sortDirection = '';
let page = 1;
// get sort parameters
const params = new Proxy(new URLSearchParams(window.location.search), {
@@ -50,11 +49,15 @@ const params = new Proxy(new URLSearchParams(window.location.search), {
});
sortingColumn = params.column ?? '';
sortDirection = params.direction ?? '';
page = parseInt(params.page ?? 1);
showInternalsButton();
showWizardButton();
// TODO currency conversion
// TODO page cleanup and recycle for transaction lists.
let index = function () {
return {
// notifications
@@ -70,11 +73,13 @@ let index = function () {
},
totalPages: 1,
page: 1,
pageUrl: '',
filters: {
active: 'both',
active: null,
name: null,
},
pageOptions: {
isLoading: true,
groupedAccounts: true,
sortingColumn: sortingColumn,
sortDirection: sortDirection,
@@ -138,29 +143,76 @@ let index = function () {
},
editors: {},
accounts: [],
lastClickedFilter: '',
lastFilterInput: '',
goToPage(page) {
this.page = page;
this.loadAccounts();
},
applyFilter() {
this.filters[this.lastClickedFilter] = this.lastFilterInput;
this.page = 1;
setVariable(this.getPreferenceKey('filters'), this.filters);
// hide modal
window.bootstrap.Modal.getInstance(document.getElementById('filterModal')).hide();
this.loadAccounts();
},
saveGroupedAccounts() {
setVariable(this.getPreferenceKey('grouped'), this.pageOptions.groupedAccounts);
this.page = 1;
this.loadAccounts();
},
removeFilter(field) {
this.filters[field] = null;
this.page = 1;
setVariable(this.getPreferenceKey('filters'), this.filters);
this.loadAccounts();
},
hasFilters() {
return this.filters.name !== null;
},
showFilterDialog(field) {
this.lastFilterInput = this.filters[field] ?? '';
this.lastClickedFilter = field;
document.getElementById('filterInput').focus();
},
accountRole(roleName) {
return i18next.t('firefly.account_role_' + roleName);
},
getPreferenceKey(name) {
return 'acc_index_' + type + '_' + name;
},
pageNavigation() {
return pageNavigation(this.totalPages, this.page, this.generatePageUrl(false));
},
sort(column) {
this.page = 1;
this.pageOptions.sortingColumn = column;
this.pageOptions.sortDirection = this.pageOptions.sortDirection === 'asc' ? 'desc' : 'asc';
const url = './accounts/' + type + '?column=' + column + '&direction=' + this.pageOptions.sortDirection;
window.history.pushState({}, "", url);
this.updatePageUrl();
// get sort column
// TODO variable name in better place
const columnKey = 'acc_index_' + type + '_sc';
const directionKey = 'acc_index_' + type + '_sd';
setVariable(columnKey, this.pageOptions.sortingColumn);
setVariable(directionKey, this.pageOptions.sortDirection);
setVariable(this.getPreferenceKey('sc'), this.pageOptions.sortingColumn);
setVariable(this.getPreferenceKey('sd'), this.pageOptions.sortDirection);
this.loadAccounts();
return false;
},
updatePageUrl() {
this.pageUrl = this.generatePageUrl(true);
window.history.pushState({}, "", this.pageUrl);
},
generatePageUrl(includePageNr) {
let url = './accounts/' + type + '?column=' + this.pageOptions.sortingColumn + '&direction=' + this.pageOptions.sortDirection + '&page=';
if (includePageNr) {
return url + this.page
}
return url;
},
formatMoney(amount, currencyCode) {
return formatMoney(amount, currencyCode);
@@ -177,56 +229,70 @@ let index = function () {
}
}
console.log('New settings', newSettings);
setVariable('acc_index_' + type + '_columns', newSettings);
setVariable(this.getPreferenceKey('columns'), newSettings);
},
init() {
// modal filter thing
const myModalEl = document.getElementById('filterModal')
myModalEl.addEventListener('shown.bs.modal', event => {
document.getElementById('filterInput').focus();
})
// some opts
this.pageOptions.isLoading = true;
this.notifications.wait.show = true;
this.page = page;
this.notifications.wait.text = i18next.t('firefly.wait_loading_data');
// get column preference
// TODO key in better variable
const key = 'acc_index_' + type + '_columns';
const defaultValue = {"drag_and_drop": false};
// get sort column
const columnKey = 'acc_index_' + type + '_sc';
const columnDefault = '';
// get sort direction
const directionKey = 'acc_index_' + type + '_sd';
const directionDefault = '';
getVariable(key, defaultValue).then((response) => {
for (let k in response) {
if (response.hasOwnProperty(k) && this.tableColumns.hasOwnProperty(k)) {
this.tableColumns[k].enabled = response[k] ?? true;
// start by collecting all preferences, create + put in the local store.
getVariables([
{name: this.getPreferenceKey('columns'), default: {"drag_and_drop": false}},
{name: this.getPreferenceKey('sc'), default: ''},
{name: this.getPreferenceKey('sd'), default: ''},
{name: this.getPreferenceKey('filters'), default: this.filters},
{name: this.getPreferenceKey('grouped'), default: true},
]).then((res) => {
// process columns:
for (let k in res[0]) {
if (res[0].hasOwnProperty(k) && this.tableColumns.hasOwnProperty(k)) {
this.tableColumns[k].enabled = res[0][k] ?? true;
}
}
}).
// get sorting preference, and overrule it if is not "" twice
then(() => {
return getVariable(columnKey, columnDefault).then((response) => {
console.log('Sorting column is "' + response + '"');
this.pageOptions.sortingColumn = '' === this.pageOptions.sortingColumn ? response : this.pageOptions.sortingColumn;
})
})
.
// get sorting preference, and overrule it if is not "" twice
then(() => {
return getVariable(directionKey, directionDefault).then((response) => {
console.log('Sorting direction is "' + response + '"');
this.pageOptions.sortDirection = '' === this.pageOptions.sortDirection ? response : this.pageOptions.sortDirection;
})
}).
// process sorting column:
this.pageOptions.sortingColumn = '' === this.pageOptions.sortingColumn ? res[1] : this.pageOptions.sortingColumn;
// process sort direction
this.pageOptions.sortDirection = '' === this.pageOptions.sortDirection ? res[2] : this.pageOptions.sortDirection;
// filters
for (let k in res[3]) {
if (res[3].hasOwnProperty(k) && this.filters.hasOwnProperty(k)) {
this.filters[k] = res[3][k];
}
}
// group accounts
this.pageOptions.groupedAccounts = res[4];
then(() => {
this.loadAccounts();
});
},
saveActiveFilter(e) {
this.page = 1;
if ('both' === e.currentTarget.value) {
this.filters.active = null;
}
if ('active' === e.currentTarget.value) {
this.filters.active = true;
}
if ('inactive' === e.currentTarget.value) {
this.filters.active = false;
}
setVariable(this.getPreferenceKey('filters'), this.filters);
this.loadAccounts();
},
renderObjectValue(field, account) {
let renderer = new AccountRenderer();
@@ -270,36 +336,45 @@ let index = function () {
this.accounts[index].nameEditorVisible = true;
},
loadAccounts() {
this.pageOptions.isLoading = true;
// sort instructions
const sorting = [{column: this.pageOptions.sortingColumn, direction: this.pageOptions.sortDirection}];
// filter instructions
let filters = [];
for (let k in this.filters) {
if (this.filters.hasOwnProperty(k) && null !== this.filters[k]) {
filters.push({column: k, filter: this.filters[k]});
}
}
// get start and end from the store:
const start = new Date(window.store.get('start'));
const end = new Date(window.store.get('end'));
const today = new Date();
let params = {
sorting: sorting,
filters: filters,
today: today,
type: type,
page: this.page,
start: start,
end: end
};
if(!this.tableColumns.balance_difference.enabled){
if (!this.tableColumns.balance_difference.enabled) {
delete params.start;
delete params.end;
}
this.notifications.wait.show = true;
this.notifications.wait.text = i18next.t('firefly.wait_loading_data')
this.accounts = [];
let groupedAccounts = {};
// one page only.o
(new Get()).index(params).then(response => {
for (let i = 0; i < response.data.data.length; i++) {
if (response.data.data.hasOwnProperty(i)) {
let current = response.data.data[i];
this.totalPages = response.meta.pagination.total_pages;
for (let i = 0; i < response.data.length; i++) {
if (response.data.hasOwnProperty(i)) {
let current = response.data[i];
let account = {
id: parseInt(current.id),
active: current.attributes.active,
@@ -315,14 +390,45 @@ let index = function () {
native_currency_code: current.attributes.native_currency_code,
last_activity: null === current.attributes.last_activity ? '' : format(new Date(current.attributes.last_activity), i18next.t('config.month_and_day_fns')),
balance_difference: current.attributes.balance_difference,
native_balance_difference: current.attributes.native_balance_difference
native_balance_difference: current.attributes.native_balance_difference,
liability_type: current.attributes.liability_type,
liability_direction: current.attributes.liability_direction,
interest: current.attributes.interest,
interest_period: current.attributes.interest_period,
current_debt: current.attributes.current_debt,
};
console.log(current.attributes.balance_difference);
this.accounts.push(account);
// get group info:
let groupId = current.attributes.object_group_id;
if(!this.pageOptions.groupedAccounts) {
groupId = '0';
}
if (!groupedAccounts.hasOwnProperty(groupId)) {
groupedAccounts[groupId] = {
group: {
id: '0' === groupId || null === groupId ? null : parseInt(groupId),
title: current.attributes.object_group_title, // are ignored if group id is null.
order: current.attributes.object_group_order,
},
accounts: [],
}
}
groupedAccounts[groupId].accounts.push(account);
//this.accounts.push(account);
}
}
// order grouped accounts by order.
let sortable = [];
for (let set in groupedAccounts) {
sortable.push(groupedAccounts[set]);
}
sortable.sort(function(a, b) {
return a.group.order - b.group.order;
});
this.accounts = sortable;
this.notifications.wait.show = false;
// add click trigger thing.
this.pageOptions.isLoading = false;
});
},
}

View File

@@ -63,7 +63,6 @@ let administrations = function () {
pageProperties: {},
submitForm() {
console.log('submitForm');
(new Put()).put({title: this.title}, {id: this.id}).then(response => {
if (this.formStates.returnHereButton) {
this.notifications.success.show = true;

View File

@@ -46,16 +46,18 @@ export default () => ({
this.autoConversion = !this.autoConversion;
setVariable('autoConversion', this.autoConversion);
},
localCacheKey(type) {
return 'ds_accounts_' + type;
},
getFreshData() {
const start = new Date(window.store.get('start'));
const end = new Date(window.store.get('end'));
const chartCacheKey = getCacheKey('dashboard-accounts-chart', start, end)
const chartCacheKey = getCacheKey(this.localCacheKey('chart'), {start: start, end: end})
const cacheValid = window.store.get('cacheValid');
let cachedData = window.store.get(chartCacheKey);
if (cacheValid && typeof cachedData !== 'undefined') {
console.log(cachedData);
this.drawChart(this.generateOptions(cachedData));
this.loading = false;
return;
@@ -65,7 +67,6 @@ export default () => ({
this.chartData = response.data;
// cache generated options:
window.store.set(chartCacheKey, response.data);
console.log(response.data);
this.drawChart(this.generateOptions(this.chartData));
this.loading = false;
});
@@ -168,7 +169,7 @@ export default () => ({
}
const start = new Date(window.store.get('start'));
const end = new Date(window.store.get('end'));
const accountCacheKey = getCacheKey('dashboard-accounts-data', start, end);
const accountCacheKey = getCacheKey(this.localCacheKey('data'), {start: start, end: end});
const cacheValid = window.store.get('cacheValid');
let cachedData = window.store.get(accountCacheKey);
@@ -221,7 +222,6 @@ export default () => ({
// if transfer and source is this account, multiply again
if('transfer' === currentTransaction.type && parseInt(currentTransaction.source_id) === accountId) { //
console.log('transfer', parseInt(currentTransaction.source_id), accountId);
nativeAmountRaw = nativeAmountRaw * -1;
amountRaw = amountRaw * -1;
}

View File

@@ -38,7 +38,8 @@ export default () => ({
getFreshData() {
const start = new Date(window.store.get('start'));
const end = new Date(window.store.get('end'));
const boxesCacheKey = getCacheKey('dashboard-boxes-data', start, end);
// TODO cache key is hard coded, problem?
const boxesCacheKey = getCacheKey('ds_boxes_data', {start: start, end: end});
cleanupCache();
const cacheValid = window.store.get('cacheValid');
@@ -208,6 +209,7 @@ export default () => ({
// Getter
init() {
// console.log('boxes init');
// TODO can be replaced by "getVariables"
Promise.all([getVariable('viewRange'), getVariable('autoConversion', false)]).then((values) => {
// console.log('boxes after promises');
afterPromises = true;

View File

@@ -59,7 +59,7 @@ export default () => ({
getFreshData() {
const start = new Date(window.store.get('start'));
const end = new Date(window.store.get('end'));
const cacheKey = getCacheKey('dashboard-budgets-chart', start, end);
const cacheKey = getCacheKey('ds_bdg_chart', {start: start, end: end});
const cacheValid = window.store.get('cacheValid');
let cachedData = window.store.get(cacheKey);

View File

@@ -147,7 +147,7 @@ export default () => ({
getFreshData() {
const start = new Date(window.store.get('start'));
const end = new Date(window.store.get('end'));
const cacheKey = getCacheKey('dashboard-categories-chart', start, end);
const cacheKey = getCacheKey('ds_ct_chart', {start: start, end: end});
const cacheValid = window.store.get('cacheValid');
let cachedData = window.store.get(cacheKey);

View File

@@ -25,7 +25,7 @@ import i18next from "i18next";
let apiData = {};
let afterPromises = false;
const PIGGY_CACHE_KEY = 'dashboard-piggies-data';
const PIGGY_CACHE_KEY = 'ds_pg_data';
export default () => ({
loading: false,
@@ -36,7 +36,7 @@ export default () => ({
const start = new Date(window.store.get('start'));
const end = new Date(window.store.get('end'));
// needs user data.
const cacheKey = getCacheKey(PIGGY_CACHE_KEY, start, end);
const cacheKey = getCacheKey(PIGGY_CACHE_KEY, {start: start, end: end});
const cacheValid = window.store.get('cacheValid');
let cachedData = window.store.get(cacheKey);
@@ -58,7 +58,7 @@ export default () => ({
downloadPiggyBanks(params) {
const start = new Date(window.store.get('start'));
const end = new Date(window.store.get('end'));
const cacheKey = getCacheKey(PIGGY_CACHE_KEY, start, end);
const cacheKey = getCacheKey(PIGGY_CACHE_KEY, {start: start, end: end});
const getter = new Get();
getter.list(params).then((response) => {
apiData = [...apiData, ...response.data.data];

View File

@@ -28,7 +28,7 @@ import i18next from "i18next";
Chart.register({SankeyController, Flow});
const SANKEY_CACHE_KEY = 'dashboard-sankey-data';
const SANKEY_CACHE_KEY = 'ds_sankey_data';
let currencies = [];
let afterPromises = false;
let chart = null;
@@ -288,7 +288,7 @@ export default () => ({
getFreshData() {
const start = new Date(window.store.get('start'));
const end = new Date(window.store.get('end'));
const cacheKey = getCacheKey(SANKEY_CACHE_KEY, start, end);
const cacheKey = getCacheKey(SANKEY_CACHE_KEY, {start: start, end: end});
const cacheValid = window.store.get('cacheValid');
let cachedData = window.store.get(cacheKey);
@@ -312,7 +312,7 @@ export default () => ({
downloadTransactions(params) {
const start = new Date(window.store.get('start'));
const end = new Date(window.store.get('end'));
const cacheKey = getCacheKey(SANKEY_CACHE_KEY, start, end);
const cacheKey = getCacheKey(SANKEY_CACHE_KEY, {start: start, end: end});
//console.log('Downloading page ' + params.page + '...');
const getter = new Get();

View File

@@ -186,7 +186,7 @@ export default () => ({
let end = new Date(window.store.get('end'));
const cacheValid = window.store.get('cacheValid');
let cachedData = window.store.get(getCacheKey('subscriptions-data-dashboard', start, end));
let cachedData = window.store.get(getCacheKey('ds_sub_data', {start: start, end: end}));
if (cacheValid && typeof cachedData !== 'undefined' && false) {
console.error('cannot handle yet');

View File

@@ -0,0 +1,47 @@
/*
* get-variable.js
* Copyright (c) 2023 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {getVariable} from "./get-variable.js";
export function getVariables(preferences) {
let chain = Promise.resolve();
let allVariables = [];
for (let i = 0; i < preferences.length; i++) {
let current = preferences[i];
let name = current.name;
let defaultValue = current.default;
chain = chain.then(() => {
return getVariable(name, defaultValue).then((value) => {
allVariables.push(value);
return Promise.resolve(allVariables);
});
});
}
return chain;
}
export function parseResponse(name, response) {
let value = response.data.data.attributes.data;
window.store.set(name, value);
return value;
}

View File

@@ -20,12 +20,77 @@
import {format} from "date-fns";
import store from "store";
//const { createHash } = require('crypto');
function getCacheKey(string, start, end) {
const localValue = store.get('lastActivity');
const cacheKey = 'dcx' + format(start, 'yMMdd')+ format(end, 'yMMdd') + string + localValue;
console.log('getCacheKey: ' + cacheKey);
return String(cacheKey);
function getCacheKey(string, params) {
const lastActivity = store.get('lastActivity')
let newParams = {lastActivity: lastActivity, key: string};
for (const key in params) {
if (params.hasOwnProperty(key)) {
if(params[key] === null || params[key] === undefined) {
newParams[key] = '';
continue;
}
if(params[key] instanceof Date) {
newParams[key] = format(params[key], 'yMMdd');
continue;
}
newParams[key] = params[key];
}
}
return 'dcx_' + md5(JSON.stringify(newParams)).substring(0,12) + lastActivity;
}
// Formatted version of a popular md5 implementation
// Original copyright (c) Paul Johnston & Greg Holt.
// The function itself is now 42 lines long.
function md5(inputString) {
var hc="0123456789abcdef";
function rh(n) {var j,s="";for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;}
function ad(x,y) {var l=(x&0xFFFF)+(y&0xFFFF);var m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);}
function rl(n,c) {return (n<<c)|(n>>>(32-c));}
function cm(q,a,b,x,s,t) {return ad(rl(ad(ad(a,q),ad(x,t)),s),b);}
function ff(a,b,c,d,x,s,t) {return cm((b&c)|((~b)&d),a,b,x,s,t);}
function gg(a,b,c,d,x,s,t) {return cm((b&d)|(c&(~d)),a,b,x,s,t);}
function hh(a,b,c,d,x,s,t) {return cm(b^c^d,a,b,x,s,t);}
function ii(a,b,c,d,x,s,t) {return cm(c^(b|(~d)),a,b,x,s,t);}
function sb(x) {
var i;var nblk=((x.length+8)>>6)+1;var blks=new Array(nblk*16);for(i=0;i<nblk*16;i++) blks[i]=0;
for(i=0;i<x.length;i++) blks[i>>2]|=x.charCodeAt(i)<<((i%4)*8);
blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks;
}
var i,x=sb(""+inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd;
for(i=0;i<x.length;i+=16) {olda=a;oldb=b;oldc=c;oldd=d;
a=ff(a,b,c,d,x[i+ 0], 7, -680876936);d=ff(d,a,b,c,x[i+ 1],12, -389564586);c=ff(c,d,a,b,x[i+ 2],17, 606105819);
b=ff(b,c,d,a,x[i+ 3],22,-1044525330);a=ff(a,b,c,d,x[i+ 4], 7, -176418897);d=ff(d,a,b,c,x[i+ 5],12, 1200080426);
c=ff(c,d,a,b,x[i+ 6],17,-1473231341);b=ff(b,c,d,a,x[i+ 7],22, -45705983);a=ff(a,b,c,d,x[i+ 8], 7, 1770035416);
d=ff(d,a,b,c,x[i+ 9],12,-1958414417);c=ff(c,d,a,b,x[i+10],17, -42063);b=ff(b,c,d,a,x[i+11],22,-1990404162);
a=ff(a,b,c,d,x[i+12], 7, 1804603682);d=ff(d,a,b,c,x[i+13],12, -40341101);c=ff(c,d,a,b,x[i+14],17,-1502002290);
b=ff(b,c,d,a,x[i+15],22, 1236535329);a=gg(a,b,c,d,x[i+ 1], 5, -165796510);d=gg(d,a,b,c,x[i+ 6], 9,-1069501632);
c=gg(c,d,a,b,x[i+11],14, 643717713);b=gg(b,c,d,a,x[i+ 0],20, -373897302);a=gg(a,b,c,d,x[i+ 5], 5, -701558691);
d=gg(d,a,b,c,x[i+10], 9, 38016083);c=gg(c,d,a,b,x[i+15],14, -660478335);b=gg(b,c,d,a,x[i+ 4],20, -405537848);
a=gg(a,b,c,d,x[i+ 9], 5, 568446438);d=gg(d,a,b,c,x[i+14], 9,-1019803690);c=gg(c,d,a,b,x[i+ 3],14, -187363961);
b=gg(b,c,d,a,x[i+ 8],20, 1163531501);a=gg(a,b,c,d,x[i+13], 5,-1444681467);d=gg(d,a,b,c,x[i+ 2], 9, -51403784);
c=gg(c,d,a,b,x[i+ 7],14, 1735328473);b=gg(b,c,d,a,x[i+12],20,-1926607734);a=hh(a,b,c,d,x[i+ 5], 4, -378558);
d=hh(d,a,b,c,x[i+ 8],11,-2022574463);c=hh(c,d,a,b,x[i+11],16, 1839030562);b=hh(b,c,d,a,x[i+14],23, -35309556);
a=hh(a,b,c,d,x[i+ 1], 4,-1530992060);d=hh(d,a,b,c,x[i+ 4],11, 1272893353);c=hh(c,d,a,b,x[i+ 7],16, -155497632);
b=hh(b,c,d,a,x[i+10],23,-1094730640);a=hh(a,b,c,d,x[i+13], 4, 681279174);d=hh(d,a,b,c,x[i+ 0],11, -358537222);
c=hh(c,d,a,b,x[i+ 3],16, -722521979);b=hh(b,c,d,a,x[i+ 6],23, 76029189);a=hh(a,b,c,d,x[i+ 9], 4, -640364487);
d=hh(d,a,b,c,x[i+12],11, -421815835);c=hh(c,d,a,b,x[i+15],16, 530742520);b=hh(b,c,d,a,x[i+ 2],23, -995338651);
a=ii(a,b,c,d,x[i+ 0], 6, -198630844);d=ii(d,a,b,c,x[i+ 7],10, 1126891415);c=ii(c,d,a,b,x[i+14],15,-1416354905);
b=ii(b,c,d,a,x[i+ 5],21, -57434055);a=ii(a,b,c,d,x[i+12], 6, 1700485571);d=ii(d,a,b,c,x[i+ 3],10,-1894986606);
c=ii(c,d,a,b,x[i+10],15, -1051523);b=ii(b,c,d,a,x[i+ 1],21,-2054922799);a=ii(a,b,c,d,x[i+ 8], 6, 1873313359);
d=ii(d,a,b,c,x[i+15],10, -30611744);c=ii(c,d,a,b,x[i+ 6],15,-1560198380);b=ii(b,c,d,a,x[i+13],21, 1309151649);
a=ii(a,b,c,d,x[i+ 4], 6, -145523070);d=ii(d,a,b,c,x[i+11],10,-1120210379);c=ii(c,d,a,b,x[i+ 2],15, 718787259);
b=ii(b,c,d,a,x[i+ 9],21, -343485551);a=ad(a,olda);b=ad(b,oldb);c=ad(c,oldc);d=ad(d,oldd);
}
return rh(a)+rh(b)+rh(c)+rh(d);
}
export {getCacheKey};

View File

@@ -0,0 +1,95 @@
/*
* page-navigation.js
* Copyright (c) 2024 james@firefly-iii.org.
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
function logarithmicPaginationLinks(lastPage, matchPage, linkURL) {
function pageLink(p, page) {
if(p === page) {
// href="'+ linkURL+ p + '"
return '<li class="page-item active" aria-current="page"><a class="page-link" href="#" @click.prevent="goToPage('+p+')">'+p+'</a></li>';
}
// href="'+ linkURL+ p + '"
return '<li class="page-item"><a class="page-link" href="#" @click.prevent="goToPage('+p+')">'+p+'</a></li>';
// return ((p === page) ? "<b>" + p + "</b>" : '<a href="' + linkURL + p + '">' + p + "</a>");
}
let page = (matchPage ? matchPage : 1), LINKS_PER_STEP = 5, lastp1 = 1, lastp2 = page, p1 = 1, p2 = page,
c1 = LINKS_PER_STEP + 1, c2 = LINKS_PER_STEP + 1, s1 = "", s2 = "", step = 1, linkHTML = "";
while (true) {
if (c1 >= c2) {
s1 += pageLink(p1, matchPage);
lastp1 = p1;
p1 += step;
c1--;
} else {
s2 = pageLink(p2, matchPage) + s2;
lastp2 = p2;
p2 -= step;
c2--;
}
if (c2 === 0) {
step *= 25;
p1 += step - 1; // Round UP to nearest multiple of step
p1 -= (p1 % step);
p2 -= (p2 % step); // Round DOWN to nearest multiple of step
c1 = LINKS_PER_STEP;
c2 = LINKS_PER_STEP;
}
if (p1 > p2) {
linkHTML += s1 + s2;
if ((lastp2 > page) || (page >= lastPage)) break;
lastp1 = page;
lastp2 = lastPage;
p1 = page + 1;
p2 = lastPage;
c1 = LINKS_PER_STEP;
c2 = LINKS_PER_STEP + 1;
s1 = '';
s2 = '';
step = 1;
}
}
return linkHTML;
}
export default function pageNavigation(totalPages, currentPage, navigationURL) {
totalPages = parseInt(totalPages);
currentPage = parseInt(currentPage);
let html = '<nav aria-label="Page navigation">';
html += '<ul class="pagination">';
if(currentPage > 1) {
html += '<li class="page-item"><a class="page-link" href="#">Previous</a></li>';
}
if(1 === currentPage) {
html += '<li class="page-item disabled"><a class="page-link">Previous</a></li>';
}
html += logarithmicPaginationLinks(totalPages, currentPage, navigationURL);
if(currentPage !== totalPages) {
html += '<li class="page-item"><a class="page-link" href="#">Next</a></li>';
}
if(currentPage === totalPages) {
html += '<li class="page-item disabled"><a class="page-link">Next</a></li>';
}
html += '</ul></nav>';
return html;
}

View File

@@ -138,7 +138,7 @@ return [
'error_ip' => 'IP адресът, свързан с тази грешка, е: :ip',
'error_url' => 'URL адресът е: :url',
'error_user_agent' => рaузър агент: :userAgent',
'error_stacktrace' => 'Пълният стак на грешката е отдолу. Ако смятате, че това е грешка в Firefly III, можете да препратите това съобщение до <a href="mailto:james@firefly-iii.org?subject=BUG!">james@firefly-iii.org</a>. Това може да помогне за отстраняване на грешката, която току-що срещнахте.',
'error_stacktrace' => 'The full stacktrace is below. If you think this is a bug in Firefly III, you can forward this message to <a href="mailto:james@firefly-iii.org?subject=I%20found%20a%20bug!">james@firefly-iii.org</a>. This can help fix the bug you just encountered.',
'error_github_html' => 'Ако предпочитате, можете също да отворите нов проблем на <a href="https://github.com/firefly-iii/firefly-iii/issues">GitHub</a>.',
'error_github_text' => 'Ако предпочитате, можете също да отворите нов проблем на https://github.com/firefly-iii/firefly-iii/issues.',
'error_stacktrace_below' => 'Пълният stacktrace е отдолу:',

View File

@@ -2399,6 +2399,16 @@ return [
'no_tags' => '(без етикети)',
'nothing_found' => '(nothing found)',
// page settings and wizard dialogs
'page_settings_header' => 'Page settings',
'visible_columns' => 'Visible columns',
'accounts_to_show' => 'Accounts to show',
'active_accounts_only' => 'Active accounts only',
'in_active_accounts_only' => 'Inactive accounts only',
'show_all_accounts' => 'Show all accounts',
'group_accounts' => 'Group accounts',
// piggy banks:
'event_history' => 'Event history',
'add_money_to_piggy' => 'Добавете пари към касичка ":name"',

View File

@@ -37,6 +37,7 @@ return [
// new user:
'bank_name' => 'Име на банката',
'bank_balance' => 'Салдо',
'current_balance' => 'Current balance',
'savings_balance' => 'Спестявания',
'credit_card_limit' => 'Лимит по кредитна карта',
'automatch' => 'Автоматично съчетаване',

View File

@@ -138,7 +138,7 @@ return [
'error_ip' => 'L\'adreça IP d\'aquest error és: :ip',
'error_url' => 'L\'URL és: :url',
'error_user_agent' => 'Agent d\'usuari: :userAgent',
'error_stacktrace' => 'La traça completa és a continuació. Si creus que és un error de Firefly III, pots reenviar aquest missatge a <a href="mailto:james@firefly-iii.org?subject=BUG!">james@firefly-iii.org</a>. Podria ajudar a solucionar l\'error que acabes de trobar.',
'error_stacktrace' => 'La traça completa és a continuació. Si creus que és un error de Firefly III, pots reenviar aquest missatge a <a href="mailto:james@firefly-iii.org?subject=I%20found%20a%20bug!">james@firefly-iii.org</a>. Podria ajudar a solucionar l\'error que acabes de trobar.',
'error_github_html' => 'Si ho prefereixes, també pots obrir un nou issue a <a href="https://github.com/firefly-iii/firefly-iii/issues">GitHub</a>.',
'error_github_text' => 'Si ho prefereixes, també pots obrir un nou issue a https://github.com/firefly-iii/firefly-iii/issues.',
'error_stacktrace_below' => 'La traça completa és a continuació:',

Some files were not shown because too many files have changed in this diff Show More