mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-10-13 07:53:16 +00:00
Merge branch 'release/4.6.10'
This commit is contained in:
@@ -40,9 +40,10 @@ SHOW_INCOMPLETE_TRANSLATIONS=false
|
|||||||
|
|
||||||
CACHE_PREFIX=firefly
|
CACHE_PREFIX=firefly
|
||||||
|
|
||||||
|
SEARCH_RESULT_LIMIT=50
|
||||||
EXCHANGE_RATE_SERVICE=fixerio
|
EXCHANGE_RATE_SERVICE=fixerio
|
||||||
|
|
||||||
GOOGLE_MAPS_API_KEY=
|
MAPBOX_API_KEY=
|
||||||
ANALYTICS_ID=
|
ANALYTICS_ID=
|
||||||
SITE_OWNER=mail@example.com
|
SITE_OWNER=mail@example.com
|
||||||
USE_ENCRYPTION=true
|
USE_ENCRYPTION=true
|
||||||
|
@@ -41,6 +41,7 @@ SHOW_INCOMPLETE_TRANSLATIONS=false
|
|||||||
|
|
||||||
CACHE_PREFIX=firefly
|
CACHE_PREFIX=firefly
|
||||||
|
|
||||||
|
SEARCH_RESULT_LIMIT=50
|
||||||
EXCHANGE_RATE_SERVICE=fixerio
|
EXCHANGE_RATE_SERVICE=fixerio
|
||||||
|
|
||||||
MAPBOX_API_KEY=
|
MAPBOX_API_KEY=
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
APP_ENV=local
|
APP_ENV=local
|
||||||
APP_DEBUG=true
|
APP_DEBUG=false
|
||||||
APP_NAME=FireflyIII
|
APP_NAME=FireflyIII
|
||||||
APP_KEY=SomeRandomStringOf32CharsExactly
|
APP_KEY=SomeRandomStringOf32CharsExactly
|
||||||
APP_LOG=syslog
|
APP_LOG=syslog
|
||||||
APP_LOG_LEVEL=debug
|
APP_LOG_LEVEL=info
|
||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
|
|
||||||
DB_CONNECTION=mysql
|
DB_CONNECTION=mysql
|
||||||
@@ -40,9 +40,10 @@ SHOW_INCOMPLETE_TRANSLATIONS=false
|
|||||||
|
|
||||||
CACHE_PREFIX=firefly
|
CACHE_PREFIX=firefly
|
||||||
|
|
||||||
|
SEARCH_RESULT_LIMIT=50
|
||||||
EXCHANGE_RATE_SERVICE=fixerio
|
EXCHANGE_RATE_SERVICE=fixerio
|
||||||
|
|
||||||
GOOGLE_MAPS_API_KEY=
|
MAPBOX_API_KEY=
|
||||||
ANALYTICS_ID=
|
ANALYTICS_ID=
|
||||||
SITE_OWNER=mail@example.com
|
SITE_OWNER=mail@example.com
|
||||||
USE_ENCRYPTION=true
|
USE_ENCRYPTION=true
|
||||||
|
@@ -1,12 +1,18 @@
|
|||||||
# 4.6.9.1
|
# 4.6.10
|
||||||
|
- Greatly expanded Docker support thanks to [alazare619](https://github.com/alazare619)
|
||||||
|
- [Issue 967](https://github.com/firefly-iii/firefly-iii/issues/967), thanks to [Aquariu](https://github.com/Aquariu)
|
||||||
|
- Improved Sandstorm support.
|
||||||
|
- [Issue 963](https://github.com/firefly-iii/firefly-iii/issues/963), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- [Issue 970](https://github.com/firefly-iii/firefly-iii/issues/970), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- [Issue 971](https://github.com/firefly-iii/firefly-iii/issues/971), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- Various Sandstorm.io related issues.
|
||||||
|
|
||||||
* Updated license
|
# 4.6.9.1
|
||||||
* Updated file list
|
- Updated license
|
||||||
|
- Updated file list
|
||||||
|
|
||||||
# 4.6.9
|
# 4.6.9
|
||||||
|
- First version that works!
|
||||||
* First version that works!
|
|
||||||
|
|
||||||
# 3.4.3
|
# 3.4.3
|
||||||
|
- Initial release on Sandstorm.io
|
||||||
* Initial release on Sandstorm.io
|
|
@@ -39,6 +39,7 @@ etc/php/7.1/cli/conf.d/20-dom.ini
|
|||||||
etc/php/7.1/cli/conf.d/20-exif.ini
|
etc/php/7.1/cli/conf.d/20-exif.ini
|
||||||
etc/php/7.1/cli/conf.d/20-fileinfo.ini
|
etc/php/7.1/cli/conf.d/20-fileinfo.ini
|
||||||
etc/php/7.1/cli/conf.d/20-ftp.ini
|
etc/php/7.1/cli/conf.d/20-ftp.ini
|
||||||
|
etc/php/7.1/cli/conf.d/20-gd.ini
|
||||||
etc/php/7.1/cli/conf.d/20-gettext.ini
|
etc/php/7.1/cli/conf.d/20-gettext.ini
|
||||||
etc/php/7.1/cli/conf.d/20-iconv.ini
|
etc/php/7.1/cli/conf.d/20-iconv.ini
|
||||||
etc/php/7.1/cli/conf.d/20-intl.ini
|
etc/php/7.1/cli/conf.d/20-intl.ini
|
||||||
@@ -75,6 +76,7 @@ etc/php/7.1/fpm/conf.d/20-dom.ini
|
|||||||
etc/php/7.1/fpm/conf.d/20-exif.ini
|
etc/php/7.1/fpm/conf.d/20-exif.ini
|
||||||
etc/php/7.1/fpm/conf.d/20-fileinfo.ini
|
etc/php/7.1/fpm/conf.d/20-fileinfo.ini
|
||||||
etc/php/7.1/fpm/conf.d/20-ftp.ini
|
etc/php/7.1/fpm/conf.d/20-ftp.ini
|
||||||
|
etc/php/7.1/fpm/conf.d/20-gd.ini
|
||||||
etc/php/7.1/fpm/conf.d/20-gettext.ini
|
etc/php/7.1/fpm/conf.d/20-gettext.ini
|
||||||
etc/php/7.1/fpm/conf.d/20-iconv.ini
|
etc/php/7.1/fpm/conf.d/20-iconv.ini
|
||||||
etc/php/7.1/fpm/conf.d/20-intl.ini
|
etc/php/7.1/fpm/conf.d/20-intl.ini
|
||||||
@@ -109,6 +111,7 @@ etc/php/7.1/mods-available/dom.ini
|
|||||||
etc/php/7.1/mods-available/exif.ini
|
etc/php/7.1/mods-available/exif.ini
|
||||||
etc/php/7.1/mods-available/fileinfo.ini
|
etc/php/7.1/mods-available/fileinfo.ini
|
||||||
etc/php/7.1/mods-available/ftp.ini
|
etc/php/7.1/mods-available/ftp.ini
|
||||||
|
etc/php/7.1/mods-available/gd.ini
|
||||||
etc/php/7.1/mods-available/gettext.ini
|
etc/php/7.1/mods-available/gettext.ini
|
||||||
etc/php/7.1/mods-available/iconv.ini
|
etc/php/7.1/mods-available/iconv.ini
|
||||||
etc/php/7.1/mods-available/intl.ini
|
etc/php/7.1/mods-available/intl.ini
|
||||||
@@ -177,6 +180,8 @@ lib/x86_64-linux-gnu/libnss_nis-2.19.so
|
|||||||
lib/x86_64-linux-gnu/libnss_nis.so.2
|
lib/x86_64-linux-gnu/libnss_nis.so.2
|
||||||
lib/x86_64-linux-gnu/libpcre.so.3
|
lib/x86_64-linux-gnu/libpcre.so.3
|
||||||
lib/x86_64-linux-gnu/libpcre.so.3.13.3
|
lib/x86_64-linux-gnu/libpcre.so.3.13.3
|
||||||
|
lib/x86_64-linux-gnu/libpng12.so.0
|
||||||
|
lib/x86_64-linux-gnu/libpng12.so.0.50.0
|
||||||
lib/x86_64-linux-gnu/libpthread-2.19.so
|
lib/x86_64-linux-gnu/libpthread-2.19.so
|
||||||
lib/x86_64-linux-gnu/libpthread.so.0
|
lib/x86_64-linux-gnu/libpthread.so.0
|
||||||
lib/x86_64-linux-gnu/libreadline.so.6
|
lib/x86_64-linux-gnu/libreadline.so.6
|
||||||
@@ -195,20 +200,12 @@ lib/x86_64-linux-gnu/libwrap.so.0.7.6
|
|||||||
lib/x86_64-linux-gnu/libz.so.1
|
lib/x86_64-linux-gnu/libz.so.1
|
||||||
lib/x86_64-linux-gnu/libz.so.1.2.8
|
lib/x86_64-linux-gnu/libz.so.1.2.8
|
||||||
lib64/ld-linux-x86-64.so.2
|
lib64/ld-linux-x86-64.so.2
|
||||||
opt/app/.DS_Store
|
|
||||||
opt/app/.dockerignore
|
opt/app/.dockerignore
|
||||||
opt/app/.env
|
opt/app/.env
|
||||||
opt/app/.env.docker
|
opt/app/.env.docker
|
||||||
opt/app/.env.example
|
opt/app/.env.example
|
||||||
opt/app/.env.sandstorm
|
opt/app/.env.sandstorm
|
||||||
opt/app/.env.testing
|
|
||||||
opt/app/.gitattributes
|
opt/app/.gitattributes
|
||||||
opt/app/.gitignore
|
|
||||||
opt/app/.sandstorm/launcher.sh
|
|
||||||
opt/app/.sandstorm/service-config/mime.types
|
|
||||||
opt/app/.sandstorm/service-config/nginx.conf
|
|
||||||
opt/app/.scrutinizer.yml
|
|
||||||
opt/app/.travis.yml
|
|
||||||
opt/app/CHANGELOG.md
|
opt/app/CHANGELOG.md
|
||||||
opt/app/CODE_OF_CONDUCT.md
|
opt/app/CODE_OF_CONDUCT.md
|
||||||
opt/app/Dockerfile
|
opt/app/Dockerfile
|
||||||
@@ -341,6 +338,7 @@ opt/app/app/Http/Controllers/JavascriptController.php
|
|||||||
opt/app/app/Http/Controllers/Json/AutoCompleteController.php
|
opt/app/app/Http/Controllers/Json/AutoCompleteController.php
|
||||||
opt/app/app/Http/Controllers/Json/BoxController.php
|
opt/app/app/Http/Controllers/Json/BoxController.php
|
||||||
opt/app/app/Http/Controllers/Json/ExchangeController.php
|
opt/app/app/Http/Controllers/Json/ExchangeController.php
|
||||||
|
opt/app/app/Http/Controllers/Json/FrontpageController.php
|
||||||
opt/app/app/Http/Controllers/Json/IntroController.php
|
opt/app/app/Http/Controllers/Json/IntroController.php
|
||||||
opt/app/app/Http/Controllers/JsonController.php
|
opt/app/app/Http/Controllers/JsonController.php
|
||||||
opt/app/app/Http/Controllers/NewUserController.php
|
opt/app/app/Http/Controllers/NewUserController.php
|
||||||
@@ -375,6 +373,7 @@ opt/app/app/Http/Middleware/Range.php
|
|||||||
opt/app/app/Http/Middleware/RedirectIfAuthenticated.php
|
opt/app/app/Http/Middleware/RedirectIfAuthenticated.php
|
||||||
opt/app/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php
|
opt/app/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php
|
||||||
opt/app/app/Http/Middleware/Sandstorm.php
|
opt/app/app/Http/Middleware/Sandstorm.php
|
||||||
|
opt/app/app/Http/Middleware/StartFireflySession.php
|
||||||
opt/app/app/Http/Middleware/TrimStrings.php
|
opt/app/app/Http/Middleware/TrimStrings.php
|
||||||
opt/app/app/Http/Middleware/TrustProxies.php
|
opt/app/app/Http/Middleware/TrustProxies.php
|
||||||
opt/app/app/Http/Middleware/VerifyCsrfToken.php
|
opt/app/app/Http/Middleware/VerifyCsrfToken.php
|
||||||
@@ -509,6 +508,7 @@ opt/app/app/Providers/RouteServiceProvider.php
|
|||||||
opt/app/app/Providers/RuleGroupServiceProvider.php
|
opt/app/app/Providers/RuleGroupServiceProvider.php
|
||||||
opt/app/app/Providers/RuleServiceProvider.php
|
opt/app/app/Providers/RuleServiceProvider.php
|
||||||
opt/app/app/Providers/SearchServiceProvider.php
|
opt/app/app/Providers/SearchServiceProvider.php
|
||||||
|
opt/app/app/Providers/SessionServiceProvider.php
|
||||||
opt/app/app/Providers/TagServiceProvider.php
|
opt/app/app/Providers/TagServiceProvider.php
|
||||||
opt/app/app/Repositories/Account/AccountRepository.php
|
opt/app/app/Repositories/Account/AccountRepository.php
|
||||||
opt/app/app/Repositories/Account/AccountRepositoryInterface.php
|
opt/app/app/Repositories/Account/AccountRepositoryInterface.php
|
||||||
@@ -688,6 +688,7 @@ opt/app/bootstrap/cache/packages.php
|
|||||||
opt/app/bootstrap/cache/services.php
|
opt/app/bootstrap/cache/services.php
|
||||||
opt/app/composer.json
|
opt/app/composer.json
|
||||||
opt/app/composer.lock
|
opt/app/composer.lock
|
||||||
|
opt/app/composer.phar
|
||||||
opt/app/config/app.php
|
opt/app/config/app.php
|
||||||
opt/app/config/auth.php
|
opt/app/config/auth.php
|
||||||
opt/app/config/broadcasting.php
|
opt/app/config/broadcasting.php
|
||||||
@@ -704,7 +705,6 @@ opt/app/config/session.php
|
|||||||
opt/app/config/twigbridge.php
|
opt/app/config/twigbridge.php
|
||||||
opt/app/config/upgrade.php
|
opt/app/config/upgrade.php
|
||||||
opt/app/config/view.php
|
opt/app/config/view.php
|
||||||
opt/app/crowdin.yaml
|
|
||||||
opt/app/database/factories/ModelFactory.php
|
opt/app/database/factories/ModelFactory.php
|
||||||
opt/app/database/migrations/2016_06_16_000000_create_support_tables.php
|
opt/app/database/migrations/2016_06_16_000000_create_support_tables.php
|
||||||
opt/app/database/migrations/2016_06_16_000001_create_users_table.php
|
opt/app/database/migrations/2016_06_16_000001_create_users_table.php
|
||||||
@@ -725,14 +725,12 @@ opt/app/database/seeds/LinkTypeSeeder.php
|
|||||||
opt/app/database/seeds/PermissionSeeder.php
|
opt/app/database/seeds/PermissionSeeder.php
|
||||||
opt/app/database/seeds/TransactionCurrencySeeder.php
|
opt/app/database/seeds/TransactionCurrencySeeder.php
|
||||||
opt/app/database/seeds/TransactionTypeSeeder.php
|
opt/app/database/seeds/TransactionTypeSeeder.php
|
||||||
|
opt/app/docker-compose.dockerhub.yml
|
||||||
opt/app/docker-compose.override.yml
|
opt/app/docker-compose.override.yml
|
||||||
opt/app/docker-compose.prod.yml
|
opt/app/docker-compose.prod.yml
|
||||||
opt/app/docker-compose.yml
|
opt/app/docker-compose.yml
|
||||||
opt/app/nginx_app.conf
|
opt/app/nginx_app.conf
|
||||||
opt/app/package.json
|
|
||||||
opt/app/phpunit.coverage.specific.xml
|
|
||||||
opt/app/phpunit.coverage.xml
|
opt/app/phpunit.coverage.xml
|
||||||
opt/app/phpunit.xml
|
|
||||||
opt/app/public/.htaccess
|
opt/app/public/.htaccess
|
||||||
opt/app/public/android-chrome-192x192.png
|
opt/app/public/android-chrome-192x192.png
|
||||||
opt/app/public/android-chrome-512x512.png
|
opt/app/public/android-chrome-512x512.png
|
||||||
@@ -743,6 +741,7 @@ opt/app/public/css/bootstrap-sortable.css
|
|||||||
opt/app/public/css/bootstrap-tagsinput.css
|
opt/app/public/css/bootstrap-tagsinput.css
|
||||||
opt/app/public/css/daterangepicker.css
|
opt/app/public/css/daterangepicker.css
|
||||||
opt/app/public/css/firefly.css
|
opt/app/public/css/firefly.css
|
||||||
|
opt/app/public/css/google-fonts.css
|
||||||
opt/app/public/css/jquery-ui/images/ui-icons_444444_256x240.png
|
opt/app/public/css/jquery-ui/images/ui-icons_444444_256x240.png
|
||||||
opt/app/public/css/jquery-ui/images/ui-icons_555555_256x240.png
|
opt/app/public/css/jquery-ui/images/ui-icons_555555_256x240.png
|
||||||
opt/app/public/css/jquery-ui/images/ui-icons_777620_256x240.png
|
opt/app/public/css/jquery-ui/images/ui-icons_777620_256x240.png
|
||||||
@@ -754,6 +753,55 @@ opt/app/public/css/jquery-ui/jquery-ui.theme.min.css
|
|||||||
opt/app/public/favicon-16x16.png
|
opt/app/public/favicon-16x16.png
|
||||||
opt/app/public/favicon-32x32.png
|
opt/app/public/favicon-32x32.png
|
||||||
opt/app/public/favicon.ico
|
opt/app/public/favicon.ico
|
||||||
|
opt/app/public/fonts/SourceSansPro-Bold-cyrillic-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Bold-cyrillic.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Bold-greek-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Bold-greek.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Bold-latin-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Bold-latin.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Bold-vietnamese.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Italic-cyrillic-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Italic-cyrillic.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Italic-greek-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Italic-greek.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Italic-latin-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Italic-latin.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Italic-vietnamese.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Light-cyrillic-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Light-cyrillic.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Light-greek-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Light-greek.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Light-latin-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Light-latin.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Light-vietnamese.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-LightItalic-greek-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-LightItalic-greek.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-LightItalic-latin-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-LightItalic-latin.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-LightItalic-vietnamese.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Regular-cyrillic-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Regular-cyrillic.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Regular-greek-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Regular-greek.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Regular-latin-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Regular-latin.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-Regular-vietnamese.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBold-greek-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBold-greek.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBold-latin-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBold-latin.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBold-vietnamese.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin.woff2
|
||||||
|
opt/app/public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2
|
||||||
opt/app/public/fonts/lato-100.woff2
|
opt/app/public/fonts/lato-100.woff2
|
||||||
opt/app/public/fonts/roboto-light-300.woff2
|
opt/app/public/fonts/roboto-light-300.woff2
|
||||||
opt/app/public/images/error.png
|
opt/app/public/images/error.png
|
||||||
@@ -826,6 +874,8 @@ opt/app/public/js/lib/daterangepicker.js
|
|||||||
opt/app/public/js/lib/html5shiv.min.js
|
opt/app/public/js/lib/html5shiv.min.js
|
||||||
opt/app/public/js/lib/jquery-3.1.1.min.js
|
opt/app/public/js/lib/jquery-3.1.1.min.js
|
||||||
opt/app/public/js/lib/jquery-3.1.1.min.map
|
opt/app/public/js/lib/jquery-3.1.1.min.map
|
||||||
|
opt/app/public/js/lib/jquery-3.2.1.min.js
|
||||||
|
opt/app/public/js/lib/jquery-3.2.1.min.map
|
||||||
opt/app/public/js/lib/jquery-ui.min.js
|
opt/app/public/js/lib/jquery-ui.min.js
|
||||||
opt/app/public/js/lib/jquery.color-2.1.2.min.js
|
opt/app/public/js/lib/jquery.color-2.1.2.min.js
|
||||||
opt/app/public/js/lib/modernizr-custom.js
|
opt/app/public/js/lib/modernizr-custom.js
|
||||||
@@ -1062,6 +1112,7 @@ opt/app/resources/views/currencies/create.twig
|
|||||||
opt/app/resources/views/currencies/delete.twig
|
opt/app/resources/views/currencies/delete.twig
|
||||||
opt/app/resources/views/currencies/edit.twig
|
opt/app/resources/views/currencies/edit.twig
|
||||||
opt/app/resources/views/currencies/index.twig
|
opt/app/resources/views/currencies/index.twig
|
||||||
|
opt/app/resources/views/debug.twig
|
||||||
opt/app/resources/views/demo/accounts/index.twig
|
opt/app/resources/views/demo/accounts/index.twig
|
||||||
opt/app/resources/views/demo/budgets/index.twig
|
opt/app/resources/views/demo/budgets/index.twig
|
||||||
opt/app/resources/views/demo/currencies/index.twig
|
opt/app/resources/views/demo/currencies/index.twig
|
||||||
@@ -1110,6 +1161,7 @@ opt/app/resources/views/form/location.twig
|
|||||||
opt/app/resources/views/form/multiCheckbox.twig
|
opt/app/resources/views/form/multiCheckbox.twig
|
||||||
opt/app/resources/views/form/multiRadio.twig
|
opt/app/resources/views/form/multiRadio.twig
|
||||||
opt/app/resources/views/form/non-selectable-amount.twig
|
opt/app/resources/views/form/non-selectable-amount.twig
|
||||||
|
opt/app/resources/views/form/number.twig
|
||||||
opt/app/resources/views/form/options.twig
|
opt/app/resources/views/form/options.twig
|
||||||
opt/app/resources/views/form/password.twig
|
opt/app/resources/views/form/password.twig
|
||||||
opt/app/resources/views/form/select.twig
|
opt/app/resources/views/form/select.twig
|
||||||
@@ -1130,6 +1182,7 @@ opt/app/resources/views/index.twig
|
|||||||
opt/app/resources/views/javascript/accounts.twig
|
opt/app/resources/views/javascript/accounts.twig
|
||||||
opt/app/resources/views/javascript/currencies.twig
|
opt/app/resources/views/javascript/currencies.twig
|
||||||
opt/app/resources/views/javascript/variables.twig
|
opt/app/resources/views/javascript/variables.twig
|
||||||
|
opt/app/resources/views/json/piggy-banks.twig
|
||||||
opt/app/resources/views/layout/default.twig
|
opt/app/resources/views/layout/default.twig
|
||||||
opt/app/resources/views/layout/empty.twig
|
opt/app/resources/views/layout/empty.twig
|
||||||
opt/app/resources/views/layout/guest.twig
|
opt/app/resources/views/layout/guest.twig
|
||||||
@@ -1228,9 +1281,7 @@ opt/app/routes/console.php
|
|||||||
opt/app/routes/web.php
|
opt/app/routes/web.php
|
||||||
opt/app/server.php
|
opt/app/server.php
|
||||||
opt/app/storage
|
opt/app/storage
|
||||||
opt/app/test.sh
|
|
||||||
opt/app/vendor/autoload.php
|
opt/app/vendor/autoload.php
|
||||||
opt/app/vendor/bacon/bacon-qr-code/.travis.yml
|
|
||||||
opt/app/vendor/bacon/bacon-qr-code/LICENSE
|
opt/app/vendor/bacon/bacon-qr-code/LICENSE
|
||||||
opt/app/vendor/bacon/bacon-qr-code/Module.php
|
opt/app/vendor/bacon/bacon-qr-code/Module.php
|
||||||
opt/app/vendor/bacon/bacon-qr-code/README.md
|
opt/app/vendor/bacon/bacon-qr-code/README.md
|
||||||
@@ -1291,11 +1342,8 @@ opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Encoder/MatrixUtilTest.php
|
|||||||
opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/HtmlTest.php
|
opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/HtmlTest.php
|
||||||
opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/TextTest.php
|
opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/TextTest.php
|
||||||
opt/app/vendor/bacon/bacon-qr-code/tests/bootstrap.php
|
opt/app/vendor/bacon/bacon-qr-code/tests/bootstrap.php
|
||||||
opt/app/vendor/bacon/bacon-qr-code/tests/phpunit.xml
|
|
||||||
opt/app/vendor/bin/commonmark
|
opt/app/vendor/bin/commonmark
|
||||||
opt/app/vendor/bin/doctrine-dbal
|
opt/app/vendor/bin/doctrine-dbal
|
||||||
opt/app/vendor/christian-riesen/base32/.scrutinizer.yml
|
|
||||||
opt/app/vendor/christian-riesen/base32/.travis.yml
|
|
||||||
opt/app/vendor/christian-riesen/base32/LICENSE
|
opt/app/vendor/christian-riesen/base32/LICENSE
|
||||||
opt/app/vendor/christian-riesen/base32/README.md
|
opt/app/vendor/christian-riesen/base32/README.md
|
||||||
opt/app/vendor/christian-riesen/base32/build.xml
|
opt/app/vendor/christian-riesen/base32/build.xml
|
||||||
@@ -1318,9 +1366,7 @@ opt/app/vendor/davejamesmiller/laravel-breadcrumbs/README.md
|
|||||||
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/RELEASE-CHECKLIST.md
|
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/RELEASE-CHECKLIST.md
|
||||||
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/composer.json
|
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/composer.json
|
||||||
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/config/breadcrumbs.php
|
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/config/breadcrumbs.php
|
||||||
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/phpunit.xml
|
|
||||||
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/scripts/test-coverage.sh
|
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/scripts/test-coverage.sh
|
||||||
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/scripts/test.sh
|
|
||||||
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/CurrentRoute.php
|
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/CurrentRoute.php
|
||||||
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exception.php
|
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exception.php
|
||||||
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Facade.php
|
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Facade.php
|
||||||
@@ -1487,7 +1533,6 @@ opt/app/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php
|
|||||||
opt/app/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php
|
opt/app/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php
|
||||||
opt/app/vendor/doctrine/common/lib/Doctrine/Common/Version.php
|
opt/app/vendor/doctrine/common/lib/Doctrine/Common/Version.php
|
||||||
opt/app/vendor/doctrine/common/phpstan.neon
|
opt/app/vendor/doctrine/common/phpstan.neon
|
||||||
opt/app/vendor/doctrine/dbal/.scrutinizer.yml
|
|
||||||
opt/app/vendor/doctrine/dbal/LICENSE
|
opt/app/vendor/doctrine/dbal/LICENSE
|
||||||
opt/app/vendor/doctrine/dbal/README.md
|
opt/app/vendor/doctrine/dbal/README.md
|
||||||
opt/app/vendor/doctrine/dbal/SECURITY.md
|
opt/app/vendor/doctrine/dbal/SECURITY.md
|
||||||
@@ -3218,12 +3263,10 @@ opt/app/vendor/paragonie/random_compat/lib/random_int.php
|
|||||||
opt/app/vendor/paragonie/random_compat/other/build_phar.php
|
opt/app/vendor/paragonie/random_compat/other/build_phar.php
|
||||||
opt/app/vendor/paragonie/random_compat/psalm-autoload.php
|
opt/app/vendor/paragonie/random_compat/psalm-autoload.php
|
||||||
opt/app/vendor/paragonie/random_compat/psalm.xml
|
opt/app/vendor/paragonie/random_compat/psalm.xml
|
||||||
opt/app/vendor/pragmarx/google2fa/.travis.yml
|
|
||||||
opt/app/vendor/pragmarx/google2fa/LICENSE
|
opt/app/vendor/pragmarx/google2fa/LICENSE
|
||||||
opt/app/vendor/pragmarx/google2fa/changelog.md
|
opt/app/vendor/pragmarx/google2fa/changelog.md
|
||||||
opt/app/vendor/pragmarx/google2fa/composer.json
|
opt/app/vendor/pragmarx/google2fa/composer.json
|
||||||
opt/app/vendor/pragmarx/google2fa/phpspec.yml
|
opt/app/vendor/pragmarx/google2fa/phpspec.yml
|
||||||
opt/app/vendor/pragmarx/google2fa/phpunit.xml
|
|
||||||
opt/app/vendor/pragmarx/google2fa/readme.md
|
opt/app/vendor/pragmarx/google2fa/readme.md
|
||||||
opt/app/vendor/pragmarx/google2fa/src/Contracts/Google2FA.php
|
opt/app/vendor/pragmarx/google2fa/src/Contracts/Google2FA.php
|
||||||
opt/app/vendor/pragmarx/google2fa/src/Exceptions/InvalidCharactersException.php
|
opt/app/vendor/pragmarx/google2fa/src/Exceptions/InvalidCharactersException.php
|
||||||
@@ -3347,7 +3390,6 @@ opt/app/vendor/rcrowe/twigbridge/src/Twig/Globals.php
|
|||||||
opt/app/vendor/rcrowe/twigbridge/src/Twig/Loader.php
|
opt/app/vendor/rcrowe/twigbridge/src/Twig/Loader.php
|
||||||
opt/app/vendor/rcrowe/twigbridge/src/Twig/Template.php
|
opt/app/vendor/rcrowe/twigbridge/src/Twig/Template.php
|
||||||
opt/app/vendor/rmccue/requests/.coveralls.yml
|
opt/app/vendor/rmccue/requests/.coveralls.yml
|
||||||
opt/app/vendor/rmccue/requests/.travis.yml
|
|
||||||
opt/app/vendor/rmccue/requests/CHANGELOG.md
|
opt/app/vendor/rmccue/requests/CHANGELOG.md
|
||||||
opt/app/vendor/rmccue/requests/LICENSE
|
opt/app/vendor/rmccue/requests/LICENSE
|
||||||
opt/app/vendor/rmccue/requests/README.md
|
opt/app/vendor/rmccue/requests/README.md
|
||||||
@@ -3454,7 +3496,6 @@ opt/app/vendor/swiftmailer/swiftmailer/.gitattributes
|
|||||||
opt/app/vendor/swiftmailer/swiftmailer/.github/ISSUE_TEMPLATE.md
|
opt/app/vendor/swiftmailer/swiftmailer/.github/ISSUE_TEMPLATE.md
|
||||||
opt/app/vendor/swiftmailer/swiftmailer/.github/PULL_REQUEST_TEMPLATE.md
|
opt/app/vendor/swiftmailer/swiftmailer/.github/PULL_REQUEST_TEMPLATE.md
|
||||||
opt/app/vendor/swiftmailer/swiftmailer/.php_cs.dist
|
opt/app/vendor/swiftmailer/swiftmailer/.php_cs.dist
|
||||||
opt/app/vendor/swiftmailer/swiftmailer/.travis.yml
|
|
||||||
opt/app/vendor/swiftmailer/swiftmailer/CHANGES
|
opt/app/vendor/swiftmailer/swiftmailer/CHANGES
|
||||||
opt/app/vendor/swiftmailer/swiftmailer/LICENSE
|
opt/app/vendor/swiftmailer/swiftmailer/LICENSE
|
||||||
opt/app/vendor/swiftmailer/swiftmailer/README
|
opt/app/vendor/swiftmailer/swiftmailer/README
|
||||||
@@ -5087,7 +5128,6 @@ opt/app/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Rule.php
|
|||||||
opt/app/vendor/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php
|
opt/app/vendor/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php
|
||||||
opt/app/vendor/twig/twig/.editorconfig
|
opt/app/vendor/twig/twig/.editorconfig
|
||||||
opt/app/vendor/twig/twig/.php_cs.dist
|
opt/app/vendor/twig/twig/.php_cs.dist
|
||||||
opt/app/vendor/twig/twig/.travis.yml
|
|
||||||
opt/app/vendor/twig/twig/CHANGELOG
|
opt/app/vendor/twig/twig/CHANGELOG
|
||||||
opt/app/vendor/twig/twig/LICENSE
|
opt/app/vendor/twig/twig/LICENSE
|
||||||
opt/app/vendor/twig/twig/README.rst
|
opt/app/vendor/twig/twig/README.rst
|
||||||
@@ -5790,6 +5830,7 @@ usr/lib/php/20160303/dom.so
|
|||||||
usr/lib/php/20160303/exif.so
|
usr/lib/php/20160303/exif.so
|
||||||
usr/lib/php/20160303/fileinfo.so
|
usr/lib/php/20160303/fileinfo.so
|
||||||
usr/lib/php/20160303/ftp.so
|
usr/lib/php/20160303/ftp.so
|
||||||
|
usr/lib/php/20160303/gd.so
|
||||||
usr/lib/php/20160303/gettext.so
|
usr/lib/php/20160303/gettext.so
|
||||||
usr/lib/php/20160303/iconv.so
|
usr/lib/php/20160303/iconv.so
|
||||||
usr/lib/php/20160303/intl.so
|
usr/lib/php/20160303/intl.so
|
||||||
@@ -5819,6 +5860,14 @@ usr/lib/php/20160303/zip.so
|
|||||||
usr/lib/ssl/openssl.cnf
|
usr/lib/ssl/openssl.cnf
|
||||||
usr/lib/x86_64-linux-gnu/libGeoIP.so.1
|
usr/lib/x86_64-linux-gnu/libGeoIP.so.1
|
||||||
usr/lib/x86_64-linux-gnu/libGeoIP.so.1.6.2
|
usr/lib/x86_64-linux-gnu/libGeoIP.so.1.6.2
|
||||||
|
usr/lib/x86_64-linux-gnu/libX11.so.6
|
||||||
|
usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
|
||||||
|
usr/lib/x86_64-linux-gnu/libXau.so.6
|
||||||
|
usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
|
||||||
|
usr/lib/x86_64-linux-gnu/libXdmcp.so.6
|
||||||
|
usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
|
||||||
|
usr/lib/x86_64-linux-gnu/libXpm.so.4
|
||||||
|
usr/lib/x86_64-linux-gnu/libXpm.so.4.11.0
|
||||||
usr/lib/x86_64-linux-gnu/libapparmor.so.1
|
usr/lib/x86_64-linux-gnu/libapparmor.so.1
|
||||||
usr/lib/x86_64-linux-gnu/libapparmor.so.1.2.0
|
usr/lib/x86_64-linux-gnu/libapparmor.so.1.2.0
|
||||||
usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
|
usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
|
||||||
@@ -5831,6 +5880,12 @@ usr/lib/x86_64-linux-gnu/libexslt.so.0
|
|||||||
usr/lib/x86_64-linux-gnu/libexslt.so.0.8.17
|
usr/lib/x86_64-linux-gnu/libexslt.so.0.8.17
|
||||||
usr/lib/x86_64-linux-gnu/libffi.so.6
|
usr/lib/x86_64-linux-gnu/libffi.so.6
|
||||||
usr/lib/x86_64-linux-gnu/libffi.so.6.0.2
|
usr/lib/x86_64-linux-gnu/libffi.so.6.0.2
|
||||||
|
usr/lib/x86_64-linux-gnu/libfontconfig.so.1
|
||||||
|
usr/lib/x86_64-linux-gnu/libfontconfig.so.1.8.0
|
||||||
|
usr/lib/x86_64-linux-gnu/libfreetype.so.6
|
||||||
|
usr/lib/x86_64-linux-gnu/libfreetype.so.6.11.1
|
||||||
|
usr/lib/x86_64-linux-gnu/libgd.so.3
|
||||||
|
usr/lib/x86_64-linux-gnu/libgd.so.3.0.0
|
||||||
usr/lib/x86_64-linux-gnu/libgmp.so.10
|
usr/lib/x86_64-linux-gnu/libgmp.so.10
|
||||||
usr/lib/x86_64-linux-gnu/libgmp.so.10.2.0
|
usr/lib/x86_64-linux-gnu/libgmp.so.10.2.0
|
||||||
usr/lib/x86_64-linux-gnu/libgnutls-deb0.so.28
|
usr/lib/x86_64-linux-gnu/libgnutls-deb0.so.28
|
||||||
@@ -5849,6 +5904,9 @@ usr/lib/x86_64-linux-gnu/libicuuc.so.52
|
|||||||
usr/lib/x86_64-linux-gnu/libicuuc.so.52.1
|
usr/lib/x86_64-linux-gnu/libicuuc.so.52.1
|
||||||
usr/lib/x86_64-linux-gnu/libidn.so.11
|
usr/lib/x86_64-linux-gnu/libidn.so.11
|
||||||
usr/lib/x86_64-linux-gnu/libidn.so.11.6.12
|
usr/lib/x86_64-linux-gnu/libidn.so.11.6.12
|
||||||
|
usr/lib/x86_64-linux-gnu/libjbig.so.0
|
||||||
|
usr/lib/x86_64-linux-gnu/libjpeg.so.62
|
||||||
|
usr/lib/x86_64-linux-gnu/libjpeg.so.62.1.0
|
||||||
usr/lib/x86_64-linux-gnu/libk5crypto.so.3
|
usr/lib/x86_64-linux-gnu/libk5crypto.so.3
|
||||||
usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
|
usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
|
||||||
usr/lib/x86_64-linux-gnu/libkrb5.so.3
|
usr/lib/x86_64-linux-gnu/libkrb5.so.3
|
||||||
@@ -5874,6 +5932,14 @@ usr/lib/x86_64-linux-gnu/libstdc++.so.6
|
|||||||
usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
|
usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
|
||||||
usr/lib/x86_64-linux-gnu/libtasn1.so.6
|
usr/lib/x86_64-linux-gnu/libtasn1.so.6
|
||||||
usr/lib/x86_64-linux-gnu/libtasn1.so.6.3.2
|
usr/lib/x86_64-linux-gnu/libtasn1.so.6.3.2
|
||||||
|
usr/lib/x86_64-linux-gnu/libtiff.so.5
|
||||||
|
usr/lib/x86_64-linux-gnu/libtiff.so.5.2.0
|
||||||
|
usr/lib/x86_64-linux-gnu/libvpx.so.1
|
||||||
|
usr/lib/x86_64-linux-gnu/libvpx.so.1.3.0
|
||||||
|
usr/lib/x86_64-linux-gnu/libwebp.so.5
|
||||||
|
usr/lib/x86_64-linux-gnu/libwebp.so.5.0.1
|
||||||
|
usr/lib/x86_64-linux-gnu/libxcb.so.1
|
||||||
|
usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0
|
||||||
usr/lib/x86_64-linux-gnu/libxml2.so.2
|
usr/lib/x86_64-linux-gnu/libxml2.so.2
|
||||||
usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1
|
usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1
|
||||||
usr/lib/x86_64-linux-gnu/libxslt.so.1
|
usr/lib/x86_64-linux-gnu/libxslt.so.1
|
||||||
|
@@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = (
|
|||||||
|
|
||||||
manifest = (
|
manifest = (
|
||||||
appTitle = (defaultText = "Firefly III"),
|
appTitle = (defaultText = "Firefly III"),
|
||||||
appVersion = 1,
|
appVersion = 2,
|
||||||
appMarketingVersion = (defaultText = "4.6.9.1"),
|
appMarketingVersion = (defaultText = "4.6.10"),
|
||||||
|
|
||||||
actions = [
|
actions = [
|
||||||
# Define your "new document" handlers here.
|
# Define your "new document" handlers here.
|
||||||
|
@@ -11,6 +11,16 @@ export DEBIAN_FRONTEND=noninteractive
|
|||||||
apt-get update
|
apt-get update
|
||||||
apt-get install -y python-software-properties software-properties-common
|
apt-get install -y python-software-properties software-properties-common
|
||||||
|
|
||||||
|
# install all languages
|
||||||
|
sed -i 's/# nl_NL.UTF-8 UTF-8/nl_NL.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
|
sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
|
sed -i 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
|
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen
|
||||||
|
dpkg-reconfigure --frontend=noninteractive locales
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# actually add repository
|
# actually add repository
|
||||||
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E9C74FEEA2098A6E
|
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E9C74FEEA2098A6E
|
||||||
add-apt-repository "deb http://packages.dotdeb.org jessie all"
|
add-apt-repository "deb http://packages.dotdeb.org jessie all"
|
||||||
@@ -29,6 +39,10 @@ service mysql stop
|
|||||||
systemctl disable nginx
|
systemctl disable nginx
|
||||||
systemctl disable php7.1-fpm
|
systemctl disable php7.1-fpm
|
||||||
systemctl disable mysql
|
systemctl disable mysql
|
||||||
|
|
||||||
|
# make php.ini display errors:
|
||||||
|
sed -i 's/display_errors = Off/display_errors = On/g' /etc/php/7.1/fpm/php.ini
|
||||||
|
|
||||||
# patch /etc/php/7.1/fpm/pool.d/www.conf to not change uid/gid to www-data
|
# patch /etc/php/7.1/fpm/pool.d/www.conf to not change uid/gid to www-data
|
||||||
sed --in-place='' \
|
sed --in-place='' \
|
||||||
--expression='s/^listen.owner = www-data/;listen.owner = www-data/' \
|
--expression='s/^listen.owner = www-data/;listen.owner = www-data/' \
|
||||||
@@ -64,3 +78,5 @@ cat <<EOF > /etc/mysql/conf.d/sandstorm.cnf
|
|||||||
# Set the main data file to grow by 1MB at a time, rather than 8MB at a time.
|
# Set the main data file to grow by 1MB at a time, rather than 8MB at a time.
|
||||||
innodb_autoextend_increment = 1
|
innodb_autoextend_increment = 1
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
14
CHANGELOG.md
14
CHANGELOG.md
@@ -2,6 +2,20 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## [4.6.10] - 2017-11-xx
|
||||||
|
### Added
|
||||||
|
- Greatly expanded Docker support thanks to [alazare619](https://github.com/alazare619)
|
||||||
|
- [Issue 967](https://github.com/firefly-iii/firefly-iii/issues/967), thanks to [Aquariu](https://github.com/Aquariu)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Improved Sandstorm support.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- [Issue 963](https://github.com/firefly-iii/firefly-iii/issues/963), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- [Issue 970](https://github.com/firefly-iii/firefly-iii/issues/970), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- [Issue 971](https://github.com/firefly-iii/firefly-iii/issues/971), as reported by [gavu](https://github.com/gavu)
|
||||||
|
- Various Sandstorm.io related issues.
|
||||||
|
|
||||||
## [4.6.9] - 2017-10-22
|
## [4.6.9] - 2017-10-22
|
||||||
### Added
|
### Added
|
||||||
- Firefly III is now available on the [Sandstorm.io](https://apps.sandstorm.io/app/uws252ya9mep4t77tevn85333xzsgrpgth8q4y1rhknn1hammw70) market.
|
- Firefly III is now available on the [Sandstorm.io](https://apps.sandstorm.io/app/uws252ya9mep4t77tevn85333xzsgrpgth8q4y1rhknn1hammw70) market.
|
||||||
|
@@ -32,6 +32,7 @@ use Illuminate\Console\Command;
|
|||||||
use Illuminate\Support\MessageBag;
|
use Illuminate\Support\MessageBag;
|
||||||
use Log;
|
use Log;
|
||||||
use Monolog\Formatter\LineFormatter;
|
use Monolog\Formatter\LineFormatter;
|
||||||
|
use Preferences;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class CreateImport
|
* Class CreateImport
|
||||||
@@ -154,6 +155,9 @@ class CreateImport extends Command
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// clear cache for user:
|
||||||
|
Preferences::setForUser($user, 'lastActivity', microtime());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -112,12 +112,17 @@ class AttachmentHelper implements AttachmentHelperInterface
|
|||||||
public function saveAttachmentsForModel(Model $model, ?array $files): bool
|
public function saveAttachmentsForModel(Model $model, ?array $files): bool
|
||||||
{
|
{
|
||||||
if (is_array($files)) {
|
if (is_array($files)) {
|
||||||
|
/** @var UploadedFile $entry */
|
||||||
foreach ($files as $entry) {
|
foreach ($files as $entry) {
|
||||||
if (!is_null($entry)) {
|
if (!is_null($entry)) {
|
||||||
$this->processFile($entry, $model);
|
$this->processFile($entry, $model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Log::debug('Done processing uploads.');
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
Log::debug('Array of files is not an array. Probably nothing uploaded. Will not store attachments.');
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -138,6 +143,7 @@ class AttachmentHelper implements AttachmentHelperInterface
|
|||||||
if ($count > 0) {
|
if ($count > 0) {
|
||||||
$msg = (string)trans('validation.file_already_attached', ['name' => $name]);
|
$msg = (string)trans('validation.file_already_attached', ['name' => $name]);
|
||||||
$this->errors->add('attachments', $msg);
|
$this->errors->add('attachments', $msg);
|
||||||
|
Log::error($msg);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -204,6 +210,7 @@ class AttachmentHelper implements AttachmentHelperInterface
|
|||||||
if (!in_array($mime, $this->allowedMimes)) {
|
if (!in_array($mime, $this->allowedMimes)) {
|
||||||
$msg = (string)trans('validation.file_invalid_mime', ['name' => $name, 'mime' => $mime]);
|
$msg = (string)trans('validation.file_invalid_mime', ['name' => $name, 'mime' => $mime]);
|
||||||
$this->errors->add('attachments', $msg);
|
$this->errors->add('attachments', $msg);
|
||||||
|
Log::error($msg);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -225,6 +232,7 @@ class AttachmentHelper implements AttachmentHelperInterface
|
|||||||
if ($size > $this->maxUploadSize) {
|
if ($size > $this->maxUploadSize) {
|
||||||
$msg = (string)trans('validation.file_too_large', ['name' => $name]);
|
$msg = (string)trans('validation.file_too_large', ['name' => $name]);
|
||||||
$this->errors->add('attachments', $msg);
|
$this->errors->add('attachments', $msg);
|
||||||
|
Log::error($msg);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -133,7 +133,7 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
public function addFilter(string $filter): JournalCollectorInterface
|
public function addFilter(string $filter): JournalCollectorInterface
|
||||||
{
|
{
|
||||||
$interfaces = class_implements($filter);
|
$interfaces = class_implements($filter);
|
||||||
if (in_array(FilterInterface::class, $interfaces) && !in_array($filter, $this->filters) ) {
|
if (in_array(FilterInterface::class, $interfaces) && !in_array($filter, $this->filters)) {
|
||||||
Log::debug(sprintf('Enabled filter %s', $filter));
|
Log::debug(sprintf('Enabled filter %s', $filter));
|
||||||
$this->filters[] = $filter;
|
$this->filters[] = $filter;
|
||||||
}
|
}
|
||||||
@@ -141,6 +141,78 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $amount
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function amountIs(string $amount): JournalCollectorInterface
|
||||||
|
{
|
||||||
|
$this->query->where(
|
||||||
|
function (EloquentBuilder $q) use ($amount) {
|
||||||
|
$q->where('transactions.amount', $amount);
|
||||||
|
$q->orWhere('transactions.amount', bcmul($amount, '-1'));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $amount
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function amountLess(string $amount): JournalCollectorInterface
|
||||||
|
{
|
||||||
|
$this->query->where(
|
||||||
|
function (EloquentBuilder $q1) use ($amount) {
|
||||||
|
$q1->where(
|
||||||
|
function (EloquentBuilder $q2) use ($amount) {
|
||||||
|
// amount < 0 and .amount > -$amount
|
||||||
|
$amount = bcmul($amount,'-1');
|
||||||
|
$q2->where('transactions.amount', '<', 0)->where('transactions.amount', '>', $amount);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
->orWhere(
|
||||||
|
function (EloquentBuilder $q3) use ($amount) {
|
||||||
|
// amount > 0 and .amount < $amount
|
||||||
|
$q3->where('transactions.amount', '>', 0)->where('transactions.amount', '<', $amount);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $amount
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function amountMore(string $amount): JournalCollectorInterface
|
||||||
|
{
|
||||||
|
$this->query->where(
|
||||||
|
function (EloquentBuilder $q1) use ($amount) {
|
||||||
|
$q1->where(
|
||||||
|
function (EloquentBuilder $q2) use ($amount) {
|
||||||
|
// amount < 0 and .amount < -$amount
|
||||||
|
$amount = bcmul($amount,'-1');
|
||||||
|
$q2->where('transactions.amount', '<', 0)->where('transactions.amount', '<', $amount);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
->orWhere(
|
||||||
|
function (EloquentBuilder $q3) use ($amount) {
|
||||||
|
// amount > 0 and .amount > $amount
|
||||||
|
$q3->where('transactions.amount', '>', 0)->where('transactions.amount', '>', $amount);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return int
|
* @return int
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
@@ -251,6 +323,20 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Carbon $after
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function setAfter(Carbon $after): JournalCollectorInterface
|
||||||
|
{
|
||||||
|
$afterStr = $after->format('Y-m-d');
|
||||||
|
$this->query->where('transaction_journals.date', '>=', $afterStr);
|
||||||
|
Log::debug(sprintf('JournalCollector range is now after %s (inclusive)', $afterStr));
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return JournalCollectorInterface
|
* @return JournalCollectorInterface
|
||||||
*/
|
*/
|
||||||
@@ -273,6 +359,20 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Carbon $before
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function setBefore(Carbon $before): JournalCollectorInterface
|
||||||
|
{
|
||||||
|
$beforeStr = $before->format('Y-m-d');
|
||||||
|
$this->query->where('transaction_journals.date', '<=', $beforeStr);
|
||||||
|
Log::debug(sprintf('JournalCollector range is now before %s (inclusive)', $beforeStr));
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Collection $bills
|
* @param Collection $bills
|
||||||
*
|
*
|
||||||
@@ -523,7 +623,7 @@ class JournalCollector implements JournalCollectorInterface
|
|||||||
->orderBy('transaction_journals.order', 'ASC')
|
->orderBy('transaction_journals.order', 'ASC')
|
||||||
->orderBy('transaction_journals.id', 'DESC')
|
->orderBy('transaction_journals.id', 'DESC')
|
||||||
->orderBy('transaction_journals.description', 'DESC')
|
->orderBy('transaction_journals.description', 'DESC')
|
||||||
->orderBy('transactions.amount','DESC');
|
->orderBy('transactions.amount', 'DESC');
|
||||||
|
|
||||||
$this->query = $query;
|
$this->query = $query;
|
||||||
|
|
||||||
|
@@ -45,6 +45,27 @@ interface JournalCollectorInterface
|
|||||||
*/
|
*/
|
||||||
public function addFilter(string $filter): JournalCollectorInterface;
|
public function addFilter(string $filter): JournalCollectorInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $amount
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function amountMore(string $amount): JournalCollectorInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $amount
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function amountLess(string $amount): JournalCollectorInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $amount
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function amountIs(string $amount): JournalCollectorInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
@@ -74,11 +95,25 @@ interface JournalCollectorInterface
|
|||||||
*/
|
*/
|
||||||
public function setAccounts(Collection $accounts): JournalCollectorInterface;
|
public function setAccounts(Collection $accounts): JournalCollectorInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Carbon $after
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function setAfter(Carbon $after): JournalCollectorInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return JournalCollectorInterface
|
* @return JournalCollectorInterface
|
||||||
*/
|
*/
|
||||||
public function setAllAssetAccounts(): JournalCollectorInterface;
|
public function setAllAssetAccounts(): JournalCollectorInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Carbon $before
|
||||||
|
*
|
||||||
|
* @return JournalCollectorInterface
|
||||||
|
*/
|
||||||
|
public function setBefore(Carbon $before): JournalCollectorInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Collection $bills
|
* @param Collection $bills
|
||||||
*
|
*
|
||||||
|
@@ -27,7 +27,6 @@ use Carbon\Carbon;
|
|||||||
use Exception;
|
use Exception;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
|
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
|
||||||
use FireflyIII\Helpers\Filter\InternalTransferFilter;
|
|
||||||
use FireflyIII\Http\Requests\BudgetFormRequest;
|
use FireflyIII\Http\Requests\BudgetFormRequest;
|
||||||
use FireflyIII\Http\Requests\BudgetIncomeRequest;
|
use FireflyIII\Http\Requests\BudgetIncomeRequest;
|
||||||
use FireflyIII\Models\Budget;
|
use FireflyIII\Models\Budget;
|
||||||
@@ -49,6 +48,7 @@ use View;
|
|||||||
*
|
*
|
||||||
* @package FireflyIII\Http\Controllers
|
* @package FireflyIII\Http\Controllers
|
||||||
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
||||||
|
* @SuppressWarnings(PHPMD.TooManyPublicMethods)
|
||||||
*/
|
*/
|
||||||
class BudgetController extends Controller
|
class BudgetController extends Controller
|
||||||
{
|
{
|
||||||
@@ -256,6 +256,7 @@ class BudgetController extends Controller
|
|||||||
/**
|
/**
|
||||||
* @param Carbon $start
|
* @param Carbon $start
|
||||||
* @param Carbon $end
|
* @param Carbon $end
|
||||||
|
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
||||||
*
|
*
|
||||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||||
*/
|
*/
|
||||||
@@ -269,50 +270,49 @@ class BudgetController extends Controller
|
|||||||
|
|
||||||
if ($cache->has()) {
|
if ($cache->has()) {
|
||||||
$result = $cache->get(); // @codeCoverageIgnore
|
$result = $cache->get(); // @codeCoverageIgnore
|
||||||
|
|
||||||
|
return view('budgets.info', compact('result', 'begin', 'currentEnd'));
|
||||||
}
|
}
|
||||||
if (!$cache->has()) {
|
$result = [
|
||||||
$result = [
|
'available' => '0',
|
||||||
'available' => '0',
|
'earned' => '0',
|
||||||
'earned' => '0',
|
'suggested' => '0',
|
||||||
'suggested' => '0',
|
];
|
||||||
];
|
$currency = app('amount')->getDefaultCurrency();
|
||||||
$currency = app('amount')->getDefaultCurrency();
|
$range = Preferences::get('viewRange', '1M')->data;
|
||||||
$range = Preferences::get('viewRange', '1M')->data;
|
$begin = Navigation::subtractPeriod($start, $range, 3);
|
||||||
$begin = Navigation::subtractPeriod($start, $range, 3);
|
|
||||||
|
|
||||||
// get average amount available.
|
// get average amount available.
|
||||||
$total = '0';
|
$total = '0';
|
||||||
$count = 0;
|
$count = 0;
|
||||||
$currentStart = clone $begin;
|
$currentStart = clone $begin;
|
||||||
while ($currentStart < $start) {
|
while ($currentStart < $start) {
|
||||||
$currentEnd = Navigation::endOfPeriod($currentStart, $range);
|
$currentEnd = Navigation::endOfPeriod($currentStart, $range);
|
||||||
$total = bcadd($total, $this->repository->getAvailableBudget($currency, $currentStart, $currentEnd));
|
$total = bcadd($total, $this->repository->getAvailableBudget($currency, $currentStart, $currentEnd));
|
||||||
$currentStart = Navigation::addPeriod($currentStart, $range, 0);
|
$currentStart = Navigation::addPeriod($currentStart, $range, 0);
|
||||||
$count++;
|
$count++;
|
||||||
}
|
|
||||||
$result['available'] = bcdiv($total, strval($count));
|
|
||||||
|
|
||||||
// amount earned in this period:
|
|
||||||
$subDay = clone $end;
|
|
||||||
$subDay->subDay();
|
|
||||||
/** @var JournalCollectorInterface $collector */
|
|
||||||
$collector = app(JournalCollectorInterface::class);
|
|
||||||
$collector->setAllAssetAccounts()->setRange($begin, $subDay)->setTypes([TransactionType::DEPOSIT])->withOpposingAccount();
|
|
||||||
$result['earned'] = bcdiv(strval($collector->getJournals()->sum('transaction_amount')), strval($count));
|
|
||||||
|
|
||||||
// amount spent in period
|
|
||||||
/** @var JournalCollectorInterface $collector */
|
|
||||||
$collector = app(JournalCollectorInterface::class);
|
|
||||||
$collector->setAllAssetAccounts()->setRange($begin, $subDay)->setTypes([TransactionType::WITHDRAWAL])->withOpposingAccount();
|
|
||||||
$result['spent'] = bcdiv(strval($collector->getJournals()->sum('transaction_amount')), strval($count));
|
|
||||||
// suggestion starts with the amount spent
|
|
||||||
$result['suggested'] = bcmul($result['spent'], '-1');
|
|
||||||
$result['suggested'] = bccomp($result['suggested'], $result['earned']) === 1 ? $result['earned'] : $result['suggested'];
|
|
||||||
// unless it's more than you earned. So min() of suggested/earned
|
|
||||||
|
|
||||||
|
|
||||||
$cache->store($result);
|
|
||||||
}
|
}
|
||||||
|
$result['available'] = bcdiv($total, strval($count));
|
||||||
|
|
||||||
|
// amount earned in this period:
|
||||||
|
$subDay = clone $end;
|
||||||
|
$subDay->subDay();
|
||||||
|
/** @var JournalCollectorInterface $collector */
|
||||||
|
$collector = app(JournalCollectorInterface::class);
|
||||||
|
$collector->setAllAssetAccounts()->setRange($begin, $subDay)->setTypes([TransactionType::DEPOSIT])->withOpposingAccount();
|
||||||
|
$result['earned'] = bcdiv(strval($collector->getJournals()->sum('transaction_amount')), strval($count));
|
||||||
|
|
||||||
|
// amount spent in period
|
||||||
|
/** @var JournalCollectorInterface $collector */
|
||||||
|
$collector = app(JournalCollectorInterface::class);
|
||||||
|
$collector->setAllAssetAccounts()->setRange($begin, $subDay)->setTypes([TransactionType::WITHDRAWAL])->withOpposingAccount();
|
||||||
|
$result['spent'] = bcdiv(strval($collector->getJournals()->sum('transaction_amount')), strval($count));
|
||||||
|
// suggestion starts with the amount spent
|
||||||
|
$result['suggested'] = bcmul($result['spent'], '-1');
|
||||||
|
$result['suggested'] = bccomp($result['suggested'], $result['earned']) === 1 ? $result['earned'] : $result['suggested'];
|
||||||
|
// unless it's more than you earned. So min() of suggested/earned
|
||||||
|
|
||||||
|
$cache->store($result);
|
||||||
|
|
||||||
|
|
||||||
return view('budgets.info', compact('result', 'begin', 'currentEnd'));
|
return view('budgets.info', compact('result', 'begin', 'currentEnd'));
|
||||||
@@ -573,9 +573,7 @@ class BudgetController extends Controller
|
|||||||
$start = Navigation::startOfPeriod($start, $range);
|
$start = Navigation::startOfPeriod($start, $range);
|
||||||
$end = Navigation::endOfX(new Carbon, $range, null);
|
$end = Navigation::endOfX(new Carbon, $range, null);
|
||||||
$entries = new Collection;
|
$entries = new Collection;
|
||||||
|
$cache = new CacheProperties;
|
||||||
// properties for cache
|
|
||||||
$cache = new CacheProperties;
|
|
||||||
$cache->addProperty($start);
|
$cache->addProperty($start);
|
||||||
$cache->addProperty($end);
|
$cache->addProperty($end);
|
||||||
$cache->addProperty('no-budget-period-entries');
|
$cache->addProperty('no-budget-period-entries');
|
||||||
@@ -588,25 +586,15 @@ class BudgetController extends Controller
|
|||||||
while ($end >= $start) {
|
while ($end >= $start) {
|
||||||
$end = Navigation::startOfPeriod($end, $range);
|
$end = Navigation::startOfPeriod($end, $range);
|
||||||
$currentEnd = Navigation::endOfPeriod($end, $range);
|
$currentEnd = Navigation::endOfPeriod($end, $range);
|
||||||
|
|
||||||
// count journals without budget in this period:
|
|
||||||
/** @var JournalCollectorInterface $collector */
|
/** @var JournalCollectorInterface $collector */
|
||||||
$collector = app(JournalCollectorInterface::class);
|
$collector = app(JournalCollectorInterface::class);
|
||||||
$collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutBudget()->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL]);
|
$collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutBudget()->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL]);
|
||||||
$set = $collector->getJournals();
|
$set = $collector->getJournals();
|
||||||
$sum = $set->sum('transaction_amount');
|
$sum = $set->sum('transaction_amount') ?? '0';
|
||||||
$journals = $set->count();
|
$journals = $set->count();
|
||||||
$dateStr = $end->format('Y-m-d');
|
$dateStr = $end->format('Y-m-d');
|
||||||
$dateName = Navigation::periodShow($end, $range);
|
$dateName = Navigation::periodShow($end, $range);
|
||||||
$entries->push(
|
$entries->push(['string' => $dateStr, 'name' => $dateName, 'count' => $journals, 'sum' => $sum, 'date' => clone $end,]);
|
||||||
[
|
|
||||||
'string' => $dateStr,
|
|
||||||
'name' => $dateName,
|
|
||||||
'count' => $journals,
|
|
||||||
'sum' => $sum,
|
|
||||||
'date' => clone $end,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
$end = Navigation::subtractPeriod($end, $range, 1);
|
$end = Navigation::subtractPeriod($end, $range, 1);
|
||||||
}
|
}
|
||||||
$cache->store($entries);
|
$cache->store($entries);
|
||||||
|
@@ -25,6 +25,7 @@ namespace FireflyIII\Http\Controllers;
|
|||||||
|
|
||||||
use Artisan;
|
use Artisan;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use DB;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
|
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
|
||||||
use FireflyIII\Models\AccountType;
|
use FireflyIII\Models\AccountType;
|
||||||
@@ -87,6 +88,18 @@ class HomeController extends Controller
|
|||||||
Session::put('end', $end);
|
Session::put('end', $end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function displayDebug()
|
||||||
|
{
|
||||||
|
$phpVersion = PHP_VERSION;
|
||||||
|
$now = Carbon::create()->format('Y-m-d H:i:s e');
|
||||||
|
$extensions = join(', ', get_loaded_extensions());
|
||||||
|
$drivers = join(', ', DB::availableDrivers());
|
||||||
|
$currentDriver = DB::getDriverName();
|
||||||
|
|
||||||
|
return view('debug', compact('phpVersion', 'extensions', 'carbon', 'now', 'drivers','currentDriver'));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
@@ -157,7 +170,7 @@ class HomeController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
return view(
|
return view(
|
||||||
'index', compact('count', 'subTitle', 'transactions', 'showDeps','billCount')
|
'index', compact('count', 'subTitle', 'transactions', 'showDeps', 'billCount')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -142,26 +142,23 @@ class JavascriptController extends Controller
|
|||||||
];
|
];
|
||||||
Log::debug(sprintf('viewRange is %s', $viewRange));
|
Log::debug(sprintf('viewRange is %s', $viewRange));
|
||||||
|
|
||||||
// get the format for the ranges:
|
|
||||||
$format = $this->getFormatByRange($viewRange);
|
|
||||||
|
|
||||||
// when current range is a custom range, add the current period as the next range.
|
// when current range is a custom range, add the current period as the next range.
|
||||||
if ($isCustom) {
|
if ($isCustom) {
|
||||||
Log::debug('Custom is true.');
|
Log::debug('Custom is true.');
|
||||||
$index = $start->formatLocalized($format);
|
$index = Navigation::periodShow($start, $viewRange);
|
||||||
$customPeriodStart = Navigation::startOfPeriod($start, $viewRange);
|
$customPeriodStart = Navigation::startOfPeriod($start, $viewRange);
|
||||||
$customPeriodEnd = Navigation::endOfPeriod($customPeriodStart, $viewRange);
|
$customPeriodEnd = Navigation::endOfPeriod($customPeriodStart, $viewRange);
|
||||||
$ranges[$index] = [$customPeriodStart, $customPeriodEnd];
|
$ranges[$index] = [$customPeriodStart, $customPeriodEnd];
|
||||||
}
|
}
|
||||||
// then add previous range and next range
|
// then add previous range and next range
|
||||||
$previousDate = Navigation::subtractPeriod($start, $viewRange);
|
$previousDate = Navigation::subtractPeriod($start, $viewRange);
|
||||||
$index = $previousDate->formatLocalized($format);
|
$index = Navigation::periodShow($previousDate, $viewRange);
|
||||||
$previousStart = Navigation::startOfPeriod($previousDate, $viewRange);
|
$previousStart = Navigation::startOfPeriod($previousDate, $viewRange);
|
||||||
$previousEnd = Navigation::endOfPeriod($previousStart, $viewRange);
|
$previousEnd = Navigation::endOfPeriod($previousStart, $viewRange);
|
||||||
$ranges[$index] = [$previousStart, $previousEnd];
|
$ranges[$index] = [$previousStart, $previousEnd];
|
||||||
|
|
||||||
$nextDate = Navigation::addPeriod($start, $viewRange, 0);
|
$nextDate = Navigation::addPeriod($start, $viewRange, 0);
|
||||||
$index = $nextDate->formatLocalized($format);
|
$index = Navigation::periodShow($nextDate, $viewRange);
|
||||||
$nextStart = Navigation::startOfPeriod($nextDate, $viewRange);
|
$nextStart = Navigation::startOfPeriod($nextDate, $viewRange);
|
||||||
$nextEnd = Navigation::endOfPeriod($nextStart, $viewRange);
|
$nextEnd = Navigation::endOfPeriod($nextStart, $viewRange);
|
||||||
$ranges[$index] = [$nextStart, $nextEnd];
|
$ranges[$index] = [$nextStart, $nextEnd];
|
||||||
@@ -188,33 +185,4 @@ class JavascriptController extends Controller
|
|||||||
return $return;
|
return $return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getFormatByRange(string $viewRange): string
|
|
||||||
{
|
|
||||||
switch ($viewRange) {
|
|
||||||
default:
|
|
||||||
throw new FireflyException(sprintf('The date picker does not yet support "%s".', $viewRange)); // @codeCoverageIgnore
|
|
||||||
case '1D':
|
|
||||||
case 'custom':
|
|
||||||
$format = (string)trans('config.month_and_day');
|
|
||||||
break;
|
|
||||||
case '3M':
|
|
||||||
$format = (string)trans('config.quarter_in_year');
|
|
||||||
break;
|
|
||||||
case '6M':
|
|
||||||
$format = (string)trans('config.half_year');
|
|
||||||
break;
|
|
||||||
case '1Y':
|
|
||||||
$format = (string)trans('config.year');
|
|
||||||
break;
|
|
||||||
case '1M':
|
|
||||||
$format = (string)trans('config.month');
|
|
||||||
break;
|
|
||||||
case '1W':
|
|
||||||
$format = (string)trans('config.week_in_year');
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $format;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
74
app/Http/Controllers/Json/FrontpageController.php
Normal file
74
app/Http/Controllers/Json/FrontpageController.php
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* FrontpageController.php
|
||||||
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Http\Controllers\Json;
|
||||||
|
|
||||||
|
use FireflyIII\Http\Controllers\Controller;
|
||||||
|
use FireflyIII\Models\PiggyBank;
|
||||||
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class FrontpageController
|
||||||
|
*
|
||||||
|
* @package FireflyIII\Http\Controllers\Json
|
||||||
|
*/
|
||||||
|
class FrontpageController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function piggyBanks(PiggyBankRepositoryInterface $repository)
|
||||||
|
{
|
||||||
|
$set = $repository->getPiggyBanks();
|
||||||
|
$info = [];
|
||||||
|
/** @var PiggyBank $piggyBank */
|
||||||
|
foreach ($set as $piggyBank) {
|
||||||
|
$rep = $piggyBank->currentRelevantRep();
|
||||||
|
$amount = strval($rep->currentamount);
|
||||||
|
if (!is_null($rep->id) && bccomp($amount, '0') === 1) {
|
||||||
|
|
||||||
|
// percentage!
|
||||||
|
$pct = round(($amount / $piggyBank->targetamount) * 100);
|
||||||
|
|
||||||
|
$entry = [
|
||||||
|
'id' => $piggyBank->id,
|
||||||
|
'name' => $piggyBank->name,
|
||||||
|
'amount' => $amount,
|
||||||
|
'target' => $piggyBank->targetamount,
|
||||||
|
'percentage' => $pct,
|
||||||
|
];
|
||||||
|
|
||||||
|
$info[] = $entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
$html = '';
|
||||||
|
if (count($info) > 0) {
|
||||||
|
$html = view('json.piggy-banks', compact('info'))->render();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response::json(['html' => $html]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -26,6 +26,7 @@ namespace FireflyIII\Http\Controllers;
|
|||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Http\Requests\NewUserFormRequest;
|
use FireflyIII\Http\Requests\NewUserFormRequest;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
use Preferences;
|
use Preferences;
|
||||||
use Session;
|
use Session;
|
||||||
use View;
|
use View;
|
||||||
@@ -81,7 +82,7 @@ class NewUserController extends Controller
|
|||||||
*
|
*
|
||||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||||
*/
|
*/
|
||||||
public function submit(NewUserFormRequest $request, AccountRepositoryInterface $repository)
|
public function submit(NewUserFormRequest $request, AccountRepositoryInterface $repository, CurrencyRepositoryInterface $currencyRepository)
|
||||||
{
|
{
|
||||||
// create normal asset account:
|
// create normal asset account:
|
||||||
$this->createAssetAccount($request, $repository);
|
$this->createAssetAccount($request, $repository);
|
||||||
@@ -89,6 +90,16 @@ class NewUserController extends Controller
|
|||||||
// create savings account
|
// create savings account
|
||||||
$this->createSavingsAccount($request, $repository);
|
$this->createSavingsAccount($request, $repository);
|
||||||
|
|
||||||
|
// also store currency preference from input:
|
||||||
|
$currency = $currencyRepository->find(intval($request->input('amount_currency_id_bank_balance')));
|
||||||
|
|
||||||
|
if(!is_null($currency->id)) {
|
||||||
|
// store currency preference:
|
||||||
|
Preferences::set('currencyPreference', $currency->code);
|
||||||
|
Preferences::mark();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Session::flash('success', strval(trans('firefly.stored_new_accounts_new_user')));
|
Session::flash('success', strval(trans('firefly.stored_new_accounts_new_user')));
|
||||||
Preferences::mark();
|
Preferences::mark();
|
||||||
|
|
||||||
@@ -137,7 +148,7 @@ class NewUserController extends Controller
|
|||||||
'accountRole' => 'savingAsset',
|
'accountRole' => 'savingAsset',
|
||||||
'openingBalance' => round($request->input('savings_balance'), 12),
|
'openingBalance' => round($request->input('savings_balance'), 12),
|
||||||
'openingBalanceDate' => new Carbon,
|
'openingBalanceDate' => new Carbon,
|
||||||
'currency_id' => intval($request->input('amount_currency_id_savings_balance')),
|
'currency_id' => intval($request->input('amount_currency_id_bank_balance')),
|
||||||
];
|
];
|
||||||
$repository->store($savingsAccount);
|
$repository->store($savingsAccount);
|
||||||
|
|
||||||
|
@@ -285,7 +285,7 @@ class PiggyBankController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function postAdd(Request $request, PiggyBankRepositoryInterface $repository, PiggyBank $piggyBank)
|
public function postAdd(Request $request, PiggyBankRepositoryInterface $repository, PiggyBank $piggyBank)
|
||||||
{
|
{
|
||||||
$amount = $request->get('amount');
|
$amount = $request->get('amount') ?? '0';
|
||||||
$currency = app('amount')->getDefaultCurrency();
|
$currency = app('amount')->getDefaultCurrency();
|
||||||
if ($repository->canAddAmount($piggyBank, $amount)) {
|
if ($repository->canAddAmount($piggyBank, $amount)) {
|
||||||
$repository->addAmount($piggyBank, $amount);
|
$repository->addAmount($piggyBank, $amount);
|
||||||
@@ -324,7 +324,7 @@ class PiggyBankController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function postRemove(Request $request, PiggyBankRepositoryInterface $repository, PiggyBank $piggyBank)
|
public function postRemove(Request $request, PiggyBankRepositoryInterface $repository, PiggyBank $piggyBank)
|
||||||
{
|
{
|
||||||
$amount = $request->get('amount');
|
$amount = $request->get('amount') ?? '0';
|
||||||
$currency = app('amount')->getDefaultCurrency();
|
$currency = app('amount')->getDefaultCurrency();
|
||||||
if ($repository->canRemoveAmount($piggyBank, $amount)) {
|
if ($repository->canRemoveAmount($piggyBank, $amount)) {
|
||||||
$repository->removeAmount($piggyBank, $amount);
|
$repository->removeAmount($piggyBank, $amount);
|
||||||
|
@@ -67,9 +67,9 @@ class PreferencesController extends Controller
|
|||||||
public function code(Google2FA $google2fa)
|
public function code(Google2FA $google2fa)
|
||||||
{
|
{
|
||||||
$domain = $this->getDomain();
|
$domain = $this->getDomain();
|
||||||
$secret = $google2fa->generateSecretKey(16);
|
$secret = $google2fa->generateSecretKey();
|
||||||
Session::flash('two-factor-secret', $secret);
|
Session::flash('two-factor-secret', $secret);
|
||||||
$image = $google2fa->getQRCodeInline('Firefly III at ' . $domain, auth()->user()->email, $secret, 150);
|
$image = $google2fa->getQRCodeInline($domain, auth()->user()->email, $secret, 200);
|
||||||
|
|
||||||
|
|
||||||
return view('preferences.code', compact('image'));
|
return view('preferences.code', compact('image'));
|
||||||
|
@@ -261,6 +261,7 @@ class ReportController extends Controller
|
|||||||
* @param ReportFormRequest $request
|
* @param ReportFormRequest $request
|
||||||
*
|
*
|
||||||
* @return RedirectResponse|\Illuminate\Routing\Redirector
|
* @return RedirectResponse|\Illuminate\Routing\Redirector
|
||||||
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||||
*/
|
*/
|
||||||
public function postIndex(ReportFormRequest $request)
|
public function postIndex(ReportFormRequest $request)
|
||||||
{
|
{
|
||||||
@@ -299,7 +300,7 @@ class ReportController extends Controller
|
|||||||
return redirect(route('reports.index'));
|
return redirect(route('reports.index'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($end < $start) {
|
if ($request->getEndDate() < $request->getStartDate()) {
|
||||||
return view('error')->with('message', trans('firefly.end_after_start_date'));
|
return view('error')->with('message', trans('firefly.end_after_start_date'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace FireflyIII\Http\Controllers;
|
namespace FireflyIII\Http\Controllers;
|
||||||
|
|
||||||
|
use FireflyIII\Support\CacheProperties;
|
||||||
use FireflyIII\Support\Search\SearchInterface;
|
use FireflyIII\Support\Search\SearchInterface;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Response;
|
use Response;
|
||||||
@@ -75,11 +76,24 @@ class SearchController extends Controller
|
|||||||
{
|
{
|
||||||
$fullQuery = strval($request->get('query'));
|
$fullQuery = strval($request->get('query'));
|
||||||
|
|
||||||
// parse search terms:
|
// cache
|
||||||
$searcher->parseQuery($fullQuery);
|
$cache = new CacheProperties;
|
||||||
$searcher->setLimit(20);
|
$cache->addProperty('search');
|
||||||
$transactions = $searcher->searchTransactions();
|
$cache->addProperty($fullQuery);
|
||||||
$html = view('search.search', compact('transactions'))->render();
|
|
||||||
|
if ($cache->has()) {
|
||||||
|
$transactions = $cache->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$cache->has()) {
|
||||||
|
// parse search terms:
|
||||||
|
$searcher->parseQuery($fullQuery);
|
||||||
|
$searcher->setLimit(intval(env('SEARCH_RESULT_LIMIT', 50)));
|
||||||
|
$transactions = $searcher->searchTransactions();
|
||||||
|
$cache->store($transactions);
|
||||||
|
}
|
||||||
|
|
||||||
|
$html = view('search.search', compact('transactions'))->render();
|
||||||
|
|
||||||
return Response::json(['count' => $transactions->count(), 'html' => $html]);
|
return Response::json(['count' => $transactions->count(), 'html' => $html]);
|
||||||
|
|
||||||
|
@@ -355,6 +355,7 @@ class SingleController extends Controller
|
|||||||
$this->attachments->saveAttachmentsForModel($journal, $files);
|
$this->attachments->saveAttachmentsForModel($journal, $files);
|
||||||
|
|
||||||
// store the journal only, flash the rest.
|
// store the journal only, flash the rest.
|
||||||
|
Log::debug(sprintf('Count of error messages is %d', $this->attachments->getErrors()->count()));
|
||||||
if (count($this->attachments->getErrors()->get('attachments')) > 0) {
|
if (count($this->attachments->getErrors()->get('attachments')) > 0) {
|
||||||
Session::flash('error', $this->attachments->getErrors()->get('attachments'));
|
Session::flash('error', $this->attachments->getErrors()->get('attachments'));
|
||||||
}
|
}
|
||||||
|
@@ -42,6 +42,7 @@ use FireflyIII\Http\Middleware\Range;
|
|||||||
use FireflyIII\Http\Middleware\RedirectIfAuthenticated;
|
use FireflyIII\Http\Middleware\RedirectIfAuthenticated;
|
||||||
use FireflyIII\Http\Middleware\RedirectIfTwoFactorAuthenticated;
|
use FireflyIII\Http\Middleware\RedirectIfTwoFactorAuthenticated;
|
||||||
use FireflyIII\Http\Middleware\Sandstorm;
|
use FireflyIII\Http\Middleware\Sandstorm;
|
||||||
|
use FireflyIII\Http\Middleware\StartFireflySession;
|
||||||
use FireflyIII\Http\Middleware\TrimStrings;
|
use FireflyIII\Http\Middleware\TrimStrings;
|
||||||
use FireflyIII\Http\Middleware\TrustProxies;
|
use FireflyIII\Http\Middleware\TrustProxies;
|
||||||
use FireflyIII\Http\Middleware\VerifyCsrfToken;
|
use FireflyIII\Http\Middleware\VerifyCsrfToken;
|
||||||
@@ -54,7 +55,6 @@ use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
|
|||||||
use Illuminate\Foundation\Http\Middleware\ValidatePostSize;
|
use Illuminate\Foundation\Http\Middleware\ValidatePostSize;
|
||||||
use Illuminate\Routing\Middleware\SubstituteBindings;
|
use Illuminate\Routing\Middleware\SubstituteBindings;
|
||||||
use Illuminate\Routing\Middleware\ThrottleRequests;
|
use Illuminate\Routing\Middleware\ThrottleRequests;
|
||||||
use Illuminate\Session\Middleware\StartSession;
|
|
||||||
use Illuminate\View\Middleware\ShareErrorsFromSession;
|
use Illuminate\View\Middleware\ShareErrorsFromSession;
|
||||||
|
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ class Kernel extends HttpKernel
|
|||||||
Sandstorm::class,
|
Sandstorm::class,
|
||||||
EncryptCookies::class,
|
EncryptCookies::class,
|
||||||
AddQueuedCookiesToResponse::class,
|
AddQueuedCookiesToResponse::class,
|
||||||
StartSession::class,
|
StartFireflySession::class,
|
||||||
ShareErrorsFromSession::class,
|
ShareErrorsFromSession::class,
|
||||||
VerifyCsrfToken::class,
|
VerifyCsrfToken::class,
|
||||||
SubstituteBindings::class,
|
SubstituteBindings::class,
|
||||||
@@ -102,7 +102,7 @@ class Kernel extends HttpKernel
|
|||||||
Sandstorm::class,
|
Sandstorm::class,
|
||||||
EncryptCookies::class,
|
EncryptCookies::class,
|
||||||
AddQueuedCookiesToResponse::class,
|
AddQueuedCookiesToResponse::class,
|
||||||
StartSession::class,
|
StartFireflySession::class,
|
||||||
ShareErrorsFromSession::class,
|
ShareErrorsFromSession::class,
|
||||||
VerifyCsrfToken::class,
|
VerifyCsrfToken::class,
|
||||||
SubstituteBindings::class,
|
SubstituteBindings::class,
|
||||||
@@ -115,7 +115,7 @@ class Kernel extends HttpKernel
|
|||||||
Sandstorm::class,
|
Sandstorm::class,
|
||||||
EncryptCookies::class,
|
EncryptCookies::class,
|
||||||
AddQueuedCookiesToResponse::class,
|
AddQueuedCookiesToResponse::class,
|
||||||
StartSession::class,
|
StartFireflySession::class,
|
||||||
ShareErrorsFromSession::class,
|
ShareErrorsFromSession::class,
|
||||||
VerifyCsrfToken::class,
|
VerifyCsrfToken::class,
|
||||||
SubstituteBindings::class,
|
SubstituteBindings::class,
|
||||||
@@ -130,7 +130,7 @@ class Kernel extends HttpKernel
|
|||||||
Sandstorm::class,
|
Sandstorm::class,
|
||||||
EncryptCookies::class,
|
EncryptCookies::class,
|
||||||
AddQueuedCookiesToResponse::class,
|
AddQueuedCookiesToResponse::class,
|
||||||
StartSession::class,
|
StartFireflySession::class,
|
||||||
ShareErrorsFromSession::class,
|
ShareErrorsFromSession::class,
|
||||||
VerifyCsrfToken::class,
|
VerifyCsrfToken::class,
|
||||||
SubstituteBindings::class,
|
SubstituteBindings::class,
|
||||||
@@ -145,7 +145,7 @@ class Kernel extends HttpKernel
|
|||||||
Sandstorm::class,
|
Sandstorm::class,
|
||||||
EncryptCookies::class,
|
EncryptCookies::class,
|
||||||
AddQueuedCookiesToResponse::class,
|
AddQueuedCookiesToResponse::class,
|
||||||
StartSession::class,
|
StartFireflySession::class,
|
||||||
ShareErrorsFromSession::class,
|
ShareErrorsFromSession::class,
|
||||||
VerifyCsrfToken::class,
|
VerifyCsrfToken::class,
|
||||||
SubstituteBindings::class,
|
SubstituteBindings::class,
|
||||||
@@ -163,7 +163,7 @@ class Kernel extends HttpKernel
|
|||||||
Sandstorm::class,
|
Sandstorm::class,
|
||||||
EncryptCookies::class,
|
EncryptCookies::class,
|
||||||
AddQueuedCookiesToResponse::class,
|
AddQueuedCookiesToResponse::class,
|
||||||
StartSession::class,
|
StartFireflySession::class,
|
||||||
ShareErrorsFromSession::class,
|
ShareErrorsFromSession::class,
|
||||||
VerifyCsrfToken::class,
|
VerifyCsrfToken::class,
|
||||||
SubstituteBindings::class,
|
SubstituteBindings::class,
|
||||||
|
@@ -49,6 +49,7 @@ class Sandstorm
|
|||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||||
*/
|
*/
|
||||||
public function handle(Request $request, Closure $next, $guard = null)
|
public function handle(Request $request, Closure $next, $guard = null)
|
||||||
{
|
{
|
||||||
|
67
app/Http/Middleware/StartFireflySession.php
Normal file
67
app/Http/Middleware/StartFireflySession.php
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StartFireflySession.php
|
||||||
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Http\Middleware;
|
||||||
|
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Session\Middleware\StartSession;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class StartFireflySession
|
||||||
|
*
|
||||||
|
* @package FireflyIII\Http\Middleware
|
||||||
|
*/
|
||||||
|
class StartFireflySession extends StartSession
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle an incoming request.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
* @param Closure $next
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
// public function handle($request, Closure $next)
|
||||||
|
// {
|
||||||
|
// return parent::handle($request, $next); // defer to the right stuff
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store the current URL for the request if necessary.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
* @param \Illuminate\Contracts\Session\Session $session
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function storeCurrentUrl(Request $request, $session)
|
||||||
|
{
|
||||||
|
$uri = $request->fullUrl();
|
||||||
|
$strpos = strpos($uri, 'jscript');
|
||||||
|
if ($request->method() === 'GET' && $request->route() && !$request->ajax() && $strpos === false) {
|
||||||
|
$session->setPreviousUrl($uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -165,6 +165,7 @@ class ImportAccount
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Account
|
* @return Account
|
||||||
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||||
*/
|
*/
|
||||||
private function findExistingObject(): Account
|
private function findExistingObject(): Account
|
||||||
{
|
{
|
||||||
|
@@ -125,7 +125,7 @@ class AbnAmroDescription implements SpecificInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the current description in SEPA format
|
* Parses the current description in SEPA format
|
||||||
*
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||||
* @return bool true if the description is SEPA format, false otherwise
|
* @return bool true if the description is SEPA format, false otherwise
|
||||||
*/
|
*/
|
||||||
protected function parseSepaDescription()
|
protected function parseSepaDescription()
|
||||||
|
49
app/Providers/SessionServiceProvider.php
Normal file
49
app/Providers/SessionServiceProvider.php
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* SessionServiceProvider.php
|
||||||
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Providers;
|
||||||
|
|
||||||
|
use FireflyIII\Http\Middleware\StartFireflySession;
|
||||||
|
use Illuminate\Session\SessionServiceProvider as BaseSessionServiceProvider;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class SessionServiceProvider
|
||||||
|
*
|
||||||
|
* @package FireflyIII\Providers
|
||||||
|
*/
|
||||||
|
class SessionServiceProvider extends BaseSessionServiceProvider
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Register the service provider.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
$this->registerSessionManager();
|
||||||
|
|
||||||
|
$this->registerSessionDriver();
|
||||||
|
|
||||||
|
$this->app->singleton(StartFireflySession::class);
|
||||||
|
}
|
||||||
|
}
|
@@ -221,8 +221,7 @@ class AccountRepository implements AccountRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
protected function openingBalanceTransaction(Account $account): TransactionJournal
|
protected function openingBalanceTransaction(Account $account): TransactionJournal
|
||||||
{
|
{
|
||||||
$journal = TransactionJournal::sortCorrectly()
|
$journal = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
|
||||||
->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
|
|
||||||
->where('transactions.account_id', $account->id)
|
->where('transactions.account_id', $account->id)
|
||||||
->transactionTypes([TransactionType::OPENING_BALANCE])
|
->transactionTypes([TransactionType::OPENING_BALANCE])
|
||||||
->first(['transaction_journals.*']);
|
->first(['transaction_journals.*']);
|
||||||
@@ -288,6 +287,8 @@ class AccountRepository implements AccountRepositoryInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* At this point strlen of amount > 0.
|
||||||
|
*
|
||||||
* @param Account $account
|
* @param Account $account
|
||||||
* @param array $data
|
* @param array $data
|
||||||
*
|
*
|
||||||
@@ -296,6 +297,7 @@ class AccountRepository implements AccountRepositoryInterface
|
|||||||
protected function storeInitialBalance(Account $account, array $data): TransactionJournal
|
protected function storeInitialBalance(Account $account, array $data): TransactionJournal
|
||||||
{
|
{
|
||||||
$amount = strval($data['openingBalance']);
|
$amount = strval($data['openingBalance']);
|
||||||
|
Log::debug(sprintf('Submitted amount is %s',$amount));
|
||||||
|
|
||||||
if (bccomp($amount, '0') === 0) {
|
if (bccomp($amount, '0') === 0) {
|
||||||
return new TransactionJournal;
|
return new TransactionJournal;
|
||||||
@@ -322,12 +324,15 @@ class AccountRepository implements AccountRepositoryInterface
|
|||||||
$secondAccount = $opposing;
|
$secondAccount = $opposing;
|
||||||
$firstAmount = $amount;
|
$firstAmount = $amount;
|
||||||
$secondAmount = bcmul($amount, '-1');
|
$secondAmount = bcmul($amount, '-1');
|
||||||
|
Log::debug(sprintf('First amount is %s, second amount is %s', $firstAmount, $secondAmount));
|
||||||
|
|
||||||
if ($data['openingBalance'] < 0) {
|
if (bccomp($amount,'0') === -1) {
|
||||||
|
Log::debug(sprintf('%s is a negative number.', $amount));
|
||||||
$firstAccount = $opposing;
|
$firstAccount = $opposing;
|
||||||
$secondAccount = $account;
|
$secondAccount = $account;
|
||||||
$firstAmount = bcmul($amount, '-1');
|
$firstAmount = bcmul($amount, '-1');
|
||||||
$secondAmount = $amount;
|
$secondAmount = $amount;
|
||||||
|
Log::debug(sprintf('First amount is %s, second amount is %s', $firstAmount, $secondAmount));
|
||||||
}
|
}
|
||||||
|
|
||||||
$one = new Transaction(
|
$one = new Transaction(
|
||||||
@@ -374,6 +379,7 @@ class AccountRepository implements AccountRepositoryInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
*
|
||||||
* @param Account $account
|
* @param Account $account
|
||||||
* @param array $data
|
* @param array $data
|
||||||
*
|
*
|
||||||
@@ -381,6 +387,7 @@ class AccountRepository implements AccountRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
protected function updateInitialBalance(Account $account, array $data): bool
|
protected function updateInitialBalance(Account $account, array $data): bool
|
||||||
{
|
{
|
||||||
|
Log::debug(sprintf('updateInitialBalance() for account #%d', $account->id));
|
||||||
$openingBalance = $this->openingBalanceTransaction($account);
|
$openingBalance = $this->openingBalanceTransaction($account);
|
||||||
|
|
||||||
// no opening balance journal? create it:
|
// no opening balance journal? create it:
|
||||||
@@ -457,6 +464,8 @@ class AccountRepository implements AccountRepositoryInterface
|
|||||||
$amount = strval($data['openingBalance']);
|
$amount = strval($data['openingBalance']);
|
||||||
$currencyId = intval($data['currency_id']);
|
$currencyId = intval($data['currency_id']);
|
||||||
|
|
||||||
|
Log::debug(sprintf('Submitted amount for opening balance to update is %s', $amount));
|
||||||
|
|
||||||
if (bccomp($amount, '0') === 0) {
|
if (bccomp($amount, '0') === 0) {
|
||||||
$journal->delete();
|
$journal->delete();
|
||||||
|
|
||||||
@@ -471,12 +480,15 @@ class AccountRepository implements AccountRepositoryInterface
|
|||||||
/** @var Transaction $transaction */
|
/** @var Transaction $transaction */
|
||||||
foreach ($journal->transactions()->get() as $transaction) {
|
foreach ($journal->transactions()->get() as $transaction) {
|
||||||
if ($account->id === $transaction->account_id) {
|
if ($account->id === $transaction->account_id) {
|
||||||
|
Log::debug(sprintf('Will change transaction #%d amount from %s to %s', $transaction->id, $transaction->amount, $amount));
|
||||||
$transaction->amount = $amount;
|
$transaction->amount = $amount;
|
||||||
$transaction->transaction_currency_id = $currencyId;
|
$transaction->transaction_currency_id = $currencyId;
|
||||||
$transaction->save();
|
$transaction->save();
|
||||||
}
|
}
|
||||||
if ($account->id !== $transaction->account_id) {
|
if ($account->id !== $transaction->account_id) {
|
||||||
$transaction->amount = bcmul($amount, '-1');
|
$negativeAmount = bcmul($amount, '-1');
|
||||||
|
Log::debug(sprintf('Will change transaction #%d amount from %s to %s', $transaction->id, $transaction->amount, $negativeAmount));
|
||||||
|
$transaction->amount = $negativeAmount;
|
||||||
$transaction->transaction_currency_id = $currencyId;
|
$transaction->transaction_currency_id = $currencyId;
|
||||||
$transaction->save();
|
$transaction->save();
|
||||||
}
|
}
|
||||||
@@ -495,7 +507,9 @@ class AccountRepository implements AccountRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
protected function validOpeningBalanceData(array $data): bool
|
protected function validOpeningBalanceData(array $data): bool
|
||||||
{
|
{
|
||||||
if (isset($data['openingBalance']) && isset($data['openingBalanceDate'])) {
|
$data['openingBalance'] = strval($data['openingBalance'] ?? '');
|
||||||
|
if (isset($data['openingBalance']) && !is_null($data['openingBalance']) && strlen($data['openingBalance']) > 0 &&
|
||||||
|
isset($data['openingBalanceDate'])) {
|
||||||
Log::debug('Array has valid opening balance data.');
|
Log::debug('Array has valid opening balance data.');
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@@ -111,7 +111,6 @@ class CurrencyRepository implements CurrencyRepositoryInterface
|
|||||||
$currency = TransactionCurrency::find($currencyId);
|
$currency = TransactionCurrency::find($currencyId);
|
||||||
if (is_null($currency)) {
|
if (is_null($currency)) {
|
||||||
$currency = new TransactionCurrency;
|
$currency = new TransactionCurrency;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $currency;
|
return $currency;
|
||||||
|
@@ -396,7 +396,7 @@ class RuleRepository implements RuleRepositoryInterface
|
|||||||
|
|
||||||
$this->storeTrigger($rule, $triggerValues);
|
$this->storeTrigger($rule, $triggerValues);
|
||||||
foreach ($data['rule-triggers'] as $index => $trigger) {
|
foreach ($data['rule-triggers'] as $index => $trigger) {
|
||||||
$value = $data['rule-trigger-values'][$index];
|
$value = $data['rule-trigger-values'][$index] ?? '';
|
||||||
$stopProcessing = isset($data['rule-trigger-stop'][$index]) ? true : false;
|
$stopProcessing = isset($data['rule-trigger-stop'][$index]) ? true : false;
|
||||||
|
|
||||||
$triggerValues = [
|
$triggerValues = [
|
||||||
|
@@ -394,6 +394,21 @@ abstract class BunqRequest
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $headers
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function joinHeaders(array $headers): string
|
||||||
|
{
|
||||||
|
$string = '';
|
||||||
|
foreach ($headers as $header => $value) {
|
||||||
|
$string .= $header . ': ' . trim($value) . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $response
|
* @param array $response
|
||||||
*
|
*
|
||||||
@@ -447,10 +462,7 @@ abstract class BunqRequest
|
|||||||
ksort($verifyHeaders);
|
ksort($verifyHeaders);
|
||||||
|
|
||||||
// add them to data to sign:
|
// add them to data to sign:
|
||||||
foreach ($verifyHeaders as $header => $value) {
|
$dataToVerify .= $this->joinHeaders($verifyHeaders);
|
||||||
$dataToVerify .= $header . ': ' . trim($value) . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
$signature = $headers['x-bunq-server-signature'][0];
|
$signature = $headers['x-bunq-server-signature'][0];
|
||||||
$dataToVerify .= "\n" . $body;
|
$dataToVerify .= "\n" . $body;
|
||||||
$result = openssl_verify($dataToVerify, base64_decode($signature), $this->serverPublicKey->getPublicKey(), OPENSSL_ALGO_SHA256);
|
$result = openssl_verify($dataToVerify, base64_decode($signature), $this->serverPublicKey->getPublicKey(), OPENSSL_ALGO_SHA256);
|
||||||
@@ -462,6 +474,8 @@ abstract class BunqRequest
|
|||||||
}
|
}
|
||||||
if (!is_int($result)) {
|
if (!is_int($result)) {
|
||||||
Log::error(sprintf('Result of verification is a boolean (%d), return false.', $result));
|
Log::error(sprintf('Result of verification is a boolean (%d), return false.', $result));
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
Log::info('Signature is a match, return true.');
|
Log::info('Signature is a match, return true.');
|
||||||
|
|
||||||
|
@@ -190,7 +190,7 @@ class Amount
|
|||||||
}
|
}
|
||||||
$cache->store(config('firefly.default_currency', 'EUR'));
|
$cache->store(config('firefly.default_currency', 'EUR'));
|
||||||
|
|
||||||
return config('firefly.default_currency', 'EUR');
|
return strval(config('firefly.default_currency', 'EUR'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -300,7 +300,6 @@ class ExpandedForm
|
|||||||
return $html;
|
return $html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $name
|
* @param string $name
|
||||||
* @param null $value
|
* @param null $value
|
||||||
@@ -331,6 +330,27 @@ class ExpandedForm
|
|||||||
return $html;
|
return $html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
* @param null $value
|
||||||
|
* @param array $options
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function number(string $name, $value = null, array $options = []): string
|
||||||
|
{
|
||||||
|
$label = $this->label($name, $options);
|
||||||
|
$options = $this->expandOptionArray($name, $label, $options);
|
||||||
|
$classes = $this->getHolderClasses($name);
|
||||||
|
$value = $this->fillFieldValue($name, $value);
|
||||||
|
$options['step'] = 'any';
|
||||||
|
unset($options['placeholder']);
|
||||||
|
|
||||||
|
$html = view('form.number', compact( 'classes', 'name', 'label', 'value', 'options'))->render();
|
||||||
|
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $type
|
* @param $type
|
||||||
* @param $name
|
* @param $name
|
||||||
|
@@ -233,7 +233,7 @@ class Navigation
|
|||||||
*/
|
*/
|
||||||
public function periodShow(Carbon $theDate, string $repeatFrequency): string
|
public function periodShow(Carbon $theDate, string $repeatFrequency): string
|
||||||
{
|
{
|
||||||
$date = clone $theDate;
|
$date = clone $theDate;
|
||||||
$formatMap = [
|
$formatMap = [
|
||||||
'1D' => trans('config.specific_day'),
|
'1D' => trans('config.specific_day'),
|
||||||
'daily' => trans('config.specific_day'),
|
'daily' => trans('config.specific_day'),
|
||||||
@@ -241,8 +241,8 @@ class Navigation
|
|||||||
'1W' => trans('config.week_in_year'),
|
'1W' => trans('config.week_in_year'),
|
||||||
'week' => trans('config.week_in_year'),
|
'week' => trans('config.week_in_year'),
|
||||||
'weekly' => trans('config.week_in_year'),
|
'weekly' => trans('config.week_in_year'),
|
||||||
'3M' => trans('config.quarter_of_year'),
|
//'3M' => trans('config.quarter_of_year'),
|
||||||
'quarter' => trans('config.quarter_of_year'),
|
//'quarter' => trans('config.quarter_of_year'),
|
||||||
'1M' => trans('config.month'),
|
'1M' => trans('config.month'),
|
||||||
'month' => trans('config.month'),
|
'month' => trans('config.month'),
|
||||||
'monthly' => trans('config.month'),
|
'monthly' => trans('config.month'),
|
||||||
@@ -253,10 +253,16 @@ class Navigation
|
|||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
if (isset($formatMap[$repeatFrequency])) {
|
if (isset($formatMap[$repeatFrequency])) {
|
||||||
return $date->formatLocalized(strval($formatMap[$repeatFrequency]));
|
return $date->formatLocalized(strval($formatMap[$repeatFrequency]));
|
||||||
}
|
}
|
||||||
|
if ($repeatFrequency === '3M' || $repeatFrequency === 'quarter') {
|
||||||
|
$quarter = ceil($theDate->month / 3);
|
||||||
|
|
||||||
|
return sprintf('Q%d %d', $quarter, $theDate->year);
|
||||||
|
}
|
||||||
|
|
||||||
|
// special formatter for quarter of year
|
||||||
throw new FireflyException(sprintf('No date formats for frequency "%s"!', $repeatFrequency));
|
throw new FireflyException(sprintf('No date formats for frequency "%s"!', $repeatFrequency));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -176,7 +176,7 @@ class Preferences
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $name
|
* @param $name
|
||||||
* @param string $value
|
* @param $value
|
||||||
*
|
*
|
||||||
* @return Preference
|
* @return Preference
|
||||||
*/
|
*/
|
||||||
|
@@ -28,6 +28,7 @@ use Carbon\Carbon;
|
|||||||
use Exception;
|
use Exception;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Models\Transaction;
|
use FireflyIII\Models\Transaction;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
use Log;
|
use Log;
|
||||||
use Steam;
|
use Steam;
|
||||||
|
|
||||||
@@ -51,65 +52,41 @@ class Modifier
|
|||||||
return $compare === $expected;
|
return $compare === $expected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $modifier
|
||||||
|
* @param Transaction $transaction
|
||||||
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
public static function apply(array $modifier, Transaction $transaction): bool
|
public static function apply(array $modifier, Transaction $transaction): bool
|
||||||
{
|
{
|
||||||
|
$res = true;
|
||||||
switch ($modifier['type']) {
|
switch ($modifier['type']) {
|
||||||
default:
|
|
||||||
throw new FireflyException(sprintf('Search modifier "%s" is not (yet) supported. Sorry!', $modifier['type']));
|
|
||||||
case 'amount':
|
|
||||||
case 'amount_is':
|
|
||||||
$res = self::amountCompare($transaction, $modifier['value'], 0);
|
|
||||||
Log::debug(sprintf('Amount is %s? %s', $modifier['value'], var_export($res, true)));
|
|
||||||
break;
|
|
||||||
case 'amount_min':
|
|
||||||
case 'amount_less':
|
|
||||||
$res = self::amountCompare($transaction, $modifier['value'], 1);
|
|
||||||
Log::debug(sprintf('Amount less than %s? %s', $modifier['value'], var_export($res, true)));
|
|
||||||
break;
|
|
||||||
case 'amount_max':
|
|
||||||
case 'amount_more':
|
|
||||||
$res = self::amountCompare($transaction, $modifier['value'], -1);
|
|
||||||
Log::debug(sprintf('Amount more than %s? %s', $modifier['value'], var_export($res, true)));
|
|
||||||
break;
|
|
||||||
case 'source':
|
case 'source':
|
||||||
$res = self::stringCompare($transaction->account_name, $modifier['value']);
|
$name = Steam::tryDecrypt($transaction->account_name);
|
||||||
|
$res = self::stringCompare($name, $modifier['value']);
|
||||||
Log::debug(sprintf('Source is %s? %s', $modifier['value'], var_export($res, true)));
|
Log::debug(sprintf('Source is %s? %s', $modifier['value'], var_export($res, true)));
|
||||||
break;
|
break;
|
||||||
case 'destination':
|
case 'destination':
|
||||||
$res = self::stringCompare($transaction->opposing_account_name, $modifier['value']);
|
$name = Steam::tryDecrypt($transaction->opposing_account_name);
|
||||||
|
$res = self::stringCompare($name, $modifier['value']);
|
||||||
Log::debug(sprintf('Destination is %s? %s', $modifier['value'], var_export($res, true)));
|
Log::debug(sprintf('Destination is %s? %s', $modifier['value'], var_export($res, true)));
|
||||||
break;
|
break;
|
||||||
case 'category':
|
case 'category':
|
||||||
$res = self::category($transaction, $modifier['value']);
|
$res = self::category($transaction, $modifier['value']);
|
||||||
Log::debug(sprintf('Category is %s? %s', $modifier['value'], var_export($res, true)));
|
Log::debug(sprintf('Category is %s? %s', $modifier['value'], var_export($res, true)));
|
||||||
break;
|
break;
|
||||||
case 'budget':
|
case 'budget':
|
||||||
$res = self::budget($transaction, $modifier['value']);
|
$res = self::budget($transaction, $modifier['value']);
|
||||||
Log::debug(sprintf('Budget is %s? %s', $modifier['value'], var_export($res, true)));
|
Log::debug(sprintf('Budget is %s? %s', $modifier['value'], var_export($res, true)));
|
||||||
break;
|
break;
|
||||||
case 'bill':
|
case 'bill':
|
||||||
$res = self::stringCompare(strval($transaction->bill_name), $modifier['value']);
|
$name = Steam::tryDecrypt($transaction->bill_name);
|
||||||
|
$res = self::stringCompare($name, $modifier['value']);
|
||||||
Log::debug(sprintf('Bill is %s? %s', $modifier['value'], var_export($res, true)));
|
Log::debug(sprintf('Bill is %s? %s', $modifier['value'], var_export($res, true)));
|
||||||
break;
|
break;
|
||||||
case 'type':
|
|
||||||
$res = self::stringCompare($transaction->transaction_type_type, $modifier['value']);
|
|
||||||
Log::debug(sprintf('Transaction type is %s? %s', $modifier['value'], var_export($res, true)));
|
|
||||||
break;
|
|
||||||
case 'date':
|
|
||||||
case 'on':
|
|
||||||
$res = self::sameDate($transaction->date, $modifier['value']);
|
|
||||||
Log::debug(sprintf('Date same as %s? %s', $modifier['value'], var_export($res, true)));
|
|
||||||
break;
|
|
||||||
case 'date_before':
|
|
||||||
case 'before':
|
|
||||||
$res = self::dateBefore($transaction->date, $modifier['value']);
|
|
||||||
Log::debug(sprintf('Date before %s? %s', $modifier['value'], var_export($res, true)));
|
|
||||||
break;
|
|
||||||
case 'date_after':
|
|
||||||
case 'after':
|
|
||||||
$res = self::dateAfter($transaction->date, $modifier['value']);
|
|
||||||
Log::debug(sprintf('Date before %s? %s', $modifier['value'], var_export($res, true)));
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
|
@@ -24,6 +24,7 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Support\Search;
|
namespace FireflyIII\Support\Search;
|
||||||
|
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
use FireflyIII\Exceptions\FireflyException;
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
|
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
|
||||||
use FireflyIII\Helpers\Filter\InternalTransferFilter;
|
use FireflyIII\Helpers\Filter\InternalTransferFilter;
|
||||||
@@ -121,6 +122,10 @@ class Search implements SearchInterface
|
|||||||
if ($this->hasModifiers()) {
|
if ($this->hasModifiers()) {
|
||||||
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
|
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// some modifiers can be applied to the collector directly.
|
||||||
|
$collector = $this->applyModifiers($collector);
|
||||||
|
|
||||||
$collector->removeFilter(InternalTransferFilter::class);
|
$collector->removeFilter(InternalTransferFilter::class);
|
||||||
$set = $collector->getPaginatedJournals()->getCollection();
|
$set = $collector->getPaginatedJournals()->getCollection();
|
||||||
|
|
||||||
@@ -186,6 +191,57 @@ class Search implements SearchInterface
|
|||||||
$this->user = $user;
|
$this->user = $user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function applyModifiers(JournalCollectorInterface $collector): JournalCollectorInterface
|
||||||
|
{
|
||||||
|
foreach ($this->modifiers as $modifier) {
|
||||||
|
switch ($modifier['type']) {
|
||||||
|
case 'amount_is':
|
||||||
|
case 'amount':
|
||||||
|
$amount = app('steam')->positive(strval($modifier['value']));
|
||||||
|
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $amount));
|
||||||
|
$collector->amountIs($amount);
|
||||||
|
break;
|
||||||
|
case 'amount_max':
|
||||||
|
case 'amount_less':
|
||||||
|
$amount = app('steam')->positive(strval($modifier['value']));
|
||||||
|
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $amount));
|
||||||
|
$collector->amountLess($amount);
|
||||||
|
break;
|
||||||
|
case 'amount_min':
|
||||||
|
case 'amount_more':
|
||||||
|
$amount = app('steam')->positive(strval($modifier['value']));
|
||||||
|
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $amount));
|
||||||
|
$collector->amountMore($amount);
|
||||||
|
break;
|
||||||
|
case 'type':
|
||||||
|
$collector->setTypes([ucfirst($modifier['value'])]);
|
||||||
|
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $modifier['value']));
|
||||||
|
break;
|
||||||
|
case 'date':
|
||||||
|
case 'on':
|
||||||
|
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $modifier['value']));
|
||||||
|
$start = new Carbon($modifier['value']);
|
||||||
|
$collector->setRange($start, $start);
|
||||||
|
break;
|
||||||
|
case 'date_before':
|
||||||
|
case 'before':
|
||||||
|
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $modifier['value']));
|
||||||
|
$before = new Carbon($modifier['value']);
|
||||||
|
$collector->setBefore($before);
|
||||||
|
break;
|
||||||
|
case 'date_after':
|
||||||
|
case 'after':
|
||||||
|
Log::debug(sprintf('Set "%s" using collector with value "%s"', $modifier['type'], $modifier['value']));
|
||||||
|
$after = new Carbon($modifier['value']);
|
||||||
|
$collector->setBefore($after);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return $collector;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $string
|
* @param string $string
|
||||||
*/
|
*/
|
||||||
|
@@ -248,7 +248,7 @@ class Journal extends Twig_Extension
|
|||||||
$txt = sprintf('<i class="fa fa-fw fa-exchange" title="%s"></i>', trans('firefly.transfer'));
|
$txt = sprintf('<i class="fa fa-fw fa-exchange" title="%s"></i>', trans('firefly.transfer'));
|
||||||
break;
|
break;
|
||||||
case $journal->isOpeningBalance():
|
case $journal->isOpeningBalance():
|
||||||
$txt = sprintf('<i class="fa-fw fa fa-ban" title="%s"></i>', trans('firefly.openingBalance'));
|
$txt = sprintf('<i class="fa-fw fa fa-star-o" title="%s"></i>', trans('firefly.openingBalance'));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$txt = '';
|
$txt = '';
|
||||||
|
@@ -24,8 +24,11 @@ declare(strict_types=1);
|
|||||||
namespace FireflyIII\Support\Twig;
|
namespace FireflyIII\Support\Twig;
|
||||||
|
|
||||||
use FireflyIII\Models\AccountType;
|
use FireflyIII\Models\AccountType;
|
||||||
|
use FireflyIII\Models\Attachment;
|
||||||
use FireflyIII\Models\Transaction as TransactionModel;
|
use FireflyIII\Models\Transaction as TransactionModel;
|
||||||
use FireflyIII\Models\TransactionType;
|
use FireflyIII\Models\TransactionType;
|
||||||
|
use FireflyIII\Support\CacheProperties;
|
||||||
|
use Lang;
|
||||||
use Steam;
|
use Steam;
|
||||||
use Twig_Extension;
|
use Twig_Extension;
|
||||||
use Twig_SimpleFilter;
|
use Twig_SimpleFilter;
|
||||||
@@ -38,6 +41,41 @@ use Twig_SimpleFunction;
|
|||||||
*/
|
*/
|
||||||
class Transaction extends Twig_Extension
|
class Transaction extends Twig_Extension
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @return Twig_SimpleFunction
|
||||||
|
*/
|
||||||
|
public function attachmentIndicator(): Twig_SimpleFunction
|
||||||
|
{
|
||||||
|
return new Twig_SimpleFunction(
|
||||||
|
'attachmentIndicator', function (int $journalId) {
|
||||||
|
|
||||||
|
$cache = new CacheProperties;
|
||||||
|
$cache->addProperty('attachments_journal');
|
||||||
|
$cache->addProperty($journalId);
|
||||||
|
if ($cache->has()) {
|
||||||
|
return $cache->get();
|
||||||
|
}
|
||||||
|
$count = Attachment::whereNull('deleted_at')
|
||||||
|
->where('attachable_type', 'FireflyIII\Models\TransactionJournal')
|
||||||
|
->where('attachable_id', $journalId)
|
||||||
|
->count();
|
||||||
|
if ($count > 0) {
|
||||||
|
$res = sprintf('<i class="fa fa-paperclip" title="%s"></i>', Lang::choice('firefly.nr_of_attachments', $count, ['count' => $count]));
|
||||||
|
$cache->store($res);
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
$res = '';
|
||||||
|
$cache->store($res);
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
|
||||||
|
|
||||||
|
}, ['is_safe' => ['html']]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@@ -63,6 +101,7 @@ class Transaction extends Twig_Extension
|
|||||||
$this->transactionCategories(),
|
$this->transactionCategories(),
|
||||||
$this->transactionIdCategories(),
|
$this->transactionIdCategories(),
|
||||||
$this->splitJournalIndicator(),
|
$this->splitJournalIndicator(),
|
||||||
|
$this->attachmentIndicator(),
|
||||||
];
|
];
|
||||||
|
|
||||||
return $functions;
|
return $functions;
|
||||||
@@ -85,12 +124,25 @@ class Transaction extends Twig_Extension
|
|||||||
{
|
{
|
||||||
return new Twig_SimpleFunction(
|
return new Twig_SimpleFunction(
|
||||||
'splitJournalIndicator', function (int $journalId) {
|
'splitJournalIndicator', function (int $journalId) {
|
||||||
|
|
||||||
|
$cache = new CacheProperties;
|
||||||
|
$cache->addProperty('is_split_journal');
|
||||||
|
$cache->addProperty($journalId);
|
||||||
|
if ($cache->has()) {
|
||||||
|
return $cache->get();
|
||||||
|
}
|
||||||
$count = TransactionModel::where('transaction_journal_id', $journalId)->whereNull('deleted_at')->count();
|
$count = TransactionModel::where('transaction_journal_id', $journalId)->whereNull('deleted_at')->count();
|
||||||
if ($count > 2) {
|
if ($count > 2) {
|
||||||
return '<i class="fa fa-fw fa-share-alt" aria-hidden="true"></i>';
|
$res = '<i class="fa fa-fw fa-share-alt" aria-hidden="true"></i>';
|
||||||
|
$cache->store($res);
|
||||||
|
|
||||||
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
$res = '';
|
||||||
|
$cache->store($res);
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
|
||||||
|
|
||||||
}, ['is_safe' => ['html']]
|
}, ['is_safe' => ['html']]
|
||||||
@@ -261,7 +313,7 @@ class Transaction extends Twig_Extension
|
|||||||
$txt = sprintf('<i class="fa fa-fw fa-exchange" title="%s"></i>', trans('firefly.transfer'));
|
$txt = sprintf('<i class="fa fa-fw fa-exchange" title="%s"></i>', trans('firefly.transfer'));
|
||||||
break;
|
break;
|
||||||
case TransactionType::OPENING_BALANCE:
|
case TransactionType::OPENING_BALANCE:
|
||||||
$txt = sprintf('<i class="fa-fw fa fa-ban" title="%s"></i>', trans('firefly.openingBalance'));
|
$txt = sprintf('<i class="fa-fw fa fa-star-o" title="%s"></i>', trans('firefly.openingBalance'));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$txt = '';
|
$txt = '';
|
||||||
|
22
composer.lock
generated
22
composer.lock
generated
@@ -788,16 +788,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/framework",
|
"name": "laravel/framework",
|
||||||
"version": "v5.5.18",
|
"version": "v5.5.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/framework.git",
|
"url": "https://github.com/laravel/framework.git",
|
||||||
"reference": "1cc21baac11551377734b8c17ead17db4c34fe21"
|
"reference": "c678100e84934ec85c9f8bc26bd0a60222682719"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/framework/zipball/1cc21baac11551377734b8c17ead17db4c34fe21",
|
"url": "https://api.github.com/repos/laravel/framework/zipball/c678100e84934ec85c9f8bc26bd0a60222682719",
|
||||||
"reference": "1cc21baac11551377734b8c17ead17db4c34fe21",
|
"reference": "c678100e84934ec85c9f8bc26bd0a60222682719",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -915,7 +915,7 @@
|
|||||||
"framework",
|
"framework",
|
||||||
"laravel"
|
"laravel"
|
||||||
],
|
],
|
||||||
"time": "2017-10-19T12:50:26+00:00"
|
"time": "2017-10-25T19:10:45+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravelcollective/html",
|
"name": "laravelcollective/html",
|
||||||
@@ -984,16 +984,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "league/commonmark",
|
"name": "league/commonmark",
|
||||||
"version": "0.15.6",
|
"version": "0.15.7",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/thephpleague/commonmark.git",
|
"url": "https://github.com/thephpleague/commonmark.git",
|
||||||
"reference": "91742543c25fecedc84a4883d2919213e04a73b7"
|
"reference": "36d82f166e441dfa28643f8d01dd8bdd3a579adf"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91742543c25fecedc84a4883d2919213e04a73b7",
|
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/36d82f166e441dfa28643f8d01dd8bdd3a579adf",
|
||||||
"reference": "91742543c25fecedc84a4883d2919213e04a73b7",
|
"reference": "36d82f166e441dfa28643f8d01dd8bdd3a579adf",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1049,7 +1049,7 @@
|
|||||||
"markdown",
|
"markdown",
|
||||||
"parser"
|
"parser"
|
||||||
],
|
],
|
||||||
"time": "2017-08-08T11:47:33+00:00"
|
"time": "2017-10-26T15:41:07+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "league/csv",
|
"name": "league/csv",
|
||||||
@@ -1271,7 +1271,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "mtdowling/cron-expression",
|
"name": "mtdowling/cron-expression",
|
||||||
"version": "v1.2.0",
|
"version": "v1.2.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/mtdowling/cron-expression.git",
|
"url": "https://github.com/mtdowling/cron-expression.git",
|
||||||
|
@@ -57,7 +57,7 @@ return [
|
|||||||
Illuminate\Queue\QueueServiceProvider::class,
|
Illuminate\Queue\QueueServiceProvider::class,
|
||||||
Illuminate\Redis\RedisServiceProvider::class,
|
Illuminate\Redis\RedisServiceProvider::class,
|
||||||
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
|
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
|
||||||
Illuminate\Session\SessionServiceProvider::class,
|
FireflyIII\Providers\SessionServiceProvider::class,
|
||||||
Illuminate\Translation\TranslationServiceProvider::class,
|
Illuminate\Translation\TranslationServiceProvider::class,
|
||||||
Illuminate\Validation\ValidationServiceProvider::class,
|
Illuminate\Validation\ValidationServiceProvider::class,
|
||||||
Illuminate\View\ViewServiceProvider::class,
|
Illuminate\View\ViewServiceProvider::class,
|
||||||
|
@@ -33,7 +33,7 @@ return [
|
|||||||
'is_demo_site' => false,
|
'is_demo_site' => false,
|
||||||
],
|
],
|
||||||
'encryption' => (is_null(env('USE_ENCRYPTION')) || env('USE_ENCRYPTION') === true),
|
'encryption' => (is_null(env('USE_ENCRYPTION')) || env('USE_ENCRYPTION') === true),
|
||||||
'version' => '4.6.9',
|
'version' => '4.6.10',
|
||||||
'maxUploadSize' => 15242880,
|
'maxUploadSize' => 15242880,
|
||||||
'allowedMimes' => ['image/png', 'image/jpeg', 'application/pdf'],
|
'allowedMimes' => ['image/png', 'image/jpeg', 'application/pdf'],
|
||||||
'list_length' => 10,
|
'list_length' => 10,
|
||||||
@@ -126,15 +126,15 @@ return [
|
|||||||
],
|
],
|
||||||
'languages' => [
|
'languages' => [
|
||||||
'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German', 'complete' => true],
|
'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German', 'complete' => true],
|
||||||
|
'es_ES' => ['name_locale' => 'Spanish', 'name_english' => 'Spanish', 'complete' => false],
|
||||||
'en_US' => ['name_locale' => 'English', 'name_english' => 'English', 'complete' => true],
|
'en_US' => ['name_locale' => 'English', 'name_english' => 'English', 'complete' => true],
|
||||||
'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French', 'complete' => true],
|
'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French', 'complete' => true],
|
||||||
'id_ID' => ['name_locale' => 'Indonesian', 'name_english' => 'Indonesian', 'complete' => false],
|
'id_ID' => ['name_locale' => 'Indonesian', 'name_english' => 'Indonesian', 'complete' => false],
|
||||||
'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch', 'complete' => true],
|
'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch', 'complete' => true],
|
||||||
'pl_PL' => ['name_locale' => 'Polski', 'name_english' => 'Polish ', 'complete' => false],
|
'pl_PL' => ['name_locale' => 'Polski', 'name_english' => 'Polish ', 'complete' => true],
|
||||||
'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)', 'complete' => true],
|
'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)', 'complete' => true],
|
||||||
'ru_RU' => ['name_locale' => 'Русский', 'name_english' => 'Russian', 'complete' => false],
|
'ru_RU' => ['name_locale' => 'Русский', 'name_english' => 'Russian', 'complete' => false],
|
||||||
'sl_SI' => ['name_locale' => 'Slovenščina', 'name_english' => 'Slovenian', 'complete' => false],
|
'sl_SI' => ['name_locale' => 'Slovenščina', 'name_english' => 'Slovenian', 'complete' => false],
|
||||||
'zh-TW' => ['name_locale' => '正體中文', 'name_english' => 'Chinese Traditional', 'complete' => false],
|
|
||||||
],
|
],
|
||||||
'transactionTypesByWhat' => [
|
'transactionTypesByWhat' => [
|
||||||
'expenses' => ['Withdrawal'],
|
'expenses' => ['Withdrawal'],
|
||||||
|
@@ -176,6 +176,7 @@ return [
|
|||||||
'is_safe' => [
|
'is_safe' => [
|
||||||
'date', 'text', 'select', 'balance', 'optionsList', 'checkbox', 'amount', 'tags', 'integer', 'textarea', 'location',
|
'date', 'text', 'select', 'balance', 'optionsList', 'checkbox', 'amount', 'tags', 'integer', 'textarea', 'location',
|
||||||
'multiRadio', 'file', 'multiCheckbox', 'staticText', 'amountSmall', 'password', 'nonSelectableBalance', 'nonSelectableAmount',
|
'multiRadio', 'file', 'multiCheckbox', 'staticText', 'amountSmall', 'password', 'nonSelectableBalance', 'nonSelectableAmount',
|
||||||
|
'number'
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
'Form' => [
|
'Form' => [
|
||||||
|
33
docker-compose.dockerhub.yml
Normal file
33
docker-compose.dockerhub.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
firefly-db:
|
||||||
|
image: 'mysql:8'
|
||||||
|
environment:
|
||||||
|
- MYSQL_DATABASE=firefly_db
|
||||||
|
- MYSQL_USER=firefly_db
|
||||||
|
- MYSQL_PASSWORD=firefly_db_secret
|
||||||
|
- MYSQL_RANDOM_ROOT_PASSWORD=yes
|
||||||
|
volumes:
|
||||||
|
- firefly-storage:/var/lib/mysql
|
||||||
|
|
||||||
|
firefly-app:
|
||||||
|
image: 'jc5x/firefly-iii'
|
||||||
|
environment:
|
||||||
|
- FF_DB_HOST=firefly-db
|
||||||
|
- FF_DB_NAME=firefly_db
|
||||||
|
- FF_DB_USER=firefly_db
|
||||||
|
- FF_DB_PASSWORD=firefly_db_secret
|
||||||
|
- FF_APP_KEY=SomeRandomStringOf32CharsExactly
|
||||||
|
- FF_APP_ENV=local
|
||||||
|
ports:
|
||||||
|
- "9001:80"
|
||||||
|
links:
|
||||||
|
- firefly-db
|
||||||
|
volumes:
|
||||||
|
- firefly-app-storage:/var/www/firefly-iii/storage
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
firefly-storage:
|
||||||
|
driver: local
|
||||||
|
firefly-app-storage:
|
||||||
|
driver: local
|
412
public/css/google-fonts.css
vendored
Normal file
412
public/css/google-fonts.css
vendored
Normal file
@@ -0,0 +1,412 @@
|
|||||||
|
/*
|
||||||
|
* google-fonts.css
|
||||||
|
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-cyrillic.woff2') format('woff2');
|
||||||
|
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-greek-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-greek.woff2') format('woff2');
|
||||||
|
unicode-range: U+0370-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-vietnamese.woff2') format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-latin-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-latin.woff2') format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-cyrillic-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-cyrillic.woff2') format('woff2');
|
||||||
|
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-greek-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-greek.woff2') format('woff2');
|
||||||
|
unicode-range: U+0370-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-vietnamese.woff2') format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-latin-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-latin.woff2') format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2') format('woff2');
|
||||||
|
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-greek.woff2') format('woff2');
|
||||||
|
unicode-range: U+0370-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2') format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-latin.woff2') format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-cyrillic-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-cyrillic.woff2') format('woff2');
|
||||||
|
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-greek-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-greek.woff2') format('woff2');
|
||||||
|
unicode-range: U+0370-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-vietnamese.woff2') format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-latin-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-latin.woff2') format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-cyrillic-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-cyrillic.woff2') format('woff2');
|
||||||
|
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-greek-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-greek.woff2') format('woff2');
|
||||||
|
unicode-range: U+0370-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-vietnamese.woff2') format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-latin-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-latin.woff2') format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-cyrillic.woff2') format('woff2');
|
||||||
|
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-greek-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-greek.woff2') format('woff2');
|
||||||
|
unicode-range: U+0370-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-vietnamese.woff2') format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-latin-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-latin.woff2') format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-cyrillic-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-cyrillic.woff2') format('woff2');
|
||||||
|
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-greek-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-greek.woff2') format('woff2');
|
||||||
|
unicode-range: U+0370-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-vietnamese.woff2') format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-latin-ext.woff2') format('woff2');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Source Sans Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-latin.woff2') format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
|
||||||
|
}
|
BIN
public/fonts/SourceSansPro-Bold-cyrillic-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Bold-cyrillic-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Bold-cyrillic.woff2
Normal file
BIN
public/fonts/SourceSansPro-Bold-cyrillic.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Bold-greek-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Bold-greek-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Bold-greek.woff2
Normal file
BIN
public/fonts/SourceSansPro-Bold-greek.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Bold-latin-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Bold-latin-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Bold-latin.woff2
Normal file
BIN
public/fonts/SourceSansPro-Bold-latin.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Bold-vietnamese.woff2
Normal file
BIN
public/fonts/SourceSansPro-Bold-vietnamese.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Italic-cyrillic-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Italic-cyrillic-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Italic-cyrillic.woff2
Normal file
BIN
public/fonts/SourceSansPro-Italic-cyrillic.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Italic-greek-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Italic-greek-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Italic-greek.woff2
Normal file
BIN
public/fonts/SourceSansPro-Italic-greek.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Italic-latin-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Italic-latin-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Italic-latin.woff2
Normal file
BIN
public/fonts/SourceSansPro-Italic-latin.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Italic-vietnamese.woff2
Normal file
BIN
public/fonts/SourceSansPro-Italic-vietnamese.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Light-cyrillic-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Light-cyrillic-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Light-cyrillic.woff2
Normal file
BIN
public/fonts/SourceSansPro-Light-cyrillic.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Light-greek-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Light-greek-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Light-greek.woff2
Normal file
BIN
public/fonts/SourceSansPro-Light-greek.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Light-latin-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Light-latin-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Light-latin.woff2
Normal file
BIN
public/fonts/SourceSansPro-Light-latin.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Light-vietnamese.woff2
Normal file
BIN
public/fonts/SourceSansPro-Light-vietnamese.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-LightItalic-cyrillic.woff2
Normal file
BIN
public/fonts/SourceSansPro-LightItalic-cyrillic.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-LightItalic-greek-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-LightItalic-greek-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-LightItalic-greek.woff2
Normal file
BIN
public/fonts/SourceSansPro-LightItalic-greek.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-LightItalic-latin-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-LightItalic-latin-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-LightItalic-latin.woff2
Normal file
BIN
public/fonts/SourceSansPro-LightItalic-latin.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-LightItalic-vietnamese.woff2
Normal file
BIN
public/fonts/SourceSansPro-LightItalic-vietnamese.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Regular-cyrillic-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Regular-cyrillic-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Regular-cyrillic.woff2
Normal file
BIN
public/fonts/SourceSansPro-Regular-cyrillic.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Regular-greek-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Regular-greek-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Regular-greek.woff2
Normal file
BIN
public/fonts/SourceSansPro-Regular-greek.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Regular-latin-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-Regular-latin-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Regular-latin.woff2
Normal file
BIN
public/fonts/SourceSansPro-Regular-latin.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-Regular-vietnamese.woff2
Normal file
BIN
public/fonts/SourceSansPro-Regular-vietnamese.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBold-cyrillic.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBold-cyrillic.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBold-greek-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBold-greek-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBold-greek.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBold-greek.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBold-latin-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBold-latin-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBold-latin.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBold-latin.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBold-vietnamese.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBold-vietnamese.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBoldItalic-greek.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBoldItalic-greek.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBoldItalic-latin.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBoldItalic-latin.woff2
Normal file
Binary file not shown.
BIN
public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2
Normal file
BIN
public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2
Normal file
Binary file not shown.
5
public/js/ff/firefly.js
vendored
5
public/js/ff/firefly.js
vendored
@@ -26,7 +26,7 @@ $(function () {
|
|||||||
configAccounting(currencySymbol);
|
configAccounting(currencySymbol);
|
||||||
|
|
||||||
// on submit of form, disable any button in form:
|
// on submit of form, disable any button in form:
|
||||||
$('form.form-horizontal').on('submit', function () {
|
$('form.form-horizontal:not(.nodisablebutton)').on('submit', function () {
|
||||||
$('button[type="submit"]').prop('disabled', true);
|
$('button[type="submit"]').prop('disabled', true);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -65,7 +65,8 @@ $(function () {
|
|||||||
$.post(dateRangeMeta.uri, {
|
$.post(dateRangeMeta.uri, {
|
||||||
start: start.format('YYYY-MM-DD'),
|
start: start.format('YYYY-MM-DD'),
|
||||||
end: end.format('YYYY-MM-DD'),
|
end: end.format('YYYY-MM-DD'),
|
||||||
label: label
|
label: label,
|
||||||
|
_token: token
|
||||||
}).done(function () {
|
}).done(function () {
|
||||||
window.location.reload(true);
|
window.location.reload(true);
|
||||||
}).fail(function () {
|
}).fail(function () {
|
||||||
|
43
public/js/ff/index.js
vendored
43
public/js/ff/index.js
vendored
@@ -43,13 +43,25 @@ function drawChart() {
|
|||||||
getBillsBox();
|
getBillsBox();
|
||||||
getAvailableBox();
|
getAvailableBox();
|
||||||
getNetWorthBox();
|
getNetWorthBox();
|
||||||
|
getPiggyBanks();
|
||||||
|
|
||||||
//getBoxAmounts();
|
//getBoxAmounts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function getPiggyBanks() {
|
||||||
|
$.getJSON(piggyInfoUri).done(function (data) {
|
||||||
|
if (data.html.length > 0) {
|
||||||
|
$('#piggy_bank_overview').html(data.html);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function getNetWorthBox() {
|
function getNetWorthBox() {
|
||||||
// box-net-worth
|
// box-net-worth
|
||||||
$.getJSON('json/box/net-worth').done(function(data) {
|
$.getJSON('json/box/net-worth').done(function (data) {
|
||||||
$('#box-net-worth').html(data.net_worth);
|
$('#box-net-worth').html(data.net_worth);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -60,7 +72,7 @@ function getNetWorthBox() {
|
|||||||
function getAvailableBox() {
|
function getAvailableBox() {
|
||||||
// box-left-to-spend
|
// box-left-to-spend
|
||||||
// box-left-per-day
|
// box-left-per-day
|
||||||
$.getJSON('json/box/available').done(function(data) {
|
$.getJSON('json/box/available').done(function (data) {
|
||||||
$('#box-left-to-spend').html(data.left);
|
$('#box-left-to-spend').html(data.left);
|
||||||
$('#box-left-per-day').html(data.perDay);
|
$('#box-left-per-day').html(data.perDay);
|
||||||
});
|
});
|
||||||
@@ -72,7 +84,7 @@ function getAvailableBox() {
|
|||||||
function getBillsBox() {
|
function getBillsBox() {
|
||||||
// box-bills-unpaid
|
// box-bills-unpaid
|
||||||
// box-bills-paid
|
// box-bills-paid
|
||||||
$.getJSON('json/box/bills').done(function(data) {
|
$.getJSON('json/box/bills').done(function (data) {
|
||||||
$('#box-bills-paid').html(data.paid);
|
$('#box-bills-paid').html(data.paid);
|
||||||
$('#box-bills-unpaid').html(data.unpaid);
|
$('#box-bills-unpaid').html(data.unpaid);
|
||||||
});
|
});
|
||||||
@@ -85,32 +97,9 @@ function getBalanceBox() {
|
|||||||
// box-balance-total
|
// box-balance-total
|
||||||
// box-balance-out
|
// box-balance-out
|
||||||
// box-balance-in
|
// box-balance-in
|
||||||
$.getJSON('json/box/balance').done(function(data) {
|
$.getJSON('json/box/balance').done(function (data) {
|
||||||
$('#box-balance-total').html(data.combined);
|
$('#box-balance-total').html(data.combined);
|
||||||
$('#box-balance-in').html(data.income);
|
$('#box-balance-in').html(data.income);
|
||||||
$('#box-balance-out').html(data.expense);
|
$('#box-balance-out').html(data.expense);
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function getBoxAmounts() {
|
|
||||||
"use strict";
|
|
||||||
var boxes = ['in', 'out', 'bills-unpaid', 'bills-paid'];
|
|
||||||
for (var x in boxes) {
|
|
||||||
if (!boxes.hasOwnProperty(x)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
var box = boxes[x];
|
|
||||||
$.getJSON('json/box/' + box).done(putData).fail(failData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function putData(data) {
|
|
||||||
"use strict";
|
|
||||||
$('#box-' + data.box).html(data.amount);
|
|
||||||
}
|
|
||||||
|
|
||||||
function failData() {
|
|
||||||
"use strict";
|
|
||||||
}
|
}
|
2
public/js/ff/intro/intro.js
vendored
2
public/js/ff/intro/intro.js
vendored
@@ -42,5 +42,5 @@ function setupIntro(steps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function reportIntroFinished() {
|
function reportIntroFinished() {
|
||||||
$.getJSON(routeForFinishedTour);
|
$.post(routeForFinishedTour, {_token:token});
|
||||||
}
|
}
|
5
public/js/ff/search/index.js
vendored
5
public/js/ff/search/index.js
vendored
@@ -29,7 +29,6 @@ $(function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
function startSearch(query) {
|
function startSearch(query) {
|
||||||
|
|
||||||
$.post(searchUri, {query: query}).done(presentSearchResults).fail(searchFailure);
|
$.post(searchUri, {query: query}).done(presentSearchResults).fail(searchFailure);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,4 +43,8 @@ function presentSearchResults(data) {
|
|||||||
$('span.search_count').text(data.count);
|
$('span.search_count').text(data.count);
|
||||||
$('.search_box').find('.overlay').remove();
|
$('.search_box').find('.overlay').remove();
|
||||||
$('.search_results').html(data.html).show();
|
$('.search_results').html(data.html).show();
|
||||||
|
|
||||||
|
$('.select_all_single').unbind('change').change(function () {
|
||||||
|
countChecked();
|
||||||
|
});
|
||||||
}
|
}
|
3
public/js/ff/transactions/list.js
vendored
3
public/js/ff/transactions/list.js
vendored
@@ -36,7 +36,7 @@ $(document).ready(function () {
|
|||||||
countChecked();
|
countChecked();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$('.select_all_single').change(function () {
|
$('.select_all_single').unbind('change').change(function () {
|
||||||
countChecked();
|
countChecked();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -147,7 +147,6 @@ function stopMassSelect() {
|
|||||||
|
|
||||||
function startMassSelect() {
|
function startMassSelect() {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
// show "select all" box in table header.
|
// show "select all" box in table header.
|
||||||
$('.select_boxes').show();
|
$('.select_boxes').show();
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user