Version 5.0.13

This commit is contained in:
Neo committed 2025-12-19 19:04:57 -08:00
1 parent b89858b2ff
commit 5efe744c5f
1407 files changed
+69690 -30177

No files matched your search

+6 -2
View File
@@ -5,6 +5,10 @@ Invision Power Services, Inc. is grateful to the following projects, whose work
has been used throughout Invision Community to add style, flair and functionality
to our product.
NULLING
Last Updated: 5 November 2025
Author: https://ipbmafia.ru
AES implementation in PHP
Description: Used by \IPS\Text\Encrypt to provide two-way text encryption for storing certain data.
Location: system/3rd_party/AES
@@ -52,7 +56,7 @@ Cropper
Included version: 1.5.9
Website: https://github.com/fengyuanchen/cropperjs
License: http://opensource.org/licenses/MIT
Devices Icon Pack
Description: Icon pack for representing different devices
Location: In development: applications/core/dev/resources/front/devices
@@ -84,7 +88,7 @@ google-code-prettify
Included version: 4 March 2013
Website: http://code.google.com/p/google-code-prettify/
License: http://www.apache.org/licenses/LICENSE-2.0
google-diff-mode-patch
Description: Provides diff comparisons for CodeMirror
Location: applications/core/interface/static/codemirror/diff_match_patch.js
+7 -5
View File
@@ -1,7 +1,9 @@
=============================[NOTE]=============================
This software is Nulled!
Nulled by IPBMafia.ru
Buy license at https://invisioncommunity.com/buy/self-hosted/
================================================================
IPS 5.0.6 (5000074)
IPS 5.0.13 (5001302)
=============================[NOTE]=============================
Invision Community End User License Agreement
@@ -23,13 +25,13 @@ In consideration for payment of all applicable license fees and subject to the t
3. Restrictions
Your license to use the Software and Services is subject to the following terms, conditions and restrictions on use:
Your license to use the Software and Services is subject to the following terms, conditions and restrictions on use:
(a) You may alter and modify the Software’s source code for Your use, subject to this Agreement, however, you may not distribute, publish, resell, or otherwise share the Software or derivative works based on the Software without prior express written consent from IPS.
(a) You may alter and modify the Software’s source code for Your use, subject to this Agreement, however, you may not distribute, publish, resell, or otherwise share the Software or derivative works based on the Software without prior express written consent from IPS.
(b) You may not utilize the Software or Services to engage in, facilitate, or otherwise allow others to engage in any activity that violates any law or regulation or the terms and conditions within this Agreement.
(b) You may not utilize the Software or Services to engage in, facilitate, or otherwise allow others to engage in any activity that violates any law or regulation or the terms and conditions within this Agreement.
(c) You are solely responsible for complying with all governmental regulations and policies. You agree to indemnify Us from any loss, action or damage arising from Your failure to use the Software in a manner inconsistent with applicable legislation.
(c) You are solely responsible for complying with all governmental regulations and policies. You agree to indemnify Us from any loss, action or damage arising from Your failure to use the Software in a manner inconsistent with applicable legislation.
(d) You may not remove any copyright or proprietary notices on or within the software’s source code at any time. A branding removal license may be purchased to remove the public display of the Software’s publicly displayed copyright notice.
+1 -1
View File
@@ -19,7 +19,7 @@
{$error}
</div>
{{endif}}
<ul class='ipsForm {{if \IPS\Dispatcher::i()->step == 1}}ipsForm_vertical{{else}}{$class}{{endif}}'>
<ul class='ipsForm {{if \IPS\Dispatcher::i()->step == 1}}ipsForm--vertical{{else}}{$class}{{endif}}'>
{expression="array_pop( $tabs )" raw="true"}
<li class='ipsFieldRow'>
<div class='ipsFieldRow__content'>
+6 -5
View File
@@ -27,13 +27,14 @@
{{if !empty( $tags )}}
</div>
<div class='ipsColumns__secondary ipsComposeArea_sidebar'>
<h3 class='i-background_3 i-padding_2 ipsTitle ipsTitle--h4' data-role='tagsHeader'>{lang="editor_tags"}</h3>
<h3 class='i-padding_2 i-font-weight_600 i-color_hard i-font-size_2' data-role='tagsHeader'>{lang="editor_tags"}</h3>
<ul class='ipsScrollbar' data-role='tagsList'>
{{foreach $tags as $tagKey => $tagValue }}
<li class='i-padding_2'>
<label class="ipsJS_show" data-tagKey="{$tagKey}">{$tagKey}</label>
<div class='ipsJS_hide i-color_soft'><strong>{$tagKey}</strong></div>
<div class='i-color_soft i-font-size_-1'>{$tagValue}</div>
<li>
<button type="button" data-tagKey="{$tagKey}">
<code class="language-ipsphtml">{$tagKey}</code>
<div class='i-color_soft i-font-size_-1 i-margin-top_1'>{$tagValue}</div>
</button>
</li>
{{endforeach}}
</ul>
@@ -30,7 +30,7 @@
<header class="ipsInstaller__header">
<a href='/' class="ipsInstaller__logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 440.71 427.19"><path d="M236,353,439.83,0H.88l203.8,353A18.11,18.11,0,0,0,236,353Z"/><polygon points="0 427.19 128.95 427.19 0 203.83 0 427.19"/><polygon points="311.76 427.19 440.71 427.19 440.71 203.83 311.76 427.19"/></svg>
<span>{lang="banner"} | Chocapikk</span>
<span>{lang="banner"} NULLED</span>
</a>
</header>
<main id='elInstaller_body'>
@@ -79,9 +79,11 @@
<div class="ipsButtons i-margin-top_5 i-margin-bottom_3">
<a href='{expression="\IPS\Settings::i()->base_url"}' class='ipsButton ipsButton--large ipsButton--primary'>{lang="gotosuite"}</a>
<a href='{expression="rtrim( \IPS\Settings::i()->base_url, '/' ) . '/admin'"}' class='ipsButton ipsButton--large ipsButton--normal'>{lang="gotoacp"}</a>
<a href='https://ipbmafia.ru/files/file/1848-russkiy-yazyk-dlya-invision-community/' target="_blank" class='ipsButton ipsButton--large ipsButton--primary' style="background: red;">Russian lang pack</a><br>
</div>
<div class="i-margin-top_3" style="font-weight:500;">
<a href="{expression="\IPS\Http\Url::ips('docs/docs')"}" target="_blank" rel="noopener">{lang="docs_link"}</a>
</div>
<a href="{expression="\IPS\Http\Url::ips('docs/docs')"}" target="_blank" rel="noopener">{lang="docs_link"}</a>
</div>
{{else}}
<div class='ipsInstaller__padding i-text-align_center'>
@@ -109,6 +111,8 @@
{{endif}}
</main>
</div>
<div class="ipsInstaller__ip">Nulled by IPBMafia.ru</div>
<div class="ipsInstaller__ip">
{lang="server_ip"} {expression="$_SERVER['SERVER_ADDR'] ?? ( $_SERVER['LOCAL_ADDR'] ?? 'unavailable' )"}
</div>
</body>
+4 -4
View File
@@ -90,9 +90,9 @@ $lang = array(
'dir_does_not_exist' => "%s does not exist.",
'dir_is_not_writable' => "%s cannot be written to. Please adjust the permissions on it or contact your hosting provider for assistance.",
'file_storage_test_error_amazon' => "There appears to be a problem with your Amazon (%s) file storage settings which can cause problems with uploads.<br> After attempting to upload a file to the directory, the URL to the file is returning a HTTP %s error. Update your settings and then check and see if the problem has been resolved",
'ftp_err_no_ext' => "Your server does not support using FTP storage. Please contact your hosting provider to ask for PHP FTP extension to be enabled.",
'ftp_err_no_ssl' => "Your server does not support using SSL-FTP storage. Please contact your hosting provider to ask for PHP OpenSSL extension to be enabled or use a different protocol.",
'ftp_err_no_sftp' => "Your server does not support using SFTP storage. Please contact your hosting provider to ask for PHP SSH2 extension to be enabled or use a different protocol.",
'ftp_err_no_ext' => "Your server does not support using FTP storage, or the directory permissions are incorrect. Please contact your hosting provider.",
'ftp_err_no_ssl' => "Your server does not support using SSL-FTP storage, or the directory permissions are incorrect. Please contact your hosting provider.",
'ftp_err_no_sftp' => "Your server does not support using SFTP storage, or the directory permissions are incorrect. Please contact your hosting provider.",
'ftp_err-COULD_NOT_CONNECT' => "A connection to the host could not be established. Check the host and port provided are correct.",
'ftp_err-COULD_NOT_LOGIN' => "Authentication failed. Check the username and password provided are correct.",
'ftp_err-COULD_NOT_CHDIR' => "Could not move into the directory specified. Check the directory is correct and the user provided has permission to access it.",
@@ -144,7 +144,7 @@ $lang = array(
'err_db_exists' => "There is already an Invision Community installation in that database. Choose a different database or use a table prefix.",
'err_db_cant_create' => "The Database does not exist and cannot be created automatically. Please create the database manually or contact your hosting provider if you are unsure how to do this.",
'diagnostics_reporting' => "Send usage and diagnostics data to IPS?",
'diagnostics_reporting_desc' => "This distribution is licensed by Chocapikk and this setting does not work. Help Invision Community improve by automatically sending usage and diagnostic information including a list of features in use and basic statistics. The data sent does not contain any private information about your users or your community.",
'diagnostics_reporting_desc' => "This distribution is nulled and this setting does not work. Help Invision Community improve by automatically sending usage and diagnostic information including a list of features in use and basic statistics. The data sent does not contain any private information about your users or your community.",
'conf_global_error' => "",
+6 -5
View File
@@ -27,13 +27,14 @@
{{if !empty( $tags )}}
</div>
<div class='ipsColumns__secondary ipsComposeArea_sidebar'>
<h3 class='i-background_3 i-padding_2 ipsTitle ipsTitle--h4' data-role='tagsHeader'>{lang="editor_tags"}</h3>
<h3 class='i-padding_2 i-font-weight_600 i-color_hard i-font-size_2' data-role='tagsHeader'>{lang="editor_tags"}</h3>
<ul class='ipsScrollbar' data-role='tagsList'>
{{foreach $tags as $tagKey => $tagValue }}
<li class='i-padding_2'>
<label class="ipsJS_show" data-tagKey="{$tagKey}">{$tagKey}</label>
<div class='ipsJS_hide i-color_soft'><strong>{$tagKey}</strong></div>
<div class='i-color_soft i-font-size_-1'>{$tagValue}</div>
<li>
<button type="button" data-tagKey="{$tagKey}">
<code class="language-ipsphtml">{$tagKey}</code>
<div class='i-color_soft i-font-size_-1 i-margin-top_1'>{$tagValue}</div>
</button>
</li>
{{endforeach}}
</ul>
@@ -31,7 +31,7 @@
<header class="ipsInstaller__header">
<a href='/' class="ipsInstaller__logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 440.71 427.19"><path d="M236,353,439.83,0H.88l203.8,353A18.11,18.11,0,0,0,236,353Z"/><polygon points="0 427.19 128.95 427.19 0 203.83 0 427.19"/><polygon points="311.76 427.19 440.71 427.19 440.71 203.83 311.76 427.19"/></svg>
<span>{lang="upgrader_banner"} | Chocapikk</span>
<span>{lang="upgrader_banner"} NULLED</span>
</a>
</header>
<main id='elInstaller_body'>
@@ -88,8 +88,9 @@
<div class="ipsButtons i-margin-top_5">
<a href='{expression="\IPS\Settings::i()->base_url"}' class='ipsButton ipsButton--large ipsButton--primary'>{lang="go_to_suite"}</a>
<a href='{expression="rtrim( \IPS\Settings::i()->base_url, '/' ) . '/admin'"}' class='ipsButton ipsButton--large ipsButton--secondary'>{lang="go_to_acp"}</a>
<a href='https://ipbmafia.ru/files/file/1848-russkiy-yazyk-dlya-invision-community/' target="_blank" class='ipsButton ipsButton--large ipsButton--primary' style="background: red;">Russian lang pack</a><br>
</div>
<div class="i-margin-top_3">
<div class="i-margin-top_3" style="font-weight:500;">
<a href="{expression="\IPS\Http\Url::ips('docs/docs')"}" target="_blank" rel="noopener">{lang="suite_docs"}</a>
</div>
</div>
@@ -113,5 +114,6 @@
{{endif}}
</main>
</div>
<div class="ipsInstaller__ip">Nulled by IPBMafia.ru</div>
</body>
</html>
+1 -22
View File
@@ -1,27 +1,6 @@
<ips:template parameters="$requirements, $incorrectFiles" />
<ips:template parameters="$requirements" />
{{$canProceed = TRUE;}}
<section class='ipsInstaller__padding'>
{{if $incorrectFiles !== NULL}}
{{if $incorrectFiles}}
{{$canProceed = FALSE;}}
<h2 class="ipsType_pageTitle i-margin-bottom_1">{lang="hc_files"}</h2>
<p>{lang="hc_files_fail"}</p>
<div class="i-margin-top_3 i-margin-bottom_3">
<a class="ipsButton ipsButton--primary" href='{url="client_area" ips="true"}' target="_blank" rel="noopener">{lang="hc_files_fail2"}</a>
</div>
<p>{lang="hc_files_fail3"}</p>
<ul class="i-margin-top_3 ipsList_checks">
{{foreach $incorrectFiles as $file}}
<li class="fail">{$file}</li>
{{endforeach}}
</ul>
{{else}}
<h2 class="ipsType_pageTitle i-margin-bottom_1">{lang="hc_files"}</h2>
<ul class="ipsList_checks">
<li class="success">{lang="hc_files_ok"}</li>
</ul>
{{endif}}
{{endif}}
{{foreach $requirements['requirements'] as $k => $_requirements}}
<h2 class="ipsType_pageTitle i-margin-bottom_1">{lang="hc_requirements" sprintf="$k"}</h2>
<ul class="ipsList_checks">
@@ -1,8 +0,0 @@
<ips:template parameters="$table" />
<div class="i-padding_2">
<div class="ipsMessage ipsMessage--info">{lang="advise_removal_of_php8_incompatible_code"}</div>
<div>
{$table|raw}
</div>
</div>
+1 -6
View File
@@ -544,7 +544,7 @@ $lang = array(
/* ! Core 101079 Diagnostic reporting option */
'101079_diagnostics_reporting' => "Send diagnostics data to IPS?",
'101079_diagnostics_reporting_desc' => "";,
'101079_diagnostics_reporting_desc' => "This distribution is nulled and this setting does not work. Help Invision Community improve by automatically sending diagnostic information. The data sent does not contain any private information about your users or your community.",
'104000_es_version' => "Elasticsearch version in use is no longer supported",
'104000_paypal_warning' => "PayPal Functionality",
@@ -684,7 +684,6 @@ $lang = array(
'200000_node_tags_delete' => "Delete",
/* PHP 8 Compatibility Issues */
'method_check_fail' => 'PHP8 Incompatible Customizations',
'method_check_fix' => 'Outdated Overloaded 3rd Party Methods',
'methodscanner_no_issues' => 'No PHP8 Issues found',
'invalid_php8_customization' => 'Contains outdated code. Please contact the Author for an updated version.',
@@ -715,9 +714,5 @@ $lang = array(
'method_parameter' => 'Bad Parameter',
'method_na' => 'N/A',
'method_priority' => 'Priority',
'acp_notification_ManualInterventionMessage' => 'PHP8 Incompatible Customizations',
'advise_removal_of_php8_incompatible_code' => <<<TEXT
<div style="text-align: left">We are currently in the process of migrating our platform from PHP7 to PHP8 in order to provide you with the greatest level of performance and security. We've identified and disabled one or more Applications currently installed on your site which contain PHP8 incompatible code. Refer to the AdminCP &gt; Support &gt; Get Support page for more information.<br><br>You can re-enable these Applications via the AdminCP &gt; Applications page. Please make a note of the following Applications so you are clear which have been automatically disabled via the upgrader.</div>
TEXT,
'107783_pbr_captcha' => "Post Before Register Changes"
);
+1 -1
View File
@@ -93,7 +93,7 @@ class Application extends SystemApplication
$title = $member->language()->get( "blogs_blog_{$blog->id}" );
$document = Rss::newDocument( $blog->url(), $title, $blog->description );
$document = Rss::newDocument( $blog->url(), $title, $blog->description ?? '' );
foreach (Entry::getItemsWithPermission( array( array( 'entry_blog_id=?', $blog->id ), array( 'entry_status!=?', 'draft' ) ), 'entry_date DESC', 25, 'read', Filter::FILTER_PUBLIC_ONLY, 0, $member, FALSE, FALSE, FALSE, FALSE, NULL, $blog ) as $entry )
{
+1 -1
View File
@@ -1,6 +1,6 @@
{
"application_title": "Blogs",
"app_author": "",
"app_author": "Invision Power Services, Inc.",
"app_directory": "blog",
"app_protected": 0,
"app_website": null,
+3
View File
@@ -1,5 +1,8 @@
{
"core": {
"Club": {
"Blog": "IPS\\blog\\extensions\\core\\Club\\Blog"
},
"ContentRouter": {
"Blog": "IPS\\blog\\extensions\\core\\ContentRouter\\Blog"
},
+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="5000074" 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="5001302" 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="5000074" 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="5001302" 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>\
");
+2 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="blog" version="5000074">
<app key="blog" version="5001302">
<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>
@@ -11,6 +11,7 @@
<word key="__defart_blog_entry_plural" js="0">{!#[1:blog entry][?:blog entries]}</word>
<word key="blog_entry_container" js="0">blog</word>
<word key="blog_entry_pl_lc" js="0">blog entries</word>
<word key="blog_categories_sg" js="0">Blog Category</word>
<word key="module__blog_blogs" js="0">Blogs</word>
<word key="menu__blog_blogs" js="0">Blogs</word>
<word key="menu__blog_blogs_settings" js="0">Settings</word>
+176 -140
View File
@@ -22,7 +22,7 @@
{{endif}}
]]></template>
<template template_group="browse" template_name="featuredEntries" template_data="$featured" template_location="front" template_app="blog"><![CDATA[
<section class='ipsBox ipsPull'>
<section class='ipsBox ipsBox--featuredBlogEntries ipsPull'>
<header class='ipsBox__header'>
<h2>{lang="featured_entries"}</h2>
{template="carouselNavigation" group="global" app="core" params="'blogs-featured-entries'"}
@@ -33,7 +33,7 @@
{{foreach $featured as $entry}}
<article class='ipsData__item {$entry->ui( 'css' )} {{if $entry->hidden() OR $entry->status === 'draft'}}ipsModerated{{endif}}' {{if $entry->unread()}}data-ips-unread{{else}}data-ips-read{{endif}} {$entry->ui( 'dataAttributes' )}>
<a href='{$entry->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{lang="read_more_about" sprintf="$entry->name"}</span></a>
<a href="{$entry->url()}" title='{lang="read_more_about" sprintf="$entry->name"}' class='ipsData__image'>
<a href="{$entry->url()}" title='{lang="read_more_about" sprintf="$entry->name"}' class='ipsData__image' aria-hidden="true" tabindex="-1">
{{if $entry->cover_photo}}
<img src='{file="$entry->cover_photo" extension="blog_Entries"}' alt='' loading='lazy'>
{{else}}
@@ -123,7 +123,7 @@
{template="indexButtons" group="browse" params="$blogs, $viewMode, TRUE, $category"}
</div>
{{endif}}
<div class='ipsBox ipsPull'>
<div class='ipsBox ipsBox--blogIndex ipsPull'>
{$table|raw}
</div>]]></template>
<template template_group="browse" template_name="indexButtons" template_data="$blogs=array(), $viewMode=NULL, $forMobile=FALSE, $category=NULL" template_location="front" template_app="blog"><![CDATA[{{if \count( $blogs ) || \IPS\blog\Blog::canCreate()}}
@@ -131,14 +131,16 @@
{{if \count( $blogs )}}
{{if \count( $blogs ) > 1}}
<li>
<a href='{url="app=blog&module=blogs&controller=browse&page=1&filter=my_blogs&sortby=blog_last_edate" seoTemplate="blogs"}' data-ipsMenu id='elMyBlogs' class='ipsButton ipsButton--text'><span>{lang="my_blogs"}</span><i class='fa-solid fa-caret-down'></i></a>
<ul class='ipsMenu ipsMenu_normal ipsHide' id='elMyBlogs_menu'>
{{foreach $blogs as $blog}}
<li class='ipsMenu_item'>
<a href='{$blog->url()}'>{$blog->_title}</a>
</li>
{{endforeach}}
</ul>
<button type="button" id="elMyBlogs" popovertarget="elMyBlogs_menu" class='ipsButton ipsButton--text'><span>{lang="my_blogs"}</span><i class='fa-solid fa-caret-down'></i></button>
<i-dropdown popover id="elMyBlogs_menu">
<div class="iDropdown">
<ul class="iDropdown__items">
{{foreach $blogs as $blog}}
<li><a href='{$blog->url()}'>{$blog->_title}</a></li>
{{endforeach}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
{{if \IPS\blog\Blog::canCreate()}}
@@ -154,17 +156,20 @@
{{if \count( $blogs ) AND \IPS\blog\Blog::canOnAny( 'add' )}}
<li>
{{if \count( $blogs ) > 1}}
<a class="ipsButton ipsButton--primary" href="#elCreateEntry_menu" data-ipsMenu id='elCreateEntry'><span>{lang="add_entry"}</span><i class='fa-solid fa-caret-down'></i></a>
<ul class='ipsMenu ipsMenu_normal ipsHide' id='elCreateEntry_menu'>
<li class='ipsMenu_title'>{lang="add_entry_to"}</li>
{{foreach $blogs as $blog}}
{{if $blog->disabled != 1}}
<li class='ipsMenu_item'>
<a href='{url="app=blog&module=blogs&controller=submit&id={$blog->id}" seoTemplate="blog_submit"}'>{$blog->_title}</a>
</li>
{{endif}}
{{endforeach}}
</ul>
<button type="button" id="elCreateEntry" class='ipsButton ipsButton--primary' popovertarget="elCreateEntry_menu"><span>{lang="add_entry"}</span><i class='fa-solid fa-caret-down'></i></button>
<i-dropdown id="elCreateEntry_menu" popover>
<div class="iDropdown">
<ul class="iDropdown__items">
{{foreach $blogs as $blog}}
{{if $blog->disabled != 1}}
<li>
<a href='{url="app=blog&module=blogs&controller=submit&id={$blog->id}" seoTemplate="blog_submit"}'>{$blog->_title}</a>
</li>
{{endif}}
{{endforeach}}
</ul>
</div>
</i-dropdown>
{{else}}
{{foreach $blogs as $blog}}
{{if $blog->disabled != 1}}
@@ -204,7 +209,7 @@
{template="indexButtons" group="browse" params="$blogs, $viewMode, TRUE, $category"}
</div>
{{endif}}
<section class='ipsBox ipsPull'>
<section class='ipsBox ipsBox--blogIndexGrid ipsPull'>
{{if \count($entries)}}
<i-data>
<div class="ipsData ipsData--grid ipsData--blog-entries">
@@ -216,13 +221,17 @@
{{else}}
<p class="ipsEmptyMessage">{lang="no_entries_yet"}</p>
{{endif}}
</section>
{{if $pagination['pages'] > 1}}
{template="pagination" app="core" location="global" group="global" params="$pagination['url'], $pagination['pages'], $pagination['page'], $pagination['perpage'], TRUE, 'page'"}
{{endif}}]]></template>
{{if $pagination['pages'] > 1}}
<div class="ipsButtonBar ipsButtonBar--bottom">
<div class="ipsButtonBar__pagination" data-role="tablePagination">
{template="pagination" app="core" location="global" group="global" params="$pagination['url'], $pagination['pages'], $pagination['page'], $pagination['perpage'], TRUE, 'page'"}
</div>
</div>
{{endif}}
</section>]]></template>
<template template_group="browse" template_name="indexGridEntry" template_data="$entry, $primary=false, $table=false" template_location="front" template_app="blog"><![CDATA[<article class='ipsData__item {$entry->ui( 'css' )} {{if $entry->hidden() OR $entry->status === 'draft'}}ipsModerated{{endif}}' {{if $entry->unread()}}data-ips-unread{{else}}data-ips-read{{endif}} {$entry->ui( 'dataAttributes' )}>
<a href='{$entry->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{lang="read_more_about" sprintf="$entry->name"}</span></a>
<a href="{$entry->url()}" title='{lang="read_more_about" sprintf="$entry->name"}' class='ipsData__image'>
<a href="{$entry->url()}" title='{lang="read_more_about" sprintf="$entry->name"}' class='ipsData__image' aria-hidden="true" tabindex="-1" data-ips-hook='image'>
{{if $entry->cover_photo}}
<img src='{file="$entry->cover_photo" extension="blog_Entries"}' alt='' loading='lazy'>
{{else}}
@@ -230,17 +239,17 @@
{{endif}}
</a>
<div class='ipsData__content'>
<div class='ipsData__main'>
<div class='ipsData__main' data-ips-hook='main'>
{{if !\IPS\Request::i()->id}}
<div class='i-color_soft i-link-color_inherit i-font-weight_600'><a href="{$entry->container()->url()}">{$entry->container()->_title}</a></div>
{{elseif $entry->category_id}}
<div class="i-color_soft i-link-color_inherit i-font-weight_600"><a href="{$entry->category()->url()}">{$entry->category()->name}</a></div>
{{endif}}
<div class='ipsData__title'>
<div class='ipsData__title' data-ips-hook='title'>
{{if $entry->prefix()}}
{template="prefix" group="global" app="core" params="$entry->prefix( TRUE ), $entry->prefix()"}
{{endif}}
<div class='ipsBadges'>
<div class='ipsBadges' data-ips-hook='badges'>
{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}
</div>
{{if $entry->unread()}}
@@ -253,7 +262,7 @@
<section class='ipsData__desc'>{$entry->truncated(TRUE)|raw}</section>
</div>
<div class="ipsData__extra">
<ul class='ipsData__stats'>
<ul class='ipsData__stats' data-ips-hook='stats'>
{{foreach $entry->stats(TRUE) as $k => $v}}
<li data-stat-type="{$k}">
{{if $k === "comments"}}
@@ -266,7 +275,7 @@
</ul>
<div class='ipsData__last'>
{template="userPhoto" app="core" params="$entry->author(), 'fluid'" group="global"}
<ul class='ipsData__last-text'>
<ul class='ipsData__last-text' data-ips-hook='metadata'>
<li class='ipsData__last-primary'>
{{if $entry->category_id}}
{lang="entry_name_with_cat" htmlsprintf="$entry->author()->link(),$entry->category()->link()"}
@@ -291,7 +300,7 @@
<li class='ipsData__blog-item ipsColumns ipsColumns--lines'>
<div class='ipsColumns__secondary i-basis_380 i-background_2 i-text-align_center cBlogInfo {$blog->ui( 'css' )}' {$blog->ui( 'dataAttributes' )}>
<a href='{$blog->url()}' class='ipsCoverPhoto ipsCoverPhoto--blog-listing' data-url="{$blog->url()->csrf()}" style='--offset:{$coverPhoto->offset}' aria-hidden="true" tabindex="-1">
<a href='{$blog->url()}' class='ipsCoverPhoto ipsCoverPhoto--blog-listing' data-url="{$blog->url()->csrf()}" style='--offset:{$coverPhoto->offset}' aria-hidden="true" tabindex="-1" data-ips-hook='image'>
{{if $coverPhoto->file}}
<div class='ipsCoverPhoto__container'>
<img src='{$coverPhoto->file->url}' class='ipsCoverPhoto__image' alt='' loading='lazy'>
@@ -305,11 +314,11 @@
<div class='i-padding_3'>
<h3 class='ipsTitle ipsTitle--h3'>
<h3 class='ipsTitle ipsTitle--h3' data-ips-hook='title'>
<a href='{$blog->url()}' title='{lang="go_to_blog" sprintf="$blog->_title"}'>{$blog->_title}</a>
</h3>
<div class='i-font-weight_500 i-color_soft i-margin-top_1'>
<div class='i-font-weight_500 i-color_soft i-margin-top_1' data-ips-hook='metadata'>
{{if $blog->owner() instanceof \IPS\Member}}
{lang="blog_by" htmlsprintf="$blog->owner()->link(), $blog->category()->link()"}
{{elseif $club = $blog->club()}}
@@ -319,7 +328,7 @@
{{endif}}
</div>
<ul class='ipsList ipsList--stacked ipsList--fill i-margin-top_3'>
<ul class='ipsList ipsList--stacked ipsList--fill i-margin-top_3' data-ips-hook='stats'>
<li><span class="ipsList__value">{$blog->_items}</span> <span class="ipsList__label">{lang="blog_entries" pluralize="$blog->_items"}</span></li>
<li><span class="ipsList__value">{$blog->_comments}</span> <span class="ipsList__label">{lang="blog_comments" pluralize="$blog->_comments"}</span></li>
<li><span class="ipsList__value">{$blog->num_views}</span> <span class="ipsList__label">{lang="blog_views" pluralize="$blog->num_views"}</span></li>
@@ -336,10 +345,10 @@
<div class='i-flex'>
<div class='i-flex_11'>
<div class='ipsTitle ipsTitle--h4'>
<div class='ipsTitle ipsTitle--h4' data-ips-hook='lastEntryTitle'>
{$blog->latestEntry()->caption}
<div class='ipsBadges'>
<div class='ipsBadges' data-ips-hook='lastEntryBadges'>
{{foreach $blog->latestEntry()->badges() as $badge}}{$badge|raw}{{endforeach}}
</div>
@@ -352,7 +361,7 @@
</a>
</h3>
</div>
<div class='ipsPhotoPanel ipsPhotoPanel--small i-margin-top_1 i-margin-bottom_2'>
<div class='ipsPhotoPanel ipsPhotoPanel--small i-margin-top_1 i-margin-bottom_2' data-ips-hook='lastEntryMetaData'>
{template="userPhoto" app="core" params="$blog->latestEntry()->author(), ''" group="global"}
<div class='ipsPhotoPanel__text'>
<p class='i-color_soft i-link-color_inherit'>{lang="latest_entry_by" htmlsprintf="trim( $blog->latestEntry()->author()->link() )"} {datetime="$blog->latestEntry()->date"}</p>
@@ -375,9 +384,9 @@
{{$recentEntries = iterator_to_array( $blog->_recentEntries );}}
{{if \count( $recentEntries ) > 1}}
<h4 class='ipsTitle ipsTitle--h5 ipsTitle--margin i-margin-top_4'>{lang="recent_entries"}</h4>
<ul class='ipsBlogs__blog-listing-entries'>
<ul class='ipsBlogs__blog-listing-entries' data-ips-hook='recentEntries'>
{{foreach $recentEntries as $entry}}
<li>
<li class="{$entry->ui('css')}" {$entry->ui('dataAttributes')}>
{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'>
@@ -389,7 +398,7 @@
</a>
</h4>
{{if !( $blog->owner() instanceof \IPS\Member )}}
<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>
<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>
@@ -418,7 +427,7 @@
</ul>
</i-data>]]></template>
<template template_group="global" template_name="blogCategoryLink" template_data="$category" template_location="front" template_app="blog"><![CDATA[<a href="{$category->url()}">{$category->_title}</a>]]></template>
<template template_group="global" template_name="categoryLink" template_data="$category" template_location="front" template_app="blog"><![CDATA[<a href="{$category->url()}" class="i-font-weight_600">{$category->name}</a>]]></template>
<template template_group="global" template_name="categoryLink" template_data="$category" template_location="front" template_app="blog"><![CDATA[<a href="{$category->url()}">{$category->name}</a>]]></template>
<template template_group="global" template_name="commentTableHeader" template_data="$comment, $entry" template_location="front" template_app="blog"><![CDATA[<!-- This template is used when viewing Profile > See my activity > Blog Entries -->
<div class='i-flex i-gap_2'>
<div class='i-flex_00 i-basis_40'>
@@ -721,7 +730,7 @@
</section>]]></template>
<template template_group="view" template_name="blogHeader" template_data="$blog, $showCover=true" template_location="front" template_app="blog"><![CDATA[
{{if $showCover}}
<div id='elBlogHeader' class='ipsPageHeader ipsBox ipsPull'>
<div id='elBlogHeader' class='ipsPageHeader ipsBox ipsBox--blogHeader ipsPull'>
{$blog->coverPhoto()|raw}
{{if !( $blog->owner() instanceof \IPS\Member ) and \count( $blog->contributors() ) AND $showCover}}
@@ -741,7 +750,7 @@
</div>
{{else}}
<div id='elBlogHeaderStats' class='ipsBox ipsPull ipsCoverPhotoMeta'>
<div id='elBlogHeaderStats' class='ipsBox ipsBox--blogHeader ipsPull ipsCoverPhotoMeta' data-ips-hook='header'>
{{if ( $blog->owner() instanceof \IPS\Member ) && \IPS\Request::i()->module == 'view'}}
<div class='ipsCoverPhoto__avatar'>
@@ -751,14 +760,14 @@
<div class='ipsCoverPhoto__titles'>
<div class='ipsCoverPhoto__title'>
<h1>
<h1 data-ips-hook='title'>
<a href='{$blog->url()}' title='{lang="go_to_blog" sprintf="$blog->_title"}'>{$blog->_title}</a>
</h1>
{{if $blog->pinned}}
<span class="ipsBadge ipsBadge--icon ipsBadge--positive" data-ipsTooltip title='{lang="pinned"}'><i class='fa-solid fa-thumbtack'></i></span>
{{endif}}
</div>
<div class='ipsCoverPhoto__subTitle'>
<div class='ipsCoverPhoto__subTitle' data-ips-hook='headerMetaData'>
{{if $blog->owner() instanceof \IPS\Member}}
{lang="blog_by" htmlsprintf="$blog->owner()->link(), $blog->category()->link()"}
{{elseif $club = $blog->club()}}
@@ -768,7 +777,7 @@
{{endif}}
</div>
</div>
<ul class='ipsCoverPhoto__stats'>
<ul class='ipsCoverPhoto__stats' data-ips-hook='headerStats'>
<li>
<h4 class='ipsCoverPhoto__statTitle'>{lang="blog_entries" pluralize="$blog->_items"}</h4>
<span class='ipsCoverPhoto__statValue'>{number="$blog->_items"}</span>
@@ -802,7 +811,7 @@
</div>
</div>
</div>]]></template>
<template template_group="view" template_name="blogTable" template_data="$table, $headers, $rows, $quickSearch" template_location="front" template_app="blog"><![CDATA[<section class='ipsBox ipsPull' data-baseurl='{$table->baseUrl}' data-resort='{$table->resortKey}' data-controller='core.global.core.table{{if $table->canModerate()}},core.front.core.moderation{{endif}}' id='elTable_{$table->uniqueId}'>
<template template_group="view" template_name="blogTable" template_data="$table, $headers, $rows, $quickSearch" template_location="front" template_app="blog"><![CDATA[<section class='ipsBox ipsBox--blogTable ipsPull' data-baseurl='{$table->baseUrl}' data-resort='{$table->resortKey}' data-controller='core.global.core.table{{if $table->canModerate()}},core.front.core.moderation{{endif}}' id='elTable_{$table->uniqueId}'>
{{if $table->title}}
<h2 class='ipsInvisible'>{lang="$table->title"}</h2>
{{endif}}
@@ -819,18 +828,22 @@
{{if ( isset( $table->sortOptions ) and !empty( $table->sortOptions ) ) OR $table->advancedSearch}}
<li>
{{if isset($table->sortOptions) }}
<a href="#elSortByMenu_menu" class='ipsDataFilters__button' id="elSortByMenu_{$table->uniqueId}" rel="nofollow" data-role="sortButton" data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active" data-ipsMenu-selectable="radio"><span>{lang="sort_by"}</span><i class="fa-solid fa-caret-down"></i></a>
<ul class="ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide" id="elSortByMenu_{$table->uniqueId}_menu">
{{$custom = TRUE;}}
{{foreach $table->sortOptions as $k => $col}}
<li class="ipsMenu_item {{if $col === $table->sortBy}}{{$custom = FALSE;}}ipsMenu_itemChecked{{endif}}" data-ipsMenuValue="{$col}" data-sortDirection='{$table->getSortDirection( $col )}'><a href="{$table->baseUrl->setQueryString( array( 'filter' => $table->filter, 'sortby' => $col, 'sortdirection' => $table->getSortDirection( $col ) ) )->setPage('page',1)}" rel="nofollow">{lang="{$table->langPrefix}sort_{$k}"}</a></li>
{{endforeach}}
{{if $table->advancedSearch}}
<li class="ipsMenu_item {{if $custom}}ipsMenu_itemChecked{{endif}}" data-noSelect="true">
<a href='{$table->baseUrl->setQueryString( array( 'advancedSearchForm' => '1', 'filter' => $table->filter, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )}' data-ipsDialog data-ipsDialog-title='{lang="custom_sort"}' rel="nofollow">{lang="custom"}</a>
</li>
{{endif}}
</ul>
<button type="button" id="elSortByMenu_{$table->uniqueId}" class='ipsDataFilters__button' popovertarget="elSortByMenu_{$table->uniqueId}_menu" data-role="sortButton"><span>{lang="sort_by"}</span><i class="fa-solid fa-caret-down"></i></button>
<i-dropdown id="elSortByMenu_{$table->uniqueId}_menu" popover data-i-dropdown-selectable="radio">
<div class="iDropdown">
<ul class="iDropdown__items">
{{$custom = TRUE;}}
{{foreach $table->sortOptions as $k => $col}}
<li><a href="{$table->baseUrl->setQueryString( array( 'filter' => $table->filter, 'sortby' => $col, 'sortdirection' => $table->getSortDirection( $col ) ) )->setPage('page',1)}" rel="nofollow" {{if $col === $table->sortBy}}{{$custom = FALSE;}}aria-selected="true"{{endif}} data-ipsMenuValue="{$col}" data-sortDirection='{$table->getSortDirection( $col )}'><i class="iDropdown__input"></i>{lang="{$table->langPrefix}sort_{$k}"}</a></li>
{{endforeach}}
{{if $table->advancedSearch}}
<li>
<a href='{$table->baseUrl->setQueryString( array( 'advancedSearchForm' => '1', 'filter' => $table->filter, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )}' data-ipsDialog data-ipsDialog-title='{lang="custom_sort"}' rel="nofollow" {{if $custom}}aria-selected="true"{{endif}} data-i-dropdown-noselect><i class="iDropdown__input"></i>{lang="custom"}</a>
</li>
{{endif}}
</ul>
</div>
</i-dropdown>
{{elseif $table->advancedSearch}}
<a href='{$table->baseUrl->setQueryString( array( 'advancedSearchForm' => '1', 'filter' => $table->filter, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )}' data-ipsDialog data-ipsDialog-title='{lang="custom_sort"}' rel="nofollow">{lang="custom"}</a>
{{endif}}
@@ -838,36 +851,45 @@
{{endif}}
{{if !empty( $table->filters )}}
<li>
<a href="#elFilterByMenu_menu" class='ipsDataFilters__button' data-role="tableFilterMenu" id="elFilterByMenu_{$table->uniqueId}" data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active" data-ipsMenu-selectable="radio"><span>{lang="filter_by"}</span><i class="fa-solid fa-caret-down"></i></a>
<ul class='ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide' id='elFilterByMenu_{$table->uniqueId}_menu'>
<li data-action="tableFilter" data-ipsMenuValue='{$k}' class='ipsMenu_item {{if !$table->filter}}ipsMenu_itemChecked{{endif}}'>
<a href='{$table->baseUrl->setQueryString( array( 'filter' => '', 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )->setPage('page',1)}' rel="nofollow">{lang="{$table->langPrefix}all"}</a>
</li>
{{foreach $table->filters as $k => $q}}
<li data-action="tableFilter" data-ipsMenuValue='{$k}' class='ipsMenu_item {{if $k === $table->filter}}ipsMenu_itemChecked{{endif}}'>
<a href='{$table->baseUrl->setQueryString( array( 'filter' => $k, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirections ) )->setPage('page',1)}' rel="nofollow">{lang="{$table->langPrefix}{$k}"}</a>
</li>
{{endforeach}}
</ul>
<button type="button" id="elFilterByMenu_{$table->uniqueId}" class='ipsDataFilters__button' popovertarget="elFilterByMenu_{$table->uniqueId}_menu" data-role="tableFilterMenu"><span>{lang="filter_by"}</span><i class="fa-solid fa-caret-down"></i></button>
<i-dropdown id="elFilterByMenu_{$table->uniqueId}_menu" popover data-i-dropdown-selectable="radio">
<div class="iDropdown">
<ul class="iDropdown__items">
<li>
<a href='{$table->baseUrl->setQueryString( array( 'filter' => '', 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )->setPage('page',1)}' rel="nofollow" data-action="tableFilter" data-ipsMenuValue='{$k}' {{if !$table->filter}}aria-selected="true"{{endif}}><i class="iDropdown__input"></i>{lang="{$table->langPrefix}all"}</a>
</li>
<li><hr></li>
{{foreach $table->filters as $k => $q}}
<li>
<a href='{$table->baseUrl->setQueryString( array( 'filter' => $k, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirections ) )->setPage('page',1)}' rel="nofollow" data-action="tableFilter" data-ipsMenuValue='{$k}' {{if $k === $table->filter}}aria-selected="true"{{endif}}><i class="iDropdown__input"></i>{lang="{$table->langPrefix}{$k}"}</a>
</li>
{{endforeach}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
{{if $table->canModerate()}}
<li>
<a class="ipsJS_show ipsDataFilters__button" href="#elCheck_menu" id="elCheck_{$table->uniqueId}" title='{lang="{$table->langPrefix}select_rows_tooltip"}' data-ipsTooltip data-ipsAutoCheck data-ipsAutoCheck-context="#elTable_{$table->uniqueId}" data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active">
<button type="button" id="elCheck_{$table->uniqueId}" class='ipsDataFilters__button' popovertarget="elCheck_{$table->uniqueId}_menu" title='{lang="{$table->langPrefix}select_rows_tooltip"}' data-ipsTooltip data-ipsAutoCheck data-ipsAutoCheck-context="#elTable_{$table->uniqueId}">
<span class="cAutoCheckIcon"><i class="fa-regular fa-square"></i></span> <i class="fa-solid fa-caret-down"></i>
<span class='ipsNotification' data-role='autoCheckCount'>0</span>
</a>
<ul class="ipsMenu ipsMenu_auto ipsMenu_withStem ipsHide" id="elCheck_{$table->uniqueId}_menu">
<li class="ipsMenu_title">{lang="{$table->langPrefix}select_rows"}</li>
<li class="ipsMenu_item" data-ipsMenuValue="all"><a href="#">{lang="all"}</a></li>
<li class="ipsMenu_item" data-ipsMenuValue="none"><a href="#">{lang="none"}</a></li>
{{if \count($table->getFilters())}}
<li class="ipsMenu_sep"><hr></li>
{{foreach $table->getFilters() as $filter}}
<li class="ipsMenu_item" data-ipsMenuValue="{$filter}"><a href="#">{lang="$filter"}</a></li>
{{endforeach}}
{{endif}}
</ul>
</button>
<i-dropdown id="elCheck_{$table->uniqueId}_menu" popover data-i-dropdown-selectable="radio">
<div class="iDropdown">
<ul class="iDropdown__items">
<li class="iDropdown__title">{lang="{$table->langPrefix}select_rows"}</li>
<li><button type="button" data-ipsMenuValue="all"><i class="iDropdown__input"></i>{lang="all"}</button></li>
<li><button type="button" data-ipsMenuValue="none"><i class="iDropdown__input"></i>{lang="none"}</button></li>
{{if \count($table->getFilters())}}
<li><hr></li>
{{foreach $table->getFilters() as $filter}}
<li><button type="button" data-ipsMenuValue="{$filter}"><i class="iDropdown__input"></i>{lang="$filter"}</button></li>
{{endforeach}}
{{endif}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
</ul>
@@ -969,11 +991,11 @@
</section>]]></template>
<template template_group="view" template_name="blogViewLarge" template_data="$entry, $table, $first = FALSE" template_location="front" template_app="blog"><![CDATA[
<article class='cBlogView_entry i-border-bottom_3 {{if $entry->hidden()}}ipsModerated{{endif}} {$entry->ui( 'css' )}' data-controller="core.front.core.lightboxedImages" {$entry->ui( 'dataAttributes' )}>
<header class='i-background_2 i-border-bottom_3 i-padding_2'>
<header class='i-background_2 i-border-bottom_3 i-padding_2' data-ips-hook='header'>
<div class="ipsPhotoPanel">
{template="userPhoto" app="core" params="$entry->author()" group="global"}
<div>
<h2 class='ipsTitle ipsTitle--h4'>
<h2 class='ipsTitle ipsTitle--h4' data-ips-hook='title'>
{$entry->caption}
{{if $entry->prefix()}}
{template="prefix" group="global" app="core" params="$entry->prefix( TRUE ), $entry->prefix()"}
@@ -984,9 +1006,9 @@
{{endif}}
{{if $entry->canEdit()}}<span data-role="editableTitle">{$entry->name}</span>{{else}}{$entry->name}{{endif}}
</a>
<div class="ipsBadges">{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}</div>
<div class="ipsBadges" data-ips-hook='badges'>{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}</div>
</h2>
<ul class='ipsList ipsList--sep i-color_soft i-link-color_inherit'>
<ul class='ipsList ipsList--sep i-color_soft i-link-color_inherit' data-ips-hook='metadata'>
<li>{lang="byline" htmlsprintf="$entry->author()->link()"}</li>
<li>{datetime="$entry->date"}</li>
{{if $entry->category_id}}
@@ -1009,7 +1031,7 @@
<div>
<strong><a href='{$entry->url( "getPrefComment" )}' title="{lang="read_more_about" sprintf="$entry->name"}">{lang="read_more"}</a></strong>
</div>
<ul class='i-margin-start_auto ipsList ipsList--inline i-gap_3 i-row-gap_1'>
<ul class='i-margin-start_auto ipsList ipsList--inline i-gap_3 i-row-gap_1' data-ips-hook='stats'>
<li class="i-margin-end_auto"></li>
{{if \IPS\Settings::i()->blog_enable_rating}}
<li>{template="rating" app="core" params="'small', $entry->averageRating(), 5, $entry->memberRating()" group="global"}</li>
@@ -1029,11 +1051,11 @@
<template template_group="view" template_name="blogViewMedium" template_data="$entry, $table" template_location="front" template_app="blog"><![CDATA[
<!-- This template is used when viewing Profile > See my activity > Blog Entries -->
<article class='cBlogView_entry {{if $entry->hidden()}}ipsModerated{{endif}} {$entry->ui( 'css' )}' data-controller="core.front.core.lightboxedImages" {$entry->ui( 'dataAttributes' )}>
<header class='ipsPhotoPanel ipsPhotoPanel--mini'>
<header class='ipsPhotoPanel ipsPhotoPanel--mini' data-ips-hook='header'>
{template="userPhoto" app="core" params="$entry->author(), 'mini'" group="global"}
<div>
<h2 class='ipsTitle ipsTitle--h5'>
<div class="ipsBadges">
<h2 class='ipsTitle ipsTitle--h5' data-ips-hook='title'>
<div class="ipsBadges" data-ips-hook='badges'>
{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}
{{if $entry->prefix()}}
{template="prefix" group="global" app="core" params="$entry->prefix( TRUE ), $entry->prefix()"}
@@ -1046,7 +1068,7 @@
{$entry->name}
</a>
</h2>
<p class='i-color_soft i-link-color_inherit'>
<p class='i-color_soft i-link-color_inherit' data-ips-hook='metadata'>
{{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(), \IPS\DateTime::ts( $entry->date )"}
</p>
</div>
@@ -1057,7 +1079,7 @@
</section>
<div class="i-flex i-align-items_center i-flex-wrap_wrap i-gap_2">
<ul class='ipsList ipsList--inline i-flex_11'>
<ul class='ipsList ipsList--inline i-flex_11' data-ips-hook='stats'>
{{if $table->canModerate()}}
<li>
{{$idField = $entry::$databaseColumnId;}}
@@ -1166,7 +1188,7 @@
{{endif}}
<div class='ipsCoverPhoto__titles'>
<div class='ipsCoverPhoto__title'>
<div class='ipsCoverPhoto__title' data-ips-hook='title'>
<h1>
<a href='{$blog->url()}' title='{lang="go_to_blog" sprintf="$blog->_title"}'>{$blog->_title}</a>
</h1>
@@ -1174,7 +1196,7 @@
<span class="ipsBadge ipsBadge--icon ipsBadge--positive" data-ipsTooltip title='{lang="pinned"}'><i class='fa-solid fa-thumbtack'></i></span>
{{endif}}
</div>
<div class='ipsCoverPhoto__subTitle'>
<div class='ipsCoverPhoto__subTitle' data-ips-hook='metadata'>
{{if $blog->owner() instanceof \IPS\Member}}
{lang="blog_by" htmlsprintf="$blog->owner()->link(), $blog->category()->link()"}
{{elseif $club = $blog->club()}}
@@ -1184,7 +1206,7 @@
{{endif}}
</div>
</div>
<ul class='ipsCoverPhoto__stats'>
<ul class='ipsCoverPhoto__stats' data-ips-hook='stats'>
<li>
<h4 class='ipsCoverPhoto__statTitle'>{lang="blog_entries" pluralize="$blog->_items"}</h4>
<span class='ipsCoverPhoto__statValue'>{number="$blog->_items"}</span>
@@ -1198,7 +1220,7 @@
<span class='ipsCoverPhoto__statValue'>{number="$blog->num_views"}</span>
</li>
</ul>
<div class='ipsCoverPhoto__buttons'>
<div class='ipsCoverPhoto__buttons' data-ips-hook='buttons'>
{template="follow" app="core" group="global" params="'blog', 'blog', $blog->_id, \IPS\blog\Entry::containerFollowerCount( $blog )"}
</div>
</div>]]></template>
@@ -1218,26 +1240,26 @@
{template="contentItemMessages" group="global" app="core" params="$entry->getMessages(), $entry"}
<article class='ipsBox ipsPull' data-ips-hook="entry__blog">
<article class='ipsBox ipsBox--blogEntry ipsPull' data-ips-hook="entry__blog">
<header class='ipsPageHeader'>
{{if $entry->coverPhoto()}}
{$entry->coverPhoto()|raw}
{{endif}}
<div class='ipsPageHeader__row'>
<div class='ipsPageHeader__primary'>
<div class='ipsPageHeader__primary' data-ips-hook='header'>
<div class='ipsPageHeader__title' data-ips-hook="contentTitle__blog">
<div class='ipsBadges'>
<div class='ipsBadges' data-ips-hook='badges'>
{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}
</div>
<h1>
{{if $entry->canEdit()}}
<span data-controller="core.front.core.moderation">
<span data-controller="core.front.core.moderation" data-ips-hook='titleEditable'>
{{if $entry->locked()}}<i class='fa-solid fa-lock'></i> {{endif}}<span data-role="editableTitle" title='{lang="click_hold_edit"}'>
{$entry->name}
</span>
</span>
{{else}}
<span>{{if $entry->locked()}}<i class='fa-solid fa-lock'></i> {{endif}}
<span data-ips-hook='title'>{{if $entry->locked()}}<i class='fa-solid fa-lock'></i> {{endif}}
{$entry->name}
</span>
{{endif}}
@@ -1250,7 +1272,7 @@
{template="tagsWithPrefix" group="global" app="core" params="$entry->tags(), $entry->prefix(), FALSE, FALSE, ( $entry->canEdit() AND ( \count( $entry->tags() ) OR $entry::canTag() ) ) ? $entry->url() : NULL"}
{{endif}}
</div>
<div class='ipsButtons'>
<div class='ipsButtons' data-ips-hook='headerButtons'>
{{if \count( $entry->shareLinks() )}}
{template="shareButton" app="core" group="sharelinks" params="$entry"}
{{endif}}
@@ -1264,7 +1286,7 @@
<div class='ipsPageHeader__primary'>
<div class="ipsPhotoPanel ipsPhotoPanel--inline">
{template="userPhoto" app="core" params="$entry->author(), 'fluid'" group="global"}
<div class='ipsPhotoPanel__text'>
<div class='ipsPhotoPanel__text' data-ips-hook='entryHeaderMetaData'>
<p class="ipsPhotoPanel__primary">
{{if $entry->category_id}}
{{if $entry->date > time()}}
@@ -1289,7 +1311,7 @@
<section class='i-padding_3'>
{{if $poll = $entry->getPoll()}}
<div class='ipsInnerBox ipsInnerBox--inherit i-margin-bottom_3'>
<div class='ipsInnerBox ipsInnerBox--inherit i-margin-bottom_3' data-ips-hook='entryPoll'>
{$poll|raw}
</div>
{{endif}}
@@ -1306,7 +1328,7 @@
{{endif}}
</section>
<div class='ipsEntry__footer'>
<menu class='ipsEntry__controls'>
<menu class='ipsEntry__controls' data-ips-hook='entryMainButtons'>
<li>{$entry->menu()|raw}</li>
</menu>
{{if \IPS\IPS::classUsesTrait( $entry, 'IPS\Content\Reactable' ) AND settings.reputation_enabled}}
@@ -1423,7 +1445,7 @@
{template="blogHeader" group="view" app="blog" params="$blog, (!$club OR !\IPS\Settings::i()->clubs OR \IPS\Settings::i()->clubs_header != 'full')"}
{{if $blog->description}}
<section class='ipsBox ipsBox--padding ipsPull'>
<section class='ipsBox ipsBox--blogDescription ipsBox--padding ipsPull'>
<h3 class='ipsTitle ipsTitle--h5 ipsTitle--margin'>{lang="about_this_blog"}</h3>
{template="richText" group="global" app="core" location="global" params="$blog->description, array('ipsTruncate_4')"}
</section>
@@ -1431,7 +1453,7 @@
{{$menu = $blog->menu();}}
{{if \IPS\blog\Entry::canCreate( \IPS\Member::loggedIn(), $blog ) or $menu->hasContent() or \count( \IPS\blog\Entry\Category::roots( NULL, NULL, array( 'entry_category_blog_id=?', $blog->id ) ) )}}
<ul class="ipsButtons ipsButtons--main">
<ul class="ipsButtons ipsButtons--main" data-ips-hook='blogMainButtons'>
{{if !$blog->club_id and $menu->hasContent()}}
<li>
{$menu|raw}
@@ -1439,17 +1461,21 @@
{{endif}}
{{if \count( \IPS\blog\Entry\Category::roots( NULL, NULL, array( 'entry_category_blog_id=?', $blog->id ) ) )}}
<li>
<a href='#elBlogCategory_menu' id='elBlogCategory' data-ipsMenu class='ipsButton ipsButton--text'>
<button id='elBlogCategory' popovertarget="elBlogCategory_menu" class="ipsButton ipsButton--text">
<span>{{if $category}}{lang="blog_category_viewing" sprintf="$category->name"}{{else}}{lang="blog_category_select"}{{endif}}</span><i class='ipsMenuCaret'></i>
</a>
<ul id='elBlogCategory_menu' class='ipsMenu ipsMenu_normal ipsMenu_selectable ipsHide'>
<li class="ipsMenu_title">
{lang="categories"}{{if $category}} (<a href="{$blog->url()}">{lang="blog_categories_all"}</a>){{endif}}
{{foreach \IPS\blog\Entry\Category::roots( NULL, NULL, array( 'entry_category_blog_id=?', $blog->id ) ) as $cat}}
<li class='ipsMenu_item {{if $category and $category->id == $cat->id}}ipsMenu_itemChecked{{endif}}'>{$cat->link()|raw}</li>
{{endforeach}}
</li>
</ul>
</button>
<i-dropdown id="elBlogCategory_menu" popover>
<div class="iDropdown">
<ul class="iDropdown__items">
<li class="iDropdown__title i-flex i-align-items_center i-justify-content_space-between">
{lang="categories"}{{if $category}} <span>(<a href="{$blog->url()}">{lang="blog_categories_all"}</a>)</span>{{endif}}
</li>
{{foreach \IPS\blog\Entry\Category::roots( NULL, NULL, array( 'entry_category_blog_id=?', $blog->id ) ) as $cat}}
<li>{$cat->link()|raw}</li>
{{endforeach}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
{{if \IPS\blog\Entry::canCreate( \IPS\Member::loggedIn(), $blog )}}
@@ -1497,7 +1523,7 @@
{{else}}
<ul class='ipsEntries ipsEntries--blog-comment-widget'>
{{foreach $comments as $comment}}
<li>
<li class='{$comment->ui('css')}' {$comment->ui('dataAttributes')}>
<article class='ipsEntry ipsEntry--simple'>
<div class='ipsEntry__content'>
<header class='ipsEntry__header'>
@@ -1525,7 +1551,7 @@
</div>
{{if $comment->canReportOrRevoke() === TRUE}}
{{$id = mt_rand();}}
<a href='#elBlogCommentFeed_{$id}_menu' class='ipsEntry__topButton ipsEntry__topButton--ellipsis' id='elBlogCommentFeed_{$id}' title='{lang="more_options"}' data-ipsMenu><i class='fa-solid fa-ellipsis' aria-hidden="true"></i><span class='ipsInvisible'>{lang="more_options"}</span></a>
<button type="button" id="elBlogCommentFeed_{$id}" popovertarget="elBlogCommentFeed_{$id}_menu" class='ipsEntry__topButton ipsEntry__topButton--ellipsis' title='{lang="more_options"}'><i class='fa-solid fa-ellipsis' aria-hidden="true"></i><span class='ipsInvisible'>{lang="more_options"}</span></button>
{{endif}}
</div>
</header>
@@ -1553,9 +1579,13 @@
</div>
</article>
{{if $comment->canReportOrRevoke() === TRUE}}
<ul id='elBlogCommentFeed_{$id}_menu' class='ipsMenu ipsMenu_auto ipsHide'>
<li class='ipsMenu_item'><a href='{$comment->url('report')}' {{if member.member_id or \IPS\Helpers\Form\Captcha::supportsModal()}}data-ipsDialog data-ipsDialog-remoteSubmit data-ipsDialog-size='medium' data-ipsDialog-flashMessage='{lang="report_submit_success"}' data-ipsDialog-title="{lang="report_post"}"{{endif}} data-action='reportComment' title='{lang="report_content"}'>{lang="report"}</a></li>
</ul>
<i-dropdown popover id="elBlogCommentFeed_{$id}_menu">
<div class="iDropdown">
<ul class="iDropdown__items">
<li><a href='{$comment->url('report')}' {{if member.member_id or \IPS\Helpers\Form\Captcha::supportsModal()}}data-ipsDialog data-ipsDialog-remoteSubmit data-ipsDialog-size='medium' data-ipsDialog-flashMessage='{lang="report_submit_success"}' data-ipsDialog-title="{lang="report_post"}"{{endif}} data-action='reportComment' title='{lang="report_content"}'>{lang="report"}</a></li>
</ul>
</div>
</i-dropdown>
{{endif}}
</li>
{{endforeach}}
@@ -1569,7 +1599,7 @@
<i-data>
<ul class='ipsData ipsData--table ipsData--blogs-widget'>
{{foreach $blogs as $blog}}
<li class='ipsData__item'>
<li class="ipsData__item {$blog->ui('css')}" {$blog->ui('dataAttributes')}>
<div class='i-flex_11'>
<h4 class='i-font-weight_600 i-margin-bottom_2'><a href="{$blog->url()}" title='{lang="view_this_blog" sprintf="$blog->_title"}' class="i-color_hard">{$blog->_title}</a></h4>
<ul class='ipsGrid ipsGrid--blog-stats ipsGrid--3'>
@@ -1660,9 +1690,9 @@
{{$recentEntries = iterator_to_array( $blog->_recentEntries );}}
{{if \count( $recentEntries ) > 1}}
<h4 class='ipsTitle ipsTitle--h5 ipsTitle--margin i-margin-top_4'>{lang="recent_entries"}</h4>
<ul class='ipsBlogs__blog-listing-entries'>
<ul class='ipsBlogs__blog-listing-entries' data-ips-hook='recentEntries'>
{{foreach $recentEntries as $entry}}
<li>
<li class="{$entry->ui('css')}" {$entry->ui('dataAttributes')}>
{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='i-font-weight_500 i-flex_11'>
@@ -1716,19 +1746,19 @@
</i-data>
</div>
{{endif}}]]></template>
<template template_group="widgets" template_name="entryRow" template_data="$entry, $layout='table', $isCarousel=false" template_location="front" template_app="blog"><![CDATA[<li class='ipsData__item'>
<template template_group="widgets" template_name="entryRow" template_data="$entry, $layout='table', $isCarousel=false" template_location="front" template_app="blog"><![CDATA[<li class='ipsData__item {$entry->ui('css')}' {$entry->ui('dataAttributes')}>
<a href="{$entry->url('getLastComment')}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$entry->name}</span></a>
<figure class='ipsData__image'>
<div class="ipsData__image" aria-hidden="true" data-ips-hook='image'>
{{if $entry->cover_photo}}
<img src='{file="$entry->cover_photo" extension="blog_Entries"}' alt='' loading='lazy'>
{{else}}
<div class="ipsFallbackImage" aria-hidden="true"></div>
{{endif}}
</figure>
</div>
<div class="ipsData__content">
<div class='ipsData__main'>
<div class='ipsData__title'><h4><a href="{$entry->url('getLastComment')}" title='{lang="view_this_entry" sprintf="$entry->_title"}'>{$entry->name}</a></h4></div>
<div class='ipsData__meta'>{lang="byline_nodate" htmlsprintf="$entry->author()->link()"} {lang="in"} <a href='{$entry->container()->url()}'>{$entry->container()->_title}</a></div>
<div class='ipsData__title'><h4 data-ips-hook='title'><a href="{$entry->url('getLastComment')}" title='{lang="view_this_entry" sprintf="$entry->_title"}'>{$entry->name}</a></h4></div>
<div class='ipsData__meta' data-ips-hook='metadata'>{lang="byline_nodate" htmlsprintf="$entry->author()->link()"} {lang="in"} <a href='{$entry->container()->url()}'>{$entry->container()->_title}</a></div>
{{if \IPS\Settings::i()->blog_enable_rating}}
{template="rating" group="global" location="front" app="core" params="'small', $entry->averageRating(), 5, $entry->memberRating()"}
{{endif}}
@@ -1736,12 +1766,18 @@
<div class='ipsData__desc ipsRichText ipsTruncate_2'>{$entry->truncated()|raw}</div>
{{endif}}
</div>
<ul class="ipsData__stats">
<li data-stattype="comments">
<span class='ipsData__stats-icon' data-stat-value="{number='$entry->num_comments'}" aria-hidden="true" data-ipstooltip title='{number="$entry->num_comments"} {lang="blog_comments" pluralize="$entry->num_comments"}'></span>
<span class='ipsData__stats-label'>{number="$entry->num_comments"} {lang="blog_comments" pluralize="$entry->num_comments"}</span>
</li>
</ul>
<div class="ipsData__extra">
<ul class="ipsData__stats" data-ips-hook='stats'>
<li data-stattype="comments">
<span class='ipsData__stats-icon' data-stat-value="{number='$entry->num_comments'}" aria-hidden="true" data-ipstooltip title='{number="$entry->num_comments"} {lang="blog_comments" pluralize="$entry->num_comments"}'></span>
<span class='ipsData__stats-label'>{number="$entry->num_comments"} {lang="blog_comments" pluralize="$entry->num_comments"}</span>
</li>
<li data-stattype="views">
<span class='ipsData__stats-icon' data-stat-value="{number='$entry->views'}" aria-hidden="true" data-ipstooltip title='{number="$entry->views"} {lang="blog_views" pluralize="$entry->views"}'></span>
<span class='ipsData__stats-label'>{number="$entry->views"} {lang="blog_views" pluralize="$entry->views"}</span>
</li>
</ul>
</div>
</div>
</li>]]></template>
<css css_location="front" css_app="blog" css_attributes="" css_path="." css_name="blog.css">/* Blog index: &quot;View Blogs&quot; */
+50 -1
View File
@@ -348,5 +348,54 @@
"5000071": "5.0.6 Beta 2",
"5000072": "5.0.6 Beta 3",
"5000073": "5.0.6 Beta 4",
"5000074": "5.0.6"
"5000074": "5.0.6",
"5000075": "5.0.7 Beta 1",
"5000076": "5.0.7 Beta 2",
"5000077": "5.0.7 Beta 2",
"5000078": "5.0.7 Beta 3",
"5000079": "5.0.7 Beta 4",
"5000080": "5.0.7",
"5000081": "5.0.7",
"5000082": "5.0.7",
"5000800": "5.0.8 Alpha 1",
"5000801": "5.0.8 Alpha 2",
"5000802": "5.0.8 Beta 1",
"5000803": "5.0.8 Beta 2",
"5000804": "5.0.8 Beta 3",
"5000805": "5.0.8",
"5000900": "5.0.9 Beta 1",
"5000901": "5.0.9 Beta 1",
"5000902": "5.0.9 Beta 1",
"5000903": "5.0.9 Beta 2",
"5000904": "5.0.9",
"5000905": "5.0.9",
"5000906": "5.0.10 Beta 1",
"5000907": "5.0.10 Beta 1",
"5000908": "5.0.10 Beta 1",
"5000909": "5.0.10 Beta 1",
"5000910": "5.0.10 Beta 2",
"5000911": "5.0.10 Beta 3",
"5000912": "5.0.10 Beta 4",
"5000913": "5.0.10 Beta 4",
"5000914": "5.0.10",
"5000915": "5.0.10",
"5000916": "5.0.10",
"5000917": "5.0.10",
"5000918": "5.0.10",
"5000919": "5.0.10",
"5000920": "5.0.10",
"5001100": "5.0.11 Beta 1",
"5001101": "5.0.11 Beta 1",
"5001102": "5.0.11 Beta 2",
"5001103": "5.0.11",
"5001104": "5.0.11",
"5001105": "5.0.11",
"5001200": "5.0.12 Beta 1",
"5001201": "5.0.12 Beta 2",
"5001202": "5.0.12 Beta 3",
"5001203": "5.0.12",
"5001204": "5.0.12",
"5001300": "5.0.13 Beta 1",
"5001301": "5.0.13 Beta 2",
"5001302": "5.0.13"
}
@@ -0,0 +1,53 @@
<?php
/**
* @brief Club plugin
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @subpackage Blogs
* @since 08 Jul 2025
*/
namespace IPS\blog\extensions\core\Club;
/* To prevent PHP errors (extending class does not exist) revealing path */
use IPS\blog\Blog as BlogClass;
use IPS\Content\ContentMenuLink;
use IPS\Helpers\Menu\MenuItem;
use IPS\Member\Club;
use IPS\Extensions\ClubAbstract;
use IPS\Member\Club\Page as ClubPage;
use IPS\Node\Model;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Club Menu plugin
*/
class Blog extends ClubAbstract
{
/**
* Return an array of menu elements to add to the club menu
*
* @param Club $club
* @param Model|ClubPage|null $container
* @return array<string,MenuItem>
*/
public function menu( Club $club, Model|ClubPage|null $container = null ) : array
{
if( $container instanceof BlogClass and $container->canEdit() )
{
$categoryLink = new ContentMenuLink( $container->url()->setQueryString( 'do', 'manageCategories' ), 'blog_manage_entry_categories' );
$categoryLink->opensDialog( 'blog_manage_entry_categories' );
return [ $categoryLink ];
}
return [];
}
}
@@ -13,6 +13,7 @@ namespace IPS\blog\extensions\core\EditorLocations;
/* To prevent PHP errors (extending class does not exist) revealing path */
use Exception;
use InvalidArgumentException;
use IPS\blog\Blog;
use IPS\blog\Entry\Comment;
@@ -27,6 +28,7 @@ use IPS\Text\Parser;
use LogicException;
use RuntimeException;
use function defined;
use function is_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -127,14 +129,20 @@ class Blogs extends EditorLocationsAbstract
*/
public function attachmentLookup( ?int $id1=null, ?int $id2=null, ?string $id3=null ): Model|Content|Url|Member|null
{
/* The attachment is attached to a comment */
if ( $id2 )
{
return Comment::load( $id2 );
try
{/* The attachment is attached to a comment */
if( $id2 )
{
return Comment::load( $id2 );
}
else
{
return Blog::load( $id1 );
}
}
else
catch( Exception $e )
{
return Blog::load( $id1 );
throw new LogicException( );
}
}
@@ -208,7 +216,7 @@ class Blogs extends EditorLocationsAbstract
}
catch( InvalidArgumentException $e )
{
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
{
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $word['word_custom'] );
}
@@ -13,6 +13,7 @@ namespace IPS\blog\extensions\core\EditorLocations;
/* To prevent PHP errors (extending class does not exist) revealing path */
use Exception;
use InvalidArgumentException;
use IPS\Content;
use IPS\Db;
@@ -24,6 +25,7 @@ use IPS\Node\Model;
use IPS\Text\Parser;
use LogicException;
use function defined;
use function is_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -78,7 +80,14 @@ class Categories extends EditorLocationsAbstract
switch ( $id3 )
{
case 'bcategory':
return Url::internal( "app=blog&module=blogs&controller=categories&do=form&id={$id1}", 'admin' );
try
{
return Url::internal( "app=blog&module=blogs&controller=categories&do=form&id={$id1}", 'admin' );
}
catch( Exception $e )
{
throw new LogicException;
}
}
return NULL;
@@ -142,7 +151,7 @@ class Categories extends EditorLocationsAbstract
}
catch( InvalidArgumentException $e )
{
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
{
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $word['word_custom'] );
}
@@ -13,6 +13,7 @@ namespace IPS\blog\extensions\core\EditorLocations;
/* To prevent PHP errors (extending class does not exist) revealing path */
use Exception;
use IPS\blog\Entry;
use IPS\Content;
use IPS\Extensions\EditorLocationsAbstract;
@@ -99,7 +100,14 @@ class Entries extends EditorLocationsAbstract
*/
public function attachmentLookup( ?int $id1=null, ?int $id2=null, ?string $id3=null ): Model|Content|Url|Member|null
{
return Entry::load( $id1 );
try
{
return Entry::load( $id1 );
}
catch( Exception $e )
{
throw new LogicException;
}
}
}
@@ -71,9 +71,9 @@ class Blog extends GroupFormAbstract
/* We intval here because (some of) the columns do not accept null values, but these are null when creating a new group */
$group->g_blog_allowlocal = (int) $values['g_blog_allowlocal'];
$group->g_blog_maxblogs = (int) $values['g_blog_maxblogs'];
$group->g_blog_allowprivate = (int) $values['g_blog_allowprivate'];
$group->g_blog_allowownmod = (int) $values['g_blog_allowownmod'];
$group->g_blog_allowdelete = (int) $values['g_blog_allowdelete'];
$group->g_blog_allowprivate = $values['g_blog_allowlocal'] ? (int) $values['g_blog_allowprivate'] : 0;
$group->g_blog_allowownmod = $values['g_blog_allowlocal'] ? (int) $values['g_blog_allowownmod'] : 0;
$group->g_blog_allowdelete = $values['g_blog_allowlocal'] ? (int) $values['g_blog_allowdelete'] : 0;
}
$group->g_blog_allowcomment = $values['g_blog_allowcomment'];
@@ -67,8 +67,23 @@ class Blogs extends OverviewStatisticsAbstract
*/
public function getBlock( array|string|null $dateRange = NULL, string $subBlock = NULL ): string
{
$total = Db::i()->select( 'COUNT(*)', 'blog_blogs' )->first();
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount(
$this->getBlockNumbers( $dateRange, $subBlock )['statsreports_current_count'],
NULL,
NULL
);
}
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount( $total, NULL, NULL );
/**
* @param array|string $dateRange=null
* @param string $subBlock = null
*
* @return array{statsreports_current_count: number}
*/
public function getBlockNumbers( array|string $dateRange = null, string $subBlock = null ) : array
{
return [
'statsreports_current_count' => Db::i()->select( "COUNT(*)", 'blog_blogs' )->first()
];
}
}
@@ -45,17 +45,6 @@ class RssImport extends RssImportAbstract
$this->classes = array( 'IPS\\blog\\Entry' );
}
/**
* Return available options for a Form\Select
*
* @return array
*/
public function availableOptions(): array
{
/* We don't want to set up Blog feeds in the ACP */
return array();
}
/**
* Show in the Admin CP?
*
@@ -115,7 +104,7 @@ class RssImport extends RssImportAbstract
*/
public function form( Form $form, ?Import $rss=NULL ): void
{
/* Blogs has it's own front end controller */
/* Blogs has its own front end controller */
}
/**
@@ -127,7 +116,7 @@ class RssImport extends RssImportAbstract
*/
public function saveForm( array &$values, Import $rss ): array
{
/* Blogs has it's own front end controller */
/* Blogs has its own front end controller */
return array( $values );
}
}
@@ -169,8 +169,9 @@ class browse extends Controller
/* Set default search option */
Output::i()->defaultSearchOption = array( 'blog_entry', 'blog_entry_pl' );
}
Output::i()->bodyAttributes['contentClass'] = Category::class;
Output::i()->jsFiles = array_merge( Output::i()->jsFiles, Output::i()->js( 'front_browse.js', 'blog', 'front' ) );
Output::i()->title = $category ? $category->_title : Member::loggedIn()->language()->addToStack( 'blogs' );
}
}
@@ -87,6 +87,8 @@ class view extends Controller
{
Output::i()->metaTags['og:image'] = File::get( $this->_coverPhotoStorageExtension(), $this->blog->cover_photo )->url;
}
Output::i()->bodyAttributes['contentClass'] = Blog::class;
parent::execute();
}
+1 -92
View File
@@ -1,92 +1 @@
{
"1": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_allowlocal",
"type": "TINYINT",
"length": 1,
"null": false,
"default": 0,
"comment": "Can create blogs?",
"unsigned": true
}
]
},
"2": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_maxblogs",
"type": "INT",
"length": 10,
"null": false,
"default": 0,
"comment": "Maximum number of blogs",
"unsigned": true
}
]
},
"3": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_allowprivate",
"type": "TINYINT",
"length": 1,
"null": false,
"default": 0,
"comment": "Can create private blogs?",
"unsigned": true
}
]
},
"4": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_allowownmod",
"type": "TINYINT",
"length": 1,
"null": false,
"default": 0,
"comment": "Can moderate own blogs?",
"unsigned": true
}
]
},
"5": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_allowdelete",
"type": "TINYINT",
"length": 1,
"null": false,
"default": 0,
"comment": "Can delete own blogs?",
"unsigned": true
}
]
},
"6": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_allowcomment",
"type": "TINYINT",
"length": 1,
"null": false,
"default": 0,
"comment": "Can comment on blogs?",
"unsigned": true
}
]
}
}
[]
@@ -0,0 +1,22 @@
{
"id": 5000075,
"name": "5.0.7 Beta 1",
"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\/featuredEntries",
"front\/browse\/index",
"front\/browse\/indexGrid",
"front\/view\/blogHeader",
"front\/view\/blogTable",
"front\/view\/entry",
"front\/view\/view"
],
"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": 5000076,
"name": "5.0.7 Beta 2",
"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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000077,
"name": "5.0.7 Beta 2",
"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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000078,
"name": "5.0.7 Beta 3",
"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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000079,
"name": "5.0.7 Beta 4",
"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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000080,
"name": "5.0.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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000081,
"name": "5.0.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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000082,
"name": "5.0.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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000800,
"name": "5.0.8 Alpha 1",
"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\/featuredEntries",
"front\/browse\/indexGridEntry",
"front\/widgets\/entryRow"
],
"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": 5000801,
"name": "5.0.8 Alpha 2",
"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,20 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/rows",
"front\/widgets\/entryRow"
],
"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": 5000802,
"name": "5.0.8 Beta 1",
"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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000803,
"name": "5.0.8 Beta 2",
"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": 5000804,
"name": "5.0.8 Beta 3",
"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": 5000805,
"name": "5.0.8",
"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": 5000900,
"name": "5.0.9 Beta 1",
"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": 5000901,
"name": "5.0.9 Beta 1",
"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": 5000902,
"name": "5.0.9 Beta 1",
"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": 5000903,
"name": "5.0.9 Beta 2",
"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": 5000904,
"name": "5.0.9",
"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": 5000905,
"name": "5.0.9",
"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": 5000906,
"name": "5.0.10 Beta 1",
"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\/entryRow"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000907,
"name": "5.0.10 Beta 1",
"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": 5000908,
"name": "5.0.10 Beta 1",
"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": 5000909,
"name": "5.0.10 Beta 1",
"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": 5000910,
"name": "5.0.10 Beta 2",
"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": 5000911,
"name": "5.0.10 Beta 3",
"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": 5000912,
"name": "5.0.10 Beta 4",
"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": 5000913,
"name": "5.0.10 Beta 4",
"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": 5000914,
"name": "5.0.10",
"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": 5000915,
"name": "5.0.10",
"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": 5000916,
"name": "5.0.10",
"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": 5000917,
"name": "5.0.10",
"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": 5000918,
"name": "5.0.10",
"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": 5000919,
"name": "5.0.10",
"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": 5000920,
"name": "5.0.10",
"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": 5001100,
"name": "5.0.11 Beta 1",
"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": 5001101,
"name": "5.0.11 Beta 1",
"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,29 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/indexGridEntry",
"front\/browse\/rows",
"front\/view\/blogHeader",
"front\/view\/blogViewLarge",
"front\/view\/blogViewMedium",
"front\/view\/coverPhotoOverlay",
"front\/view\/entry",
"front\/view\/view",
"front\/widgets\/blogCommentFeed",
"front\/widgets\/blogs",
"front\/widgets\/entryRow"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5001102,
"name": "5.0.11 Beta 2",
"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": 5001103,
"name": "5.0.11",
"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": 5001104,
"name": "5.0.11",
"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": 5001105,
"name": "5.0.11",
"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": 5001200,
"name": "5.0.12 Beta 1",
"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,23 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/indexButtons",
"front\/global\/categoryLink",
"front\/view\/blogTable",
"front\/view\/view",
"front\/widgets\/blogCommentFeed"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5001201,
"name": "5.0.12 Beta 2",
"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": 5001202,
"name": "5.0.12 Beta 3",
"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": 5001203,
"name": "5.0.12",
"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": 5001204,
"name": "5.0.12",
"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": 5001300,
"name": "5.0.13 Beta 1",
"steps": {
"queries": false,
"lang": true,
"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,14 @@
{
"normal": {
"added": [
"blog_categories_sg"
],
"edited": [],
"removed": []
},
"js": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/indexButtons",
"front\/view\/blogTable",
"front\/view\/view",
"front\/widgets\/blogCommentFeed"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5001301,
"name": "5.0.13 Beta 2",
"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": 5001302,
"name": "5.0.13",
"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
}
+18 -11
View File
@@ -185,6 +185,11 @@ class Blog extends Model implements Embeddable
*/
public static bool $canBeExtended = true;
/**
* @brief [Node] Sortable?
*/
public static bool $nodeSortable = false;
/**
* Columns needed to query for search result / stream view
*
@@ -240,7 +245,7 @@ class Blog extends Model implements Embeddable
{
/* We don't want any kind of specific comment moderation here, just leave it up to the
general rules */
if( $action == 'moderate_comments' )
if( $action == 'moderate_comments' or $action == 'moderate_items' )
{
return false;
}
@@ -1096,7 +1101,17 @@ class Blog extends Model implements Embeddable
*/
protected function get_description(): ?string
{
return $this->member_id ? $this->desc : Member::loggedIn()->language()->addToStack( static::$titleLangPrefix . $this->_id . static::$descriptionLangSuffix );
if( $this->member_id )
{
return $this->desc;
}
if( Member::loggedIn()->language()->checkKeyExists( static::$titleLangPrefix . $this->_id . static::$descriptionLangSuffix ) )
{
return Member::loggedIn()->language()->addToStack( static::$titleLangPrefix . $this->_id . static::$descriptionLangSuffix );
}
return null;
}
/**
@@ -1348,7 +1363,6 @@ class Blog extends Model implements Embeddable
{
Output::i()->jsFiles = array_merge( Output::i()->jsFiles, Output::i()->js( 'front_view.js', 'blog', 'front' ) );
$form->addTab( 'blog_settings' );
$itemClass = static::$contentItemClass;
$form->add( new Text( 'club_node_name', $this->_id ? $this->_title : Member::loggedIn()->language()->addToStack( 'blogs_sg' ), TRUE, array( 'maxLength' => 255 ) ) );
$form->add( new Editor( 'club_node_description', $this->_id ? Member::loggedIn()->language()->get( static::$titleLangPrefix . $this->_id . '_desc' ) : NULL, FALSE, array( 'app' => 'blog', 'key' => 'Blogs', 'autoSaveKey' => ( $this->id ? "blogs-blog-{$this->id}" : "blogs-new-blog" ), 'attachIds' => $this->id ? array( $this->id, NULL, 'description' ) : NULL, 'minimize' => 'blog_desc_placeholder' ) ) );
@@ -1362,13 +1376,6 @@ class Blog extends Model implements Embeddable
$form->add( new Radio( 'club_node_public', $this->id ? $this->isPublic() : 0, TRUE, array( 'options' => array( '0' => 'club_node_public_no', '1' => 'club_node_public_view', '2' => 'club_node_public_participate' ) ) ) );
}
/* Categories */
if ( $this->id )
{
$form->addTab( 'blog_entry_categories' );
$form->addHtml( Theme::i()->getTemplate( 'view', 'blog', 'front' )->manageCategories( $this ) );
}
}
/**
@@ -1554,7 +1561,7 @@ class Blog extends Model implements Embeddable
if( $this->canDelete() )
{
$deleteLink = new ContentMenuLink( $this->url()->setQueryString( 'do', 'deleteBlog' )->csrf(), 'delete_blog', 'ipsMenu_item', [
$deleteLink = new ContentMenuLink( $this->url()->setQueryString( 'do', 'deleteBlog' )->csrf(), 'delete_blog', 'iDropdown__li', [
'data-confirm' => '',
'data-confirmMessage' => Member::loggedIn()->language()->addToStack( 'delete_blog_confirm' ),
'data-confirmSubMessage' => Member::loggedIn()->language()->addToStack( 'delete_blog_warning' )
+1 -1
View File
@@ -808,7 +808,7 @@ class Entry extends Item implements
and Login::registrationType() != 'disabled' )
{
/* We can override post before register for guests */
return (bool) Group::load( Settings::i()->member_group )->g_blog_allowcomment;
return (bool) Group::load( Settings::i()->guest_group )->g_blog_allowcomment;
}
elseif( $member->member_id )
{
+45
View File
@@ -56,6 +56,51 @@
{$email->language->addToStack("go_to_this_x", FALSE, array( 'htmlsprintf' => array( mb_strtolower( $email->language->addToStack( $content::$title, FALSE ) ) ) ) )}: {$content->url()}
-- {setting="board_name"}]]></template_content_plaintext><template_pinned>0</template_pinned></template><template><template_app>calendar</template_app><template_name>notification_event_rsvp</template_name><template_content_html><![CDATA[
{$email->language->addToStack("email_event_rsvp", FALSE, array( 'sprintf' => array( $member->name, $content->url(), $content->mapped('title') ) ) )}
<br />
<br />
<table cellpadding="0" cellspacing="0" border="0" width="100%" bgcolor="#ffffff" class='responsive_table'>
<tr>
<td dir='{dir}' width="100%" class='responsive_fullwidth' bgcolor="#f9f9f9">
<table cellpadding="10" cellspacing="0" border="0" width="100%">
<tr>
<td dir='{dir}' colspan='2' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px" bgcolor="#f0f0f0">
<strong>{$email->language->get("rsvp_attend_event")}</strong>
</td>
<td dir='{dir}' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px">
{$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_YES ) ) ) )}
</td>
</tr>
<tr>
<td dir='{dir}' colspan='2' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px" bgcolor="#f0f0f0">
<strong>{$email->language->get("rsvp_maybe_event")}</strong>
</td>
<td dir='{dir}' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px">
{$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_MAYBE ) ) ) )}
</td>
</tr>
<tr>
<td dir='{dir}' colspan='2' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px" bgcolor="#f0f0f0">
<strong>{$email->language->get("rsvp_notgoing_event")}</strong>
</td>
<td dir='{dir}' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px">
{$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_NO ) ) ) )}
</td>
</tr>
</table>
</td>
</tr>
</table>
<br /><br />
<em style='color: #8c8c8c'>&mdash; {setting="board_name"}</em>]]></template_content_html><template_data>$content, $member, $email</template_data><template_content_plaintext><![CDATA[{$email->language->addToStack("email_event_rsvp_plain", FALSE, array( 'htmlsprintf' => array( $member->name, $content->mapped('title') ) ) )}
{$email->language->get("rsvp_attend_event")}: {$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_YES ) ) ) )}
{$email->language->get("rsvp_maybe_event")}: {$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_MAYBE ) ) ) )}
{$email->language->get("rsvp_notgoing_event")}: {$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_NO ) ) ) )}
-- {setting="board_name"}]]></template_content_plaintext><template_pinned>0</template_pinned></template><template><template_app>calendar</template_app><template_name>notification_new_content</template_name><template_content_html><![CDATA[
{{if $content->author()->member_id}}
{$email->language->addToStack("email_new_calevent", FALSE, array( 'sprintf' => array( $content->author()->url(), $content->author()->name, $content->indefiniteArticle( $email->language ), $content->url(), $content->mapped('title'), $content->fixedDateTimeDescription( $email->language ) ) ) )}
+1 -5
View File
@@ -1,11 +1,7 @@
{
"topLevel": "events",
"pages": {
"featured": {
"friendly": "featured",
"real": "app=calendar&module=calendar&controller=view&view=overview&do=featured"
},
"calendar_calweek": {
"calendar_calweek": {
"friendly": "{#id}-{?}/week/{@w}",
"real": "app=calendar&module=calendar&controller=view&view=week"
},
Loaded 100 of 1407 files, more files were not shown because too many files have changed in this diff. Show more