1
0
mirror of https://github.com/flarum/core.git synced 2025-08-16 21:34:08 +02:00

Compare commits

..

21 Commits

Author SHA1 Message Date
StyleCI Bot
453d272874 Apply fixes from StyleCI 2024-06-16 11:53:11 +00:00
Daniël Klabbers
f04542e8fb feat: adds ability for blueprints to ignore user emai; verification 2024-06-16 13:52:45 +02:00
flarum-bot
64cd6d1988 Bundled output for commit 51bd7a7e32
Includes transpiled JS/TS, and Typescript declaration files (typings).

[skip ci]
2023-05-27 09:37:18 +00:00
Darkle
51bd7a7e32 Update the scheduler info link in admin (#3826) 2023-05-27 11:29:56 +02:00
Sami Mazouz
b6a6248dff chore: prepare v2.0 development
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-24 08:52:14 +01:00
Sami Mazouz
5437bf5c23 chore: prepare v1.8.1 release
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-23 19:24:51 +01:00
flarum-bot
717af13bb1 Bundled output for commit e72541e35d
Includes transpiled JS/TS, and Typescript declaration files (typings).

[skip ci]
2023-05-22 21:58:15 +00:00
Sami Mazouz
e72541e35d fix: recover temporary solution for html entities in browser title
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-22 22:49:20 +01:00
Sami Mazouz
577890d89c fix: custom contrast color affected by parents
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-22 22:23:11 +01:00
Sami Mazouz
253a3d281d fix: reply placeholder wrong positioning
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-22 21:58:38 +01:00
flarum-bot
d27f952584 Bundled output for commit e5abffc75b
Includes transpiled JS/TS, and Typescript declaration files (typings).

[skip ci]
2023-05-20 16:46:42 +00:00
Sami Mazouz
e5abffc75b chore: v1.8 preparations
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-20 16:08:42 +01:00
Sami Mazouz
d1059c1cc7 fix: improve avatar upload functionality
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-20 15:15:53 +01:00
flarum-bot
777c304ab7 Bundled output for commit 789246b621
Includes transpiled JS/TS, and Typescript declaration files (typings).

[skip ci]
2023-05-17 10:47:32 +00:00
Sami Mazouz
789246b621 fix(regression): slidable mark read showing for read discussions
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-17 11:37:33 +01:00
Sami Mazouz
980cfd6c28 Update prepare-release.yml 2023-05-17 09:51:06 +01:00
Sami Mazouz
65390a4fc0 test: patch phpstan error
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-16 19:57:57 +01:00
Sami Mazouz
c7c86a77e9 fix(regression): newCollection does not accept base collection
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-16 19:25:23 +01:00
Sami Mazouz
f1f6051deb fix(regression): lost spacing between tag label icon and text
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-16 19:21:04 +01:00
Sami Mazouz
bded3da42d fix(regression): queryVisibleTo accepts nullable actor
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-16 19:17:07 +01:00
Sami Mazouz
231cee1f78 fix(regression): newCollection accepts collections
Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
2023-05-15 17:31:23 +01:00
72 changed files with 255 additions and 172 deletions

View File

@@ -20,7 +20,7 @@ jobs:
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Prepare release - name: Prepare release
uses: flarum/action-release@master uses: flarum/action-release@master
env: with:
NEXT_TAG: ${{ inputs.version }} next_tag: ${{ inputs.version }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
OPEN_COLLECTIVE_TOKEN: ${{ secrets.OPEN_COLLECTIVE_TOKEN }} open_collective_token: ${{ secrets.OPEN_COLLECTIVE_TOKEN }}

View File

@@ -1,5 +1,55 @@
# Changelog # Changelog
## [v1.8.1](https://github.com/flarum/framework/compare/v1.8.0...v1.8.1)
### Fixed
* recover temporary solution for html entities in browser title (e72541e35de4f71f9d870bbd9bb46ddf586bdf1d)
* custom contrast color affected by parents (577890d89c593ae5b6cb96083fab69e2f1ae600c)
* reply placeholder wrong positioning (253a3d281dbf5ce3fa712b629b80587cf67e7dbe)
## [v1.8.0](https://github.com/flarum/framework/compare/v1.7.1...v1.8.0)
### Fixed
- (a11y) reply placeholder not accessible [#3793]
- (bbcode) highlight.js does not work after changing post content [#3817]
- (bbcode) localize quote `wrote` string [#3809]
- (mentions) mentions XHR fired even after mentioning is done [#3806]
- (package-manager) available core updates cause an error in the dashboard ([fab71f2](fab71f2d01fa20ce9b3002833339dc5ea3ea6301))
- (tags) not all tags are loaded in the permission grid [#3804]
- (tags) tag discussion modal filters with exact matches only after first index [#3786]
- (testing) always clear cache in integration test's tearDown [#3818]
- `UserSecurityPage` not exported ([232618a](232618aba604ab003425df38b895208c863d3260))
- `isDark()` utility can receive null value [#3774]
- approving a post does not bump user `comment_count` [#3790]
- circular dependencies disable all involved extensions [#3785]
- color input overflowing the input box [#3796]
- deleting a discussion from the profile does not visually remove it [#3799]
- discussion page showing horizontal scroll on iOS [#3821]
- empty string displayed as SelectDropdown title [#3773]
- filter values are not validated [#3795]
- infinite scroll not initialized for notifications on big screens [#3733]
- notification subject discussion eager loading fails [#3788]
- null as 2nd param in `preg_match` is deprecated [#3801]
- unread count in post stream not visible [#3791]
- unreadable badge icon on certain colors [#3810]
- integrity constraint violation [#3772]
### Changed
- (core,mentions) limit `mentionedBy` post relation results [#3780]
- (likes) limit `likes` relationship results [#3781]
- Change some methods from private to protected, to be able to extend the affected classes [#3802]
- Do not catch exceptions when testing Console commands [#3813]
- drop usage of jquery in `install` and `update` interfaces [#3797]
- extensibility improvements [#3729]
- major frontend JS cleanup [#3609]
- revert ineffective code for encoding of page title [#3768]
- speed up post creation time [#3808]
### Added
- (mentions,tags) tag mentions [#3769]
- add delete own posts permission [#3784]
- add a trait to flush the formatter cache in tests [#3811]
- add user creation to users list page [#3744]
- cli command for enabling or disabling an extension [#3816]
- conditional extenders [#3759]
- provide old content to `Revised` event [#3789]
## [v1.7.1](https://github.com/flarum/framework/compare/v1.7.0...v1.7.1) ## [v1.7.1](https://github.com/flarum/framework/compare/v1.7.0...v1.7.1)
### Fixed ### Fixed
- (tags) composer tag selection modal using wrong primary max & min numbers (abc9670659426b765274376945b818b70d84848c) - (tags) composer tag selection modal using wrong primary max & min numbers (abc9670659426b765274376945b818b70d84848c)

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7", "flarum/core": "^1.8",
"flarum/approval": "^1.7" "flarum/approval": "^1.7"
}, },
"autoload": { "autoload": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7", "flarum/core": "^1.8",
"flarum/flags": "^1.7" "flarum/flags": "^1.7"
}, },
"autoload": { "autoload": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"extra": { "extra": {
"branch-alias": { "branch-alias": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -40,6 +40,7 @@ class AddCanFlagAttribute
// If $actor is the post author, check to see if the setting is enabled // If $actor is the post author, check to see if the setting is enabled
return (bool) $this->settings->get('flarum-flags.can_flag_own'); return (bool) $this->settings->get('flarum-flags.can_flag_own');
} }
// $actor is not the post author // $actor is not the post author
return true; return true;
} }

View File

@@ -7,7 +7,7 @@
], ],
"license": "MIT", "license": "MIT",
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"extra": { "extra": {
"branch-alias": { "branch-alias": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -44,7 +44,6 @@ class LoadLikesRelationship
$loadable = null; $loadable = null;
if ($data instanceof Discussion) { if ($data instanceof Discussion) {
// @phpstan-ignore-next-line
$loadable = $data->newCollection($data->posts)->filter(function ($post) { $loadable = $data->newCollection($data->posts)->filter(function ($post) {
return $post instanceof Post; return $post instanceof Post;
}); });

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"extra": { "extra": {
"branch-alias": { "branch-alias": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -47,8 +47,7 @@ class LoadMentionedByRelationship
$loadable = null; $loadable = null;
if ($data instanceof Discussion) { if ($data instanceof Discussion) {
// @phpstan-ignore-next-line $loadable = $data->newCollection($data->posts)->filter(function ($post) {
$loadable = $data->newCollection((array) $data->posts)->filter(function ($post) {
return $post instanceof Post; return $post instanceof Post;
}); });
} elseif ($data instanceof Collection) { } elseif ($data instanceof Collection) {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -22,7 +22,7 @@
"source": "https://github.com/flarum/package-manager" "source": "https://github.com/flarum/package-manager"
}, },
"require": { "require": {
"flarum/core": "^1.5.0", "flarum/core": "^1.8",
"composer/composer": "^2.3" "composer/composer": "^2.3"
}, },
"require-dev": { "require-dev": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7", "flarum/core": "^1.8",
"pusher/pusher-php-server": "^2.2" "pusher/pusher-php-server": "^2.2"
}, },
"require-dev": { "require-dev": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -19,7 +19,7 @@
} }
], ],
"require": { "require": {
"flarum/core": "^1.7" "flarum/core": "^1.8"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -19,6 +19,10 @@
&.colored &-text, &--colored &-text { &.colored &-text, &--colored &-text {
color: var(--tag-color) !important; color: var(--tag-color) !important;
} }
&-icon {
margin-right: 2px;
}
} }
.TagLabel { .TagLabel {

View File

@@ -26,7 +26,7 @@ class TagRepository
return Tag::query(); return Tag::query();
} }
public function queryVisibleTo(User $actor): Builder public function queryVisibleTo(?User $actor = null): Builder
{ {
return $this->scopeVisibleTo($this->query(), $actor); return $this->scopeVisibleTo($this->query(), $actor);
} }
@@ -114,7 +114,7 @@ class TagRepository
* @param User|null $user * @param User|null $user
* @return Builder<Tag> * @return Builder<Tag>
*/ */
protected function scopeVisibleTo(Builder $query, User $user = null) protected function scopeVisibleTo(Builder $query, ?User $user = null)
{ {
if ($user !== null) { if ($user !== null) {
$query->whereVisibleTo($user); $query->whereVisibleTo($user);

View File

@@ -27,7 +27,7 @@ trait RetrievesRepresentativeTags
['id' => 11, 'name' => 'Secondary Restricted', 'slug' => 'secondary-restricted', 'position' => null, 'parent_id' => null, 'is_restricted' => true], ['id' => 11, 'name' => 'Secondary Restricted', 'slug' => 'secondary-restricted', 'position' => null, 'parent_id' => null, 'is_restricted' => true],
['id' => 12, 'name' => 'Primary Restricted 2', 'slug' => 'primary-2-restricted', 'position' => 100, 'parent_id' => null, 'is_restricted' => true], ['id' => 12, 'name' => 'Primary Restricted 2', 'slug' => 'primary-2-restricted', 'position' => 100, 'parent_id' => null, 'is_restricted' => true],
['id' => 13, 'name' => 'Primary Restricted 2 Child 1', 'slug' => 'primary-2-restricted-child-1', 'position' => 101, 'parent_id' => 12], ['id' => 13, 'name' => 'Primary Restricted 2 Child 1', 'slug' => 'primary-2-restricted-child-1', 'position' => 101, 'parent_id' => 12],
['id' => 14, 'name' => 'Primary Restricted 3', 'slug' => 'primary-3-restricted', 'position' => 102, 'parent_id' =>null, 'is_restricted' => true], ['id' => 14, 'name' => 'Primary Restricted 3', 'slug' => 'primary-3-restricted', 'position' => 102, 'parent_id' => null, 'is_restricted' => true],
]; ];
} }
} }

View File

@@ -1 +1 @@
export default function textContrastClass(hexcolor: string | null): string; export default function textContrastClass(hexcolor: string | null | undefined): string;

View File

@@ -72,7 +72,7 @@ export default class AvatarEditor extends Component<import("../../common/Compone
remove(): void; remove(): void;
/** /**
* After a successful upload/removal, push the updated user data into the * After a successful upload/removal, push the updated user data into the
* store, and force a recomputation of the user's avatar color. * store, and force a re-computation of the user's avatar color.
* *
* @param {object} response * @param {object} response
* @protected * @protected

2
framework/core/js/dist/admin.js generated vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
framework/core/js/dist/forum.js generated vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -40,7 +40,7 @@ export default class StatusWidget extends DashboardWidget {
[ [
<span> <span>
<strong>{app.translator.trans('core.admin.dashboard.status.headers.scheduler-status')}</strong>{' '} <strong>{app.translator.trans('core.admin.dashboard.status.headers.scheduler-status')}</strong>{' '}
<LinkButton href="https://discuss.flarum.org/d/24118" external={true} target="_blank" icon="fas fa-info-circle" /> <LinkButton href="https://docs.flarum.org/scheduler" external={true} target="_blank" icon="fas fa-info-circle" />
</span>, </span>,
<br />, <br />,
app.data.schedulerStatus, app.data.schedulerStatus,

View File

@@ -411,12 +411,23 @@ export default class Application {
pageNumber: 1, pageNumber: 1,
}; };
const title = let title =
onHomepage || !this.title onHomepage || !this.title
? extractText(app.translator.trans('core.lib.meta_titles.without_page_title', params)) ? extractText(app.translator.trans('core.lib.meta_titles.without_page_title', params))
: extractText(app.translator.trans('core.lib.meta_titles.with_page_title', params)); : extractText(app.translator.trans('core.lib.meta_titles.with_page_title', params));
document.title = count + title; title = count + title;
// We pass the title through a DOMParser to allow HTML entities
// to be rendered correctly, while still preventing XSS attacks
// from user input by using a script-disabled environment.
// https://github.com/flarum/framework/issues/3514
// https://github.com/flarum/framework/pull/3684
// This is only a temporary solution for 1.x,
// and the actual source of the issue will be fixed in 2.x
// Actual source of the issue: https://github.com/flarum/framework/issues/3685
const parser = new DOMParser();
document.title = parser.parseFromString(title, 'text/html').body.innerText;
} }
protected transformRequestOptions<ResponseType>(flarumOptions: FlarumRequestOptions<ResponseType>): InternalFlarumRequestOptions<ResponseType> { protected transformRequestOptions<ResponseType>(flarumOptions: FlarumRequestOptions<ResponseType>): InternalFlarumRequestOptions<ResponseType> {

View File

@@ -28,7 +28,7 @@ export default class Badge<CustomAttrs extends IBadgeAttrs = IBadgeAttrs> extend
view() { view() {
const { type, icon: iconName, label, color, style = {}, ...attrs } = this.attrs; const { type, icon: iconName, label, color, style = {}, ...attrs } = this.attrs;
const className = classList('Badge', [type && `Badge--${type}`], attrs.className, color && textContrastClass(color)); const className = classList('Badge', [type && `Badge--${type}`], attrs.className, textContrastClass(color));
const iconChild = iconName ? icon(iconName, { className: 'Badge-icon' }) : m.trust('&nbsp;'); const iconChild = iconName ? icon(iconName, { className: 'Badge-icon' }) : m.trust('&nbsp;');

View File

@@ -1,5 +1,7 @@
import isDark from '../utils/isDark'; import isDark from '../utils/isDark';
export default function textContrastClass(hexcolor: string | null): string { export default function textContrastClass(hexcolor: string | null | undefined): string {
if (!hexcolor) return 'text-contrast--unchanged';
return isDark(hexcolor) ? 'text-contrast--light' : 'text-contrast--dark'; return isDark(hexcolor) ? 'text-contrast--light' : 'text-contrast--dark';
} }

View File

@@ -204,7 +204,7 @@ export default class AvatarEditor extends Component {
/** /**
* After a successful upload/removal, push the updated user data into the * After a successful upload/removal, push the updated user data into the
* store, and force a recomputation of the user's avatar color. * store, and force a re-computation of the user's avatar color.
* *
* @param {object} response * @param {object} response
* @protected * @protected

View File

@@ -98,7 +98,7 @@ export default class DiscussionListItem<CustomAttrs extends IDiscussionListItemA
return ( return (
<span <span
className={classList('Slidable-underneath Slidable-underneath--left Slidable-underneath--elastic', { disabled: isUnread })} className={classList('Slidable-underneath Slidable-underneath--left Slidable-underneath--elastic', { disabled: !isUnread })}
onclick={this.markAsRead.bind(this)} onclick={this.markAsRead.bind(this)}
> >
{icon('fas fa-check')} {icon('fas fa-check')}

View File

@@ -176,4 +176,10 @@ blockquote ol:last-child {
--contrast-color: var(--text-on-dark); --contrast-color: var(--text-on-dark);
color: var(--contrast-color); color: var(--contrast-color);
} }
// This exists to prevent inheriting the contrast color from a parent element.
// Like when a badge is inside a tag hero.
&--unchanged {
--contrast-color: var(--unchanged-color);
}
} }

View File

@@ -441,7 +441,7 @@
color: var(--muted-color); color: var(--muted-color);
border-radius: 10px; border-radius: 10px;
background-color: transparent; background-color: transparent;
width: 100%; width: calc(~"100% + 20px * 2");
display: flex; display: flex;
.Post-header { .Post-header {

View File

@@ -62,7 +62,7 @@ class UploadFaviconController extends UploadImageController
]); ]);
} }
$encodedImage = $this->imageManager->make($file->getStream())->resize(64, 64, function ($constraint) { $encodedImage = $this->imageManager->make($file->getStream()->getMetadata('uri'))->resize(64, 64, function ($constraint) {
$constraint->aspectRatio(); $constraint->aspectRatio();
$constraint->upsize(); $constraint->upsize();
})->encode('png'); })->encode('png');

View File

@@ -38,7 +38,7 @@ class UploadLogoController extends UploadImageController
*/ */
protected function makeImage(UploadedFileInterface $file): Image protected function makeImage(UploadedFileInterface $file): Image
{ {
$encodedImage = $this->imageManager->make($file->getStream())->heighten(60, function ($constraint) { $encodedImage = $this->imageManager->make($file->getStream()->getMetadata('uri'))->heighten(60, function ($constraint) {
$constraint->upsize(); $constraint->upsize();
})->encode('png'); })->encode('png');

View File

@@ -256,7 +256,10 @@ abstract class AbstractModel extends Eloquent
return $result; return $result;
} }
public function newCollection(array $models = []) /**
* @param \Illuminate\Support\Collection|array $models
*/
public function newCollection($models = [])
{ {
return new Collection($models); return new Collection($models);
} }

View File

@@ -21,7 +21,7 @@ class Application
* *
* @var string * @var string
*/ */
const VERSION = '1.8.0-dev'; const VERSION = '2.0-dev';
/** /**
* The IoC container for the Flarum application. * The IoC container for the Flarum application.

View File

@@ -41,7 +41,7 @@ class GroupRepository
return $this->scopeVisibleTo($query, $actor)->firstOrFail(); return $this->scopeVisibleTo($query, $actor)->firstOrFail();
} }
public function queryVisibleTo(User $actor = null) public function queryVisibleTo(?User $actor = null)
{ {
return $this->scopeVisibleTo($this->query(), $actor); return $this->scopeVisibleTo($this->query(), $actor);
} }
@@ -53,7 +53,7 @@ class GroupRepository
* @param User|null $actor * @param User|null $actor
* @return Builder<Group> * @return Builder<Group>
*/ */
protected function scopeVisibleTo(Builder $query, User $actor = null) protected function scopeVisibleTo(Builder $query, ?User $actor = null)
{ {
if ($actor !== null) { if ($actor !== null) {
$query->whereVisibleTo($actor); $query->whereVisibleTo($actor);

View File

@@ -24,33 +24,40 @@ interface BlueprintInterface
* *
* @return User|null * @return User|null
*/ */
public function getFromUser(); public function getFromUser(): ?User;
/** /**
* Get the model that is the subject of this activity. * Get the model that is the subject of this activity.
* *
* @return AbstractModel|null * @return AbstractModel|null
*/ */
public function getSubject(); public function getSubject(): ?AbstractModel;
/** /**
* Get the data to be stored in the notification. * Get the data to be stored in the notification.
* *
* @return mixed * @return mixed
*/ */
public function getData(); public function getData(): mixed;
/** /**
* Get the serialized type of this activity. * Get the serialized type of this activity.
* *
* @return string * @return string
*/ */
public static function getType(); public static function getType(): string;
/** /**
* Get the name of the model class for the subject of this activity. * Get the name of the model class for the subject of this activity.
* *
* @return string * @return string
*/ */
public static function getSubjectModel(); public static function getSubjectModel(): string;
/**
* Whether the blueprint ignores that a user has not verified their email address.
*
* @return bool
*/
public function ignoresUserVerification(): bool;
} }

View File

@@ -29,7 +29,7 @@ class PostRepository
* @param User|null $user * @param User|null $user
* @return Builder<Post> * @return Builder<Post>
*/ */
public function queryVisibleTo(User $user = null) public function queryVisibleTo(?User $user = null)
{ {
$query = $this->query(); $query = $this->query();

View File

@@ -87,7 +87,7 @@ class AvatarValidator extends AbstractValidator
} }
try { try {
$this->imageManager->make($file->getStream()); $this->imageManager->make($file->getStream()->getMetadata('uri'));
} catch (NotReadableException $_e) { } catch (NotReadableException $_e) {
$this->raise('image'); $this->raise('image');
} }

View File

@@ -74,7 +74,7 @@ class UploadAvatarHandler
$this->validator->assertValid(['avatar' => $command->file]); $this->validator->assertValid(['avatar' => $command->file]);
$image = $this->imageManager->make($command->file->getStream()); $image = $this->imageManager->make($command->file->getStream()->getMetadata('uri'));
$this->events->dispatch( $this->events->dispatch(
new AvatarSaving($user, $actor, $image) new AvatarSaving($user, $actor, $image)

View File

@@ -1,6 +1,6 @@
{ {
"name": "flarum-webpack-config", "name": "flarum-webpack-config",
"version": "2.0.1", "version": "2.0.2",
"description": "Webpack config for Flarum JS and TS transpilation.", "description": "Webpack config for Flarum JS and TS transpilation.",
"main": "index.js", "main": "index.js",
"author": "Flarum Team", "author": "Flarum Team",

View File

@@ -192,6 +192,7 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase
protected function database(): ConnectionInterface protected function database(): ConnectionInterface
{ {
$this->app(); $this->app();
// Set in `BeginTransactionAndSetDatabase` extender. // Set in `BeginTransactionAndSetDatabase` extender.
return $this->database; return $this->database;
} }