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

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;