Compare commits

...

23 Commits

Author SHA1 Message Date
github-actions[bot]
dc60025097 Merge pull request #12012 from firefly-iii/release-1774166607
🤖 Automatically merge the PR into the develop branch.
2026-03-22 09:03:34 +01:00
JC5
d77769b2f4 🤖 Auto commit for release 'develop' on 2026-03-22 2026-03-22 09:03:27 +01:00
James Cole
c6497960f8 Try updating package lock/ 2026-03-22 08:58:15 +01:00
James Cole
4eee0c79cd Go to vite plugin 3. 2026-03-22 08:36:43 +01:00
James Cole
e333c3254b Merge pull request #11961 from firefly-iii/dependabot/npm_and_yarn/develop/vite-8.0.0
Bump vite from 7.3.1 to 8.0.0
2026-03-22 07:21:07 +01:00
github-actions[bot]
9d244883a1 Merge pull request #12007 from firefly-iii/release-1774159543
🤖 Automatically merge the PR into the develop branch.
2026-03-22 07:05:54 +01:00
JC5
a17131c2f7 🤖 Auto commit for release 'develop' on 2026-03-22 2026-03-22 07:05:43 +01:00
James Cole
898459198d Fix null pointer. 2026-03-22 07:00:27 +01:00
James Cole
6466bc9272 Restore currency functionality. 2026-03-22 06:57:27 +01:00
James Cole
dd8a8dba85 Merge pull request #12005 from IDevJoe/main
Adjust $request->only() in testNotification function
2026-03-22 06:42:41 +01:00
James Cole
ee16888317 Catch null pointer. 2026-03-22 06:41:55 +01:00
Joe Longendyke
56a2580fd7 Fix testNotification function
Signed-off-by: Joe Longendyke <IDevJoe@users.noreply.github.com>
2026-03-21 16:05:03 -04:00
github-actions[bot]
2ab0225223 Merge pull request #12003 from firefly-iii/release-1774107220
🤖 Automatically merge the PR into the develop branch.
2026-03-21 16:33:48 +01:00
JC5
83662415c3 🤖 Auto commit for release 'develop' on 2026-03-21 2026-03-21 16:33:41 +01:00
James Cole
cf976b2ab1 Throw the error still to find out what's happening. 2026-03-21 16:28:19 +01:00
James Cole
bf79c9db72 Also add post data when PUT. 2026-03-21 16:19:05 +01:00
James Cole
29f4c09a7b Switch to unreported error to cut down on spam. 2026-03-21 16:17:52 +01:00
James Cole
22ef456dca Remove admin access from routes. 2026-03-21 16:15:15 +01:00
github-actions[bot]
9c706465b2 Merge pull request #12001 from firefly-iii/release-1774102841
🤖 Automatically merge the PR into the develop branch.
2026-03-21 15:20:48 +01:00
JC5
a40425fd75 🤖 Auto commit for release 'develop' on 2026-03-21 2026-03-21 15:20:41 +01:00
James Cole
e9a37592ba Improved sorting and slicing for https://github.com/firefly-iii/firefly-iii/issues/12000 2026-03-21 15:05:00 +01:00
James Cole
0c598cb034 Fix changelog header. 2026-03-21 11:57:08 +01:00
dependabot[bot]
974c84a877 Bump vite from 7.3.1 to 8.0.0
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.3.1 to 8.0.0.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@8.0.0/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:52:51 +00:00
15 changed files with 569 additions and 851 deletions

View File

@@ -4,6 +4,7 @@ Over time, many people have contributed to Firefly III. Their efforts are not al
Please find below all the people who contributed to the Firefly III code. Their names are mentioned in the year of their first contribution.
## 2026
- Joe Longendyke
- Daniel Holøien
- Matthew Grove
- Cinnamon Pyro

View File

@@ -35,7 +35,6 @@ use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\CurrencyTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
use League\Fractal\Resource\Item;
/**
@@ -154,7 +153,6 @@ final class UpdateController extends Controller
public function update(UpdateRequest $request, TransactionCurrency $currency): JsonResponse
{
$data = $request->getAll();
Log::debug(__METHOD__, $data);
/** @var User $user */
$user = auth()->user();

View File

@@ -28,6 +28,7 @@ use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use FireflyIII\User;
use Illuminate\Foundation\Http\FormRequest;
/**
@@ -45,15 +46,23 @@ class UpdateRequest extends FormRequest
*/
public function getAll(): array
{
// return nothing that isn't explicitly in the array:
$fields = [
'name' => ['name', 'convertString'],
'code' => ['code', 'convertString'],
'symbol' => ['symbol', 'convertString'],
'decimal_places' => ['decimal_places', 'convertInteger'],
'default' => ['default', 'boolean'],
'enabled' => ['enabled', 'boolean'],
/** @var User $user */
$user = auth()->user();
$isAdmin = $user->hasRole('owner');
$fields = [
'enabled' => ['enabled', 'boolean'],
];
if ($isAdmin) {
$fields = [
'name' => ['name', 'convertString'],
'code' => ['code', 'convertString'],
'symbol' => ['symbol', 'convertString'],
'decimal_places' => ['decimal_places', 'convertInteger'],
'default' => ['default', 'boolean'],
'enabled' => ['enabled', 'boolean'],
];
}
return $this->getAllData($fields);
}

View File

@@ -251,7 +251,7 @@ class Handler extends ExceptionHandler
'method' => request()->method(),
'headers' => $headers,
// @mago-expect lint:no-request-all
'post' => 'POST' === request()->method() ? json_encode(request()->all()) : '',
'post' => 'PUT' === request()->method() || 'POST' === request()->method() ? json_encode(request()->all()) : '',
];
// create job that will mail.

View File

@@ -75,8 +75,6 @@ class GroupCollector implements GroupCollectorInterface
$this->userGroup = null;
$this->limit = null;
$this->page = null;
$this->startRow = null;
$this->endRow = null;
$this->hasAccountInfo = false;
$this->hasCatInformation = false;
@@ -443,9 +441,15 @@ class GroupCollector implements GroupCollectorInterface
$this->query->orWhereIn('transaction_journals.transaction_group_id', $groupIds);
}
$result = $this->query->get($this->fields);
$this->total = $result->count();
// if no post-filters are present, it can be sliced and returned.
if (0 === count($this->sorting) && 0 === count($this->postFilters) && null !== $this->limit && null !== $this->page) {
$offset = ($this->page - 1) * $this->limit;
$result = $result->slice($offset, $this->limit);
}
// $this->dumpQueryInLogs();
// Log::debug(sprintf('Count of result is %d', $result->count()));
// now to parse this into an array.
// now to parse the rest into an array.
$collection = $this->parseArray($result);
// filter the array using all available post filters:
@@ -454,19 +458,12 @@ class GroupCollector implements GroupCollectorInterface
// sort the collection, if sort instructions are present.
$collection = $this->sortCollection($collection);
// count it and continue:
$this->total = $collection->count();
// now filter the array according to the page and the limit (if necessary)
if (null !== $this->limit && null !== $this->page) {
if (count($this->postFilters) > 0 && null !== $this->limit && null !== $this->page) {
$offset = ($this->page - 1) * $this->limit;
return $collection->slice($offset, $this->limit);
}
// OR filter the array according to the start and end row variable
if (null !== $this->startRow && null !== $this->endRow) {
return $collection->slice($this->startRow, $this->endRow);
}
return $collection;
}
@@ -477,17 +474,11 @@ class GroupCollector implements GroupCollectorInterface
public function getPaginatedGroups(): LengthAwarePaginator
{
Log::debug('Now in getPaginatedGroups()');
$set = $this->getGroups();
$limit = $this->limit ?? 1;
if (0 === $this->limit) {
$this->setLimit(50);
}
if (null !== $this->startRow && null !== $this->endRow) {
/** @var int $total */
$total = $this->endRow - $this->startRow;
return new LengthAwarePaginator($set, $this->total, $total, 1);
}
$limit = $this->limit ?? 1;
$set = $this->getGroups();
return new LengthAwarePaginator($set, $this->total, $limit, $this->page);
}
@@ -519,13 +510,6 @@ class GroupCollector implements GroupCollectorInterface
return $this;
}
public function setEndRow(int $endRow): self
{
$this->endRow = $endRow;
return $this;
}
public function setExpandGroupSearch(bool $expandGroupSearch): GroupCollectorInterface
{
$this->expandGroupSearch = $expandGroupSearch;
@@ -636,13 +620,6 @@ class GroupCollector implements GroupCollectorInterface
return $this;
}
public function setStartRow(int $startRow): self
{
$this->startRow = $startRow;
return $this;
}
/**
* Limit the search to one specific transaction group.
*/
@@ -692,6 +669,10 @@ class GroupCollector implements GroupCollectorInterface
#[Override]
public function sortCollection(Collection $collection): Collection
{
if (0 === count($this->sorting)) {
return $collection;
}
/**
* @var string $field
* @var string $direction

View File

@@ -469,11 +469,6 @@ interface GroupCollectorInterface
*/
public function setEnd(Carbon $end): self;
/**
* Set the page to get.
*/
public function setEndRow(int $endRow): self;
public function setExpandGroupSearch(bool $expandGroupSearch): self;
/**
@@ -573,11 +568,6 @@ interface GroupCollectorInterface
*/
public function setStart(Carbon $start): self;
/**
* Set the page to get.
*/
public function setStartRow(int $startRow): self;
/**
* Limit results to a specific tag.
*/

View File

@@ -132,7 +132,7 @@ final class NotificationController extends Controller
return redirect(route('settings.notification.index'));
}
$all = $request->only(['channel']);
$all = $request->only(['test_submit']);
$channel = $all['test_submit'] ?? '';
switch ($channel) {

View File

@@ -29,6 +29,7 @@ use FireflyIII\User;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
/**
* Class IsAdmin.
@@ -41,6 +42,8 @@ class IsAdminApi
* @param null|string $guard
*
* @return mixed
*
* @throws AuthorizationException
*/
public function handle(Request $request, Closure $next, $guard = null)
{
@@ -58,6 +61,8 @@ class IsAdminApi
/** @var UserRepositoryInterface $repository */
$repository = app(UserRepositoryInterface::class);
if (!$repository->hasRole($user, 'owner')) {
Log::error(sprintf('Cannot access %s?%s.', $request->url(), $request->getQueryString()));
throw new AuthorizationException();
}

View File

@@ -202,7 +202,7 @@ class PrimaryAmountRecalculationService
/** @var Account $account */
foreach ($set as $account) {
$currencyId = (int) $account->accountMeta()->where('name', 'currency_id')->first()->data;
$currencyId = (int) $account->accountMeta()->where('name', 'currency_id')->first()?->data;
if ($groupCurrency->id === $currencyId) {
Log::debug(sprintf('Account "%s" is in group currency %s. Skip.', $account->name, $groupCurrency->code));

View File

@@ -70,7 +70,7 @@ class Date implements BinderInterface
try {
$result = new Carbon($value);
} catch (InvalidDateException|InvalidFormatException $e) {
$message = sprintf('Could not parse date "%s" for user #%d: %s', $value, auth()->user()->id, $e->getMessage());
$message = sprintf('Could not parse date "%s" for user #%d: %s', $value, (int) auth()->user()?->id, $e->getMessage());
Log::error($message);
throw new NotFoundHttpException('Could not parse value', $e);

View File

@@ -3,7 +3,7 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
### v6.5.8 - 2026-03-22
## v6.5.8 - 2026-03-22
<!-- summary: This release fixes a regression bug in user registration. -->

View File

@@ -78,8 +78,8 @@ return [
'running_balance_column' => (bool)envDefaultWhenEmpty(env('USE_RUNNING_BALANCE'), true), // this is only the default value, is not used.
// see cer.php for exchange rates feature flag.
],
'version' => '6.5.8',
'build_time' => 1774090288,
'version' => 'develop/2026-03-22',
'build_time' => 1774166412,
'api_version' => '2.1.0', // field is no longer used.
'db_version' => 28, // field is no longer used.

1307
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,10 +9,10 @@
},
"devDependencies": {
"axios": "^1",
"laravel-vite-plugin": "^2",
"laravel-vite-plugin": "^3",
"patch-package": "^8",
"sass": "^1",
"vite": "^7",
"vite": "^8",
"vite-plugin-manifest-sri": "^0.2.0"
},
"dependencies": {

View File

@@ -347,7 +347,6 @@ Route::group(
'namespace' => 'FireflyIII\Api\V1\Controllers\Models\UserGroup',
'prefix' => 'v1/user-groups',
'as' => 'api.v1.user-groups.',
'middleware' => ['api-admin'],
],
static function (): void {
Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']);
@@ -636,6 +635,7 @@ Route::group(
],
static function (): void {
Route::get('', ['uses' => 'ShowController@index', 'as' => 'index']);
Route::put('{currency_code?}', ['uses' => 'UpdateController@update', 'as' => 'update']);
Route::get('primary', ['uses' => 'ShowController@showPrimary', 'as' => 'show.primary']);
Route::get('default', ['uses' => 'ShowController@showPrimary', 'as' => 'show.default']);
Route::get('{currency_code}', ['uses' => 'ShowController@show', 'as' => 'show']);
@@ -666,7 +666,6 @@ Route::group(
static function (): void {
Route::delete('{currency_code}', ['uses' => 'DestroyController@destroy', 'as' => 'delete']);
Route::post('', ['uses' => 'StoreController@store', 'as' => 'store']);
Route::put('{currency_code?}', ['uses' => 'UpdateController@update', 'as' => 'update']);
}
);