Version 5.0.0 beta 7

This commit is contained in:
Neo committed 2025-12-19 17:18:38 -08:00
1 parent fa2a720105
commit 54d5dcd0a0
156 files changed
+4337 -2995

No files matched your search

+1 -1
View File
@@ -346,7 +346,7 @@ Web Push Library for PHP
Whoops
Description: Provides error handling for development mode
Location: dev/Whoops
Included Version: 2.15.2
Included Version: 2.16.0
Website: http://filp.github.io/whoops/
License: https://github.com/filp/whoops/blob/master/LICENSE.md
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="blog">
<file javascript_app="blog" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.manageCategories.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="blog" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.manageCategories.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -277,7 +277,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="blog" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.view.js" javascript_type="template" javascript_version="5000032" javascript_position="1000050"><![CDATA[/* CLASS LIST TEMPLATES */
<file javascript_app="blog" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.view.js" javascript_type="template" javascript_version="5000034" javascript_position="1000050"><![CDATA[/* CLASS LIST TEMPLATES */
ips.templates.set('blog.view.addButton', "\
<li><button type=\"button\" class=\"ipsButton ipsButton--primary ipsHide\" data-action=\"addNew\">{{#lang}}manage_cats_new_row{{/lang}}</button></li>\
");
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="blog" version="5000032">
<app key="blog" version="5000034">
<word key="__app_blog" js="0">Blogs</word>
<word key="frontnavigation_blogs" js="0">Blogs</word>
<word key="__indefart_blog_entry_comment" js="0">a comment on a blog entry</word>
+16 -22
View File
@@ -374,7 +374,7 @@
</a>
</h4>
{{if !( $blog->owner() instanceof \IPS\Member )}}
<p class='i-font-size_-1 i-color_soft'>{lang="byline" htmlsprintf="trim( $blog->latestEntry()->author()->link() )"} {datetime="$blog->latestEntry()->date"}</p>
<p class='i-font-size_-1 i-color_soft'>{lang="byline_name_date" htmlsprintf="trim( $blog->latestEntry()->author()->link() ), \IPS\DateTime::ts( $blog->latestEntry()->date )->html(TRUE)"} {datetime=""}</p>
{{endif}}
</div>
</li>
@@ -1018,21 +1018,21 @@
{template="userPhoto" app="core" params="$entry->author(), 'mini'" group="global"}
<div>
<h2 class='ipsTitle ipsTitle--h5'>
<span>{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}</span>
{{if $entry->prefix()}}
<span>{template="prefix" group="global" app="core" params="$entry->prefix( TRUE ), $entry->prefix()"}</span>
{{endif}}
<span class=''>
<a href="{$entry->url( "getPrefComment" )}" title="{lang="read_more_about" sprintf="$entry->name"} {{if $entry->canEdit()}}{lang="click_hold_edit"}{{endif}}" {{if $entry->canEdit()}}data-role="editableTitle"{{endif}}>
{{if $entry->unread()}}
<div class='ipsIndicator' data-ipsTooltip title="{lang="unread_blog"}"></div>
{{endif}}
{$entry->name}
</a>
</span>
<div class="ipsBadges">
{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}
{{if $entry->prefix()}}
{template="prefix" group="global" app="core" params="$entry->prefix( TRUE ), $entry->prefix()"}
{{endif}}
</div>
<a href="{$entry->url( "getPrefComment" )}" title="{lang="read_more_about" sprintf="$entry->name"} {{if $entry->canEdit()}}{lang="click_hold_edit"}{{endif}}" {{if $entry->canEdit()}}data-role="editableTitle"{{endif}}>
{{if $entry->unread()}}
<div class='ipsIndicator' data-ipsTooltip title="{lang="unread_blog"}"></div>
{{endif}}
{$entry->name}
</a>
</h2>
<p class='i-color_soft i-link-color_inherit'>
{{if $entry->category_id}}<span class="i-color_hard i-font-weight_600">{$entry->category()->name}</span>{{endif}} &middot; {lang="byline" htmlsprintf="$entry->author()->link()"}{datetime="$entry->date"}
{{if $entry->category_id}}<span class="i-color_hard i-font-weight_600">{$entry->category()->name}</span>{{endif}} &middot; {lang="byline_name_date" htmlsprintf="$entry->author()->link()"}{datetime="$entry->date"}
</p>
</div>
</header>
@@ -1627,9 +1627,6 @@
{{foreach $blog->latestEntry()->badges() as $badge}}{$badge|raw}{{endforeach}}
</span>
<a href='{$blog->latestEntry()->url( "getPrefComment" )}' title='{lang="view_this_entry" sprintf="$blog->latestEntry()->name"}'>
{{if $blog->latestEntry()->unread()}}
<span class='ipsIndicator' data-ipsTooltip title="{lang="unread_blog"}"></span>
{{endif}}
{$blog->latestEntry()->name}
</a>
</h3>
@@ -1657,16 +1654,13 @@
<li>
{template="userPhoto" app="core" params="$entry->author(), 'fluid'" group="global"}
<div class='i-flex_11 i-flex i-gap_2 i-row-gap_0 i-flex-wrap_wrap'>
<h4 class='{{if $entry->unread()}}font-weight_700{{else}}i-font-weight_500{{endif}} i-flex_11'>
{{if $entry->unread()}}
<a href='{$entry->url()}' title='{lang="view_this_entry" sprintf="$entry->name"}' class='ipsIndicator'></a>
{{endif}}
<h4 class='i-font-weight_500 i-flex_11'>
<a href='{$entry->url( "getPrefComment" )}' title='{lang="view_this_entry" sprintf="$entry->name"}'>
{$entry->name}
</a>
</h4>
{{if !( $blog->owner() instanceof \IPS\Member )}}
<p class='i-font-size_-1 i-color_soft'>{lang="byline" htmlsprintf="trim( $blog->latestEntry()->author()->link() )"} {datetime="$blog->latestEntry()->date"}</p>
<p class='i-font-size_-1 i-color_soft'>{lang="byline_name_date" htmlsprintf="trim( $blog->latestEntry()->author()->link() ), \IPS\DateTime::ts( $blog->latestEntry()->date )->html(TRUE)"}</p>
{{endif}}
</div>
</li>
+3 -1
View File
@@ -281,5 +281,7 @@
"5000029": "5.0.0 Beta 3",
"5000030": "5.0.0 Beta 4",
"5000031": "5.0.0 Beta 5",
"5000032": "5.0.0 Beta 6"
"5000032": "5.0.0 Beta 6",
"5000033": "5.0.0 Beta 7",
"5000034": "5.0.0 Beta 7"
}
@@ -0,0 +1,22 @@
{
"id": 5000033,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,21 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/rows",
"front\/view\/blogViewMedium",
"front\/widgets\/blogs"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000034,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
+11 -11
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="calendar">
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.main.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000250"><![CDATA[/**
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.main.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000250"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -110,7 +110,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.monthView.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000250"><![CDATA[/**
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.monthView.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000250"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -229,7 +229,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.eventList.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000300"><![CDATA[/**
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.eventList.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000300"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -347,7 +347,7 @@ var PER_PAGE = 16;
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.nearMe.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000300"><![CDATA[/**
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.nearMe.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000300"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -711,7 +711,7 @@ var PER_PAGE = 16;
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.search.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000300"><![CDATA[/**
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.search.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000300"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1265,7 +1265,7 @@ var PER_PAGE = 16;
});
}(jQuery, _));
]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.dates.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.dates.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1813,7 +1813,7 @@ var PER_PAGE = 16;
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/venue" javascript_name="ips.venue.main.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000200"><![CDATA[/**
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/venue" javascript_name="ips.venue.main.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000200"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1920,7 +1920,7 @@ var PER_PAGE = 16;
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.reminderButton.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150"><![CDATA[/**
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.reminderButton.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -2003,7 +2003,7 @@ var PER_PAGE = 16;
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.reminderForm.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150">/**
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.reminderForm.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -2113,7 +2113,7 @@ var PER_PAGE = 16;
});
}(jQuery, _));
</file>
<file javascript_app="calendar" javascript_location="front" javascript_path="templates" javascript_name="ips.calendar.templates.js" javascript_type="framework" javascript_version="5000032" javascript_position="1000050"><![CDATA[/**
<file javascript_app="calendar" javascript_location="front" javascript_path="templates" javascript_name="ips.calendar.templates.js" javascript_type="framework" javascript_version="5000034" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*/
@@ -2122,7 +2122,7 @@ var PER_PAGE = 16;
ips.templates.set('calendar.reminder.loading', " \
<div class='ipsLoading ipsLoading--tiny'></div>\
");]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.overview.js" javascript_type="template" javascript_version="5000032" javascript_position="1000050"><![CDATA[ips.templates.set("eventLoading", `
<file javascript_app="calendar" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.overview.js" javascript_type="template" javascript_version="5000034" javascript_position="1000050"><![CDATA[ips.templates.set("eventLoading", `
<li class='ipsData__item ipsData__item--loading'>
<div class="ipsData__image"></div>
<div class="ipsData__content">
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="calendar" version="5000032">
<app key="calendar" version="5000034">
<word key="__app_calendar" js="0">Events</word>
<word key="frontnavigation_calendar" js="0">Events</word>
<word key="__indefart_calendar_event_comment" js="0">a comment on an event</word>
+3 -4
View File
@@ -968,7 +968,7 @@
<div class="ipsBadges">
{{foreach $row->badges() as $badge}}{$badge|raw}{{endforeach}}
{{if $row->prefix()}}
<span>{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}</span>
{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}
{{endif}}
</div>
<h4>
@@ -979,13 +979,12 @@
<div class='ipsData__desc ipsTruncate_2'>{$row->tableDescription()|raw}</div>
{{else}}
<div class="ipsData__meta">
{lang="byline" htmlsprintf="$row->author()->link( $row->warningRef() )"}{datetime="$row->__get( $row::$databaseColumnMap['date'] )"}
{lang="byline_name_date" htmlsprintf="$row->author()->link( $row->warningRef() ), \IPS\DateTime::ts( $row->__get( $row::$databaseColumnMap['date'] ) )->html(TRUE)"}
{lang="in"} <a href="{$row->container()->url()}">{$row->container()->_title}</a>
</div>
{{endif}}
</div>
<!-- v5 todo: The anon badge isn't great on mobile but I can't be bothered fixing it atm -->
{{if $row->_followData['follow_is_anon']}}
<div class='cFollowedContent_anon'>
<span class='ipsBadge ipsBadge--icon' data-role='followAnonymous' data-ipsTooltip title='{lang="follow_is_anon"}'><i class='fa-solid fa-eye-slash'></i></span>
@@ -1034,7 +1033,7 @@
<div class='ipsData__title'>
{{foreach $row->badges() as $badge}}{$badge|raw}{{endforeach}}
{{if $row->prefix()}}
<span>{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}</span>
{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}
{{endif}}
<h4>
<a href='{$row->url( "getPrefComment" )}' {{if $row->tableHoverUrl}}data-ipsHover{{endif}}>
+3 -1
View File
@@ -281,5 +281,7 @@
"5000029": "5.0.0 Beta 3",
"5000030": "5.0.0 Beta 4",
"5000031": "5.0.0 Beta 5",
"5000032": "5.0.0 Beta 6"
"5000032": "5.0.0 Beta 6",
"5000033": "5.0.0 Beta 7",
"5000034": "5.0.0 Beta 7"
}
@@ -0,0 +1,22 @@
{
"id": 5000033,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,20 @@
{
"html": {
"added": [],
"edited": [
"front\/global\/manageFollowRow",
"front\/global\/rows"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000034,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
+10 -10
View File
@@ -710,14 +710,14 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi
{{endif}}
{{if $comment->author()->member_id}}
<!-- Expand mini profile -->
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-{$comment->$idField}' aria-expanded='false' data-ipscontrols aria-label="Toggle mini profile"><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-{$comment->$idField}' aria-expanded='false' data-ipscontrols data-ipscontrols-src="{$comment->authorMiniProfileUrl}" aria-label="Toggle mini profile"><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
{{endif}}
</div>
{{if $comment->author()->member_id}}
{{if $comment->author()->member_id}}
{template="miniProfile" app="core" group="global" params="$comment, $comment->$idField"}
{template="miniProfileWrap" app="core" group="global" params="$comment->author(), $comment->$idField, remoteLoading: true"}
{{endif}}
{{endif}}
</header>
<div class='ipsEntry__post'>
@@ -1142,12 +1142,12 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
</ul>
{{if $review->author()->member_id}}
<!-- Expand mini profile -->
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-review-{$review->id}' aria-expanded='false' data-ipscontrols aria-label="Toggle mini profile"><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-review-{$review->id}' aria-expanded='false' data-ipscontrols data-ipscontrols-src="{$review->authorMiniProfileUrl}" aria-label="Toggle mini profile"><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
{{endif}}
</div>
{{if $review->author()->member_id}}
{template="miniProfile" app="core" group="global" params="$review, $review->id, 'review'"}
{{endif}}
{{if $review->author()->member_id}}
{template="miniProfileWrap" app="core" group="global" params="$review->author(), $review->id, 'review', remoteLoading: true"}
{{endif}}
</header>
<div class='ipsEntry__post'>
{{if $review->hidden() AND $review->hidden() != -2}}
@@ -1893,7 +1893,7 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
{{$iposted = $table ? $table->contentPostedIn : array();}}
{{foreach $rows as $row}}
{{$idField = $row::$databaseColumnId;}}
<li class="ipsData__item {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsData__item--{$row->tableClass()}{{endif}} {{if $row->hidden()}}ipsModerated{{endif}} {{if $row->isAssignedToMember()}}ipsData__item--assigned{{endif}}" data-rowID='{$row->$idField}' {{if $row->unread()}}data-ips-unread{{else}}data-ips-read{{endif}}>
<li class="ipsData__item {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsData__item--{$row->tableClass()}{{endif}} {{if $row->hidden()}}ipsModerated{{endif}} {{if $row->isAssignedToMember()}}ipsData__item--assigned{{endif}}" data-rowID='{$row->$idField}' {{if $table !== null and $row->unread()}}data-ips-unread{{else}}data-ips-read{{endif}}>
<a href='{$row->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{{if $row->_title or $row->_title == 0}}{$row->_title}{{else}}{lang="content_deleted"}{{endif}}</span></a>
{{if $row->showRecordImage()}}
<figure class="ipsData__image">
@@ -1916,7 +1916,7 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
{{endif}}
<h4>
{{if member.member_id}}
{{if $row->unread()}}
{{if $table !== null and $row->unread()}}
<a href='{$row->url( 'getNewComment' )}' title='{lang="first_unread_post"}' data-ipsTooltip class='ipsIndicator {{if \in_array( $row->$idField, $iposted )}}ipsIndicator--participated{{endif}}'></a>
{{else}}
<span class='ipsIndicator {{if \in_array( $row->$idField, $iposted )}}ipsIndicator--participated{{endif}}'></span>
+19 -19
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="cms">
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/blocks" javascript_name="ips.blocks.form.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/blocks" javascript_name="ips.blocks.form.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -67,7 +67,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/blocks" javascript_name="ips.blocks.navigation.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050"><![CDATA[/**
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/blocks" javascript_name="ips.blocks.navigation.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -111,7 +111,7 @@
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/databases" javascript_name="ips.databases.download.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150">/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/databases" javascript_name="ips.databases.download.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -156,7 +156,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/databases" javascript_name="ips.databases.form.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150"><![CDATA[/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/databases" javascript_name="ips.databases.form.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -232,7 +232,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/external" javascript_name="ips.external.communication.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150"><![CDATA[/**
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/external" javascript_name="ips.external.communication.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -367,7 +367,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/fields" javascript_name="ips.fields.form.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000200"><![CDATA[/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/fields" javascript_name="ips.fields.form.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000200"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -457,7 +457,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/media" javascript_name="ips.media.main.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000300"><![CDATA[/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/media" javascript_name="ips.media.main.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000300"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1096,7 +1096,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/pages" javascript_name="ips.pages.embed.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000250"><![CDATA[/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/pages" javascript_name="ips.pages.embed.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000250"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1131,7 +1131,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/pages" javascript_name="ips.pages.form.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000250"><![CDATA[/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/pages" javascript_name="ips.pages.form.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000250"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1253,7 +1253,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/records" javascript_name="ips.records.form.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/records" javascript_name="ips.records.form.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1365,7 +1365,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/records" javascript_name="ips.records.revisions.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100">/**
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/records" javascript_name="ips.records.revisions.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1420,7 +1420,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.addForm.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050">/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.addForm.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1470,7 +1470,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.conflict.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050">/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.conflict.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1542,7 +1542,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.fileEditor.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050"><![CDATA[/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.fileEditor.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -2503,7 +2503,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.fileList.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050"><![CDATA[/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.fileList.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -2795,7 +2795,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.main.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050"><![CDATA[/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.main.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -2964,7 +2964,7 @@
});
}(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.variablesDialog.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050">/**
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.variablesDialog.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -3009,7 +3009,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="cms" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.media.js" javascript_type="template" javascript_version="5000032" javascript_position="1000050"><![CDATA[ips.templates.set( 'templates.media.grid', "\
<file javascript_app="cms" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.media.js" javascript_type="template" javascript_version="5000034" javascript_position="1000050"><![CDATA[ips.templates.set( 'templates.media.grid', "\
<ul class='ipsGrid ipsGrid--pages-media'>\
{{{contents}}}\
</ul>\
@@ -3026,7 +3026,7 @@ ips.templates.set( 'templates.media.noSearchResults', "\
{{#lang}}mediaNoResults{{/lang}}\
</div>\
");]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.templates.js" javascript_type="template" javascript_version="5000032" javascript_position="1000050"><![CDATA[/* TEMPLATE EDITOR TEMPLATES */
<file javascript_app="cms" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.templates.js" javascript_type="template" javascript_version="5000034" javascript_position="1000050"><![CDATA[/* TEMPLATE EDITOR TEMPLATES */
/* TEMPLATECEPTION */
ips.templates.set('templates.editor.newTab', " \
<a href='#' class='ipsTabs__tab' id='ipsTabs_elTemplateEditor_tabbar_tab_{{fileid}}' role='tab' aria-controls='ipsTabs_elTemplateEditor_tabbar_tab_{{fileid}}_panel' aria-selected='false' data-fileid='{{fileid}}' data-location='{{location}}'>{{title}} <span data-action='closeTab'><i class='fa-solid fa-xmark'></i></span></a>\
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="cms" version="5000032">
<app key="cms" version="5000034">
<word key="__app_cms" js="0">Pages</word>
<word key="menutab__cms" js="0">Pages</word>
<word key="menutab__cms_icon" js="0">file</word>
+1 -1
View File
@@ -1234,7 +1234,7 @@
{template="navigationLine" app="cms" group="widgets" params="$folder, null, $currentContainer"}
{{endforeach}}
{{else}}
{template="navigationLine" app="cms" group="widgets" params="$folders, $title, $currentContainer"}
{template="navigationLine" app="cms" group="widgets" params="$folders, null, $currentContainer"}
{{endif}}
{{if $rootId == 0 AND \count( $pages )}}
<div>
+3 -1
View File
@@ -599,5 +599,7 @@
"5000029": "5.0.0 Beta 3",
"5000030": "5.0.0 Beta 4",
"5000031": "5.0.0 Beta 5",
"5000032": "5.0.0 Beta 6"
"5000032": "5.0.0 Beta 6",
"5000033": "5.0.0 Beta 7",
"5000034": "5.0.0 Beta 7"
}
@@ -303,57 +303,61 @@ class MoveComments extends QueueAbstract
}
foreach( new ActiveRecordIterator( Db::i()->select( '*', 'forums_posts', array( "pid>? AND new_topic=? AND " . Db::i()->in( 'topic_id', $subquery ), $data['lastId'], 0 ), "pid ASC", $this->rebuild ), 'IPS\forums\Topic\Post' ) AS $row )
{
/* @var Records $recordClass */
$record = $recordClass::load( $row->topic_id, 'record_topicid' );
$approved = $row->queued;
if ( $row->queued == 1 )
try
{
$approved = 0;
}
else if ( $row->queued == 0 )
{
$approved = 1;
}
$comment = new $commentClass;
$comment->user = $row->author_id;
$comment->database_id = $database->_id;
$comment->record_id = $record->primary_id_field;
$comment->date = $row->post_date;
$comment->ip_address = $row->ip_address;
$comment->post = $row->post;
$comment->approved = $approved;
$comment->author = $row->author_name;
$comment->edit_date = $row->edit_time ?: 0;
$comment->edit_reason = $row->edit_reason;
$comment->edit_member_name = $row->edit_name;
$comment->save();
/* @var Records $recordClass */
$record = $recordClass::load( $row->topic_id, 'record_topicid' );
/* Update post before register */
Db::i()->update( 'core_post_before_registering', array( 'class' => $commentClass, 'id' => $comment->id ), array( 'class=? and id=?', "\IPS\forums\Topic\Post", $row->id ) );
$approved = $row->queued;
if ( $row->queued == 1 )
{
$approved = 0;
}
else if ( $row->queued == 0 )
{
$approved = 1;
}
Index::i()->index( $comment );
$row->delete();
$data['lastId'] = $row->pid;
$data['done']++;
$done++;
/* If we're no longer keeping the topic, then delete it, but only if we're really done with it (ex, only the first post still exists). Otherwise, we still want the topic linked, we're just not using it for comments anymore. */
if ( $data['deleteTopics'] AND (int) Db::i()->select( 'COUNT(*)', 'forums_posts', array( "topic_id=?", $row->topic_id ) )->first() === 1 )
{
Topic::load( $row->topic_id )->delete();
$record->record_topicid = 0;
$comment = new $commentClass;
$comment->user = $row->author_id;
$comment->database_id = $database->_id;
$comment->record_id = $record->primary_id_field;
$comment->date = $row->post_date;
$comment->ip_address = $row->ip_address;
$comment->post = $row->post;
$comment->approved = $approved;
$comment->author = $row->author_name;
$comment->edit_date = $row->edit_time ?: 0;
$comment->edit_reason = $row->edit_reason;
$comment->edit_member_name = $row->edit_name;
$comment->save();
/* Update post before register */
Db::i()->update( 'core_post_before_registering', array( 'class' => $commentClass, 'id' => $comment->id ), array( 'class=? and id=?', "\IPS\forums\Topic\Post", $row->id ) );
Index::i()->index( $comment );
$row->delete();
$data['lastId'] = $row->pid;
$data['done']++;
$done++;
/* If we're no longer keeping the topic, then delete it, but only if we're really done with it (ex, only the first post still exists). Otherwise, we still want the topic linked, we're just not using it for comments anymore. */
if ( $data['deleteTopics'] and (int)Db::i()->select( 'COUNT(*)', 'forums_posts', array( "topic_id=?", $row->topic_id ) )->first() === 1 )
{
Topic::load( $row->topic_id )->delete();
$record->record_topicid = 0;
}
$record->resyncCommentCounts();
$record->save();
$category = $record->container();
$category->resetCommentCounts();
$category->save();
}
$record->resyncCommentCounts();
$record->save();
$category = $record->container();
$category->resetCommentCounts();
$category->save();
catch ( OutOfRangeException ) {} // this may have already been handled
}
return $done;
@@ -0,0 +1,22 @@
{
"id": 5000033,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,19 @@
{
"html": {
"added": [],
"edited": [
"front\/widgets\/FolderNavigation"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000034,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -827,17 +827,6 @@ class Records extends Item implements
}
}
if ( static::modPermission( 'feature', NULL, $container ) )
{
$options['feature'] = 'create_record_featured';
$toggles['feature'] = array( 'create_record_featured' );
if ( $item AND $item->record_featured === 1 )
{
$values[] = 'feature';
}
}
if ( Member::loggedIn()->modPermission('can_content_edit_meta_tags') )
{
$formElements['record_meta_keywords'] = new TextArea( 'record_meta_keywords', $item ? $item->record_meta_keywords : '', FALSE );
@@ -1011,15 +1000,6 @@ class Records extends Item implements
{
$this->record_pinned = 0;
}
if ( in_array( 'feature', $values['create_record_state'] ) )
{
$this->record_featured = 1;
}
else
{
$this->record_featured = 0;
}
}
/* Dates */
@@ -95,11 +95,6 @@ class FolderNavigation extends Widget
*/
public function render(): string
{
if( !Page::$currentPage )
{
return "";
}
$rootId = $this->configuration['block_nav_folder'] ?? 0;
if( $rootId !== 0 )
{
@@ -124,6 +119,6 @@ class FolderNavigation extends Widget
)
);
return $this->output( $folders, $rootId, $pages, $this->configuration['block_nav_title'] ?? null, Page::$currentPage->folder_id ?: null );
return $this->output( $folders, $rootId, $pages, $this->configuration['block_nav_title'] ?? null, ( Page::$currentPage ? ( Page::$currentPage->folder_id ?: null ) : null ) );
}
}
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="convert">
<file javascript_app="convert" javascript_location="admin" javascript_path="controllers/convert" javascript_name="ips.convert.menu.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100">/**
<file javascript_app="convert" javascript_location="admin" javascript_path="controllers/convert" javascript_name="ips.convert.menu.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -45,7 +45,7 @@
}
} );
}(jQuery, _));</file>
<file javascript_app="convert" javascript_location="admin" javascript_path="controllers/forms" javascript_name="ips.forms.reactionmapper.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050">/**
<file javascript_app="convert" javascript_location="admin" javascript_path="controllers/forms" javascript_name="ips.forms.reactionmapper.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="convert" version="5000032">
<app key="convert" version="5000034">
<word key="__app_convert" js="0">Converter</word>
<word key="menu__convert_manage" js="0">Conversions</word>
<word key="menu__convert_manage_manage_start" js="0">Start New Conversion</word>
+3 -1
View File
@@ -281,5 +281,7 @@
"5000029": "5.0.0 Beta 3",
"5000030": "5.0.0 Beta 4",
"5000031": "5.0.0 Beta 5",
"5000032": "5.0.0 Beta 6"
"5000032": "5.0.0 Beta 6",
"5000033": "5.0.0 Beta 7",
"5000034": "5.0.0 Beta 7"
}
@@ -0,0 +1,22 @@
{
"id": 5000033,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000034,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -117,7 +117,7 @@ class Bbpress extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums() : void
{
$libraryClass = $this->getLibrary();
@@ -141,14 +141,14 @@ class Bbpress extends Software
/**
* @brief User cache to minimise repeated DB lookups
*/
protected static $userCache = array();
protected static array $userCache = array();
/**
* Convert topics
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'ID' );
@@ -190,7 +190,7 @@ class Bbpress extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'ID' );
@@ -17,7 +17,7 @@ use DomainException;
use Exception;
use IPS\Content;
use IPS\convert\Software;
use IPS\convert\Software\Core\Expressionengine;
use IPS\convert\Software\Core\Expressionengine as ExpressionEngineCore;
use IPS\Db;
use IPS\Http\Url;
use IPS\Member;
@@ -197,14 +197,14 @@ class Expressionengine extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return Expressionengine::fixPostData( $post, $className, $contentId );
return ExpressionEngineCore::fixPostData( $post, $className, $contentId );
}
/**
@@ -212,7 +212,7 @@ class Expressionengine extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums() : void
{
$libraryClass = $this->getLibrary();
@@ -248,7 +248,7 @@ class Expressionengine extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics() : void
{
$libraryClass = $this->getLibrary();
@@ -352,7 +352,7 @@ class Expressionengine extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts() : void
{
$libraryClass = $this->getLibrary();
@@ -394,7 +394,7 @@ class Expressionengine extends Software
*
* @return void
*/
public function convertOtherPosts()
public function convertOtherPosts() : void
{
$libraryClass = $this->getLibrary();
@@ -436,7 +436,7 @@ class Expressionengine extends Software
*
* @return void
*/
public function convertAttachments()
public function convertAttachments() : void
{
$libraryClass = $this->getLibrary();
@@ -22,6 +22,7 @@ use IPS\convert\App;
use IPS\convert\Library;
use IPS\convert\Software;
use IPS\Db;
use IPS\Db\Exception as DbException;
use IPS\Http\Url;
use IPS\Member;
use IPS\Node\Model;
@@ -46,12 +47,12 @@ class Invisioncommunity extends Software
/**
* @brief Whether the versions of IPS4 match
*/
public static $versionMatch = FALSE;
public static bool $versionMatch = FALSE;
/**
* @brief Whether the database has been required
*/
public static $dbNeeded = FALSE;
public static bool $dbNeeded = FALSE;
/**
* Constructor
@@ -61,12 +62,12 @@ class Invisioncommunity extends Software
* @return void
* @throws InvalidArgumentException
*/
public function __construct( App $app, $needDB=TRUE )
public function __construct( App $app, bool $needDB=TRUE )
{
/* Set filename obscuring flag */
Library::$obscureFilenames = FALSE;
$return = parent::__construct( $app, $needDB );
parent::__construct( $app, $needDB );
if( $needDB )
{
@@ -82,13 +83,11 @@ class Invisioncommunity extends Software
static::$versionMatch = TRUE;
}
}
catch( \IPS\Db\Exception $e ) {}
catch( DbException $e ) {}
/* Get parent sauce */
$this->parent = $this->app->_parent->getSource();
}
return $return;
}
/**
@@ -181,17 +180,15 @@ class Invisioncommunity extends Software
case 'core_rss_imported':
try
{
return $this->db->select( 'COUNT(*)', 'core_rss_imported', array( 'rss_imported_import_id IN(' . (string) $this->db->select( 'rss_import_id', 'core_rss_import', array( "rss_import_class='IPS\\forums\\Topic'" ) ) . ')' ) )->first();
return $this->db->select( 'COUNT(*)', 'core_rss_imported', array( 'rss_imported_import_id IN(' . $this->db->select( 'rss_import_id', 'core_rss_import', array( "rss_import_class='IPS\\forums\\Topic'" ) ) . ')' ) )->first();
}
catch( Exception $e )
{
throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) );
}
break;
default:
return parent::countRows( $table, $where, $recache );
break;
}
}
@@ -235,7 +232,7 @@ class Invisioncommunity extends Software
$return[ $method ] = array(
'upload_path' => array(
'field_class' => 'IPS\\Helpers\\Form\\Text',
'field_default' => isset( $this->parent->app->_session['more_info']['convertEmoticons']['upload_path'] ) ? $this->parent->app->_session['more_info']['convertEmoticons']['upload_path'] : NULL,
'field_default' => $this->parent->app->_session['more_info']['convertEmoticons']['upload_path'] ?? NULL,
'field_required' => TRUE,
'field_extra' => array(),
'field_hint' => Member::loggedIn()->language()->addToStack('convert_invision_upload_path'),
@@ -287,7 +284,7 @@ class Invisioncommunity extends Software
*
* @return void
*/
public function convertForumsAnswerRatings()
public function convertForumsAnswerRatings() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'id' );
@@ -307,7 +304,7 @@ class Invisioncommunity extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'id' );
@@ -348,7 +345,7 @@ class Invisioncommunity extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'tid' );
@@ -402,7 +399,7 @@ class Invisioncommunity extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'pid' );
@@ -445,7 +442,7 @@ class Invisioncommunity extends Software
*
* @return void
*/
public function convertForumsQuestionRatings()
public function convertForumsQuestionRatings() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'id' );
@@ -465,7 +462,7 @@ class Invisioncommunity extends Software
*
* @return void
*/
public function convertForumsTopicsMultimods()
public function convertForumsTopicsMultimods() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'mm_id' );
@@ -488,7 +485,7 @@ class Invisioncommunity extends Software
*
* @return void
*/
public function convertForumsRssImports()
public function convertForumsRssImports() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'rss_import_id' );
@@ -511,11 +508,11 @@ class Invisioncommunity extends Software
*
* @return void
*/
public function convertForumsRssImported()
public function convertForumsRssImported() : void
{
$libraryClass = $this->getLibrary();
foreach( $this->fetch( 'core_rss_imported', 'rss_imported_content_id', array( 'rss_imported_id IN(' . (string) Db::i()->select( 'rss_import_id', 'core_rss_import', array( "rss_import_class='IPS\\forums\\Topic'" ) ) . ')' ) ) AS $row )
foreach( $this->fetch( 'core_rss_imported', 'rss_imported_content_id', array( 'rss_imported_id IN(' . Db::i()->select( 'rss_import_id', 'core_rss_import', array( "rss_import_class='IPS\\forums\\Topic'" ) ) . ')' ) ) AS $row )
{
/* Remove non-standard columns */
$this->parent->unsetNonStandardColumns( $row, 'core_rss_imported', 'core' );
@@ -529,7 +526,7 @@ class Invisioncommunity extends Software
*
* @return void
*/
public function convertAttachments()
public function convertAttachments() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'attach_id' );
@@ -17,7 +17,7 @@ use DomainException;
use Exception;
use IPS\Content;
use IPS\convert\Software;
use IPS\convert\Software\Core\Mybb;
use IPS\convert\Software\Core\Mybb as MybbCore;
use IPS\Db;
use IPS\Http\Url;
use IPS\Member;
@@ -209,14 +209,14 @@ class Mybb extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return Mybb::fixPostData( $post, $className, $contentId );
return MybbCore::fixPostData( $post, $className, $contentId );
}
/**
@@ -224,7 +224,7 @@ class Mybb extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums(): void
{
$libraryClass = $this->getLibrary();
@@ -283,7 +283,7 @@ class Mybb extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics(): void
{
$libraryClass = $this->getLibrary();
@@ -380,10 +380,7 @@ class Mybb extends Software
$this->db->select( 'fid', 'threads', array( "tid=?", $moved[1] ) )->first()
);
}
catch( UnderflowException $e )
{
$moved_to = NULL;
}
catch( UnderflowException $e ){}
}
$info = array(
@@ -473,7 +470,7 @@ class Mybb extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts(): void
{
$libraryClass = $this->getLibrary();
@@ -512,7 +509,7 @@ class Mybb extends Software
'author_name' => $row['username'],
'ip_address' => $row['ipaddress'],
'post_date' => $row['dateline'],
'queued' => $queued,
'queued' => $queued ?? 0,
'post_edit_reason' => $row['editreason'],
);
@@ -574,7 +571,7 @@ class Mybb extends Software
*
* @return void
*/
public function convertAttachments()
public function convertAttachments(): void
{
$libraryClass = $this->getLibrary();
@@ -629,9 +626,8 @@ class Mybb extends Software
}
}
}
catch( UnderflowException $e ) {}
catch( OutOfRangeException $e ) {}
catch( UnderflowException|OutOfRangeException $e ) {}
$libraryClass->setLastKeyValue( $row['aid'] );
}
}
@@ -17,7 +17,7 @@ use DomainException;
use Exception;
use IPS\Content;
use IPS\convert\Software;
use IPS\convert\Software\Core\Phpbb;
use IPS\convert\Software\Core\Phpbb as PhpbbCore;
use IPS\Db;
use IPS\Http\Url;
use IPS\Member;
@@ -192,14 +192,14 @@ class Phpbb extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return Phpbb::fixPostData( $post, $className, $contentId );
return PhpbbCore::fixPostData( $post, $className, $contentId );
}
/**
@@ -207,7 +207,7 @@ class Phpbb extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums(): void
{
$libraryClass = $this->getLibrary();
@@ -219,8 +219,8 @@ class Phpbb extends Software
'id' => $row['forum_id'],
'name' => $row['forum_name'],
'description' => $row['forum_desc'],
'topics' => isset( $row['forum_topics_approved'] ) ? $row['forum_topics_approved'] : $row['forum_topics'],
'posts' => isset( $row['forum_posts_approved'] ) ? $row['forum_posts_approved'] : $row['forum_posts'],
'topics' => $row['forum_topics_approved'] ?? $row['forum_topics'],
'posts' => $row['forum_posts_approved'] ?? $row['forum_posts'],
'last_post' => $row['forum_last_post_time'],
'last_poster_id' => $row['forum_last_poster_id'],
'last_poster_name' => $row['forum_last_poster_name'],
@@ -229,9 +229,9 @@ class Phpbb extends Software
'position' => $row['left_id'],
'password' => ( isset( $this->app->_session['more_info']['convertForumsForums']["forum_password_{$row['forum_id']}"] ) ) ? $this->app->_session['more_info']['convertForumsForums']["forum_password_{$row['forum_id']}"] : NULL,
'last_title' => $row['forum_last_post_subject'],
'queued_topics' => isset( $row['forum_topics_unapproved'] ) ? $row['forum_topics_unapproved'] : 0,
'queued_topics' => $row['forum_topics_unapproved'] ?? 0,
'queued_posts' => isset( $row['forum_posts_unapproved'] ) ? $row['forum_topics_unapproved'] : 0,
'sub_can_post' => ( $row['forum_type'] == 1 ) ? TRUE : FALSE
'sub_can_post' => $row['forum_type'] == 1
);
$libraryClass->convertForumsForum( $info );
@@ -264,7 +264,7 @@ class Phpbb extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics(): void
{
$libraryClass = $this->getLibrary();
@@ -327,15 +327,8 @@ class Phpbb extends Software
);
}
}
if ( isset( $row['topic_visibility'] ) )
{
$visibility = $row['topic_visibility'];
}
else
{
$visibility = $row['topic_approved'];
}
$visibility = $row['topic_visibility'] ?? $row['topic_approved'];
/* Global Topics */
if ( !$row['forum_id'] )
@@ -361,7 +354,7 @@ class Phpbb extends Software
'title' => $row['topic_title'],
'forum_id' => $row['forum_id'],
'state' => ( $row['topic_status'] == 0 ) ? 'open' : 'closed',
'posts' => isset( $row['topic_posts_approved'] ) ? $row['topic_posts_approved'] : $row['topic_replies'],
'posts' => $row['topic_posts_approved'] ?? $row['topic_replies'],
'starter_id' => $row['topic_poster'],
'start_date' => $row['topic_time'],
'last_poster_id' => $row['topic_last_poster_id'],
@@ -406,7 +399,7 @@ class Phpbb extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts(): void
{
$libraryClass = $this->getLibrary();
@@ -414,14 +407,7 @@ class Phpbb extends Software
foreach( $this->fetch( 'posts', 'post_id' ) AS $row )
{
if ( isset( $row['post_visibility'] ) )
{
$visibility = $row['post_visibility'];
}
else
{
$visibility = $row['post_approved'];
}
$visibility = $row['post_visibility'] ?? $row['post_approved'];
$editName = null;
if( $row['post_edit_time'] AND $row['post_edit_user'] )
@@ -436,7 +422,7 @@ class Phpbb extends Software
$info = array(
'pid' => $row['post_id'],
'topic_id' => $row['topic_id'],
'post' => Phpbb::stripUid( $row['post_text'], $row['bbcode_uid'] ),
'post' => PhpbbCore::stripUid( $row['post_text'], $row['bbcode_uid'] ),
'append_edit' => ( $row['post_edit_user'] ) ? 1 : 0,
'edit_time' => $row['post_edit_time'],
'edit_name' => $editName,
@@ -445,7 +431,7 @@ class Phpbb extends Software
'ip_address' => $row['poster_ip'],
'post_date' => $row['post_time'],
'queued' => ( $visibility == 1 ) ? 0 : -1,
'pdelete_time' => isset( $row['post_delete_time'] ) ? $row['post_delete_time'] : NULL,
'pdelete_time' => $row['post_delete_time'] ?? NULL,
);
$libraryClass->convertForumsPost( $info );
@@ -470,7 +456,7 @@ class Phpbb extends Software
'wl_moderator' => $log['user_id'],
'wl_date' => $warning['warning_time'],
'wl_points' => 1,
'wl_note_member' => isset( $data[0] ) ? $data[0] : NULL,
'wl_note_member' => $data[0] ?? NULL,
) );
/* Add a member history record for this member */
@@ -492,14 +478,14 @@ class Phpbb extends Software
/**
* @brief temporarily store post content
*/
protected $_postContent = array();
protected array $_postContent = array();
/**
* Convert attachments
*
* @return void
*/
public function convertAttachments()
public function convertAttachments(): void
{
$libraryClass = $this->getLibrary();
@@ -559,8 +545,7 @@ class Phpbb extends Software
$this->_postContent[ $pid ] .= '<br>' . $replacement;
}
}
catch( UnderflowException $e ) {}
catch( OutOfRangeException $e ) {}
catch( UnderflowException|OutOfRangeException $e ) {}
}
$libraryClass->setLastKeyValue( $row['attach_id'] );
@@ -16,7 +16,7 @@ namespace IPS\convert\Software\Forums;
use Exception;
use IPS\Content;
use IPS\convert\Software;
use IPS\convert\Software\Core\Punbb;
use IPS\convert\Software\Core\Punbb as PunbbCore;
use IPS\Http\Url;
use IPS\Node\Model;
use IPS\Request;
@@ -122,14 +122,14 @@ class Punbb extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return Punbb::fixPostData( $post, $className, $contentId );
return PunbbCore::fixPostData( $post, $className, $contentId );
}
/**
@@ -137,7 +137,7 @@ class Punbb extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums(): void
{
$libraryClass = $this->getLibrary();
@@ -200,7 +200,7 @@ class Punbb extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics(): void
{
$libraryClass = $this->getLibrary();
@@ -280,7 +280,7 @@ class Punbb extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts(): void
{
$libraryClass = $this->getLibrary();
@@ -18,7 +18,7 @@ use DomainException;
use Exception;
use IPS\Content;
use IPS\convert\Software;
use IPS\convert\Software\Core\Smf;
use IPS\convert\Software\Core\Smf as SmfCore;
use IPS\Db;
use IPS\Http\Url;
use IPS\Member;
@@ -141,11 +141,9 @@ class Smf extends Software
{
throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) );
}
break;
default:
return parent::countRows( $table, $where, $recache );
break;
}
}
@@ -230,14 +228,14 @@ class Smf extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return Smf::fixPostData( $post, $className, $contentId );
return SmfCore::fixPostData( $post, $className, $contentId );
}
/**
@@ -245,7 +243,7 @@ class Smf extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums(): void
{
$libraryClass = $this->getLibrary();
@@ -266,7 +264,7 @@ class Smf extends Software
*
* @return void
*/
public function convertForumsBoards()
public function convertForumsBoards(): void
{
$libraryClass = $this->getLibrary();
@@ -319,7 +317,7 @@ class Smf extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics(): void
{
$libraryClass = $this->getLibrary();
@@ -437,7 +435,7 @@ class Smf extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts(): void
{
$libraryClass = $this->getLibrary();
@@ -466,14 +464,14 @@ class Smf extends Software
/**
* @brief Cached attachment paths
*/
protected static $paths = NULL;
protected static ?array $paths = NULL;
/**
* Convert attachments
*
* @return void
*/
public function convertAttachments()
public function convertAttachments(): void
{
if ( is_null( static::$paths ) )
{
@@ -15,7 +15,8 @@ namespace IPS\convert\Software\Forums;
use Exception;
use IPS\convert\Software;
use IPS\convert\Software\Core\UBBthreads;
use IPS\convert\Software\Core\UBBthreads as UBBthreadsCore;
use IPS\convert\Software\Exception as SoftwareException;
use IPS\DateTime;
use IPS\Db;
use IPS\forums\Forum;
@@ -245,14 +246,14 @@ class UBBthreads extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return UBBthreads::fixPostData( $post, $className, $contentId );
return UBBthreadsCore::fixPostData( $post, $className, $contentId );
}
/**
@@ -260,7 +261,7 @@ class UBBthreads extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums(): void
{
$libraryClass = $this->getLibrary();
@@ -299,7 +300,7 @@ class UBBthreads extends Software
) );
}
throw new \IPS\convert\Software\Exception;
throw new SoftwareException;
}
/**
@@ -307,7 +308,7 @@ class UBBthreads extends Software
*
* @return void
*/
public function convertForumsForumsFollowers()
public function convertForumsForumsFollowers(): void
{
$libraryClass = $this->getLibrary();
@@ -329,7 +330,7 @@ class UBBthreads extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics(): void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'TOPIC_ID' );
@@ -429,7 +430,7 @@ class UBBthreads extends Software
*
* @return void
*/
public function convertForumsTopicsRatings()
public function convertForumsTopicsRatings(): void
{
$libraryClass = $this->getLibrary();
@@ -450,7 +451,7 @@ class UBBthreads extends Software
*
* @return void
*/
public function convertForumsTopicsFollowers()
public function convertForumsTopicsFollowers(): void
{
$libraryClass = $this->getLibrary();
@@ -472,7 +473,7 @@ class UBBthreads extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts(): void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'POST_ID' );
@@ -503,7 +504,7 @@ class UBBthreads extends Software
*
* @return void
*/
public function convertAttachments()
public function convertAttachments(): void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'FILE_ID' );
@@ -43,7 +43,7 @@ class Vanilla extends Software
/**
* @brief Store the result of the check for reaction support
*/
protected static $_supportsReactions = FALSE;
protected static bool $_supportsReactions = FALSE;
/**
* Constructor
@@ -53,17 +53,15 @@ class Vanilla extends Software
* @return void
* @throws InvalidArgumentException
*/
public function __construct( App $app, $needDB=TRUE )
public function __construct( App $app, bool $needDB=TRUE )
{
$return = parent::__construct( $app, $needDB );
parent::__construct( $app, $needDB );
/* Check for reaction support - This is a Vanilla2 addon, so it may not be installed */
if ( $needDB )
{
static::$_supportsReactions = $this->db->checkForTable( 'Action' );
}
return $return;
}
/**
* Software Name
@@ -186,11 +184,9 @@ class Vanilla extends Software
{
throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) );
}
break;
default:
return parent::countRows( $table, $where, $recache );
break;
}
}
@@ -317,9 +313,9 @@ class Vanilla extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
@@ -332,7 +328,7 @@ class Vanilla extends Software
*
* @return void
*/
public function convertAttachments()
public function convertAttachments(): void
{
$libraryClass = $this->getLibrary();
@@ -391,7 +387,7 @@ class Vanilla extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums(): void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'c.CategoryID' );
@@ -433,7 +429,7 @@ class Vanilla extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics(): void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'd.DiscussionID' );
@@ -469,12 +465,12 @@ class Vanilla extends Software
continue;
}
$row['DateLastComment'] = 0;
$row['LastCommentUserID'] = 0;
$row['LastCommentUserName'] = '';
$row['DateLastComment'] = $row['DateLastComment'] ?? 0;
$row['LastCommentUserID'] = $row['LastCommentUserID'] ?? 0;
$row['LastCommentUserName'] = $row['LastCommentUserName'] ?? '';
/* If last post info is empty, fetch it */
if( $row['DateLastComment'] === NULL )
if( !$row['DateLastComment'] )
{
try
{
@@ -542,7 +538,7 @@ class Vanilla extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts(): void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'DiscussionID' );
@@ -634,7 +630,7 @@ class Vanilla extends Software
*
* @return void
*/
public function convertForumsPosts2()
public function convertForumsPosts2(): void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'CommentID' );
@@ -18,7 +18,7 @@ use Exception;
use InvalidArgumentException;
use IPS\convert\App;
use IPS\convert\Software;
use IPS\convert\Software\Core\Vbulletin;
use IPS\convert\Software\Core\Vbulletin as VbulletinCore;
use IPS\Db;
use IPS\forums\Forum;
use IPS\forums\Topic;
@@ -49,12 +49,12 @@ class Vbulletin extends Software
/**
* @brief vBulletin 4 Stores all attachments under one table - this will store the content type for the forums app.
*/
protected static $postContentType = NULL;
protected static ?int $postContentType = NULL;
/**
* @brief The schematic for vB3 and vB4 is similar enough that we can make specific concessions in a single converter for either version.
*/
protected static $isLegacy = NULL;
protected static ?bool $isLegacy = NULL;
/**
* @brief Flag to indicate the post data has been fixed during conversion, and we only need to use Legacy Parser
@@ -69,9 +69,9 @@ class Vbulletin extends Software
* @return void
* @throws InvalidArgumentException
*/
public function __construct( App $app, $needDB=TRUE )
public function __construct( App $app, bool $needDB=TRUE )
{
$return = parent::__construct( $app, $needDB );
parent::__construct( $app, $needDB );
if ( $needDB )
{
@@ -101,8 +101,6 @@ class Vbulletin extends Software
}
catch( Exception $e ) {}
}
return $return;
}
/**
@@ -240,14 +238,14 @@ class Vbulletin extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return Vbulletin::fixPostData( $post, $className, $contentId );
return VbulletinCore::fixPostData( $post, $className, $contentId );
}
/**
@@ -340,7 +338,7 @@ class Vbulletin extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums() : void
{
$libraryClass = $this->getLibrary();
@@ -357,7 +355,7 @@ class Vbulletin extends Software
$key = 'options';
}
if ( $forum[$key] & $self::$bitOptions[$name][$perm] )
if ( $forum[$key] & static::$bitOptions[$name][$perm] )
{
return TRUE;
}
@@ -432,7 +430,7 @@ class Vbulletin extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'threadid' );
@@ -469,7 +467,7 @@ class Vbulletin extends Software
$votes[$index] = $vote;
$index++;
$numvotes += $vote;
$numvotes += (int) $vote;
}
$poll = array();
@@ -552,7 +550,7 @@ class Vbulletin extends Software
'poll_state' => $poll,
'last_vote' => $lastVote,
'views' => $topic['views'],
'approved' => $approved,
'approved' => $approved ?? 1,
'pinned' => $topic['sticky'],
'topic_hiddenposts' => $topic['hiddencount'] + $topic['deletedcount']
);
@@ -627,7 +625,7 @@ class Vbulletin extends Software
*
* @return void
*/
public function convertForumsTopicsFollowers()
public function convertForumsTopicsFollowers() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'subscribethreadid' );
@@ -677,7 +675,7 @@ class Vbulletin extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'postid' );
@@ -819,7 +817,7 @@ class Vbulletin extends Software
*
* @return void
*/
public function convertAttachments()
public function convertAttachments() : void
{
$libraryClass = $this->getLibrary();
@@ -918,8 +916,7 @@ class Vbulletin extends Software
Db::i()->update( 'forums_posts', array( 'post' => $post ), array( "pid=?", $pid ) );
}
}
catch( UnderflowException $e ) {}
catch( OutOfRangeException $e ) {}
catch( UnderflowException|OutOfRangeException $e ) {}
}
$libraryClass->setLastKeyValue( $attachment['attachmentid'] );
@@ -931,7 +928,7 @@ class Vbulletin extends Software
*
* @return void
*/
public function convertClubForums()
public function convertClubForums() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'groupid' );
@@ -954,7 +951,7 @@ class Vbulletin extends Software
*
* @return void
*/
public function convertClubTopics()
public function convertClubTopics() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'discussionid' );
@@ -996,7 +993,7 @@ class Vbulletin extends Software
'last_post' => $row['lastpost'],
'starter_name' => $firstpost['postusername'],
'last_poster_name' => $row['lastposter'],
'approved' => $approved,
'approved' => $approved ?? 1,
) );
$libraryClass->setLastKeyValue( $row['discussionid'] );
@@ -1008,7 +1005,7 @@ class Vbulletin extends Software
*
* @return void
*/
public function convertClubPosts()
public function convertClubPosts() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'gmid' );
@@ -1036,7 +1033,7 @@ class Vbulletin extends Software
'author_id' => $row['postuserid'],
'author_name' => $row['postusername'],
'post_date' => $row['dateline'],
'queued' => $queued,
'queued' => $queued ?? 0,
) );
$libraryClass->setLastKeyValue( $row['gmid'] );
}
@@ -17,7 +17,7 @@ use DomainException;
use Exception;
use IPS\convert\App;
use IPS\convert\Software;
use IPS\convert\Software\Core\Vbulletin5;
use IPS\convert\Software\Core\Vbulletin5 as Vbulletin5Core;
use IPS\Db;
use IPS\forums\Topic;
use IPS\forums\Topic\Post;
@@ -135,7 +135,6 @@ class Vbulletin5 extends Software
{
case 'forum':
return count( $this->fetchForums() );
break;
case 'thread':
try
@@ -146,7 +145,6 @@ class Vbulletin5 extends Software
{
throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) );
}
break;
case 'post':
try
@@ -157,15 +155,12 @@ class Vbulletin5 extends Software
{
throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) );
}
break;
case 'attachment':
return parent::countRows( 'node', array( "contenttypeid IN (" . $this->fetchType( 'Attach' ) . ',' . $this->fetchType( 'Photo' ) . ")" ) );
break;
default:
return parent::countRows( $table, $where, $recache );
break;
}
}
@@ -213,14 +208,14 @@ class Vbulletin5 extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return Vbulletin5::fixPostData( $post, $className, $contentId );
return Vbulletin5Core::fixPostData( $post, $className, $contentId );
}
/**
@@ -297,7 +292,7 @@ class Vbulletin5 extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums() : void
{
$libraryClass = $this->getLibrary();
@@ -325,7 +320,7 @@ class Vbulletin5 extends Software
$key = 'nodeoptions';
}
if ( $forum[$key] & $self::$bitOptions[$name][$perm] )
if ( $forum[$key] & static::$bitOptions[$name][$perm] )
{
return TRUE;
}
@@ -362,7 +357,7 @@ class Vbulletin5 extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics() : void
{
$libraryClass = $this->getLibrary();
@@ -441,8 +436,7 @@ class Vbulletin5 extends Software
);
}
}
catch( UnderflowException $e ) {} # if the poll is missing, don't bother
catch( UnexpectedValueException $e ) {} # if poll data is corrupt, then skip
catch( UnderflowException|UnexpectedValueException $e ) {} # if the poll is missing, don't bother # if poll data is corrupt, then skip
$info = array(
'tid' => $topic['nodeid'],
@@ -517,7 +511,7 @@ class Vbulletin5 extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts() : void
{
$libraryClass = $this->getLibrary();
@@ -741,7 +735,7 @@ LINK;
*
* @return void
*/
public function convertAttachments()
public function convertAttachments() : void
{
$libraryClass = $this->getLibrary();
@@ -891,7 +885,7 @@ LINK;
*
* @return void
*/
public function convertAttachments2()
public function convertAttachments2() : void
{
$libraryClass = $this->getLibrary();
@@ -1020,7 +1014,7 @@ LINK;
*
* @return array
*/
protected function fetchForums()
protected function fetchForums() : array
{
$forums = array();
$clubs = $this->fetchClubs();
@@ -1037,7 +1031,7 @@ LINK;
*
* @return array
*/
protected function fetchClubs()
protected function fetchClubs() : array
{
$clubs = array();
@@ -1066,29 +1060,25 @@ LINK;
/**
* @brief Types Cache
*/
protected $typesCache = array();
protected array $typesCache = array();
/**
* Helper method to retrieve content type ids
*
* @param int|string $type The content type
* @return void
* @return array
*/
protected function fetchType( $type )
protected function fetchType( int|string $type ) : array
{
if ( count( $this->typesCache ) )
{
return $this->typesCache[ $type ];
}
else
if ( !count( $this->typesCache ) )
{
foreach( $this->db->select( '*', 'contenttype' ) AS $contenttype )
{
$this->typesCache[ $contenttype['class'] ] = $contenttype['contenttypeid'];
}
return $this->typesCache[ $type ];
}
return $this->typesCache[ $type ];
}
/**
@@ -17,7 +17,7 @@ use DomainException;
use Exception;
use IPS\Content;
use IPS\convert\Software;
use IPS\convert\Software\Core\Woltlab;
use IPS\convert\Software\Core\Woltlab as WoltlabCore;
use IPS\Db;
use IPS\Http\Url;
use IPS\Member;
@@ -44,7 +44,7 @@ class Woltlab extends Software
/**
* @brief The WBB table prefix can change depending on the number of installs
*/
public static $installId = 1;
public static int $installId = 1;
/**
* Software Name
@@ -166,25 +166,23 @@ class Woltlab extends Software
{
throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) );
}
break;
default:
return parent::countRows( $table, $where, $recache );
break;
}
}
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return Woltlab::fixPostData( $post, $className, $contentId );
return WoltlabCore::fixPostData( $post, $className, $contentId );
}
/**
@@ -263,7 +261,7 @@ class Woltlab extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'boardID' );
@@ -316,7 +314,7 @@ class Woltlab extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'threadID' );
@@ -388,7 +386,7 @@ class Woltlab extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'postID' );
@@ -438,7 +436,7 @@ class Woltlab extends Software
*
* @return void
*/
public function convertAttachments()
public function convertAttachments() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'attachmentID' );
@@ -16,7 +16,7 @@ namespace IPS\convert\Software\Forums;
use Exception;
use IPS\Content;
use IPS\convert\Software;
use IPS\convert\Software\Core\Wpforo;
use IPS\convert\Software\Core\Wpforo as WpforoCore;
use IPS\Db;
use IPS\Http\Url;
use IPS\Member;
@@ -138,14 +138,14 @@ class Wpforo extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return Wpforo::fixPostData( $post, $className, $contentId );
return WpforoCore::fixPostData( $post, $className, $contentId );
}
/**
@@ -202,7 +202,7 @@ class Wpforo extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'forumid' );
@@ -256,7 +256,7 @@ class Wpforo extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'topicid' );
@@ -325,7 +325,7 @@ class Wpforo extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'postid' );
@@ -366,14 +366,14 @@ class Wpforo extends Software
/**
* @brief temporarily store post content
*/
protected $_postContent = [];
protected array $_postContent = [];
/**
* Convert attachments
*
* @return void
*/
public function convertAttachments()
public function convertAttachments() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'postid' );
@@ -431,8 +431,7 @@ class Wpforo extends Software
$this->_postContent[ $pid ] = str_replace( $matches[0][ $key ], '[attachment=' . $attachId . ':name]', $this->_postContent[ $pid ] );
}
}
catch( UnderflowException $e ) {}
catch( OutOfRangeException $e ) {}
catch( UnderflowException|OutOfRangeException $e ) {}
}
}
@@ -473,8 +472,7 @@ class Wpforo extends Software
$this->_postContent[ $pid ] = str_replace( $matches[0][ $key ], '[attachment=' . $attachId . ':name]', $this->_postContent[ $pid ] );
}
}
catch( UnderflowException $e ) {}
catch( OutOfRangeException $e ) {}
catch( UnderflowException|OutOfRangeException $e ) {}
}
}
@@ -496,7 +494,7 @@ class Wpforo extends Software
public function checkRedirects(): ?Url
{
$url = Request::i()->url();
$wpForoSlug = defined('WPFORO_SLUG') ? WPFOROSLUG : 'community';
$wpForoSlug = defined('WPFORO_SLUG') ? WPFORO_SLUG : 'community';
$matches = [];
if( preg_match( '#/' . $wpForoSlug . '/([a-z0-9-]+)/([a-z0-9-]+)#i', $url->data[ Url::COMPONENT_PATH ], $matches ) )
@@ -19,7 +19,7 @@ use InvalidArgumentException;
use IPS\Content;
use IPS\convert\App;
use IPS\convert\Software;
use IPS\convert\Software\Core\Xenforo;
use IPS\convert\Software\Core\Xenforo as XenforoCore;
use IPS\Db;
use IPS\Http\Url;
use IPS\Member;
@@ -51,7 +51,7 @@ class Xenforo extends Software
/**
* @brief The similarities between XF1 and XF2 are close enough that we can use the same converter
*/
public static $isLegacy = NULL;
public static ?bool $isLegacy = NULL;
/**
* @brief Flag to indicate the post data has been fixed during conversion, and we only need to use Legacy Parser
@@ -61,7 +61,7 @@ class Xenforo extends Software
/**
* @brief XF2.1 changed serialized data to json decoded
*/
public static $useJson = FALSE;
public static bool $useJson = FALSE;
/**
* Constructor
@@ -71,9 +71,9 @@ class Xenforo extends Software
* @return void
* @throws InvalidArgumentException
*/
public function __construct( App $app, $needDB=TRUE )
public function __construct( App $app, bool $needDB=TRUE )
{
$return = parent::__construct( $app, $needDB );
parent::__construct( $app, $needDB );
if ( $needDB )
{
@@ -104,8 +104,6 @@ class Xenforo extends Software
}
catch( Exception $e ) {} # If we can't query, we won't be able to do anything anyway
}
return $return;
}
/**
@@ -275,14 +273,14 @@ class Xenforo extends Software
/**
* Pre-process content for the Invision Community text parser
*
* @param string The post
* @param string|null Content Classname passed by post-conversion rebuild
* @param int|null Content ID passed by post-conversion rebuild
* @param string $post The post
* @param string|null $className Content Classname passed by post-conversion rebuild
* @param int|null $contentId Content ID passed by post-conversion rebuild
* @return string The converted post
*/
public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string
{
return Xenforo::fixPostData( $post, $className, $contentId );
return XenforoCore::fixPostData( $post, $className, $contentId );
}
/**
@@ -292,7 +290,7 @@ class Xenforo extends Software
* @param string $xfTwoTitle XF2 Phrase Title
* @return string|null
*/
protected function getPhrase( $xfOneTitle, $xfTwoTitle )
protected function getPhrase( string $xfOneTitle, string $xfTwoTitle ) : ?string
{
try
{
@@ -310,7 +308,7 @@ class Xenforo extends Software
*
* @return void
*/
public function convertForumsForums()
public function convertForumsForums() : void
{
$libraryClass = $this->getLibrary();
@@ -384,7 +382,7 @@ class Xenforo extends Software
*
* @return void
*/
public function convertForumsTopics()
public function convertForumsTopics() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'thread_id' );
@@ -494,7 +492,7 @@ class Xenforo extends Software
'last_poster_name' => $row['last_post_username'],
'poll_state' => $poll,
'views' => $row['view_count'],
'approved' => $approved,
'approved' => $approved ?? 0,
'pinned' => $row['sticky'],
'moved_to' => $moved_to,
);
@@ -571,7 +569,7 @@ class Xenforo extends Software
*
* @return void
*/
public function convertForumsPosts()
public function convertForumsPosts() : void
{
$libraryClass = $this->getLibrary();
@@ -628,7 +626,7 @@ class Xenforo extends Software
'author_name' => $row['username'],
'ip_address' => $row['ip'] ?? '127.0.0.1',
'post_date' => $row['post_date'],
'queued' => $queued,
'queued' => $queued ?? 0,
);
$libraryClass->convertForumsPost( $info );
@@ -726,7 +724,7 @@ class Xenforo extends Software
*
* @return void
*/
public function convertAttachments()
public function convertAttachments() : void
{
$libraryClass = $this->getLibrary();
$libraryClass::setKey( 'xf_attachment.attachment_id' );
@@ -786,9 +784,8 @@ class Xenforo extends Software
}
}
}
catch( UnderflowException $e ) {}
catch( OutOfRangeException $e ) {}
catch( UnderflowException|OutOfRangeException $e ) {}
$libraryClass->setLastKeyValue( $row['attachment_id'] );
}
}
File diff suppressed because it is too large. Load diff
+14 -9
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="core" version="5000032">
<app key="core" version="5000034">
<word key="__app_core" js="0">System</word>
<word key="__indefart_personal_conversation" js="0">a personal conversation</word>
<word key="__indefart_personal_conversation_message" js="0">a message in a personal conversation</word>
@@ -127,7 +127,7 @@
<word key="loc_logging_in_action" js="0">%s is logging in</word>
<word key="ignoring_content" js="0">You've chosen to ignore content by %s.</word>
<word key="ignoring_signatures" js="0">You've chosen to ignore signatures by %s.</word>
<word key="front_logged_in_as" js="0"><![CDATA[%s <strong>as</strong>]]></word>
<word key="front_logged_in_as" js="0">%s as</word>
<word key="number_to_show" js="0">Number to show</word>
<word key="devices_to_show" js="0">Devices</word>
<word key="show_on_all_devices" js="0">Show on all devices?</word>
@@ -211,6 +211,7 @@
<word key="post_before_register_submission_cancelled" js="0">Your submission and email address has been removed</word>
<word key="pbr_row_not_found" js="0">We could not locate your submission details.</word>
<word key="view_all" js="0">View all</word>
<word key="author_stats_cannot_load" js="0">Cannot load author stats at this time.</word>
<word key="mobile_menu_account" js="0">Account</word>
<word key="mobile_menu_more" js="0">More</word>
<word key="mobile_menu_sections" js="0">Sections</word>
@@ -727,7 +728,6 @@
<word key="mark_as" js="0">Mark as</word>
<word key="byline_name_date" js="0"><![CDATA[%s &middot; %s]]></word>
<word key="byline" js="0">By %s</word>
<word key="byline_itemprop" js="0">%s, </word>
<word key="byline_nodate" js="0">%s</word>
<word key="byline_nodate_itemprop" js="0">By %s</word>
<word key="byline_merge" js="0"><![CDATA[<span>By %s, %s</span>]]></word>
@@ -2268,7 +2268,7 @@
<word key="prunetable_prune_follows" js="0">follows</word>
<word key="prunetable_prune_member_history" js="0">member history</word>
<word key="profile_solutions" js="0">Solutions</word>
<word key="solutionlog_show_activity" js="0">See answers</word>
<word key="solutionlog_show_activity" js="0">See all answers</word>
<word key="member_solutions" js="0">Answers from %s</word>
<word key="solution_headline" js="0"><![CDATA[%s's <a href='%s'>%s</a> in <a href='%s'>%s</a> was marked as the answer]]></word>
<word key="profile_reputation" js="0">Reputation</word>
@@ -4194,8 +4194,8 @@
<word key="ipb_embed_url_header" js="0">Custom iframes</word>
<word key="ipb_embed_url_filter_option" js="0">Allow links to be converted to iframes?</word>
<word key="ipb_embed_url_filter_option_desc" js="0">When this is enabled, users with permission will see a button to convert the link to an iframe if the URL's Domain is allowed.</word>
<word key="ipb_embed_url_whitelist" js="0">Allowed Domains</word>
<word key="ipb__embed_url_whitelist_desc" js="0">Use * as a wildcard. e.g. 'http://*.example.com/*'</word>
<word key="ipb_embed_url_whitelist" js="0">Allowed Domain Patterns</word>
<word key="ipb_embed_url_whitelist_desc" js="0"><![CDATA[Use <code>*</code> as a wildcard. Note that subdomains must be explicitly specified in a pattern to be allowed. For example, the pattern <code>google.com</code> would not allow https://www.google.com/, but <code>*.google.com</code> or <code>www.google.com</code> would. This setting only applies when saving new content and edits in the future.]]></word>
<word key="embed_url_filter_any_action" js="0">Moderate iframes in Posts</word>
<word key="embed_url_filter_any_allow" js="0">Allow</word>
<word key="embed_url_filter_any_allow_desc" js="0">Any iframe can be directly posted.</word>
@@ -7036,9 +7036,9 @@
<word key="leaderboard_in_all_apps" js="0">in all areas</word>
<word key="leaderboard_in_app" js="0">in %s</word>
<word key="popular_no_member_results" js="0">There are no members to show</word>
<word key="profile_you_won" js="0"><![CDATA[You last won the day on <span style='display:inline-block'>%s</span>]]></word>
<word key="profile_member_won" js="0"><![CDATA[%s last won the day on <span style='display:inline-block'>%s</span>]]></word>
<word key="profile_you_congrats" js="0">Congratulations, you had the most liked content!</word>
<word key="profile_you_won" js="0">You had the most liked content on %s</word>
<word key="profile_member_won" js="0">They last won the day on %s</word>
<word key="profile_you_congrats" js="0">Congratulations!</word>
<word key="profile_member_congrats" js="0">%s had the most liked content!</word>
<word key="members_days_won_count" js="0">Days Won</word>
<word key="members_days_won_count_desc" js="0">The number of times %s had the most number of content likes for a day</word>
@@ -9522,6 +9522,10 @@ In PHP8, altering overloaded method signatures within a subclass results in a fa
<word key="menu_manager_menutype_smallscreen" js="0">Small screen menu (mobile devices, etc)</word>
<word key="menu_manager_icon" js="0">Icon</word>
<word key="menu_manager_icon_desc" js="0">You may pick a custom icon for this menu item. If none is selected, a context relevant default icon may be used.</word>
<word key="menu_title_node_type" js="0">Title</word>
<word key="menu_title_node_inherit" js="0">Use the node name.</word>
<word key="menu_title_node_custom" js="0">I will enter a different title.</word>
<word key="menu_title_node" js="0">Title</word>
<word key="open_in_ide" js="0">Open in IDE</word>
<word key="not_in_dev" js="0">You must be in developer mode to use this tool.</word>
<word key="dev_build" js="0">Build for release</word>
@@ -12124,5 +12128,6 @@ In PHP8, altering overloaded method signatures within a subclass results in a fa
<word key="editor_font_type_generic" js="1">OS Native</word>
<word key="moderator_alert_reply_ready" js="1">Your reply has been sent</word>
<word key="moderator_alert_reply_view" js="1">View Reply</word>
<word key="ips.ui.controls.cannot_load" js="1">This content cannot be loaded at this time.</word>
</app>
</language>
File diff suppressed because it is too large. Load diff
+3 -1
View File
@@ -281,5 +281,7 @@
"5000029": "5.0.0 Beta 3",
"5000030": "5.0.0 Beta 4",
"5000031": "5.0.0 Beta 5",
"5000032": "5.0.0 Beta 6"
"5000032": "5.0.0 Beta 6",
"5000033": "5.0.0 Beta 7",
"5000034": "5.0.0 Beta 7"
}
@@ -24,6 +24,7 @@ use IPS\Node\Model;
use IPS\Text\Parser;
use LogicException;
use function defined;
use function is_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -141,7 +142,7 @@ class Alert extends EditorLocationsAbstract
/* Update */
try
{
if( $callback[1] == 'parseStatic' )
if( is_array( $callback ) and $callback[1] == 'parseStatic' )
{
$rebuilt = $callback( $alert['alert_content'], Member::load( $alert['alert_member_id'] ), FALSE, 'core_Alert' );
}
@@ -26,6 +26,7 @@ use LogicException;
use OutOfRangeException;
use function count;
use function defined;
use function is_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -193,7 +194,7 @@ class CustomField extends EditorLocationsAbstract
$rebuilt = FALSE;
try
{
if( $callback[1] == 'parseStatic' )
if( is_array( $callback ) and $callback[1] == 'parseStatic' )
{
$rebuilt = $callback( $member[ $fieldId ], Member::load( $member['member_id'] ), FALSE, 'core_ProfileField', $member['member_id'] );
}
@@ -25,6 +25,7 @@ use IPS\Text\Parser;
use LogicException;
use function count;
use function defined;
use function is_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -155,7 +156,7 @@ class Modcp extends EditorLocationsAbstract
{
try
{
if( $callback[1] == 'parseStatic' )
if( is_array( $callback ) and $callback[1] == 'parseStatic' )
{
$update[ $k ] = $callback( $log[ $k ], Member::load( $log['wl_moderator'] ), FALSE, 'core_Modcp', $log['wl_id'], NULL, ( $k == 'wl_note_member' ? 'member' : 'mod' ) );
}
@@ -25,6 +25,7 @@ use IPS\Text\Parser;
use LogicException;
use OutOfRangeException;
use function count;
use function is_array;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
@@ -150,7 +151,7 @@ class Reports extends EditorLocationsAbstract
try
{
if( $callback[1] == 'parseStatic' )
if( is_array( $callback ) and $callback[1] == 'parseStatic' )
{
$update['report'] = $callback( $report['report'], Member::load( $report['report_by'] ), FALSE, 'core_Reports', $report['id'], NULL, NULL );
}
@@ -183,7 +184,7 @@ class Reports extends EditorLocationsAbstract
try
{
if( $callback[1] == 'parseStatic' )
if( is_array( $callback ) and $callback[1] == 'parseStatic' )
{
$updateComment = $callback( $comment['comment'], Member::load( $comment['comment_by'] ), FALSE, 'core_Reports', $comment['id'], NULL, NULL );
}
@@ -25,6 +25,7 @@ use IPS\Text\LegacyParser;
use IPS\Text\Parser;
use LogicException;
use function defined;
use function is_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -142,7 +143,7 @@ class Signatures extends EditorLocationsAbstract
/* Update */
try
{
if( $callback[1] == 'parseStatic' )
if( is_array( $callback ) and $callback[1] == 'parseStatic' )
{
$rebuilt = LegacyParser::parseStatic( $member['signature'], Member::load( $member['member_id'] ), FALSE, 'core_Signatures', $member['member_id'] );
}
@@ -14,8 +14,11 @@ namespace IPS\core\extensions\core\FrontNavigation;
use IPS\Content;
use IPS\Content\Search\SearchContent;
use IPS\core\FrontNavigation\FrontNavigationAbstract;
use IPS\Helpers\Form\Radio;
use IPS\Helpers\Form\Select;
use IPS\Helpers\Form\Node as NodeForm;
use IPS\Helpers\Form\Translatable;
use IPS\Lang;
use IPS\Node\Model;
use IPS\Http\Url;
use IPS\Member;
@@ -117,6 +120,14 @@ class Node extends FrontNavigationAbstract
*/
public function title(): string
{
if( isset( $this->configuration['menu_title_node_type'] ) and $this->configuration['menu_title_node_type'] == 1 )
{
if( Member::loggedIn()->language()->checkKeyExists( 'menu_item_' . $this->id ) )
{
return Member::loggedIn()->language()->addToStack( 'menu_item_' . $this->id );
}
}
return (string) $this->node?->_title;
}
@@ -182,7 +193,7 @@ class Node extends FrontNavigationAbstract
$fields[] = new Select( 'menu_node_content_classes', $existingConfiguration['selected'] ?? null, null, array( 'options' => $classes, 'toggles' => $classToggles ), null, null, null, 'classes' );
/* Nodes */
foreach ( $classToggles as $class => $id )
foreach ( $classToggles as $class => $classId )
{
if ( isset( $class::$containerNodeClass ) )
{
@@ -212,6 +223,9 @@ class Node extends FrontNavigationAbstract
}
}
$fields[] = new Radio( 'menu_title_node_type', $existingConfiguration['menu_title_node_type'] ?? 0, NULL, array( 'options' => array( 0 => 'menu_title_node_inherit', 1 => 'menu_title_node_custom' ), 'toggles' => array( 1 => array( 'menu_title_node' ) ) ), NULL, NULL, NULL, 'menu_title_node_type' );
$fields[] = new Translatable( 'menu_title_node', NULL, NULL, array( 'app' => 'core', 'key' => $id ? "menu_item_{$id}" : NULL ), NULL, NULL, NULL, 'menu_title_node' );
return $fields;
}
@@ -225,7 +239,16 @@ class Node extends FrontNavigationAbstract
public static function parseConfiguration( array $configuration, int $id ): array
{
$class = $configuration['menu_node_content_classes'];
$return = [ 'nodeClass' => $class::$containerNodeClass, 'selected' => $class ];
$return = [
'nodeClass' => $class::$containerNodeClass,
'selected' => $class,
'menu_title_node_type' => $configuration['menu_title_node_type'] ?? 0
];
if( $configuration['menu_title_node_type'] == 1 and $configuration['menu_title_node'] )
{
Lang::saveCustom( 'core', 'menu_item_' . $id, $configuration['menu_title_node'] );
}
foreach( $configuration as $field => $value )
{
@@ -105,6 +105,7 @@ class PruneLargeTable extends QueueAbstract
public function postComplete( array $data, bool $processed = TRUE ) : void
{
/* If this was pruning follows, make sure to clear the follow count cache so it can rebuild */
$data = json_decode( $data['data'], true );
if( $data['setting'] == 'prune_follows' )
{
Db::i()->delete( 'core_follow_count_cache' );
@@ -152,7 +152,7 @@ class RebuildImageProxy extends QueueAbstract
Store::i()->currentImageProxyRebuild = array( $classname, $item->$idColumn );
/* Only run an update if the content has actually changed */
if( mb_strpos( $item->$contentColumn, 'imageproxy.php' ) AND $newContent = Parser::removeImageProxy( $item->$contentColumn, !$data['cachePeriod'] ) AND $newContent != $item->$contentColumn )
if( $item->$contentColumn and mb_strpos( $item->$contentColumn, 'imageproxy.php' ) AND $newContent = Parser::removeImageProxy( $item->$contentColumn, !$data['cachePeriod'] ) AND $newContent != $item->$contentColumn )
{
$item->$contentColumn = $newContent;
@@ -85,6 +85,7 @@ class RebuildImageProxyNonContent extends QueueAbstract
*/
public function run( array &$data, int $offset ): int
{
$did = 0;
foreach( Application::allExtensions( 'core', 'EditorLocations', FALSE, NULL, NULL, TRUE ) as $_key => $extension )
{
if( $_key != $data['extension'] )
@@ -16,6 +16,7 @@ use IPS\Request;
define( 'REPORT_EXCEPTIONS', TRUE);
require_once '../../../../init.php';
Output::i()->bypassDataLayer = true;
$badgeID = Request::i()->icon;
$cacheHeaders = ( !\IPS\IN_DEV ) ? Output::getCacheHeaders( time(), 360 ) : array();
@@ -65,6 +65,7 @@ use function intval;
use function is_array;
use function is_int;
use function method_exists;
use function strrpos;
use function strtoupper;
use function substr;
use function trim;
@@ -1914,11 +1915,21 @@ class support extends Controller
{
foreach( $listeners as $class )
{
if( !class_exists( $class ) )
{
continue;
}
foreach( get_class_methods( $class ) as $method )
{
if( substr( $method, 0, 2 ) == 'on' and !in_array( $method, $events ) )
if( substr( $method, 0, 2 ) == 'on' )
{
$events[] = $method;
$parentClass = get_parent_class( $class );
$method = substr( $parentClass, strrpos( $parentClass, '\\' ) + 1 ) . ': ' . $method;
if( !in_array( $method, $events ) )
{
$events[] = $method;
}
}
}
}
@@ -67,6 +67,33 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
*/
class ajax extends Controller
{
/**
* Load the mini profile on demand
*
* @return void
*/
public function miniProfile(): void
{
/* Load the item */
try
{
$author = Member::load( Request::i()->authorId );
$anonymous = (bool) Request::i()->anonymous ?? false;
$solvedCount = is_numeric( Request::i()->solvedCount ) ? (int) Request::i()->solvedCount : null;
if ( $author->member_id and Request::i()->solvedCount === 'load' )
{
$solvedCount = Db::i()->select( "COUNT(*)", "core_solved_index", ["member_id=?", $author->member_id] )->first() ?: null;
}
/* return the json */
Output::i()->json( [ 'html' => \IPS\Theme::i()->getTemplate( "global", "core" )->miniProfile( $author, $anonymous, $solvedCount ) ] );
}
catch ( OutOfRangeException $e )
{
Output::i()->json( [ 'error' => 'not_found', 'errorMessage' => Member::loggedIn()->language()->addToStack( 'author_stats_cannot_load' ) ], 404 );
}
}
/**
* Find Member
*
@@ -0,0 +1,22 @@
{
"id": 5000033,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": true,
"theme": true,
"themeeditor": true,
"javascript": true,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": true,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,18 @@
{
"files": {
"added": [],
"edited": [
"global\/library\/app.js",
"global\/framework\/common\/ips.controller.js",
"global\/framework\/common\/ui\/ips.ui.controls.js",
"global\/front\/controllers\/core\/ips.core.commentFeed.js",
"global\/framework\/templates\/ips.core.templates.js"
],
"removed": []
},
"orders": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,31 @@
{
"normal": {
"added": [
"author_stats_cannot_load",
"ipb_embed_url_whitelist_desc",
"menu_title_node_type",
"menu_title_node_inherit",
"menu_title_node_custom",
"menu_title_node"
],
"edited": [
"front_logged_in_as",
"solutionlog_show_activity",
"ipb_embed_url_whitelist",
"profile_you_won",
"profile_member_won",
"profile_you_congrats"
],
"removed": [
"byline_itemprop",
"ipb__embed_url_whitelist_desc"
]
},
"js": {
"added": [
"ips.ui.controls.cannot_load"
],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,75 @@
{
"html": {
"added": [
"front\/global\/miniProfileWrap"
],
"edited": [
"front\/embed\/embedOriginalItem",
"global\/forms\/editorAttachmentsPlaceholder",
"front\/global\/comment",
"front\/global\/includeDataLayer",
"front\/global\/miniProfile",
"front\/global\/review",
"admin\/memberprofile\/warnings",
"front\/modcp\/alertRow",
"front\/modcp\/announcementRow",
"front\/modcp\/report",
"front\/modcp\/reportPanel",
"front\/profile\/allFollowers",
"front\/profile\/followers",
"front\/profile\/profile",
"front\/profile\/profileHeader",
"front\/profile\/recentVisitorsBlock",
"front\/profile\/tableRow",
"front\/profile\/userBadgeOverview",
"front\/profile\/userContent",
"front\/profile\/userReputation",
"front\/profile\/userSolutions",
"front\/system\/followedContentMemberRow",
"front\/tables\/manageFollowRow",
"front\/tables\/rows",
"front\/tables\/table",
"front\/tags\/contentTableRows",
"front\/widgets\/relatedContent"
],
"removed": []
},
"css": {
"added": [],
"edited": [
"global\/framework\/3-cover-photo.css",
"global\/framework\/3-entries.css",
"global\/framework\/3-misc.css",
"global\/framework\/3-richtext.css",
"global\/framework\/3-streams.css",
"front\/styles\/profiles.css"
],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": [
"admin\/mobileapp\/screenshot.png",
"admin\/large_loading.gif",
"admin\/loading.gif",
"admin\/small_loading.gif",
"admin\/notepad_bg.png",
"front\/wizard_step_extra@2x.png",
"front\/wizard_step_extra_rtl@2x.png",
"front\/wizard_step_large_rtl.png",
"front\/wizard_step_extra.png",
"front\/wizard_step_large_rtl@2x.png",
"front\/notification_settings\/email.svg",
"front\/notification_settings\/push.svg",
"front\/notification_settings\/notification_bell.svg",
"front\/hive\/communityhive.svg",
"front\/hive\/logo_on_white_background.png",
"front\/wizard_step_large@2x.png",
"front\/wizard_step_large.png",
"front\/loaders\/large_loading@2x.gif",
"front\/loaders\/large_loading.gif",
"front\/wizard_step_extra_rtl.png"
]
}
}
@@ -0,0 +1,116 @@
{
"categories": {
"added": [],
"edited": [
"lightDarkMode",
"logos",
"pageLayouts",
"typography",
"header",
"sidePanel",
"content",
"footer",
"mobileNavigation",
"navigationPanel",
"global",
"textLogo",
"imageLogoDesktop",
"imageLogoMobile",
"desktopHeader",
"mobileHeader",
"desktopFooter",
"body",
"contentBoxes",
"sidebar",
"avatars",
"buttons"
],
"removed": []
},
"settings": {
"added": [],
"edited": [
"set__i-default-scheme",
"set__i-logo-text",
"set__i-sidebar-width",
"i-primary-button--co",
"set__i-mobile-icons-location",
"set__logo-light",
"i-footer--co",
"set__mobile-logo-light",
"layout_global_view_mode",
"set__i-font-family",
"set__i-design-border",
"set__i-layout-width",
"set__i-sidebar-ui-header--he",
"set__i-position-logo",
"set__i-mobile-header--he",
"set__i-change-scheme",
"set__i-logo-slogan",
"i-primary-button--ba-co",
"set__i-mobile-footer-labels",
"set__logo-dark",
"i-footer--ba-co",
"set__mobile-logo-dark",
"set__i-design-radius",
"set__i-font-size",
"set__i-flip-sidebar",
"i-dashHeader--ba-co",
"set__i-position-navigation",
"i-headerMobile--ba-co",
"i-headerMobile--co",
"i-secondary-button--co",
"set__i-logo--fo-fa",
"set__i-position-user",
"i-dashHeader--co",
"set__i-avatar-radius",
"i-color_root",
"set__i-mobile-logo--he",
"set__i-design-shadow",
"i-mobileFooter--ba-co",
"set__i-logo--he",
"i-secondary-button--ba-co",
"set__i-logo--fo-we",
"i-navPanelLinkHover--co",
"set__i-position-breadcrumb",
"i-mobileFooter--co",
"i-color_soft",
"i-body--ba-co",
"set__i-link-panels",
"set__i-sidebar-ui-logo--he",
"i-button--bo-ra",
"set__i-desktop-logo--fo-si",
"set__i-sticky-sidebar",
"i-navPanelLinkActive--ba-co",
"set__i-position-search",
"i-mobileFooter-active--co",
"i-color_hard",
"i-box--ba-co",
"set__i-header-primary--he",
"set__i-sidebar-ui-logo--fo-si",
"i-box--bo-co",
"i-link--co",
"i-mobileFooter-active--ba-co",
"i-navPanel--ba-co",
"set__i-mobile-logo--fo-si",
"i-link-hover--co",
"i-navPanel--co",
"set__i-header-secondary--he",
"i-boxHeader--ba-co",
"i-boxHeader--co",
"set__i-user-content-font-size",
"i-navPanelLinkActive--co",
"set__i-nav-bar-icons",
"i-widget-header--ba-co",
"i-headerTop--ba-co",
"i-widget-header--co",
"i-headerTop--co",
"i-headerPrimary--ba-co",
"i-headerPrimary--co",
"i-headerSecondary--ba-co",
"i-headerSecondary--co",
"set__i-header-top--he"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000034,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": true,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": true,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"files": {
"added": [],
"edited": [
"global\/front\/controllers\/core\/ips.core.commentFeed.js"
],
"removed": []
},
"orders": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,116 @@
{
"categories": {
"added": [],
"edited": [
"lightDarkMode",
"logos",
"pageLayouts",
"typography",
"header",
"sidePanel",
"content",
"footer",
"mobileNavigation",
"navigationPanel",
"global",
"textLogo",
"imageLogoDesktop",
"imageLogoMobile",
"desktopHeader",
"mobileHeader",
"desktopFooter",
"body",
"contentBoxes",
"sidebar",
"avatars",
"buttons"
],
"removed": []
},
"settings": {
"added": [],
"edited": [
"set__i-default-scheme",
"set__i-logo-text",
"set__i-sidebar-width",
"i-primary-button--co",
"set__i-mobile-icons-location",
"set__logo-light",
"i-footer--co",
"set__mobile-logo-light",
"layout_global_view_mode",
"set__i-font-family",
"set__i-design-border",
"set__i-layout-width",
"set__i-sidebar-ui-header--he",
"set__i-position-logo",
"set__i-mobile-header--he",
"set__i-change-scheme",
"set__i-logo-slogan",
"i-primary-button--ba-co",
"set__i-mobile-footer-labels",
"set__logo-dark",
"i-footer--ba-co",
"set__mobile-logo-dark",
"set__i-design-radius",
"set__i-font-size",
"set__i-flip-sidebar",
"i-dashHeader--ba-co",
"set__i-position-navigation",
"i-headerMobile--ba-co",
"i-headerMobile--co",
"i-secondary-button--co",
"set__i-logo--fo-fa",
"set__i-position-user",
"i-dashHeader--co",
"set__i-avatar-radius",
"i-color_root",
"set__i-mobile-logo--he",
"set__i-design-shadow",
"i-mobileFooter--ba-co",
"set__i-logo--he",
"i-secondary-button--ba-co",
"set__i-logo--fo-we",
"i-navPanelLinkHover--co",
"set__i-position-breadcrumb",
"i-mobileFooter--co",
"i-color_soft",
"i-body--ba-co",
"set__i-link-panels",
"set__i-sidebar-ui-logo--he",
"i-button--bo-ra",
"set__i-desktop-logo--fo-si",
"set__i-sticky-sidebar",
"i-navPanelLinkActive--ba-co",
"set__i-position-search",
"i-mobileFooter-active--co",
"i-color_hard",
"i-box--ba-co",
"set__i-header-primary--he",
"set__i-sidebar-ui-logo--fo-si",
"i-box--bo-co",
"i-link--co",
"i-mobileFooter-active--ba-co",
"i-navPanel--ba-co",
"set__i-mobile-logo--fo-si",
"i-link-hover--co",
"i-navPanel--co",
"set__i-header-secondary--he",
"i-boxHeader--ba-co",
"i-boxHeader--co",
"set__i-user-content-font-size",
"i-navPanelLinkActive--co",
"set__i-nav-bar-icons",
"i-widget-header--ba-co",
"i-headerTop--ba-co",
"i-widget-header--co",
"i-headerTop--co",
"i-headerPrimary--ba-co",
"i-headerPrimary--co",
"i-headerSecondary--ba-co",
"i-headerSecondary--co",
"set__i-header-top--he"
],
"removed": []
}
}
@@ -13,6 +13,7 @@ namespace IPS\core;
/* To prevent PHP errors (extending class does not exist) revealing path */
use IPS\Application;
use IPS\convert\App;
use IPS\Data\Store;
use IPS\DateTime;
use IPS\Db;
@@ -272,12 +273,12 @@ abstract class AdminNotification extends ActiveRecord
$notifications = array();
foreach ( Store::i()->acpNotifications as $notification )
{
if ( Application::appIsEnabled( $notification['app'] ) AND class_exists( 'IPS\\' . $notification['app'] . '\extensions\core\AdminNotifications\\' . IPS::mb_ucfirst( $notification['ext'] ) ) )
if( Application::appIsEnabled( $notification['app'] ) )
{
$notificationObject = static::constructFromData( $notification );
if ( $notificationObject )
$app = Application::load( $notification['app'] );
if( array_key_exists( $notification['ext'], $app->extensions( $app, 'AdminNotifications', false ) ) AND class_exists( 'IPS\\' . $notification['app'] . '\extensions\core\AdminNotifications\\' . IPS::mb_ucfirst( $notification['ext'] ) ) )
{
$notificationObject = static::constructFromData( $notification );
$notifications[$notificationObject->id] = $notificationObject;
}
else
@@ -585,7 +585,7 @@ HTML,
*/
public static function i(): static
{
if ( empty( static::$instance ) )
if ( !static::hasInstance() )
{
if ( ( \IPS\IN_DEV OR CIC ) AND class_exists( '\IPS\cloud\DataLayer' ) )
{
@@ -607,6 +607,16 @@ HTML,
return static::$instance;
}
/**
* Check if there is an instance currently
*
* @return bool
*/
public static function hasInstance() : bool
{
return !empty( static::$instance );
}
/**
* Initialize this instance
*
@@ -631,6 +641,12 @@ HTML,
*/
public function addEvent( string $key, array $values, bool $odkUpdate=true ) : void
{
/* Do we care about the datalayer on this request? */
if ( Output::i()->bypassDataLayer )
{
return;
}
/* Is it set */
if ( !$odkUpdate AND isset( $this->events[$key] ) )
{
@@ -796,6 +812,11 @@ HTML,
*/
public function addContextProperty( string $key, mixed $value, bool $odkUpdate=true ) : void
{
if ( Output::i()->bypassDataLayer )
{
return;
}
/* Did we set it already? */
if ( !$odkUpdate AND isset( $this->context[$key] ) )
{
@@ -343,6 +343,11 @@ abstract class FrontNavigationAbstract
*/
public function isAvailableFor( string $type ): bool
{
if( !$this->canView() )
{
return false;
}
if ( $this->menuTypes === '*' )
{
return true;
+9 -9
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="downloads">
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/downloads" javascript_name="ips.downloads.browse.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000200">/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/downloads" javascript_name="ips.downloads.browse.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000200">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -59,7 +59,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/pending" javascript_name="ips.pending.buttons.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000250">/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/pending" javascript_name="ips.pending.buttons.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000250">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -87,7 +87,7 @@
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="admin" javascript_path="controllers/settings" javascript_name="ips.settings.settings.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050">/**
<file javascript_app="downloads" javascript_location="admin" javascript_path="controllers/settings" javascript_name="ips.settings.settings.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -140,7 +140,7 @@
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.linkedScreenshots.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100">/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.linkedScreenshots.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -212,7 +212,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.main.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.main.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -657,7 +657,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.changeLog.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150"><![CDATA[/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.changeLog.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -779,7 +779,7 @@
});
}(jQuery, _));]]></file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.download.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150">/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.download.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -907,7 +907,7 @@
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.subscribe.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150">/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.subscribe.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -970,7 +970,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.submit.js" javascript_type="template" javascript_version="5000032" javascript_position="1000050"><![CDATA[/* VIEW TEMPLATES */
<file javascript_app="downloads" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.submit.js" javascript_type="template" javascript_version="5000034" javascript_position="1000050"><![CDATA[/* VIEW TEMPLATES */
ips.templates.set('downloads.submit.screenshot', " \
<div class='ipsUploader__row ipsUploader__row--image ipsAttach {{#done}}ipsAttach_done{{/done}}' id='{{id}}' data-role='file' data-fileid='{{id}}' data-filesize='{{sizeRaw}}' data-fullsizeurl='{{imagesrc}}' data-thumbnailurl='{{thumbnail}}' data-fileType='image'>\
<div class='ipsUploader__rowPreview' data-role='preview'>\
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="downloads" version="5000032">
<app key="downloads" version="5000034">
<word key="__app_downloads" js="0">Downloads</word>
<word key="frontnavigation_downloads" js="0">Downloads</word>
<word key="__indefart_downloads_file_comment" js="0">a comment on a file</word>
+23 -23
View File
@@ -261,7 +261,7 @@
<a href='{$file->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$file->name}</span></a>
<figure class='ipsData__image'>
{{if $file->primary_screenshot_thumb}}
<img src='{file="$file->primary_screenshot_thumb" extension="core_Attachment"}' alt='' loading='lazy'>
<img src='{file="$file->primary_screenshot_thumb" extension="downloads_Screenshots"}' alt='' loading='lazy'>
{{else}}
<i></i>
{{endif}}
@@ -347,8 +347,8 @@
<input type='checkbox' data-role='moderation' name="moderate[{$file->id}]" data-actions="{expression="implode( ' ', $table->multimodActions( $file ) )"}" data-state='{{if $file->tableStates()}}{$file->tableStates()}{{endif}}' class="ipsInput ipsInput--toggle">
</div>
{{endif}}
{template="thumbImage" group="global" app="core" params="$file->primary_screenshot_thumb, $file->name, 'medium', '', 'view_this', $file->url( 'getPrefComment' ), 'core_Attachment', '', true"}
<h4 class='ipsData__title ipsType_sectionHead'>
{template="thumbImage" group="global" app="core" params="$file->primary_screenshot_thumb, $file->name, 'medium', '', 'view_this', $file->url( 'getPrefComment' ), 'downloads_Screenshots', '', true"}
<h4 class='ipsData__title'>
{{if $file->unread()}}
<span class='ipsIndicator' data-ipsTooltip title='{{if $file->unread() === -1}}{lang="new"}{{else}}{lang="updated"}{{endif}}'></span>
{{endif}}
@@ -356,10 +356,10 @@
{{foreach $file->badges() as $badge}}{$badge|raw}{{endforeach}}
{{if $file->prefix()}}
<span>{template="prefix" group="global" app="core" params="$file->prefix( TRUE ), $file->prefix()"}</span>
{template="prefix" group="global" app="core" params="$file->prefix( TRUE ), $file->prefix()"}
{{endif}}
<span class=''><a href='{$file->url( "getPrefComment" )}' title='{lang="view_this_file" sprintf="$file->name"} {{if $file->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $file->canEdit()}}data-role="editableTitle"{{endif}}>{$file->name}</a></span>
<a href='{$file->url( "getPrefComment" )}' title='{lang="view_this_file" sprintf="$file->name"} {{if $file->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $file->canEdit()}}data-role="editableTitle"{{endif}}>{$file->name}</a>
</h4>
<p class='i-color_soft i-link-color_inherit'>
{lang="byline_nodate" htmlsprintf="$file->author()->link( NULL, NULL, $file->isAnonymous() )"}
@@ -373,7 +373,7 @@
<!-- Rating -->
{{if $file->container()->bitoptions['reviews']}}
{template="rating" group="global" location="front" app="core" params="'large', $file->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $file->memberReviewRating()"}&nbsp;&nbsp; <span class='i-color_soft'>({lang="num_reviews" pluralize="$file->reviews"})</span>
{template="rating" group="global" location="front" app="core" params="'large', $file->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $file->memberReviewRating()"} <span class='i-color_soft'>({lang="num_reviews" pluralize="$file->reviews"})</span>
{{endif}}
<!-- Comments -->
@@ -391,15 +391,15 @@
<!-- Price -->
{{if \IPS\Application::appIsEnabled( 'nexus' ) and settings.idm_nexus_on}}
<p class='i-font-size_2 i-text-align_center i-margin-top_2'>
<span class='cFilePrice'>
{{if $file->isPaid()}}
{{if $price = $file->price()}}
{$price|raw}
{{endif}}
{{else}}
{lang="file_free"}
{{endif}}
</span>
<span class='cFilePrice'>
{{if $file->isPaid()}}
{{if $price = $file->price()}}
{$price|raw}
{{endif}}
{{else}}
{lang="file_free"}
{{endif}}
</span>
</p>
<!-- Purchase Count -->
<p>
@@ -412,7 +412,7 @@
</p>
<!-- Tags -->
{{if \count( $file->tags() )}}
{template="tags" group="global" app="core" params="$file->tags(), TRUE"}
{template="tags" group="global" app="core" params="$file->tags(), TRUE"}
{{endif}}
{{endif}}
</div>]]></template>
@@ -523,7 +523,7 @@
<a href='{$file->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$file->name}</span></a>
<figure class='ipsData__image'>
{{if $file->primary_screenshot_thumb}}
<img src='{file="$file->primary_screenshot_thumb" extension="core_Attachment"}' alt='' loading='lazy'>
<img src='{file="$file->primary_screenshot_thumb" extension="downloads_Screenshots"}' alt='' loading='lazy'>
{{else}}
<i></i>
{{endif}}
@@ -615,7 +615,7 @@
<a href="{$file->url( 'getPrefComment' )}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$file->name}</span></a>
<a href="{$file->url( 'getPrefComment' )}" class='ipsData__image'>
{{if $file->primary_screenshot_thumb}}
<img src='{file="$file->primary_screenshot_thumb" extension="core_Attachment"}' alt='' loading='lazy'>
<img src='{file="$file->primary_screenshot_thumb" extension="downloads_Screenshots"}' alt='' loading='lazy'>
{{else}}
<i></i>
{{endif}}
@@ -704,7 +704,7 @@
<a href='{$file->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$file->name}</span></a>
<a href="{$file->url( 'getPrefComment' )}" class='ipsData__image'>
{{if $file->primary_screenshot_thumb}}
<img src='{file="$file->primary_screenshot_thumb" extension="core_Attachment"}' alt='' loading='lazy'>
<img src='{file="$file->primary_screenshot_thumb" extension="downloads_Screenshots"}' alt='' loading='lazy'>
{{else}}
<i></i>
{{endif}}
@@ -1011,7 +1011,7 @@
</div>
{{else}}
<div class='ipsData__meta'>
{lang="byline" htmlsprintf="$row->author()->link( $row->warningRef() )"}{datetime="$row->__get( $row::$databaseColumnMap['date'] )"}
{lang="byline_name_date" htmlsprintf="$row->author()->link( $row->warningRef() ), \IPS\DateTime::ts( $row->__get( $row::$databaseColumnMap['date'] ) )->html(TRUE)"}
{lang="in"} <a href="{$row->container()->url()}">{$row->container()->_title}</a>
</div>
{{endif}}
@@ -1136,11 +1136,11 @@
{{endif}}
</a>
<div class='ipsData__main'>
<h4 class='ipsData__title ipsType_sectionHead'>
<h4 class='ipsData__title'>
{{if $file->prefix()}}
<span>{template="prefix" group="global" app="core" location="front" params="$file->prefix( TRUE ), $file->prefix()"}</span>
{template="prefix" group="global" app="core" location="front" params="$file->prefix( TRUE ), $file->prefix()"}
{{endif}}
<span><a href='{$file->url()}' title='{lang="view_this_file" sprintf="$file->name"}'>{$file->name}</a></span>
<a href='{$file->url()}' title='{lang="view_this_file" sprintf="$file->name"}'>{$file->name}</a>
</h4>
<p class='i-color_soft i-link-color_inherit'>
{lang="byline_nodate" htmlsprintf="$file->author()->link()"}
+3 -1
View File
@@ -280,5 +280,7 @@
"5000029": "5.0.0 Beta 3",
"5000030": "5.0.0 Beta 4",
"5000031": "5.0.0 Beta 5",
"5000032": "5.0.0 Beta 6"
"5000032": "5.0.0 Beta 6",
"5000033": "5.0.0 Beta 7",
"5000034": "5.0.0 Beta 7"
}
@@ -1259,27 +1259,12 @@ class view extends Controller
}
catch ( Exception $e ) { }
}
/**
* We only need to generate a new thumbnail if we are using watermarking.
* If we are not, then we can simply use the previous thumbnail, if this existed previously, rather than generating a new one every time we upload a new version, which is unnecessary extra processing as well as disk usage.
* If we are, then it is impossible to know if the watermark has since changed, so we need to go ahead and do it anyway.
*/
$existing = NULL;
if ( $watermarked !== TRUE )
{
try
{
$existing = Db::i()->select( '*', 'downloads_files_records', array( "record_location=? AND record_file_id=?", (string) $file, $this->file->id ), NULL, NULL, NULL, NULL, Db::SELECT_FROM_WRITE_SERVER )->first();
}
catch( UnderflowException $e ) {}
}
Db::i()->insert( 'downloads_files_records', array(
'record_file_id' => $this->file->id,
'record_type' => 'ssupload',
'record_location' => (string) $file,
'record_thumb' => ( $watermarked OR !$existing ) ? (string) $file->thumbnail( 'downloads_Screenshots' ) : $existing['record_thumb'],
'record_thumb' => (string) $file->thumbnail( 'downloads_Screenshots' ),
'record_realname' => $file->originalFilename,
'record_size' => $file->filesize(),
'record_time' => time(),
@@ -0,0 +1,22 @@
{
"id": 5000033,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,25 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/featuredFile",
"front\/browse\/fileGrid",
"front\/browse\/indexBlock",
"front\/browse\/rows",
"front\/browse\/tableRow",
"front\/global\/manageFollowRow",
"admin\/nexus\/fileInfo"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_downloads_categories"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000034,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_downloads_categories"
],
"removed": []
}
}
+15 -2
View File
@@ -46,6 +46,7 @@ use IPS\Db;
use IPS\Db\Select;
use IPS\downloads\extensions\nexus\Item\File as FileNexusItem;
use IPS\downloads\File\PendingVersion;
use IPS\Events\Event;
use IPS\File as SystemFile;
use IPS\File\Iterator;
use IPS\Helpers\Form;
@@ -71,6 +72,7 @@ use IPS\Node\Model;
use IPS\Notification;
use IPS\Output;
use IPS\Output\Plugin\Filesize;
use IPS\Output\UI\UiExtension;
use IPS\Patterns\ActiveRecordIterator;
use IPS\Request;
use IPS\Settings;
@@ -1505,7 +1507,7 @@ Filter
return TRUE;
}
return $member->group['idm_view_downloads'];
return (bool) $member->group['idm_view_downloads'];
}
/**
@@ -2417,6 +2419,13 @@ Filter
$this->_primaryScreenshotThumb = FALSE;
$this->syncTopic();
}
/* Call UI extensions */
$this->ui( 'formPostSave', array( $values ) );
/* Fire event for listeners */
Event::fire( 'onCreateOrEdit', $this, array( $values ) );
Webhook::fire( 'downloads_new_version', array( $this ) );
}
@@ -2782,7 +2791,11 @@ Filter
*/
public function newVersionFormElements( Form &$form ) : void
{
/* UI Extension for new version. You can check Request::i()->do to see which form you're working with. */
foreach( UiExtension::i()->run( $this, 'formElements', array( $this->container() ) ) as $element )
{
$form->add( $element );
}
}
+10 -10
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="forums">
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.flow.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.flow.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -272,7 +272,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.forumList.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.forumList.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -340,7 +340,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.forumPage.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.forumPage.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -397,7 +397,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.hovercard.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100">/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.hovercard.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -447,7 +447,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="forums" javascript_location="admin" javascript_path="controllers/settings" javascript_name="ips.settings.archiveRules.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050"><![CDATA[/**
<file javascript_app="forums" javascript_location="admin" javascript_path="controllers/settings" javascript_name="ips.settings.archiveRules.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -512,7 +512,7 @@
});
}(jQuery, _));
]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.activity.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050">/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.activity.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -534,7 +534,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.answers.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050"><![CDATA[/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.answers.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -674,7 +674,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.reply.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050">/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.reply.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -703,7 +703,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.solved.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050"><![CDATA[/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.solved.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -741,7 +741,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.view.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050">/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.view.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="forums" version="5000032">
<app key="forums" version="5000034">
<word key="__app_forums" js="0">Forums</word>
<word key="frontnavigation_forums" js="0">Forums</word>
<word key="__indefart_post" js="0">a post in a topic</word>
+5 -6
View File
@@ -917,7 +917,7 @@
{{endif}}
</div>
<div class='ipsData__meta'>
{lang="byline" htmlsprintf="$topic->author()->link( NULL, NULL, $topic->isAnonymous() )"} {datetime="$topic->mapped('date')"}
{lang="byline_name_date" htmlsprintf="$topic->author()->link( NULL, NULL, $topic->isAnonymous() ), \IPS\DateTime::ts( $topic->mapped('date') )->html(TRUE)"}
{{if \IPS\Request::i()->controller != 'forums'}}
{lang="in"} <a href="{$topic->container()->url()}">{$topic->container()->_title}</a>
{{endif}}
@@ -1712,8 +1712,7 @@
{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}
{{endif}}
</div>
{lang="byline_itemprop" htmlsprintf="$row->author()->link( NULL, NULL, $row->isAnonymous() )"}
{datetime="$row->mapped('date')" lowercase="true"}
{lang="byline_name_date" htmlsprintf="$row->author()->link( NULL, NULL, $row->isAnonymous() ), \IPS\DateTime::ts( $row->mapped('date') )->html(FALSE)"}
{lang="in"} <a href="{$row->container()->url()}" class="ipsData__container-title">{{if $club = $row->container()->club()}}{lang="club_node" sprintf="$club->name, $row->container()->_title"}{{else}}{$row->container()->_title|raw}{{endif}}</a>
</div>
{{if \count( $row->tags() )}}
@@ -2811,10 +2810,10 @@ data-first-page="{{if isset( request.page ) and request.page > 1}}false{{else}}t
{{if $comment->author()->member_id}}
<!-- Expand mini profile -->
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-{$comment->$idField}' aria-expanded='false' data-ipscontrols aria-label='{lang="author_stats"}' data-ipstooltip><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-{$comment->$idField}' aria-expanded='false' data-ipscontrols data-ipscontrols-src="{$comment->authorMiniProfileUrl}" aria-label='{lang="author_stats"}' data-ipstooltip><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
{{endif}}
{template="miniProfile" app="core" group="global" params="$comment, $comment->$idField"}
{template="miniProfileWrap" app="core" group="global" params="$comment->author(), $comment->$idField, remoteLoading: true"}
</div>
</aside>]]></template>
<template template_group="topics" template_name="topic" template_data="$topic, $comments, $votes=array(), $nextUnread=NULL, $pagination=NULL, $topicVotes=array(), $firstPost=null, $viewerIsFollowingTheseExperts=array()" template_location="front" template_app="forums"><![CDATA[{{$Traditional = \IPS\Member::loggedIn()->getLayoutValue( 'forums_post' ) !== 'modern';}}
@@ -3387,7 +3386,7 @@ data-first-page="{{if isset( request.page ) and request.page > 1}}false{{else}}t
{{endif}}
</div>
<div class='ipsData__desc ipsRichText' data-controller='core.front.core.lightboxedImages'>{$comment->truncated()|raw}</div>
<p class='ipsData__meta'>{lang="byline_itemprop" htmlsprintf="$comment->author()->link( NULL, NULL, $comment->isAnonymous() )"} <a href='{$comment->item()->url()->setQueryString( array( 'do' => 'findComment', 'comment' => $comment->pid ) )}'>{$comment->dateLine()|raw}</a></p>
<p class='ipsData__meta'>{lang="byline" htmlsprintf="$comment->author()->link( NULL, NULL, $comment->isAnonymous() )"} &middot; <a href='{$comment->item()->url()->setQueryString( array( 'do' => 'findComment', 'comment' => $comment->pid ) )}'>{$comment->dateLine()|raw}</a></p>
</div>
</div>
</li>
+3 -1
View File
@@ -280,5 +280,7 @@
"5000029": "5.0.0 Beta 3",
"5000030": "5.0.0 Beta 4",
"5000031": "5.0.0 Beta 5",
"5000032": "5.0.0 Beta 6"
"5000032": "5.0.0 Beta 6",
"5000033": "5.0.0 Beta 7",
"5000034": "5.0.0 Beta 7"
}
@@ -0,0 +1,22 @@
{
"id": 5000033,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"html": {
"added": [],
"edited": [
"front\/global\/row",
"front\/index\/simplifiedTopicRow",
"front\/topics\/postHeader",
"front\/widgets\/postFeed"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,17 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_forums_forum",
"layout_forums_topic",
"layout_forums_post",
"layout_forum_topic_view_firstpost"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000034,
"name": "5.0.0 Beta 7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,17 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_forums_forum",
"layout_forums_topic",
"layout_forums_post",
"layout_forum_topic_view_firstpost"
],
"removed": []
}
}
+5 -1
View File
@@ -31,6 +31,7 @@ use IPS\Db;
use IPS\Dispatcher;
use IPS\File;
use IPS\downloads\Category;
use IPS\forums\Topic\Post;
use IPS\Helpers\Form;
use IPS\Helpers\Form\CheckboxSet;
use IPS\Helpers\Form\Color;
@@ -691,7 +692,10 @@ class Forum extends Model implements Permissions
try
{
$results = [];
foreach( Db::i()->select( '*', 'forums_posts', array( 'topic_id=? AND queued=0', Db::i()->select( 'tid', 'forums_topics', array( 'forum_id=? AND approved=1 AND starter_id=? AND is_future_entry=0', $this->_id, Member::loggedIn()->member_id ), 'last_post DESC', 1 )->first() ), 'post_date DESC', $count ) as $post )
foreach(
new ActiveRecordIterator(
Db::i()->select( '*', 'forums_posts', array( 'topic_id=? AND queued=0', Db::i()->select( 'tid', 'forums_topics', array( 'forum_id=? AND approved=1 AND starter_id=? AND is_future_entry=0', $this->_id, Member::loggedIn()->member_id ), 'last_post DESC', 1 )->first() ), 'post_date DESC', $count ),
Post::class ) as $post )
{
$results[ $post->post_date ] = [
'author' => $post->author(),
+1 -1
View File
@@ -380,7 +380,7 @@ class Post extends Comment implements Embeddable,
/* If we feature the first post, then pagination is all wrong */
if( Member::loggedIn()->getLayoutValue( 'forum_topic_view_firstpost' ) )
{
return [ 'new_topic=?', 0 ];
return [ static::$databasePrefix . static::$databaseColumnMap['first'] . '=?', 0 ];
}
return parent::findCommentWhere();
@@ -597,16 +597,6 @@ class Topic extends Item implements Embeddable,
$current[] = 'hide';
}
}
if ( static::modPermission( 'feature', NULL, $container ) )
{
$options['feature'] = 'create_topic_featured';
$toggles['feature'] = array( 'create_topic_featured' );
if( $item and $item->mapped('featured') )
{
$current[] = 'feature';
}
}
if ( count( $options ) or count( $toggles ) )
{
@@ -666,11 +656,6 @@ class Topic extends Item implements Embeddable,
{
$this->pinned = ( in_array( 'pin', $values['topic_create_state'] ) ) ? 1 : 0;
}
if ( static::modPermission( 'feature', NULL, $this->container() ) )
{
$this->featured = ( in_array( 'feature', $values['topic_create_state'] ) ) ? 1 : 0;
}
}
if ( static::modPermission( 'lock', NULL, $this->container() ) )
+12 -12
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="gallery">
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/global" javascript_name="ips.global.nsfw.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000200">;( function($, _, undefined){
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/global" javascript_name="ips.global.nsfw.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000200">;( function($, _, undefined){
&quot;use strict&quot;;
ips.controller.register('gallery.front.global.nsfw', {
@@ -20,7 +20,7 @@
});
}(jQuery, _));</file>
<file javascript_app="gallery" javascript_location="admin" javascript_path="controllers/settings" javascript_name="ips.settings.settings.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000050">/**
<file javascript_app="gallery" javascript_location="admin" javascript_path="controllers/settings" javascript_name="ips.settings.settings.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -77,7 +77,7 @@
});
}(jQuery, _));</file>
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.chooseCategory.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.chooseCategory.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -244,7 +244,7 @@
});
}(jQuery, _));
]]></file>
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.existingAlbums.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.existingAlbums.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -280,7 +280,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.uploadImages.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.uploadImages.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -411,7 +411,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.wrapper.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000100"><![CDATA[/**
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.wrapper.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1166,7 +1166,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.image.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150">/**
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.image.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1308,7 +1308,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.note.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150"><![CDATA[/**
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.note.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1768,7 +1768,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.notes.js" javascript_type="controller" javascript_version="5000032" javascript_position="1000150"><![CDATA[/**
<file javascript_app="gallery" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.notes.js" javascript_type="controller" javascript_version="5000034" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1851,8 +1851,8 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="gallery" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.browse.js" javascript_type="template" javascript_version="5000032" javascript_position="1000050">// Empty</file>
<file javascript_app="gallery" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.submit.js" javascript_type="template" javascript_version="5000032" javascript_position="1000050"><![CDATA[ips.templates.set('gallery.submit.imageItem', " \
<file javascript_app="gallery" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.browse.js" javascript_type="template" javascript_version="5000034" javascript_position="1000050">// Empty</file>
<file javascript_app="gallery" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.submit.js" javascript_type="template" javascript_version="5000034" javascript_position="1000050"><![CDATA[ips.templates.set('gallery.submit.imageItem', " \
<div class='ipsAttach ipsImageAttach {{#done}}ipsAttach_done{{/done}}' id='{{id}}' data-role='file' data-fileid='{{id}}' data-fullsizeurl='{{imagesrc}}' data-thumbnailurl='{{thumbnail}}' data-isImage='1'>\
<ul class='ipsImageAttach_controls'>\
<li data-role='insert' {{#insertable}}style='display: none'{{/insertable}}><a href='#' data-action='insertFile' class='ipsAttach_selection' data-ipsTooltip title='{{#lang}}insertIntoPost{{/lang}}'><i class='fa-solid fa-plus'></i></a></li>\
@@ -1879,7 +1879,7 @@
ips.templates.set('gallery.submit.imageItemWrapper', " \
<div class='cGallerySubmit_fileList'>{{{content}}}</div>\
");]]></file>
<file javascript_app="gallery" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.view.js" javascript_type="template" javascript_version="5000032" javascript_position="1000050"><![CDATA[ips.templates.set('gallery.notes.wrapper', " \
<file javascript_app="gallery" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.view.js" javascript_type="template" javascript_version="5000034" javascript_position="1000050"><![CDATA[ips.templates.set('gallery.notes.wrapper', " \
<div class='cGalleryNote' data-controller='gallery.front.view.note' data-noteID='{{id}}' data-note=\"{{note}}\" {{#editable}}data-editable{{/editable}} data-posLeft='{{left}}' data-posTop='{{top}}' data-dimWidth='{{width}}' data-dimHeight='{{height}}'>\
<div class='cGalleryNote_border'></div>\
<div class='cGalleryNote_note' style='display: none'>\
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="gallery" version="5000032">
<app key="gallery" version="5000034">
<word key="__app_gallery" js="0">Gallery</word>
<word key="frontnavigation_gallery" js="0">Gallery</word>
<word key="gallery_title" js="0">Gallery</word>
+9 -9
View File
@@ -1658,11 +1658,11 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi
{{endif}}
{{if $comment->author()->member_id}}
<!-- Expand mini profile -->
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-{$comment->$idField}' aria-expanded='false' data-ipscontrols aria-label="Toggle mini profile"><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-{$comment->$idField}' aria-expanded='false' data-ipscontrols data-ipscontrols-src="{$comment->authorMiniProfileUrl}" aria-label="Toggle mini profile"><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
{{endif}}
</div>
{{if $comment->author()->member_id}}
{template="miniProfile" app="core" group="global" params="$comment, $comment->$idField"}
{{if $comment->author()->member_id}}
{template="miniProfileWrap" app="core" group="global" params="$comment->author(), $comment->$idField, remoteLoading:true"}
{{endif}}
</header>
<div class='ipsEntry__post'>
@@ -2280,7 +2280,7 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi
</div>
{{else}}
<div class="ipsData__meta">
{lang="byline" htmlsprintf="$row->author()->link( $row->warningRef() )"}{datetime="$row->__get( $row::$databaseColumnMap['date'] )"}
{lang="byline_name_date" htmlsprintf="$row->author()->link( $row->warningRef() ), \IPS\DateTime::ts( $row->__get( $row::$databaseColumnMap['date'] ) )->html(TRUE)"}
{lang="in"} <a href="{$row->container()->url()}">{$row->container()->_title}</a>
</div>
{{endif}}
@@ -2431,12 +2431,12 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi
</ul>
{{if $review->author()->member_id}}
<!-- Expand mini profile -->
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-review-{$review->id}' aria-expanded='false' data-ipscontrols aria-label="Toggle mini profile"><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-review-{$review->id}' aria-expanded='false' data-ipscontrols data-ipscontrols-src="{$review->authorMiniProfileUrl}" aria-label="Toggle mini profile"><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
{{endif}}
</div>
{{if $review->author()->member_id}}
{template="miniProfile" app="core" group="global" params="$review, $review->id"}
{{endif}}
{{if $review->author()->member_id}}
{template="miniProfileWrap" app="core" group="global" params="$review->author(), $review->id, 'review', remoteLoading: true"}
{{endif}}
</header>
<div class='ipsEntry__post'>
{{if $review->hidden() AND $review->hidden() != -2}}
@@ -4469,7 +4469,7 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi
</a>
</div>
<div class="i-flex i-justify-content_space-between">
<div>{lang="byline" htmlsprintf="$latestImage->author()->link()"} {datetime="$latestImage->mapped('date')"}</div>
<div>{lang="byline_name_date" htmlsprintf="$latestImage->author()->link(), \IPS\DateTime::ts( $latestImage->mapped('date') )->html(TRUE)"}</div>
{{if $latestImage->directContainer()->allow_comments && $latestImage->comments > 0}}
<div data-ipsTooltip title='{lang="num_comments" pluralize="$latestImage->comments"}'>
<i class='fa-solid fa-comment'></i> {$latestImage->comments}
Loaded 100 of 156 files, more files were not shown because too many files have changed in this diff. Show more