Version 5.0.14

This commit is contained in:
Neo committed 2025-12-19 19:17:57 -08:00
1 parent 5efe744c5f
commit dbd774b30c
364 files changed
+7048 -1377

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@ has been used throughout Invision Community to add style, flair and functionalit
to our product. to our product.
NULLING NULLING
Last Updated: 5 November 2025 Last Updated: 9 December 2025
Author: https://ipbmafia.ru Author: https://ipbmafia.ru
AES implementation in PHP AES implementation in PHP
-85
View File
@@ -460,89 +460,4 @@ label input{
/* Install: Admin username, password, email */ /* Install: Admin username, password, email */
.ipsFieldRow[id^="admin_admin_"] input{ .ipsFieldRow[id^="admin_admin_"] input{
justify-self: stretch; justify-self: stretch;
}
@supports(display:ehren){
.ipsFieldRow:not( :last-child ) {
margin-bottom: 15px;
}
/* FIELD LISTS (for stacks of radios/checkboxes) */
.ipsFieldList {
padding-top: 7px;
}
.ipsFieldList > li {
margin-bottom: 10px;
}
.ipsFieldList input[type="radio"], .ipsFieldList input[type="checkbox"] {
float: left;
margin-top: 4px;
}
.ipsFieldList__content {
margin-left: 22px;
}
/* FORM TYPOGRAPHY */
.ipsFieldRow__desc {
font-size: 12px;
color: #adadad;
margin-top: 3px;
display: inline-block;
}
.ipsFieldRow:not( .ipsFieldRow_checkbox ) .ipsFieldRow_label,
.ipsFieldRow:not( .ipsFieldRow_checkbox ) .ipsFieldRow_title {
font-size: 15px;
font-weight: bold;
margin-bottom: 5px;
display: inline-block;
padding-top: 5px;
}
.ipsFieldRow__required {
font-size: 10px;
text-transform: uppercase;
color: #c02222;
margin-left: 10px;
font-weight: normal;
}
.ipsFieldRow__content select {
margin-top: 6px;
}
.ipsFieldRow_section {
background: #f9f9f9;
color: #333;
padding: 15px;
font-size: 16px;
margin-bottom: 10px;
}
} }
+1 -1
View File
@@ -3,7 +3,7 @@
Nulled by IPBMafia.ru Nulled by IPBMafia.ru
Buy license at https://invisioncommunity.com/buy/self-hosted/ Buy license at https://invisioncommunity.com/buy/self-hosted/
================================================================ ================================================================
IPS 5.0.13 (5001302) IPS 5.0.14 (5001403)
=============================[NOTE]============================= =============================[NOTE]=============================
Invision Community End User License Agreement Invision Community End User License Agreement
+1 -1
View File
@@ -105,7 +105,7 @@ class Application extends SystemApplication
} }
/* @note application/rss+xml is not a registered IANA mime-type so we need to stick with text/xml for RSS */ /* @note application/rss+xml is not a registered IANA mime-type so we need to stick with text/xml for RSS */
Output::i()->sendOutput( $document->asXML(), 200, 'text/xml', array(), TRUE, parseFileObjects: FALSE ); Output::i()->sendOutput( $document->asXML(), 200, 'text/xml', array(), TRUE, parseFileObjects: true );
} }
/** /**
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<javascript app="blog"> <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="5001302" 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="5001403" javascript_position="1000100"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -277,7 +277,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<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 */ <file javascript_app="blog" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.view.js" javascript_type="template" javascript_version="5001403" javascript_position="1000050"><![CDATA[/* CLASS LIST TEMPLATES */
ips.templates.set('blog.view.addButton', "\ 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>\ <li><button type=\"button\" class=\"ipsButton ipsButton--primary ipsHide\" data-action=\"addNew\">{{#lang}}manage_cats_new_row{{/lang}}</button></li>\
"); ");
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<language> <language>
<app key="blog" version="5001302"> <app key="blog" version="5001403">
<word key="__app_blog" js="0">Blogs</word> <word key="__app_blog" js="0">Blogs</word>
<word key="frontnavigation_blogs" 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> <word key="__indefart_blog_entry_comment" js="0">a comment on a blog entry</word>
+18 -1
View File
@@ -275,6 +275,19 @@
"107799": "4.7.20 Beta 5", "107799": "4.7.20 Beta 5",
"107800": "4.7.20", "107800": "4.7.20",
"107801": "4.7.20", "107801": "4.7.20",
"107802": "4.7.20",
"107803": "4.7.20",
"107810": "4.7.21 Beta 1",
"107811": "4.7.21",
"107815": "4.7.22 Beta 1",
"107816": "4.7.22 Beta 2",
"107817": "4.7.22",
"107818": "4.7.22",
"107819": "4.7.22",
"107820": "4.7.22",
"107826": "4.7.23 Beta 1",
"107827": "4.7.23",
"107828": "4.7.23",
"500001": "5.0.0 Alpha 1", "500001": "5.0.0 Alpha 1",
"500002": "5.0.0 Alpha 2", "500002": "5.0.0 Alpha 2",
"5000003": "5.0.0 Alpha 3", "5000003": "5.0.0 Alpha 3",
@@ -397,5 +410,9 @@
"5001204": "5.0.12", "5001204": "5.0.12",
"5001300": "5.0.13 Beta 1", "5001300": "5.0.13 Beta 1",
"5001301": "5.0.13 Beta 2", "5001301": "5.0.13 Beta 2",
"5001302": "5.0.13" "5001302": "5.0.13",
"5001400": "5.0.14 Beta 1",
"5001401": "5.0.14 Beta 1",
"5001402": "5.0.14 Beta 2",
"5001403": "5.0.14"
} }
@@ -27,6 +27,12 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
*/ */
class Blogs extends ModeratorPermissionsAbstract class Blogs extends ModeratorPermissionsAbstract
{ {
public function getPermissions( array $toggles ): array
{
/* Leave this empty because we are going to just add to the existing Blogs tab */
return [];
}
/** /**
* Get Permissions * Get Permissions
* *
@@ -45,7 +51,7 @@ class Blogs extends ModeratorPermissionsAbstract
* @param array $toggles * @param array $toggles
* @return array * @return array
*/ */
public function getPermissions( array $toggles ): array public function getContentPermissions( array $toggles ): array
{ {
return array( 'can_mod_blogs' => 'YesNo' ); return array( 'can_mod_blogs' => 'YesNo' );
} }
@@ -0,0 +1,23 @@
{
"id": 107802,
"name": "4.7.20",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107803,
"name": "4.7.20",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107810,
"name": "4.7.21 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107811,
"name": "4.7.21",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107815,
"name": "4.7.22 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107816,
"name": "4.7.22 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107817,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107818,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107819,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107820,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107826,
"name": "4.7.23 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107827,
"name": "4.7.23",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107828,
"name": "4.7.23",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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": 5001400,
"name": "5.0.14 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": 5001401,
"name": "5.0.14 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": 5001402,
"name": "5.0.14 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": 5001403,
"name": "5.0.14",
"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
}
+2 -2
View File
@@ -128,7 +128,7 @@ class Application extends SystemApplication
$ics = $feed->buildICalendarFeed( $calendar ); $ics = $feed->buildICalendarFeed( $calendar );
Output::i()->sendOutput( $ics, 200, 'text/calendar', [ 'Content-Disposition' => Output::getContentDisposition( 'inline', "calendarEvents.ics" ) ], FALSE, FALSE, FALSE ); Output::i()->sendOutput( $ics, 200, 'text/calendar', [ 'Content-Disposition' => Output::getContentDisposition( 'inline', "calendarEvents.ics" ) ], FALSE, FALSE, true );
} }
/** /**
@@ -171,7 +171,7 @@ class Application extends SystemApplication
} }
/* @note application/rss+xml is not a registered IANA mime-type so we need to stick with text/xml for RSS */ /* @note application/rss+xml is not a registered IANA mime-type so we need to stick with text/xml for RSS */
Output::i()->sendOutput( $document->asXML(), 200, 'text/xml' ); Output::i()->sendOutput( $document->asXML(), 200, 'text/xml', parseFileObjects: true );
} }
/** /**
+1
View File
@@ -5,6 +5,7 @@
<module key="front/calendar"><![CDATA[{"default_controller":"view","protected":0,"default":1}]]></module> <module key="front/calendar"><![CDATA[{"default_controller":"view","protected":0,"default":1}]]></module>
<task frequency="P0Y0M0DT4H0M0S">icalendar</task> <task frequency="P0Y0M0DT4H0M0S">icalendar</task>
<task frequency="P0Y0M0DT1H0M0S">eventreminders</task> <task frequency="P0Y0M0DT1H0M0S">eventreminders</task>
<task frequency="P0Y0M1DT0H0M0S">clearfeaturedevents</task>
<setting key="all_activity_calendar_streamitems"><![CDATA[{"key":"all_activity_calendar_streamitems","default":"1","report":"full"}]]></setting> <setting key="all_activity_calendar_streamitems"><![CDATA[{"key":"all_activity_calendar_streamitems","default":"1","report":"full"}]]></setting>
<setting key="calendar_block_past_changes"><![CDATA[{"key":"calendar_block_past_changes","default":"0","report":"full"}]]></setting> <setting key="calendar_block_past_changes"><![CDATA[{"key":"calendar_block_past_changes","default":"0","report":"full"}]]></setting>
<setting key="calendar_date_format"><![CDATA[{"key":"calendar_date_format","default":"d_lm_y","report":"full"}]]></setting> <setting key="calendar_date_format"><![CDATA[{"key":"calendar_date_format","default":"d_lm_y","report":"full"}]]></setting>
+11 -11
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<javascript app="calendar"> <javascript app="calendar">
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.main.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000250"><![CDATA[/** <file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.main.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000250"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -110,7 +110,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.monthView.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000250"><![CDATA[/** <file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.monthView.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000250"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -229,7 +229,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.eventList.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000300"><![CDATA[/** <file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.eventList.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000300"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -347,7 +347,7 @@ var PER_PAGE = 16;
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.nearMe.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000300"><![CDATA[/** <file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.nearMe.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000300"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -711,7 +711,7 @@ var PER_PAGE = 16;
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.search.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000300"><![CDATA[/** <file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.search.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000300"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1265,7 +1265,7 @@ var PER_PAGE = 16;
}); });
}(jQuery, _)); }(jQuery, _));
]]></file> ]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.dates.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000100"><![CDATA[/** <file javascript_app="calendar" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.dates.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000100"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1787,7 +1787,7 @@ var PER_PAGE = 16;
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/venue" javascript_name="ips.venue.main.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000200"><![CDATA[/** <file javascript_app="calendar" javascript_location="front" javascript_path="controllers/venue" javascript_name="ips.venue.main.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000200"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1894,7 +1894,7 @@ var PER_PAGE = 16;
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.reminderButton.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000150"><![CDATA[/** <file javascript_app="calendar" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.reminderButton.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000150"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1977,7 +1977,7 @@ var PER_PAGE = 16;
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.reminderForm.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000150">/** <file javascript_app="calendar" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.reminderForm.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000150">/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -2087,7 +2087,7 @@ var PER_PAGE = 16;
}); });
}(jQuery, _)); }(jQuery, _));
</file> </file>
<file javascript_app="calendar" javascript_location="front" javascript_path="templates" javascript_name="ips.calendar.templates.js" javascript_type="framework" javascript_version="5001302" javascript_position="1000050"><![CDATA[/** <file javascript_app="calendar" javascript_location="front" javascript_path="templates" javascript_name="ips.calendar.templates.js" javascript_type="framework" javascript_version="5001403" javascript_position="1000050"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*/ */
@@ -2096,7 +2096,7 @@ var PER_PAGE = 16;
ips.templates.set('calendar.reminder.loading', " \ ips.templates.set('calendar.reminder.loading', " \
<div class='ipsLoading ipsLoading--tiny'></div>\ <div class='ipsLoading ipsLoading--tiny'></div>\
");]]></file> ");]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.overview.js" javascript_type="template" javascript_version="5001302" javascript_position="1000050"><![CDATA[ips.templates.set("eventLoading", ` <file javascript_app="calendar" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.overview.js" javascript_type="template" javascript_version="5001403" javascript_position="1000050"><![CDATA[ips.templates.set("eventLoading", `
<li class='ipsData__item ipsData__item--loading'> <li class='ipsData__item ipsData__item--loading'>
<div class="ipsData__image" aria-hidden="true"></div> <div class="ipsData__image" aria-hidden="true"></div>
<div class="ipsData__content"> <div class="ipsData__content">
+4 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<language> <language>
<app key="calendar" version="5001302"> <app key="calendar" version="5001403">
<word key="__app_calendar" js="0">Events</word> <word key="__app_calendar" js="0">Events</word>
<word key="frontnavigation_calendar" js="0">Events</word> <word key="frontnavigation_calendar" js="0">Events</word>
<word key="__indefart_calendar_event_comment" js="0">a comment on an event</word> <word key="__indefart_calendar_event_comment" js="0">a comment on an event</word>
@@ -89,6 +89,9 @@
<word key="cal_allow_comments" js="0">Allow comments?</word> <word key="cal_allow_comments" js="0">Allow comments?</word>
<word key="cal_allow_reviews" js="0">Allow reviews?</word> <word key="cal_allow_reviews" js="0">Allow reviews?</word>
<word key="cal_review_moderate" js="0">Reviews must be approved?</word> <word key="cal_review_moderate" js="0">Reviews must be approved?</word>
<word key="cal_allow_recurring" js="0">Allow recurring events?</word>
<word key="cal_show_overview" js="0">Include in Overview</word>
<word key="cal_show_overview_desc" js="0"><![CDATA[When disabled, events in this calendar will be excluded from the <a href='{internal.front.app=calendar&module=calendar&controller=view&view=overview}' target='_blank'>events landing page</a>.<br>Featured events will always be displayed in the overview.]]></word>
<word key="calperm_perm__label" js="0"></word> <word key="calperm_perm__label" js="0"></word>
<word key="calperm_perm__view" js="0">See Calendar</word> <word key="calperm_perm__view" js="0">See Calendar</word>
<word key="calperm_perm__read" js="0">View Events</word> <word key="calperm_perm__read" js="0">View Events</word>
+1 -1
View File
@@ -1 +1 @@
{"icalendar":"P0Y0M0DT4H0M0S","eventreminders":"P0Y0M0DT1H0M0S"} {"icalendar":"P0Y0M0DT4H0M0S","eventreminders":"P0Y0M0DT1H0M0S","clearfeaturedevents":"P0Y0M1DT0H0M0S"}
+5
View File
@@ -1549,6 +1549,7 @@
</label> </label>
</div> </div>
</div> </div>
{{if $value['allow_recurring']}}
<div class='i-padding_3 i-background_2'> <div class='i-padding_3 i-background_2'>
<strong class='i-color_hard i-font-weight_600 i-font-size_3 i-margin-bottom_2 i-display_block'><i class="fa-solid fa-clipboard-list i-color_soft i-margin-end_icon i-opacity_5"></i> {lang="submit_event_summary"}</strong> <strong class='i-color_hard i-font-weight_600 i-font-size_3 i-margin-bottom_2 i-display_block'><i class="fa-solid fa-clipboard-list i-color_soft i-margin-end_icon i-opacity_5"></i> {lang="submit_event_summary"}</strong>
<p><span data-role='dateSummary'></span></p> <p><span data-role='dateSummary'></span></p>
@@ -1623,6 +1624,10 @@
</i-dropdown> </i-dropdown>
</div> </div>
</div> </div>
{{else}}
<input type='hidden' name='event_dates[event_repeat]' value='0'>
<input type='hidden' name='event_dates[repeat_end]' value='never'>
{{endif}}
</div> </div>
</div>]]></template> </div>]]></template>
<template template_group="submit" template_name="submitForm" template_data="$id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class=''" template_location="front" template_app="calendar"><![CDATA[ <template template_group="submit" template_name="submitForm" template_data="$id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class=''" template_location="front" template_app="calendar"><![CDATA[
+18 -1
View File
@@ -275,6 +275,19 @@
"107799": "4.7.20 Beta 5", "107799": "4.7.20 Beta 5",
"107800": "4.7.20", "107800": "4.7.20",
"107801": "4.7.20", "107801": "4.7.20",
"107802": "4.7.20",
"107803": "4.7.20",
"107810": "4.7.21 Beta 1",
"107811": "4.7.21",
"107815": "4.7.22 Beta 1",
"107816": "4.7.22 Beta 2",
"107817": "4.7.22",
"107818": "4.7.22",
"107819": "4.7.22",
"107820": "4.7.22",
"107826": "4.7.23 Beta 1",
"107827": "4.7.23",
"107828": "4.7.23",
"500001": "5.0.0 Alpha 1", "500001": "5.0.0 Alpha 1",
"500002": "5.0.0 Alpha 2", "500002": "5.0.0 Alpha 2",
"5000003": "5.0.0 Alpha 3", "5000003": "5.0.0 Alpha 3",
@@ -397,5 +410,9 @@
"5001204": "5.0.12", "5001204": "5.0.12",
"5001300": "5.0.13 Beta 1", "5001300": "5.0.13 Beta 1",
"5001301": "5.0.13 Beta 2", "5001301": "5.0.13 Beta 2",
"5001302": "5.0.13" "5001302": "5.0.13",
"5001400": "5.0.14 Beta 1",
"5001401": "5.0.14 Beta 1",
"5001402": "5.0.14 Beta 2",
"5001403": "5.0.14"
} }
@@ -553,6 +553,12 @@ class view extends Controller
); );
} }
/* Featured events use all calendars, but the other areas don't,
so let's filter down the list based on the bitoption */
$calendars = array_filter( $calendars, function( $calendar ) {
return !$calendar->calendar_bitoptions['bw_hide_overview'];
});
/* Events near me */ /* Events near me */
if( isset( Request::i()->lat ) and isset( Request::i()->lon ) ) if( isset( Request::i()->lat ) and isset( Request::i()->lon ) )
{ {
@@ -0,0 +1,23 @@
{
"id": 107802,
"name": "4.7.20",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107803,
"name": "4.7.20",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107810,
"name": "4.7.21 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107811,
"name": "4.7.21",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107815,
"name": "4.7.22 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107816,
"name": "4.7.22 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107817,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107818,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107819,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107820,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107826,
"name": "4.7.23 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107827,
"name": "4.7.23",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107828,
"name": "4.7.23",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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": 5001400,
"name": "5.0.14 Beta 1",
"steps": {
"queries": false,
"lang": true,
"theme": true,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": true,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,16 @@
{
"normal": {
"added": [
"cal_allow_recurring",
"cal_show_overview",
"cal_show_overview_desc"
],
"edited": [],
"removed": []
},
"js": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,7 @@
{
"added": [
"clearfeaturedevents"
],
"edited": [],
"removed": []
}
@@ -0,0 +1,19 @@
{
"html": {
"added": [],
"edited": [
"front\/submit\/datesForm"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5001401,
"name": "5.0.14 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": 5001402,
"name": "5.0.14 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": 5001403,
"name": "5.0.14",
"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
}
@@ -145,7 +145,9 @@ class Calendar extends Model implements Permissions
'calendar_bitoptions' => array( 'calendar_bitoptions' => array(
'calendar_bitoptions' => array( 'calendar_bitoptions' => array(
'bw_disable_tagging' => 1, 'bw_disable_tagging' => 1,
'bw_disable_prefixes' => 2 'bw_disable_prefixes' => 2,
'bw_disable_recurring' => 4,
'bw_hide_overview' => 8
) )
) )
); );
@@ -239,6 +241,8 @@ class Calendar extends Model implements Permissions
$form->add( new YesNo( 'cal_allow_reviews', $this->id ? $this->allow_reviews : FALSE, FALSE, array( 'togglesOn' => array( 'cal_review_moderate' ) ) ) ); $form->add( new YesNo( 'cal_allow_reviews', $this->id ? $this->allow_reviews : FALSE, FALSE, array( 'togglesOn' => array( 'cal_review_moderate' ) ) ) );
$form->add( new YesNo( 'cal_review_moderate', $this->id ? $this->review_moderate : FALSE, FALSE, array(), NULL, NULL, NULL, 'cal_review_moderate' ) ); $form->add( new YesNo( 'cal_review_moderate', $this->id ? $this->review_moderate : FALSE, FALSE, array(), NULL, NULL, NULL, 'cal_review_moderate' ) );
$form->add( new YesNo( 'cal_allow_anonymous', $this->id ? $this->allow_anonymous : FALSE, FALSE, array(), NULL, NULL, NULL, 'cal_allow_anonymous' ) ); $form->add( new YesNo( 'cal_allow_anonymous', $this->id ? $this->allow_anonymous : FALSE, FALSE, array(), NULL, NULL, NULL, 'cal_allow_anonymous' ) );
$form->add( new YesNo( 'cal_allow_recurring', $this->id ? !$this->calendar_bitoptions['bw_disable_recurring'] : true, false ) );
$form->add( new YesNo( 'cal_show_overview', $this->id ? !$this->calendar_bitoptions['bw_hide_overview'] : true, false ) );
parent::form( $form ); parent::form( $form );
} }
@@ -264,6 +268,13 @@ class Calendar extends Model implements Permissions
unset( $values['cal_title'] ); unset( $values['cal_title'] );
} }
/* These are reversed because we want to default to previous behavior, which means that the bit options would be turned OFF.
However, to the end-user it makes more sense to disable it as opposed to enable */
$values['calendar_bitoptions']['bw_disable_recurring'] = !$values['cal_allow_recurring'];
$values['calendar_bitoptions']['bw_hide_overview'] = !$values['cal_show_overview'];
unset( $values['cal_allow_recurring'] );
unset( $values['cal_show_overview'] );
return $values; return $values;
} }
+50 -38
View File
@@ -1446,6 +1446,7 @@ class Event extends Item implements Embeddable,
'event_repeat_freq' => NULL, /* Repeat every 1 day, 2 days, 3 days, etc. */ 'event_repeat_freq' => NULL, /* Repeat every 1 day, 2 days, 3 days, etc. */
'repeat_end_occurrences' => NULL, /* Ends after x occurrences */ 'repeat_end_occurrences' => NULL, /* Ends after x occurrences */
'repeat_end_date' => NULL, /* Ends on x date (which is separate from the event end date - e.g. jan 9 2014 3pm to jan 10 2014 3pm, repeat annually until jan 9 2019) */ 'repeat_end_date' => NULL, /* Ends on x date (which is separate from the event end date - e.g. jan 9 2014 3pm to jan 10 2014 3pm, repeat annually until jan 9 2019) */
'allow_recurring' => ( !$container->calendar_bitoptions['bw_disable_recurring'] )
); );
/* If we're copying an event, reset the date & time fields */ /* If we're copying an event, reset the date & time fields */
@@ -1463,7 +1464,7 @@ class Event extends Item implements Embeddable,
} }
/* Figure out the recurrence data if we are editing */ /* Figure out the recurrence data if we are editing */
if ( $item AND $item->recurring ) if ( $item AND $item->recurring AND $dateValues['allow_recurring'] )
{ {
try try
{ {
@@ -1768,6 +1769,13 @@ class Event extends Item implements Embeddable,
$this->start_date = Date::createFromForm( $values['event_dates']['start_date'], ( ( !isset( $values['event_dates']['all_day'] ) OR !$values['event_dates']['all_day'] ) ? $values['event_dates']['start_time'] : '' ), ( isset( $values['event_dates']['all_day'] ) AND $values['event_dates']['all_day'] ) ? 'UTC' : $values['event_dates']['event_timezone'] )->format( 'Y-m-d H:i' ); $this->start_date = Date::createFromForm( $values['event_dates']['start_date'], ( ( !isset( $values['event_dates']['all_day'] ) OR !$values['event_dates']['all_day'] ) ? $values['event_dates']['start_time'] : '' ), ( isset( $values['event_dates']['all_day'] ) AND $values['event_dates']['all_day'] ) ? 'UTC' : $values['event_dates']['event_timezone'] )->format( 'Y-m-d H:i' );
$this->end_date = null; $this->end_date = null;
/* If the calendar does not allow recurring events, force the settings */
if( $this->container()->calendar_bitoptions['bw_disable_recurring'] )
{
$values['event_dates']['repeat_end'] = 'never';
$values['event_dates']['event_repeat'] = 0;
}
/* Clear clear fields for non-selected items */ /* Clear clear fields for non-selected items */
switch( $values['event_dates']['repeat_end'] ) switch( $values['event_dates']['repeat_end'] )
{ {
@@ -2279,57 +2287,61 @@ class Event extends Item implements Embeddable,
$formattedEvents = iterator_to_array( $events ); $formattedEvents = iterator_to_array( $events );
} }
/* Now get the recurring events.... */ /* Now get the recurring events....
$recurringEvents = Event::getItemsWithPermission( array_merge( $where, array( array( "event_recurring IS NOT NULL AND (event_recurring_end_date IS NULL OR DATE(event_recurring_end_date) >= '{$startDate->mysqlDatetime( FALSE )}')" ) ) ), 'event_start_date ASC', NULL, ( $skipPermissions === TRUE ) ? NULL : 'view', ( $skipPermissions === TRUE ) ? Filter::FILTER_SHOW_HIDDEN : Filter::FILTER_AUTOMATIC, 0, $member, FALSE, FALSE, FALSE,FALSE, NULL, FALSE, TRUE, TRUE, TRUE, FALSE, $location ); If we only have one calendar, and it does not allow recurring events, we can skip this extra query */
if( !( $calendar instanceof Calendar ) or !$calendar->calendar_bitoptions['bw_disable_recurring'] )
/* Loop over any results */
foreach( $recurringEvents as $event )
{ {
/* @var Event $event */ $recurringEvents = Event::getItemsWithPermission( array_merge( $where, array( array( "event_recurring IS NOT NULL AND (event_recurring_end_date IS NULL OR DATE(event_recurring_end_date) >= '{$startDate->mysqlDatetime( FALSE )}')" ) ) ), 'event_start_date ASC', NULL, ( $skipPermissions === TRUE ) ? NULL : 'view', ( $skipPermissions === TRUE ) ? Filter::FILTER_SHOW_HIDDEN : Filter::FILTER_AUTOMATIC, 0, $member, FALSE, FALSE, FALSE,FALSE, NULL, FALSE, TRUE, TRUE, TRUE, FALSE, $location );
/* Find occurrences within our date range (if any) */
$thisEndDate = ( $endDate ? $endDate->setTime( 23, 59, 59 ) : $startDate->adjust( "+2 years" ) )->setTime( 23, 59, 59 );
$thisEndDate = ( clone $thisEndDate )->adjust( "+1 day" );
$occurrences = $event->findOccurrences( $startDate, $thisEndDate );
/* Do we have any? */ /* Loop over any results */
if ( count( $occurrences ) ) foreach( $recurringEvents as $event )
{ {
/* Are we formatting events? If so, place into the array as appropriate. */ /* @var Event $event */
if ( $formatEvents ) /* Find occurrences within our date range (if any) */
$thisEndDate = ( $endDate ? $endDate->setTime( 23, 59, 59 ) : $startDate->adjust( "+2 years" ) )->setTime( 23, 59, 59 );
$thisEndDate = ( clone $thisEndDate )->adjust( "+1 day" );
$occurrences = $event->findOccurrences( $startDate, $thisEndDate );
/* Do we have any? */
if ( count( $occurrences ) )
{ {
foreach( $occurrences as $occurrence ) /* Are we formatting events? If so, place into the array as appropriate. */
if ( $formatEvents )
{ {
/* Is this a ranged repeating event? */ foreach( $occurrences as $occurrence )
if ( $occurrence['endDate'] !== NULL )
{ {
$date = $occurrence['startDate']; /* Is this a ranged repeating event? */
$eDate = ( $thisEndDate->mysqlDatetime( FALSE ) < $occurrence['endDate']->mysqlDatetime( FALSE ) ) ? $thisEndDate : $occurrence['endDate']; if ( $occurrence['endDate'] !== NULL )
if ( $date->mysqlDatetime( FALSE ) < $eDate->mysqlDatetime( FALSE ) )
{ {
while( $date->mysqlDatetime( FALSE ) < $eDate->mysqlDatetime( FALSE ) ) $date = $occurrence['startDate'];
{ $eDate = ( $thisEndDate->mysqlDatetime( FALSE ) < $occurrence['endDate']->mysqlDatetime( FALSE ) ) ? $thisEndDate : $occurrence['endDate'];
$formattedEvents[ $date->mysqlDatetime( FALSE ) ]['ranged'][ $event->id ] = $event;
$date = $date->adjust( '+1 day' );
}
$formattedEvents[ $eDate->mysqlDatetime( FALSE ) ]['ranged'][ $event->id ] = $event; if ( $date->mysqlDatetime( FALSE ) < $eDate->mysqlDatetime( FALSE ) )
{
while( $date->mysqlDatetime( FALSE ) < $eDate->mysqlDatetime( FALSE ) )
{
$formattedEvents[ $date->mysqlDatetime( FALSE ) ]['ranged'][ $event->id ] = $event;
$date = $date->adjust( '+1 day' );
}
$formattedEvents[ $eDate->mysqlDatetime( FALSE ) ]['ranged'][ $event->id ] = $event;
}
else
{
$formattedEvents[ $date->mysqlDatetime( FALSE ) ]['single'][ $event->id ] = $event;
}
} }
else else
{ {
$formattedEvents[ $date->mysqlDatetime( FALSE ) ]['single'][ $event->id ] = $event; $formattedEvents[ $occurrence['startDate']->mysqlDatetime( FALSE ) ]['single'][ $event->id ] = $event;
} }
} }
else
{
$formattedEvents[ $occurrence['startDate']->mysqlDatetime( FALSE ) ]['single'][ $event->id ] = $event;
}
} }
} /* Otherwise we only want one instance of the event in our final array */
/* Otherwise we only want one instance of the event in our final array */ else
else {
{ $formattedEvents[] = $event;
$formattedEvents[] = $event; }
} }
} }
} }
@@ -400,6 +400,12 @@ class ICSParser
{ {
break; break;
} }
/* If recurring is blocked on this calendar, disable it */
if( !$calendar->calendar_bitoptions['bw_disable_recurring'] and isset( $event['recurr'] ) )
{
unset( $event['recurr'] );
}
/* Quickly, if we don't support the recurrence data provided let's just skip this event */ /* Quickly, if we don't support the recurrence data provided let's just skip this event */
if( isset( $event['recurr'] ) ) if( isset( $event['recurr'] ) )
@@ -0,0 +1,72 @@
<?php
/**
* @brief clearfeaturedevents Task
* @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}
* @since 03 Nov 2025
*/
namespace IPS\calendar\tasks;
use IPS\calendar\Event;
use IPS\Task;
use IPS\Task\Exception as TaskException;
use function defined;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* clearfeaturedevents Task
*/
class clearfeaturedevents extends Task
{
/**
* Execute
*
* If ran successfully, should return anything worth logging. Only log something
* worth mentioning (don't log "task ran successfully"). Return NULL (actual NULL, not '' or 0) to not log (which will be most cases).
* If an error occurs which means the task could not finish running, throw an \IPS\Task\Exception - do not log an error as a normal log.
* Tasks should execute within the time of a normal HTTP request.
*
* @return mixed Message to log or NULL
* @throws TaskException
*/
public function execute() : mixed
{
$log = "";
$featured = iterator_to_array( Event::featured( null ) );
foreach( $featured as $event )
{
/* @var Event $event */
if( $event->hasPassed() )
{
$event->setFeatured( false );
$log .= "Unfeatured event {$event->id}; ";
}
}
return $log ?: null;
}
/**
* Cleanup
*
* If your task takes longer than 15 minutes to run, this method
* will be called before execute(). Use it to clean up anything which
* may not have been done
*
* @return void
*/
public function cleanup() : void
{
}
}
+6 -6
View File
@@ -331,10 +331,10 @@ class Application extends SystemApplication
'tab' => 'cms', 'tab' => 'cms',
'module_url' => 'databases', 'module_url' => 'databases',
'controller' => 'records', 'controller' => 'records',
'do' => 'manage&database_id=' . $database['id'], 'do' => "&database_id={$database['id']}",
'restriction' => 'records_manage', 'restriction' => 'records_manage',
'restriction_module' => 'databases', 'restriction_module' => 'databases',
'menu_checks' => array( 'do' => 'manage', 'database_id' => $database['id'] ), 'menu_checks' => array( 'database_id' => $database['id'] ),
'menu_controller' => 'records_' . $database['id'] 'menu_controller' => 'records_' . $database['id']
); );
@@ -344,10 +344,10 @@ class Application extends SystemApplication
'tab' => 'cms', 'tab' => 'cms',
'module_url' => 'databases', 'module_url' => 'databases',
'controller' => 'categories', 'controller' => 'categories',
'do' => 'manage&database_id=' . $database['id'], 'do' => "&database_id={$database['id']}",
'restriction' => 'categories_manage', 'restriction' => 'categories_manage',
'restriction_module' => 'databases', 'restriction_module' => 'databases',
'menu_checks' => array( 'do' => 'manage', 'database_id' => $database['id'] ), 'menu_checks' => array( 'database_id' => $database['id'] ),
'menu_controller' => 'categories_' . $database['id'] 'menu_controller' => 'categories_' . $database['id']
); );
} }
@@ -356,10 +356,10 @@ class Application extends SystemApplication
'tab' => 'cms', 'tab' => 'cms',
'module_url' => 'databases', 'module_url' => 'databases',
'controller' => 'fields', 'controller' => 'fields',
'do' => 'manage&database_id=' . $database['id'], 'do' => "&database_id={$database['id']}",
'restriction' => 'cms_fields_manage', 'restriction' => 'cms_fields_manage',
'restriction_module' => 'databases', 'restriction_module' => 'databases',
'menu_checks' => array( 'do' => 'manage', 'database_id' => $database['id'] ), 'menu_checks' => array( 'database_id' => $database['id'] ),
'menu_controller' => 'fields_' . $database['id'] 'menu_controller' => 'fields_' . $database['id']
); );
+14 -2
View File
@@ -498,7 +498,7 @@
</div> </div>
</div> </div>
</article>]]></template> </article>]]></template>
<template template_key="database_category_articles_index" template_title="index" template_desc="" template_location="database" template_group="category_articles" template_params="$database, $articles, $url, $pagination" template_app="" template_type="template"><![CDATA[<header class='ipsPageHeader ipsBox ipsPull ipsPageHeader--category-articles'> <template template_key="database_category_articles_index" template_title="index" template_desc="" template_location="database" template_group="category_articles" template_params="$database, $articles, $url, $pagination, $filters=array()" template_app="" template_type="template"><![CDATA[<header class='ipsPageHeader ipsBox ipsPull ipsPageHeader--category-articles'>
<div class="ipsPageHeader__row"> <div class="ipsPageHeader__row">
<div class='ipsPageHeader__primary'> <div class='ipsPageHeader__primary'>
<h1 class='ipsPageHeader__title'>{$database->_title}</h1> <h1 class='ipsPageHeader__title'>{$database->_title}</h1>
@@ -529,6 +529,18 @@
</ul> </ul>
{{endif}} {{endif}}
{{if !empty( $filters )}}
<div class='ipsMessage ipsMessage--info'>
<div class='i-flex i-flex-wrap_wrap-reverse i-gap_2 i-align-items_center'>
<span>{lang="cms_database_filtered_by"}</span>
<a href='{$database->page->url()->csrf()->setQueryString( array( "do" => "clearFilters" ) )}' class='ipsButton ipsButton--soft ipsButton--small'>{lang="cms_database_filtered_clear"}</a>
</div>
{{foreach $filters as $id => $data}}
{$data['field']->_title} ({$data['value']})
{{endforeach}}
</div>
{{endif}}
{{if \count($articles)}} {{if \count($articles)}}
<section class='ipsBox ipsBox--cmsCategoryArticles ipsPull'> <section class='ipsBox ipsBox--cmsCategoryArticles ipsPull'>
<i-data> <i-data>
@@ -706,7 +718,7 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi
{{if $comment->author()->hasHighlightedReplies() || ( \IPS\IPS::classUsesTrait( $comment, 'IPS\Content\Reactable' ) and $comment->isHighlighted() ) OR $comment->isFeatured()}} {{if $comment->author()->hasHighlightedReplies() || ( \IPS\IPS::classUsesTrait( $comment, 'IPS\Content\Reactable' ) and $comment->isHighlighted() ) OR $comment->isFeatured()}}
<ul class='ipsBadges'> <ul class='ipsBadges'>
{{if $comment->author()->hasHighlightedReplies()}} {{if $comment->author()->hasHighlightedReplies()}}
<li><span class='ipsBadge ipsBadge--highlightedGroup'>{expression="\IPS\Member\Group::load( $comment->author()->member_group_id )->name" raw="true"}</span></li> <li><span class='ipsBadge ipsBadge--highlightedGroup'>{expression="\IPS\Member\Group::load( $comment->author()->highlightedGroup() )->name" raw="true"}</span></li>
{{endif}} {{endif}}
{{if $comment->isFeatured()}} {{if $comment->isFeatured()}}
<li><span class='ipsBadge ipsBadge--positive'>{lang="this_is_a_featured_post"}</span></li> <li><span class='ipsBadge ipsBadge--positive'>{lang="this_is_a_featured_post"}</span></li>
+19 -19
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<javascript app="cms"> <javascript app="cms">
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/blocks" javascript_name="ips.blocks.form.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000100"><![CDATA[/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/blocks" javascript_name="ips.blocks.form.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000100"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -67,7 +67,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/blocks" javascript_name="ips.blocks.navigation.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000050"><![CDATA[/** <file javascript_app="cms" javascript_location="front" javascript_path="controllers/blocks" javascript_name="ips.blocks.navigation.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000050"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -115,7 +115,7 @@
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/databases" javascript_name="ips.databases.download.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000150">/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/databases" javascript_name="ips.databases.download.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000150">/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -160,7 +160,7 @@
} }
}); });
}(jQuery, _));</file> }(jQuery, _));</file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/databases" javascript_name="ips.databases.form.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000150"><![CDATA[/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/databases" javascript_name="ips.databases.form.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000150"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -236,7 +236,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/external" javascript_name="ips.external.communication.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000150"><![CDATA[/** <file javascript_app="cms" javascript_location="front" javascript_path="controllers/external" javascript_name="ips.external.communication.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000150"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -371,7 +371,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/fields" javascript_name="ips.fields.form.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000200"><![CDATA[/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/fields" javascript_name="ips.fields.form.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000200"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -461,7 +461,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/media" javascript_name="ips.media.main.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000300"><![CDATA[/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/media" javascript_name="ips.media.main.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000300"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1100,7 +1100,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/pages" javascript_name="ips.pages.embed.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000250"><![CDATA[/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/pages" javascript_name="ips.pages.embed.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000250"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1135,7 +1135,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/pages" javascript_name="ips.pages.form.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000250"><![CDATA[/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/pages" javascript_name="ips.pages.form.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000250"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1257,7 +1257,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/records" javascript_name="ips.records.form.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000100"><![CDATA[/** <file javascript_app="cms" javascript_location="front" javascript_path="controllers/records" javascript_name="ips.records.form.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000100"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1369,7 +1369,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="front" javascript_path="controllers/records" javascript_name="ips.records.revisions.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000100">/** <file javascript_app="cms" javascript_location="front" javascript_path="controllers/records" javascript_name="ips.records.revisions.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000100">/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1424,7 +1424,7 @@
} }
}); });
}(jQuery, _));</file> }(jQuery, _));</file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.addForm.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000050">/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.addForm.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000050">/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1474,7 +1474,7 @@
} }
}); });
}(jQuery, _));</file> }(jQuery, _));</file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.conflict.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000050">/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.conflict.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000050">/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -1546,7 +1546,7 @@
} }
}); });
}(jQuery, _));</file> }(jQuery, _));</file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.fileEditor.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000050"><![CDATA[/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.fileEditor.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000050"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -2507,7 +2507,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.fileList.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000050"><![CDATA[/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.fileList.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000050"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -2799,7 +2799,7 @@
} }
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.main.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000050"><![CDATA[/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.main.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000050"><![CDATA[/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -2968,7 +2968,7 @@
}); });
}(jQuery, _));]]></file> }(jQuery, _));]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.variablesDialog.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000050">/** <file javascript_app="cms" javascript_location="admin" javascript_path="controllers/templates" javascript_name="ips.templates.variablesDialog.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000050">/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -3013,7 +3013,7 @@
} }
}); });
}(jQuery, _));</file> }(jQuery, _));</file>
<file javascript_app="cms" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.media.js" javascript_type="template" javascript_version="5001302" javascript_position="1000050"><![CDATA[ips.templates.set( 'templates.media.grid', "\ <file javascript_app="cms" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.media.js" javascript_type="template" javascript_version="5001403" javascript_position="1000050"><![CDATA[ips.templates.set( 'templates.media.grid', "\
<ul class='ipsGrid ipsGrid--pages-media'>\ <ul class='ipsGrid ipsGrid--pages-media'>\
{{{contents}}}\ {{{contents}}}\
</ul>\ </ul>\
@@ -3030,7 +3030,7 @@ ips.templates.set( 'templates.media.noSearchResults', "\
{{#lang}}mediaNoResults{{/lang}}\ {{#lang}}mediaNoResults{{/lang}}\
</div>\ </div>\
");]]></file> ");]]></file>
<file javascript_app="cms" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.templates.js" javascript_type="template" javascript_version="5001302" javascript_position="1000050"><![CDATA[/* TEMPLATE EDITOR TEMPLATES */ <file javascript_app="cms" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.templates.js" javascript_type="template" javascript_version="5001403" javascript_position="1000050"><![CDATA[/* TEMPLATE EDITOR TEMPLATES */
/* TEMPLATECEPTION */ /* TEMPLATECEPTION */
ips.templates.set('templates.editor.newTab', " \ ips.templates.set('templates.editor.newTab', " \
<a href='#' class='ipsTabs__tab' id='ipsTabs_elTemplateEditor_tabbar_tab_{{fileid}}' role='tab' aria-controls='ipsTabs_elTemplateEditor_tabbar_tab_{{fileid}}_panel' aria-selected='false' data-fileid='{{fileid}}' data-location='{{location}}'>{{title}} <span data-action='closeTab'><i class='fa-solid fa-xmark'></i></span></a>\ <a href='#' class='ipsTabs__tab' id='ipsTabs_elTemplateEditor_tabbar_tab_{{fileid}}' role='tab' aria-controls='ipsTabs_elTemplateEditor_tabbar_tab_{{fileid}}_panel' aria-selected='false' data-fileid='{{fileid}}' data-location='{{location}}'>{{title}} <span data-action='closeTab'><i class='fa-solid fa-xmark'></i></span></a>\
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<language> <language>
<app key="cms" version="5001302"> <app key="cms" version="5001403">
<word key="__app_cms" js="0">Pages</word> <word key="__app_cms" js="0">Pages</word>
<word key="menutab__cms" js="0">Pages</word> <word key="menutab__cms" js="0">Pages</word>
<word key="menutab__cms_icon" js="0">file</word> <word key="menutab__cms_icon" js="0">file</word>
+5 -1
View File
@@ -1241,7 +1241,11 @@
</div> </div>
]]></template> ]]></template>
<template template_group="widgets" template_name="Database" template_data="$database, $layout='table', $isCarousel=false" template_location="front" template_app="cms"><![CDATA[{database="$database->id" title="$database->title"}]]></template> <template template_group="widgets" template_name="Database" template_data="$database, $layout='table', $isCarousel=false" template_location="front" template_app="cms"><![CDATA[{database="$database->id" title="$database->title"}]]></template>
<template template_group="widgets" template_name="DatabaseFilters" template_data="$database, $category, $form, $layout='table', $isCarousel=false" template_location="front" template_app="cms"><![CDATA[<h3 class='ipsWidget__header'>{lang="block_DatabaseFilters_title" sprintf="$category->_title"}</h3> <template template_group="widgets" template_name="DatabaseFilters" template_data="$database, $category, $form, $layout='table', $isCarousel=false" template_location="front" template_app="cms"><![CDATA[{{if $category !== null}}
<h3 class='ipsWidget__header'>{lang="block_DatabaseFilters_title" sprintf="$category->_title"}</h3>
{{else}}
<h3 class='ipsWidget__header'>{lang="block_DatabaseFilters_title" sprintf="$database->_title"}</h3>
{{endif}}
<div class='ipsWidget__content'> <div class='ipsWidget__content'>
{$form|raw} {$form|raw}
</div> </div>
+18 -1
View File
@@ -275,6 +275,19 @@
"107799": "4.7.20 Beta 5", "107799": "4.7.20 Beta 5",
"107800": "4.7.20", "107800": "4.7.20",
"107801": "4.7.20", "107801": "4.7.20",
"107802": "4.7.20",
"107803": "4.7.20",
"107810": "4.7.21 Beta 1",
"107811": "4.7.21",
"107815": "4.7.22 Beta 1",
"107816": "4.7.22 Beta 2",
"107817": "4.7.22",
"107818": "4.7.22",
"107819": "4.7.22",
"107820": "4.7.22",
"107826": "4.7.23 Beta 1",
"107827": "4.7.23",
"107828": "4.7.23",
"500001": "5.0.0 Alpha 1", "500001": "5.0.0 Alpha 1",
"500002": "5.0.0 Alpha 2", "500002": "5.0.0 Alpha 2",
"5000003": "5.0.0 Alpha 3", "5000003": "5.0.0 Alpha 3",
@@ -397,5 +410,9 @@
"5001204": "5.0.12", "5001204": "5.0.12",
"5001300": "5.0.13 Beta 1", "5001300": "5.0.13 Beta 1",
"5001301": "5.0.13 Beta 2", "5001301": "5.0.13 Beta 2",
"5001302": "5.0.13" "5001302": "5.0.13",
"5001400": "5.0.14 Beta 1",
"5001401": "5.0.14 Beta 1",
"5001402": "5.0.14 Beta 2",
"5001403": "5.0.14"
} }
@@ -122,18 +122,15 @@ class Records extends SearchContentAbstract
*/ */
public function searchIndexPermissions(): string public function searchIndexPermissions(): string
{ {
if( $this->object instanceof BaseRecords ) $record = ( $this->object instanceof BaseComment ) ? $this->object->item() : $this->object;
{
/* We don't want to index items in databases with search disabled */
if( !$this->object::database()->search )
{
return '';
}
return $this->object->deleteLogPermissions(); /* We don't want to index items in databases with search disabled */
if( !$record::database()->search )
{
return '';
} }
return parent::searchIndexPermissions(); return $record->deleteLogPermissions();
} }
/** /**
@@ -92,7 +92,7 @@ class category extends Controller
try try
{ {
$category = $catClass::loadAndCheckPerms( Dispatcher::i()->categoryId ); $category = $catClass::loadAndCheckPerms( Dispatcher::i()->categoryId );
$category->saveFilterCookie( FALSE ); $category::database()->saveFilterCookie( false, $category );
Output::i()->redirect( $category->url(), 'cms_filters_cleared' ); Output::i()->redirect( $category->url(), 'cms_filters_cleared' );
} }
@@ -143,7 +143,7 @@ class category extends Controller
/* Check cookie */ /* Check cookie */
$where = array(); $where = array();
$cookie = $category->getFilterCookie(); $cookie = $category::database()->getFilterCookie( $category );
if ( $cookie !== NULL ) if ( $cookie !== NULL )
{ {
@@ -192,7 +192,7 @@ class category extends Controller
} }
} }
$where = $category->buildWhereFromCookie( $cookie ); $where = $category::database()->buildWhereFromCookie( $cookie, $category );
} }
else else
{ {
@@ -17,6 +17,7 @@ use IPS\cms\Categories;
use IPS\cms\Databases; use IPS\cms\Databases;
use IPS\cms\Databases\Controller; use IPS\cms\Databases\Controller;
use IPS\cms\Databases\Dispatcher; use IPS\cms\Databases\Dispatcher;
use IPS\cms\Fields;
use IPS\cms\Pages\Page; use IPS\cms\Pages\Page;
use IPS\cms\Records; use IPS\cms\Records;
use IPS\Content\Filter; use IPS\Content\Filter;
@@ -28,6 +29,7 @@ use IPS\Http\Url;
use IPS\Member; use IPS\Member;
use IPS\Output; use IPS\Output;
use IPS\Request; use IPS\Request;
use IPS\Session;
use IPS\Theme; use IPS\Theme;
use IPS\Xml\Rss; use IPS\Xml\Rss;
use OutOfRangeException; use OutOfRangeException;
@@ -47,6 +49,12 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
*/ */
class index extends Controller class index extends Controller
{ {
/**
* Store any active filters for this view
*
* @var array
*/
static public array $activeFilters = array();
/** /**
* Determine which method to load * Determine which method to load
@@ -139,13 +147,10 @@ class index extends Controller
$where = []; $where = [];
/** @var Categories $categoryClass */ $cookie = $database->getFilterCookie();
$categoryClass = 'IPS\cms\Categories' . $database->id;
$category = $categoryClass::load( $database->_default_category );
$cookie = $category->getFilterCookie();
if( $cookie !== null ) if( $cookie !== null )
{ {
$where = $category->buildWhereFromCookie( $cookie ); $where = $database->buildWhereFromCookie( $cookie );
} }
elseif( isset( Request::i()->advanced_search_submitted ) and Request::i()->advanced_search_submitted ) elseif( isset( Request::i()->advanced_search_submitted ) and Request::i()->advanced_search_submitted )
{ {
@@ -163,7 +168,59 @@ class index extends Controller
} }
if( count( $cookie ) ) if( count( $cookie ) )
{ {
$where = $category->buildWhereFromCookie( $cookie ); $where = $database->buildWhereFromCookie( $cookie );
}
}
/* Build the filters */
/* @var Fields $fieldClass */
$fieldClass = 'IPS\cms\Fields' . $database->id;
$customFields = $fieldClass::data( 'view', null, $fieldClass::FIELD_SKIP_TITLE_CONTENT );
if( $cookie !== null )
{
foreach( $cookie as $f => $v )
{
if( $f == 'cms_record_i_started' and Member::loggedIn()->member_id )
{
/* FilterMessage template only accepts \IPS\cms\Fields */
$field = new Fields;
$field->id = 'cms_record_i_started';
Member::loggedIn()->language()->words['content_field_cms_record_i_started'] = Member::loggedIn()->language()->addToStack( 'cms_record_i_started_sprintf', FALSE, array( 'sprintf' => $database->recordWord() ) );
static::$activeFilters['cms_record_i_started'] = array( 'field' => $field, 'value' => Member::loggedIn()->language()->addToStack('content_field_cms_record_i_started_on') );
}
else
{
$displayValue = $customFields[ $f ]->displayValue( $v );
if ( $customFields[ $f ]->type === 'Member' )
{
if ( ! empty( $v ) )
{
$newDisplayValue = array();
$concat = '\n';
if ( is_array( $v ) )
{
foreach( $v as $m )
{
$member = Member::load( $m );
$newDisplayValue[] = $member->name;
}
}
else
{
$member = Member::load( $v );
$newDisplayValue[] = $member->name;
}
$displayValue = implode( ', ', $newDisplayValue );
}
}
static::$activeFilters[ $f ] = array( 'field' => $customFields[ $f ], 'value' => $displayValue );
}
} }
} }
@@ -194,7 +251,7 @@ class index extends Controller
Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'database_index/featured.css', 'cms', 'front' ) ); Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'database_index/featured.css', 'cms', 'front' ) );
Output::i()->title = ( $page > 1 ) ? Member::loggedIn()->language()->addToStack( 'title_with_page_number', FALSE, array( 'sprintf' => array( $database->pageTitle(), $page ) ) ) : $database->pageTitle(); Output::i()->title = ( $page > 1 ) ? Member::loggedIn()->language()->addToStack( 'title_with_page_number', FALSE, array( 'sprintf' => array( $database->pageTitle(), $page ) ) ) : $database->pageTitle();
Dispatcher::i()->output .= Output::i()->output = \IPS\cms\Theme::i()->getTemplate( $database->template_featured, 'cms', 'database' )->index( $database, $articles, $url, $pagination ); Dispatcher::i()->output .= Output::i()->output = \IPS\cms\Theme::i()->getTemplate( $database->template_featured, 'cms', 'database' )->index( $database, $articles, $url, $pagination, static::$activeFilters );
} }
else else
{ {
@@ -275,4 +332,19 @@ class index extends Controller
Output::i()->breadcrumb[] = array( NULL, Member::loggedIn()->language()->addToStack( 'cms_select_category' ) ); Output::i()->breadcrumb[] = array( NULL, Member::loggedIn()->language()->addToStack( 'cms_select_category' ) );
Dispatcher::i()->output = Output::i()->output = Theme::i()->getTemplate( 'records' )->categorySelector( $form ); Dispatcher::i()->output = Output::i()->output = Theme::i()->getTemplate( 'records' )->categorySelector( $form );
} }
/**
* Clear any filters
*
* @return void
*/
public function clearFilters() : void
{
Session::i()->csrfCheck();
$database = Databases::load( Dispatcher::i()->databaseId );
$database->saveFilterCookie( false );
Output::i()->redirect( $database->page->url(), 'cms_filters_cleared' );
}
} }
@@ -0,0 +1,23 @@
{
"id": 107802,
"name": "4.7.20",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107803,
"name": "4.7.20",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107810,
"name": "4.7.21 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": true,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,7 @@
{
"added": [
"sitemap_databases_count"
],
"edited": [],
"removed": []
}
@@ -0,0 +1,23 @@
{
"id": 107811,
"name": "4.7.21",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107815,
"name": "4.7.22 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107816,
"name": "4.7.22 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107817,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107818,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107819,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107820,
"name": "4.7.22",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107826,
"name": "4.7.23 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107827,
"name": "4.7.23",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107828,
"name": "4.7.23",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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": 5001400,
"name": "5.0.14 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\/DatabaseFilters"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5001401,
"name": "5.0.14 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": 5001402,
"name": "5.0.14 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": 5001403,
"name": "5.0.14",
"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
}
@@ -2077,175 +2077,6 @@ class Categories extends Model implements Permissions
Index::i()->massUpdate( 'IPS\cms\Records\Comment' . static::database()->_id, $this->_id, NULL, $permissions, NULL, NULL, NULL, NULL, NULL, TRUE ); Index::i()->massUpdate( 'IPS\cms\Records\Comment' . static::database()->_id, $this->_id, NULL, $permissions, NULL, NULL, NULL, NULL, NULL, TRUE );
} }
} }
/**
* Get the filter cookie for this category
*
* @return array|null
*/
public function getFilterCookie(): ?array
{
if ( isset( Request::i()->cookie['cms_filters'] ) )
{
$saved = json_decode( Request::i()->cookie['cms_filters'], TRUE );
if ( array_key_exists( $this->id, $saved ) and count( $saved[ $this->id ] ) )
{
return $saved[ $this->id ];
}
}
return NULL;
}
/**
* Save filter cookie for this category
*
* @param array|bool $values Filter values to save (array) or FALSE to remove cookie
* @return void
*/
public function saveFilterCookie( array|bool $values ): void
{
$cookie = ( isset( Request::i()->cookie['cms_filters'] ) ) ? json_decode( Request::i()->cookie['cms_filters'], TRUE ) : array();
if ( $values === FALSE )
{
if ( array_key_exists( $this->id, $cookie ) )
{
unset( $cookie[ $this->id ] );
}
}
else
{
/* We only want to include ones where we have actually specified values to filter on */
$toSave = array();
foreach( $values AS $key => $data )
{
if ( is_numeric( $key ) or $key == 'cms_record_i_started' )
{
$toSave[$key] = $data;
}
}
$cookie[ $this->id ] = $toSave;
}
Request::i()->setCookie( 'cms_filters', json_encode( $cookie ), DateTime::create()->add( new DateInterval( 'P7D' ) ) );
}
/**
* Use the cookie to build filters
*
* @param array $cookie
* @return array
*/
public function buildWhereFromCookie( array $cookie ) : array
{
$where = [];
$database = static::database();
/** @var Fields $fieldClass */
$fieldClass = 'IPS\cms\Fields' . $database->id;
$customFields = $fieldClass::data( 'view', $this, $fieldClass::FIELD_SKIP_TITLE_CONTENT );
foreach( $cookie as $f => $v )
{
if ( $f == 'cms_record_i_started' and Member::loggedIn()->member_id )
{
$where[] = array( 'cms_custom_database_' . $database->id . '.member_id=' . Member::loggedIn()->member_id );
continue;
}
$k = 'content_field_' . $f;
if ( $customFields[ $f ]->type === 'Member' )
{
if ( ! empty( $v ) )
{
if ( is_array( $v ) )
{
foreach( $v as $m )
{
$member = Member::load( $m );
$where[] = [ "FIND_IN_SET( " . $member->member_id . ", REPLACE(field_" . $f . ", '\n',','))" ];
}
}
else
{
$member = Member::load( $v );
$where[] = [ "FIND_IN_SET( " . $member->member_id . ", REPLACE(field_" . $f . ", '\n',','))" ];
}
}
continue;
}
if ( isset( $customFields[ $f ] ) and $v !== '___any___' )
{
if ( is_array( $v ) )
{
if ( array_key_exists( 'start', $v ) or array_key_exists( 'end', $v ) )
{
$start = ( $v['start'] instanceof DateTime ) ? $v['start']->getTimestamp() : intval( $v['start'] );
$end = ( $v['end'] instanceof DateTime ) ? $v['end']->getTimestamp() : intval( $v['end'] );
if ( $start or $end )
{
$where[] = array( '( ' . mb_substr( $k, 8 ) . ' BETWEEN ' . $start . ' AND ' . $end . ' )' );
}
}
else
{
$like = array();
foreach( $v as $val )
{
if ( $val === 0 or ! empty( $val ) )
{
$like[] = $val;
}
}
if( $customFields[ $f ]->default_value and in_array( $customFields[ $f ]->default_value, $v ) )
{
$where[] = array( "( " . mb_substr( $k, 8 ) . " IS NULL OR " . Db::i()->findInSet( mb_substr( $k, 8 ), $like ) . ")" );
}
else
{
$where[] = array( Db::i()->findInSet( mb_substr( $k, 8 ), $like ) );
}
}
}
else
{
if ( is_bool( $v ) )
{
/* YesNo fields are false or true */
if ( $v === false )
{
$where[] = array( '(' . mb_substr( $k, 8 ) . ' IS NULL or ' . mb_substr( $k, 8 ) . '=0)' );
}
else
{
$where[] = array( mb_substr( $k, 8 ) . "=1" );
}
}
else
{
if ( $v !== 0 and ! $v )
{
$where[] = array( mb_substr( $k, 8 ) . " IS NULL" );
}
else
{
$where[] = array( mb_substr( $k, 8 ) . "=?", $v );
}
}
}
}
}
return $where;
}
/** /**
* [Node] Get meta description * [Node] Get meta description
@@ -13,12 +13,14 @@ namespace IPS\cms;
/* To prevent PHP errors (extending class does not exist) revealing path */ /* To prevent PHP errors (extending class does not exist) revealing path */
use DateInterval;
use Exception; use Exception;
use IPS\Application; use IPS\Application;
use IPS\cms\Pages\Page; use IPS\cms\Pages\Page;
use IPS\Content\Search\Index; use IPS\Content\Search\Index;
use IPS\Content\ViewUpdates; use IPS\Content\ViewUpdates;
use IPS\Data\Store; use IPS\Data\Store;
use IPS\DateTime;
use IPS\Db; use IPS\Db;
use IPS\Dispatcher; use IPS\Dispatcher;
use IPS\File; use IPS\File;
@@ -32,6 +34,7 @@ use IPS\Node\Permissions;
use IPS\Patterns\ActiveRecord; use IPS\Patterns\ActiveRecord;
use IPS\Patterns\ActiveRecordIterator; use IPS\Patterns\ActiveRecordIterator;
use IPS\Platform\Bridge; use IPS\Platform\Bridge;
use IPS\Request;
use IPS\Settings; use IPS\Settings;
use IPS\Task; use IPS\Task;
use IPS\Widget\Area; use IPS\Widget\Area;
@@ -1490,6 +1493,179 @@ class Databases extends Model implements Permissions
} }
} }
/**
* Get the filter cookie for this category/database
*
* @param Categories|null $category
* @return array|null
*/
public function getFilterCookie( ?Categories $category=null ): ?array
{
$key = $category ? $category->id : 'd' . $this->id;
if ( isset( Request::i()->cookie['cms_filters'] ) )
{
$saved = json_decode( Request::i()->cookie['cms_filters'], TRUE );
if ( array_key_exists( $key, $saved ) and count( $saved[ $key ] ) )
{
return $saved[ $key ];
}
}
return NULL;
}
/**
* Save filter cookie for this category
*
* @param array|bool $values Filter values to save (array) or FALSE to remove cookie
* @param Categories|null $category
* @return void
*/
public function saveFilterCookie( array|bool $values, ?Categories $category=null ): void
{
$key = $category ? $category->id : 'd' . $this->id;
$cookie = ( isset( Request::i()->cookie['cms_filters'] ) ) ? json_decode( Request::i()->cookie['cms_filters'], TRUE ) : array();
if ( $values === FALSE )
{
if ( array_key_exists( $key, $cookie ) )
{
unset( $cookie[ $key ] );
}
}
else
{
/* We only want to include ones where we have actually specified values to filter on */
$toSave = array();
foreach( $values AS $k => $v )
{
if ( is_numeric( $k ) or $k == 'cms_record_i_started' )
{
$toSave[ $k ] = $v;
}
}
$cookie[ $key ] = $toSave;
}
Request::i()->setCookie( 'cms_filters', json_encode( $cookie ), DateTime::create()->add( new DateInterval( 'P7D' ) ) );
}
/**
* Use the cookie to build filters
*
* @param array $cookie
* @param Categories|null $category
* @return array
*/
public function buildWhereFromCookie( array $cookie, ?Categories $category=null ) : array
{
$where = [];
/** @var Fields $fieldClass */
$fieldClass = 'IPS\cms\Fields' . $this->id;
$customFields = $fieldClass::data( 'view', $category, $fieldClass::FIELD_SKIP_TITLE_CONTENT );
foreach( $cookie as $f => $v )
{
if ( $f == 'cms_record_i_started' and Member::loggedIn()->member_id )
{
$where[] = array( 'cms_custom_database_' . $this->id . '.member_id=' . Member::loggedIn()->member_id );
continue;
}
$k = 'content_field_' . $f;
if ( $customFields[ $f ]->type === 'Member' )
{
if ( ! empty( $v ) )
{
if ( is_array( $v ) )
{
foreach( $v as $m )
{
$member = Member::load( $m );
$where[] = [ "FIND_IN_SET( " . $member->member_id . ", REPLACE(field_" . $f . ", '\n',','))" ];
}
}
else
{
$member = Member::load( $v );
$where[] = [ "FIND_IN_SET( " . $member->member_id . ", REPLACE(field_" . $f . ", '\n',','))" ];
}
}
continue;
}
if ( isset( $customFields[ $f ] ) and $v !== '___any___' )
{
if ( is_array( $v ) )
{
if ( array_key_exists( 'start', $v ) or array_key_exists( 'end', $v ) )
{
$start = ( $v['start'] instanceof DateTime ) ? $v['start']->getTimestamp() : intval( $v['start'] );
$end = ( $v['end'] instanceof DateTime ) ? $v['end']->getTimestamp() : intval( $v['end'] );
if ( $start or $end )
{
$where[] = array( '( ' . mb_substr( $k, 8 ) . ' BETWEEN ' . $start . ' AND ' . $end . ' )' );
}
}
else
{
$like = array();
foreach( $v as $val )
{
if ( $val === 0 or ! empty( $val ) )
{
$like[] = $val;
}
}
if( $customFields[ $f ]->default_value and in_array( $customFields[ $f ]->default_value, $v ) )
{
$where[] = array( "( " . mb_substr( $k, 8 ) . " IS NULL OR " . Db::i()->findInSet( mb_substr( $k, 8 ), $like ) . ")" );
}
else
{
$where[] = array( Db::i()->findInSet( mb_substr( $k, 8 ), $like ) );
}
}
}
else
{
if ( is_bool( $v ) )
{
/* YesNo fields are false or true */
if ( $v === false )
{
$where[] = array( '(' . mb_substr( $k, 8 ) . ' IS NULL or ' . mb_substr( $k, 8 ) . '=0)' );
}
else
{
$where[] = array( mb_substr( $k, 8 ) . "=1" );
}
}
else
{
if ( $v !== 0 and ! $v )
{
$where[] = array( mb_substr( $k, 8 ) . " IS NULL" );
}
else
{
$where[] = array( mb_substr( $k, 8 ) . "=?", $v );
}
}
}
}
}
return $where;
}
/** /**
* Get output for API * Get output for API
* *
+1 -1
View File
@@ -1241,7 +1241,7 @@ class Fields extends CustomField implements Permissions
*/ */
public function get_display_json(): array public function get_display_json(): array
{ {
return ( is_array( $this->_data['display_json'] ) ) ? $this->_data['display_json'] : json_decode( $this->_data['display_json'], TRUE ); return ( is_array( $this->_data['display_json'] ) ) ? $this->_data['display_json'] : ( isset( $this->_data['display_json'] ) ? json_decode( $this->_data['display_json'], TRUE ) : [] );
} }
/** /**
+14
View File
@@ -1268,6 +1268,13 @@ class Page extends Model implements Permissions
try try
{ {
$template = Templates::load( $key ); $template = Templates::load( $key );
/* If this is an empty file, don't bother loading it */
if( empty( $template->content ) )
{
continue;
}
$object = $template->_file_object; $object = $template->_file_object;
$return['js'][ $key ] = $object; $return['js'][ $key ] = $object;
@@ -1287,6 +1294,13 @@ class Page extends Model implements Permissions
try try
{ {
$template = Templates::load( $key ); $template = Templates::load( $key );
/* Skip if empty */
if( empty( $template->content ) )
{
continue;
}
$object = $template->_file_object; $object = $template->_file_object;
$return['css'][ $key ] = $object; $return['css'][ $key ] = $object;
+10 -2
View File
@@ -3771,7 +3771,11 @@ class Records extends Item implements
{ {
$title = ''; $title = '';
if( $prefix = static::database()->forum_prefix ) if ( $prefix = $this->container()->forum_prefix )
{
$title .= $prefix . ' ';
}
else if( $prefix = static::database()->forum_prefix )
{ {
$title .= $prefix . ' '; $title .= $prefix . ' ';
} }
@@ -3779,7 +3783,11 @@ class Records extends Item implements
$column = 'field_' . static::database()->field_title; $column = 'field_' . static::database()->field_title;
$title .= $this->$column; $title .= $this->$column;
if( $suffix = static::database()->forum_suffix ) if ( $suffix = $this->container()->forum_suffix )
{
$title .= ' ' . $suffix;
}
else if( $suffix = static::database()->forum_suffix )
{ {
$title .= ' ' . $suffix; $title .= ' ' . $suffix;
} }
+10
View File
@@ -71,6 +71,11 @@ class Codemirror extends Widget
{ {
$form = parent::configuration( $form ); $form = parent::configuration( $form );
if( !Dispatcher::i()->checkAcpPermission( 'theme_sets_manage', 'core', Module::get( 'core', 'customization', 'admin' ), true ) )
{
return $form;
}
$form->add( $form->add(
new Form\TextArea( new Form\TextArea(
'content', 'content',
@@ -111,6 +116,11 @@ class Codemirror extends Widget
*/ */
public function preConfig( array $values=array() ) : array public function preConfig( array $values=array() ) : array
{ {
if( !array_key_exists( 'content', $values ) )
{
$values['content'] = $this->configuration['content'];
}
$functionName = 'content_widget_' . $this->uniqueKey; $functionName = 'content_widget_' . $this->uniqueKey;
if ( isset( Store::i()->$functionName ) ) if ( isset( Store::i()->$functionName ) )
{ {
+29 -15
View File
@@ -13,6 +13,7 @@ namespace IPS\cms\widgets;
/* To prevent PHP errors (extending class does not exist) revealing path */ /* To prevent PHP errors (extending class does not exist) revealing path */
use DateInterval;
use Exception; use Exception;
use IPS\cms\Categories; use IPS\cms\Categories;
use IPS\cms\Databases; use IPS\cms\Databases;
@@ -85,7 +86,7 @@ class DatabaseFilters extends Widget
return ''; return '';
} }
if ( ! Dispatcher::i()->databaseId AND ! Dispatcher::i()->categoryId ) if ( ! Dispatcher::i()->databaseId )
{ {
return ''; return '';
} }
@@ -99,24 +100,36 @@ class DatabaseFilters extends Widget
{ {
return ''; return '';
} }
try $category = null;
if( isset( Dispatcher::i()->categoryId ) )
{ {
/* @var Categories $categoryClass */ try
$categoryClass = "IPS\cms\Categories" . Dispatcher::i()->databaseId; {
$category = $categoryClass::load( Dispatcher::i()->categoryId ); /* @var Categories $categoryClass */
$categoryClass = "IPS\cms\Categories" . Dispatcher::i()->databaseId;
$category = $categoryClass::load( Dispatcher::i()->categoryId );
}
catch ( OutOfRangeException $e )
{
return '';
}
} }
catch ( OutOfRangeException $e ) else
{ {
return ''; /* Is this the category view? */
if( $database->display_settings['index']['type'] == 'categories' or isset( Request::i()->show ) )
{
return '';
}
} }
/* @var Fields $fieldClass */ /* @var Fields $fieldClass */
$fieldClass = 'IPS\cms\Fields' . $database->id; $fieldClass = 'IPS\cms\Fields' . $database->id;
$fields = array(); $fields = array();
$cookie = $category->getFilterCookie(); $cookie = $database->getFilterCookie( $category );
$cookieValues = ( $cookie !== NULL ) ? array_combine( array_map( function( $k ) { return "field_" . $k; }, array_keys( $cookie ) ), $cookie ) : array(); $cookieValues = ( !empty( $cookie ) ) ? array_combine( array_map( function( $k ) { return "field_" . $k; }, array_keys( $cookie ) ), $cookie ) : array();
$databaseFields = $fieldClass::roots(); $databaseFields = $fieldClass::roots();
$urlValues = array(); $urlValues = array();
@@ -186,7 +199,8 @@ class DatabaseFilters extends Widget
if ( count( $fields ) ) if ( count( $fields ) )
{ {
$form = new Form( 'category_filters', 'update', $category->url() ); $baseUrl = $category ? $category->url() : $database->page->url();
$form = new Form( 'category_filters', 'update', $baseUrl );
$form->class = 'ipsForm--vertical ipsForm--database-widget-filters'; $form->class = 'ipsForm--vertical ipsForm--database-widget-filters';
if ( Request::i()->sortby ) if ( Request::i()->sortby )
{ {
@@ -233,7 +247,7 @@ class DatabaseFilters extends Widget
if ( $values = $form->values() ) if ( $values = $form->values() )
{ {
$url = $category->url()->setQueryString( array( 'advanced_search_submitted' => 1 ) ); $url = $baseUrl->setQueryString( array( 'advanced_search_submitted' => 1 ) );
$cookie = array(); $cookie = array();
$params = array(); $params = array();
foreach( $values as $k => $v ) foreach( $values as $k => $v )
@@ -308,13 +322,13 @@ class DatabaseFilters extends Widget
if ( $values['cms_widget_filters_remember'] ) if ( $values['cms_widget_filters_remember'] )
{ {
$category->saveFilterCookie( $cookie ); $database->saveFilterCookie( $cookie, $category );
Output::i()->redirect( $category->url() ); Output::i()->redirect( $baseUrl );
} }
else else
{ {
/* Remove the filter cookie */ /* Remove the filter cookie */
$category->saveFilterCookie( FALSE ); $database->saveFilterCookie( false, $category );
Output::i()->redirect( $url->setQueryString( $params ) ); Output::i()->redirect( $url->setQueryString( $params ) );
} }
} }
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<javascript app="convert"> <javascript app="convert">
<file javascript_app="convert" javascript_location="admin" javascript_path="controllers/convert" javascript_name="ips.convert.menu.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000100">/** <file javascript_app="convert" javascript_location="admin" javascript_path="controllers/convert" javascript_name="ips.convert.menu.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000100">/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
@@ -45,7 +45,7 @@
} }
} ); } );
}(jQuery, _));</file> }(jQuery, _));</file>
<file javascript_app="convert" javascript_location="admin" javascript_path="controllers/forms" javascript_name="ips.forms.reactionmapper.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000050">/** <file javascript_app="convert" javascript_location="admin" javascript_path="controllers/forms" javascript_name="ips.forms.reactionmapper.js" javascript_type="controller" javascript_version="5001403" javascript_position="1000050">/**
* Invision Community * Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
* *
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<language> <language>
<app key="convert" version="5001302"> <app key="convert" version="5001403">
<word key="__app_convert" js="0">Converter</word> <word key="__app_convert" js="0">Converter</word>
<word key="menu__convert_manage" js="0">Conversions</word> <word key="menu__convert_manage" js="0">Conversions</word>
<word key="menu__convert_manage_manage_start" js="0">Start New Conversion</word> <word key="menu__convert_manage_manage_start" js="0">Start New Conversion</word>
+18 -1
View File
@@ -275,6 +275,19 @@
"107799": "4.7.20 Beta 5", "107799": "4.7.20 Beta 5",
"107800": "4.7.20", "107800": "4.7.20",
"107801": "4.7.20", "107801": "4.7.20",
"107802": "4.7.20",
"107803": "4.7.20",
"107810": "4.7.21 Beta 1",
"107811": "4.7.21",
"107815": "4.7.22 Beta 1",
"107816": "4.7.22 Beta 2",
"107817": "4.7.22",
"107818": "4.7.22",
"107819": "4.7.22",
"107820": "4.7.22",
"107826": "4.7.23 Beta 1",
"107827": "4.7.23",
"107828": "4.7.23",
"500001": "5.0.0 Alpha 1", "500001": "5.0.0 Alpha 1",
"500002": "5.0.0 Alpha 2", "500002": "5.0.0 Alpha 2",
"5000003": "5.0.0 Alpha 3", "5000003": "5.0.0 Alpha 3",
@@ -397,5 +410,9 @@
"5001204": "5.0.12", "5001204": "5.0.12",
"5001300": "5.0.13 Beta 1", "5001300": "5.0.13 Beta 1",
"5001301": "5.0.13 Beta 2", "5001301": "5.0.13 Beta 2",
"5001302": "5.0.13" "5001302": "5.0.13",
"5001400": "5.0.14 Beta 1",
"5001401": "5.0.14 Beta 1",
"5001402": "5.0.14 Beta 2",
"5001403": "5.0.14"
} }
@@ -0,0 +1,23 @@
{
"id": 107802,
"name": "4.7.20",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107803,
"name": "4.7.20",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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": [],
"removed": []
},
"css": {
"added": [],
"edited": [
"admin\/convert.css"
],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,23 @@
{
"id": 107810,
"name": "4.7.21 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": 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 @@
{
"id": 107811,
"name": "4.7.21",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
Loaded 100 of 364 files, more files were not shown because too many files have changed in this diff. Show more