Version 5.0.13

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

No files matched your search

+1 -1
View File
@@ -93,7 +93,7 @@ class Application extends SystemApplication
$title = $member->language()->get( "blogs_blog_{$blog->id}" );
$document = Rss::newDocument( $blog->url(), $title, $blog->description );
$document = Rss::newDocument( $blog->url(), $title, $blog->description ?? '' );
foreach (Entry::getItemsWithPermission( array( array( 'entry_blog_id=?', $blog->id ), array( 'entry_status!=?', 'draft' ) ), 'entry_date DESC', 25, 'read', Filter::FILTER_PUBLIC_ONLY, 0, $member, FALSE, FALSE, FALSE, FALSE, NULL, $blog ) as $entry )
{
+1 -1
View File
@@ -1,6 +1,6 @@
{
"application_title": "Blogs",
"app_author": "",
"app_author": "Invision Power Services, Inc.",
"app_directory": "blog",
"app_protected": 0,
"app_website": null,
+3
View File
@@ -1,5 +1,8 @@
{
"core": {
"Club": {
"Blog": "IPS\\blog\\extensions\\core\\Club\\Blog"
},
"ContentRouter": {
"Blog": "IPS\\blog\\extensions\\core\\ContentRouter\\Blog"
},
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="blog">
<file javascript_app="blog" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.manageCategories.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000100"><![CDATA[/**
<file javascript_app="blog" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.manageCategories.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -277,7 +277,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="blog" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.view.js" javascript_type="template" javascript_version="5000074" javascript_position="1000050"><![CDATA[/* CLASS LIST TEMPLATES */
<file javascript_app="blog" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.view.js" javascript_type="template" javascript_version="5001302" javascript_position="1000050"><![CDATA[/* CLASS LIST TEMPLATES */
ips.templates.set('blog.view.addButton', "\
<li><button type=\"button\" class=\"ipsButton ipsButton--primary ipsHide\" data-action=\"addNew\">{{#lang}}manage_cats_new_row{{/lang}}</button></li>\
");
+2 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="blog" version="5000074">
<app key="blog" version="5001302">
<word key="__app_blog" js="0">Blogs</word>
<word key="frontnavigation_blogs" js="0">Blogs</word>
<word key="__indefart_blog_entry_comment" js="0">a comment on a blog entry</word>
@@ -11,6 +11,7 @@
<word key="__defart_blog_entry_plural" js="0">{!#[1:blog entry][?:blog entries]}</word>
<word key="blog_entry_container" js="0">blog</word>
<word key="blog_entry_pl_lc" js="0">blog entries</word>
<word key="blog_categories_sg" js="0">Blog Category</word>
<word key="module__blog_blogs" js="0">Blogs</word>
<word key="menu__blog_blogs" js="0">Blogs</word>
<word key="menu__blog_blogs_settings" js="0">Settings</word>
+176 -140
View File
@@ -22,7 +22,7 @@
{{endif}}
]]></template>
<template template_group="browse" template_name="featuredEntries" template_data="$featured" template_location="front" template_app="blog"><![CDATA[
<section class='ipsBox ipsPull'>
<section class='ipsBox ipsBox--featuredBlogEntries ipsPull'>
<header class='ipsBox__header'>
<h2>{lang="featured_entries"}</h2>
{template="carouselNavigation" group="global" app="core" params="'blogs-featured-entries'"}
@@ -33,7 +33,7 @@
{{foreach $featured as $entry}}
<article class='ipsData__item {$entry->ui( 'css' )} {{if $entry->hidden() OR $entry->status === 'draft'}}ipsModerated{{endif}}' {{if $entry->unread()}}data-ips-unread{{else}}data-ips-read{{endif}} {$entry->ui( 'dataAttributes' )}>
<a href='{$entry->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{lang="read_more_about" sprintf="$entry->name"}</span></a>
<a href="{$entry->url()}" title='{lang="read_more_about" sprintf="$entry->name"}' class='ipsData__image'>
<a href="{$entry->url()}" title='{lang="read_more_about" sprintf="$entry->name"}' class='ipsData__image' aria-hidden="true" tabindex="-1">
{{if $entry->cover_photo}}
<img src='{file="$entry->cover_photo" extension="blog_Entries"}' alt='' loading='lazy'>
{{else}}
@@ -123,7 +123,7 @@
{template="indexButtons" group="browse" params="$blogs, $viewMode, TRUE, $category"}
</div>
{{endif}}
<div class='ipsBox ipsPull'>
<div class='ipsBox ipsBox--blogIndex ipsPull'>
{$table|raw}
</div>]]></template>
<template template_group="browse" template_name="indexButtons" template_data="$blogs=array(), $viewMode=NULL, $forMobile=FALSE, $category=NULL" template_location="front" template_app="blog"><![CDATA[{{if \count( $blogs ) || \IPS\blog\Blog::canCreate()}}
@@ -131,14 +131,16 @@
{{if \count( $blogs )}}
{{if \count( $blogs ) > 1}}
<li>
<a href='{url="app=blog&module=blogs&controller=browse&page=1&filter=my_blogs&sortby=blog_last_edate" seoTemplate="blogs"}' data-ipsMenu id='elMyBlogs' class='ipsButton ipsButton--text'><span>{lang="my_blogs"}</span><i class='fa-solid fa-caret-down'></i></a>
<ul class='ipsMenu ipsMenu_normal ipsHide' id='elMyBlogs_menu'>
{{foreach $blogs as $blog}}
<li class='ipsMenu_item'>
<a href='{$blog->url()}'>{$blog->_title}</a>
</li>
{{endforeach}}
</ul>
<button type="button" id="elMyBlogs" popovertarget="elMyBlogs_menu" class='ipsButton ipsButton--text'><span>{lang="my_blogs"}</span><i class='fa-solid fa-caret-down'></i></button>
<i-dropdown popover id="elMyBlogs_menu">
<div class="iDropdown">
<ul class="iDropdown__items">
{{foreach $blogs as $blog}}
<li><a href='{$blog->url()}'>{$blog->_title}</a></li>
{{endforeach}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
{{if \IPS\blog\Blog::canCreate()}}
@@ -154,17 +156,20 @@
{{if \count( $blogs ) AND \IPS\blog\Blog::canOnAny( 'add' )}}
<li>
{{if \count( $blogs ) > 1}}
<a class="ipsButton ipsButton--primary" href="#elCreateEntry_menu" data-ipsMenu id='elCreateEntry'><span>{lang="add_entry"}</span><i class='fa-solid fa-caret-down'></i></a>
<ul class='ipsMenu ipsMenu_normal ipsHide' id='elCreateEntry_menu'>
<li class='ipsMenu_title'>{lang="add_entry_to"}</li>
{{foreach $blogs as $blog}}
{{if $blog->disabled != 1}}
<li class='ipsMenu_item'>
<a href='{url="app=blog&module=blogs&controller=submit&id={$blog->id}" seoTemplate="blog_submit"}'>{$blog->_title}</a>
</li>
{{endif}}
{{endforeach}}
</ul>
<button type="button" id="elCreateEntry" class='ipsButton ipsButton--primary' popovertarget="elCreateEntry_menu"><span>{lang="add_entry"}</span><i class='fa-solid fa-caret-down'></i></button>
<i-dropdown id="elCreateEntry_menu" popover>
<div class="iDropdown">
<ul class="iDropdown__items">
{{foreach $blogs as $blog}}
{{if $blog->disabled != 1}}
<li>
<a href='{url="app=blog&module=blogs&controller=submit&id={$blog->id}" seoTemplate="blog_submit"}'>{$blog->_title}</a>
</li>
{{endif}}
{{endforeach}}
</ul>
</div>
</i-dropdown>
{{else}}
{{foreach $blogs as $blog}}
{{if $blog->disabled != 1}}
@@ -204,7 +209,7 @@
{template="indexButtons" group="browse" params="$blogs, $viewMode, TRUE, $category"}
</div>
{{endif}}
<section class='ipsBox ipsPull'>
<section class='ipsBox ipsBox--blogIndexGrid ipsPull'>
{{if \count($entries)}}
<i-data>
<div class="ipsData ipsData--grid ipsData--blog-entries">
@@ -216,13 +221,17 @@
{{else}}
<p class="ipsEmptyMessage">{lang="no_entries_yet"}</p>
{{endif}}
</section>
{{if $pagination['pages'] > 1}}
{template="pagination" app="core" location="global" group="global" params="$pagination['url'], $pagination['pages'], $pagination['page'], $pagination['perpage'], TRUE, 'page'"}
{{endif}}]]></template>
{{if $pagination['pages'] > 1}}
<div class="ipsButtonBar ipsButtonBar--bottom">
<div class="ipsButtonBar__pagination" data-role="tablePagination">
{template="pagination" app="core" location="global" group="global" params="$pagination['url'], $pagination['pages'], $pagination['page'], $pagination['perpage'], TRUE, 'page'"}
</div>
</div>
{{endif}}
</section>]]></template>
<template template_group="browse" template_name="indexGridEntry" template_data="$entry, $primary=false, $table=false" template_location="front" template_app="blog"><![CDATA[<article class='ipsData__item {$entry->ui( 'css' )} {{if $entry->hidden() OR $entry->status === 'draft'}}ipsModerated{{endif}}' {{if $entry->unread()}}data-ips-unread{{else}}data-ips-read{{endif}} {$entry->ui( 'dataAttributes' )}>
<a href='{$entry->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{lang="read_more_about" sprintf="$entry->name"}</span></a>
<a href="{$entry->url()}" title='{lang="read_more_about" sprintf="$entry->name"}' class='ipsData__image'>
<a href="{$entry->url()}" title='{lang="read_more_about" sprintf="$entry->name"}' class='ipsData__image' aria-hidden="true" tabindex="-1" data-ips-hook='image'>
{{if $entry->cover_photo}}
<img src='{file="$entry->cover_photo" extension="blog_Entries"}' alt='' loading='lazy'>
{{else}}
@@ -230,17 +239,17 @@
{{endif}}
</a>
<div class='ipsData__content'>
<div class='ipsData__main'>
<div class='ipsData__main' data-ips-hook='main'>
{{if !\IPS\Request::i()->id}}
<div class='i-color_soft i-link-color_inherit i-font-weight_600'><a href="{$entry->container()->url()}">{$entry->container()->_title}</a></div>
{{elseif $entry->category_id}}
<div class="i-color_soft i-link-color_inherit i-font-weight_600"><a href="{$entry->category()->url()}">{$entry->category()->name}</a></div>
{{endif}}
<div class='ipsData__title'>
<div class='ipsData__title' data-ips-hook='title'>
{{if $entry->prefix()}}
{template="prefix" group="global" app="core" params="$entry->prefix( TRUE ), $entry->prefix()"}
{{endif}}
<div class='ipsBadges'>
<div class='ipsBadges' data-ips-hook='badges'>
{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}
</div>
{{if $entry->unread()}}
@@ -253,7 +262,7 @@
<section class='ipsData__desc'>{$entry->truncated(TRUE)|raw}</section>
</div>
<div class="ipsData__extra">
<ul class='ipsData__stats'>
<ul class='ipsData__stats' data-ips-hook='stats'>
{{foreach $entry->stats(TRUE) as $k => $v}}
<li data-stat-type="{$k}">
{{if $k === "comments"}}
@@ -266,7 +275,7 @@
</ul>
<div class='ipsData__last'>
{template="userPhoto" app="core" params="$entry->author(), 'fluid'" group="global"}
<ul class='ipsData__last-text'>
<ul class='ipsData__last-text' data-ips-hook='metadata'>
<li class='ipsData__last-primary'>
{{if $entry->category_id}}
{lang="entry_name_with_cat" htmlsprintf="$entry->author()->link(),$entry->category()->link()"}
@@ -291,7 +300,7 @@
<li class='ipsData__blog-item ipsColumns ipsColumns--lines'>
<div class='ipsColumns__secondary i-basis_380 i-background_2 i-text-align_center cBlogInfo {$blog->ui( 'css' )}' {$blog->ui( 'dataAttributes' )}>
<a href='{$blog->url()}' class='ipsCoverPhoto ipsCoverPhoto--blog-listing' data-url="{$blog->url()->csrf()}" style='--offset:{$coverPhoto->offset}' aria-hidden="true" tabindex="-1">
<a href='{$blog->url()}' class='ipsCoverPhoto ipsCoverPhoto--blog-listing' data-url="{$blog->url()->csrf()}" style='--offset:{$coverPhoto->offset}' aria-hidden="true" tabindex="-1" data-ips-hook='image'>
{{if $coverPhoto->file}}
<div class='ipsCoverPhoto__container'>
<img src='{$coverPhoto->file->url}' class='ipsCoverPhoto__image' alt='' loading='lazy'>
@@ -305,11 +314,11 @@
<div class='i-padding_3'>
<h3 class='ipsTitle ipsTitle--h3'>
<h3 class='ipsTitle ipsTitle--h3' data-ips-hook='title'>
<a href='{$blog->url()}' title='{lang="go_to_blog" sprintf="$blog->_title"}'>{$blog->_title}</a>
</h3>
<div class='i-font-weight_500 i-color_soft i-margin-top_1'>
<div class='i-font-weight_500 i-color_soft i-margin-top_1' data-ips-hook='metadata'>
{{if $blog->owner() instanceof \IPS\Member}}
{lang="blog_by" htmlsprintf="$blog->owner()->link(), $blog->category()->link()"}
{{elseif $club = $blog->club()}}
@@ -319,7 +328,7 @@
{{endif}}
</div>
<ul class='ipsList ipsList--stacked ipsList--fill i-margin-top_3'>
<ul class='ipsList ipsList--stacked ipsList--fill i-margin-top_3' data-ips-hook='stats'>
<li><span class="ipsList__value">{$blog->_items}</span> <span class="ipsList__label">{lang="blog_entries" pluralize="$blog->_items"}</span></li>
<li><span class="ipsList__value">{$blog->_comments}</span> <span class="ipsList__label">{lang="blog_comments" pluralize="$blog->_comments"}</span></li>
<li><span class="ipsList__value">{$blog->num_views}</span> <span class="ipsList__label">{lang="blog_views" pluralize="$blog->num_views"}</span></li>
@@ -336,10 +345,10 @@
<div class='i-flex'>
<div class='i-flex_11'>
<div class='ipsTitle ipsTitle--h4'>
<div class='ipsTitle ipsTitle--h4' data-ips-hook='lastEntryTitle'>
{$blog->latestEntry()->caption}
<div class='ipsBadges'>
<div class='ipsBadges' data-ips-hook='lastEntryBadges'>
{{foreach $blog->latestEntry()->badges() as $badge}}{$badge|raw}{{endforeach}}
</div>
@@ -352,7 +361,7 @@
</a>
</h3>
</div>
<div class='ipsPhotoPanel ipsPhotoPanel--small i-margin-top_1 i-margin-bottom_2'>
<div class='ipsPhotoPanel ipsPhotoPanel--small i-margin-top_1 i-margin-bottom_2' data-ips-hook='lastEntryMetaData'>
{template="userPhoto" app="core" params="$blog->latestEntry()->author(), ''" group="global"}
<div class='ipsPhotoPanel__text'>
<p class='i-color_soft i-link-color_inherit'>{lang="latest_entry_by" htmlsprintf="trim( $blog->latestEntry()->author()->link() )"} {datetime="$blog->latestEntry()->date"}</p>
@@ -375,9 +384,9 @@
{{$recentEntries = iterator_to_array( $blog->_recentEntries );}}
{{if \count( $recentEntries ) > 1}}
<h4 class='ipsTitle ipsTitle--h5 ipsTitle--margin i-margin-top_4'>{lang="recent_entries"}</h4>
<ul class='ipsBlogs__blog-listing-entries'>
<ul class='ipsBlogs__blog-listing-entries' data-ips-hook='recentEntries'>
{{foreach $recentEntries as $entry}}
<li>
<li class="{$entry->ui('css')}" {$entry->ui('dataAttributes')}>
{template="userPhoto" app="core" params="$entry->author(), 'fluid'" group="global"}
<div class='i-flex_11 i-flex i-gap_2 i-row-gap_0 i-flex-wrap_wrap'>
<h4 class='{{if $entry->unread()}}font-weight_700{{else}}i-font-weight_500{{endif}} i-flex_11'>
@@ -389,7 +398,7 @@
</a>
</h4>
{{if !( $blog->owner() instanceof \IPS\Member )}}
<p class='i-font-size_-1 i-color_soft'>{lang="byline_name_date" htmlsprintf="trim( $blog->latestEntry()->author()->link() ), \IPS\DateTime::ts( $blog->latestEntry()->date )->html(TRUE)"} {datetime=""}</p>
<p class='i-font-size_-1 i-color_soft'>{lang="byline_name_date" htmlsprintf="trim( $blog->latestEntry()->author()->link() ), \IPS\DateTime::ts( $blog->latestEntry()->date )->html(TRUE)"}</p>
{{endif}}
</div>
</li>
@@ -418,7 +427,7 @@
</ul>
</i-data>]]></template>
<template template_group="global" template_name="blogCategoryLink" template_data="$category" template_location="front" template_app="blog"><![CDATA[<a href="{$category->url()}">{$category->_title}</a>]]></template>
<template template_group="global" template_name="categoryLink" template_data="$category" template_location="front" template_app="blog"><![CDATA[<a href="{$category->url()}" class="i-font-weight_600">{$category->name}</a>]]></template>
<template template_group="global" template_name="categoryLink" template_data="$category" template_location="front" template_app="blog"><![CDATA[<a href="{$category->url()}">{$category->name}</a>]]></template>
<template template_group="global" template_name="commentTableHeader" template_data="$comment, $entry" template_location="front" template_app="blog"><![CDATA[<!-- This template is used when viewing Profile > See my activity > Blog Entries -->
<div class='i-flex i-gap_2'>
<div class='i-flex_00 i-basis_40'>
@@ -721,7 +730,7 @@
</section>]]></template>
<template template_group="view" template_name="blogHeader" template_data="$blog, $showCover=true" template_location="front" template_app="blog"><![CDATA[
{{if $showCover}}
<div id='elBlogHeader' class='ipsPageHeader ipsBox ipsPull'>
<div id='elBlogHeader' class='ipsPageHeader ipsBox ipsBox--blogHeader ipsPull'>
{$blog->coverPhoto()|raw}
{{if !( $blog->owner() instanceof \IPS\Member ) and \count( $blog->contributors() ) AND $showCover}}
@@ -741,7 +750,7 @@
</div>
{{else}}
<div id='elBlogHeaderStats' class='ipsBox ipsPull ipsCoverPhotoMeta'>
<div id='elBlogHeaderStats' class='ipsBox ipsBox--blogHeader ipsPull ipsCoverPhotoMeta' data-ips-hook='header'>
{{if ( $blog->owner() instanceof \IPS\Member ) && \IPS\Request::i()->module == 'view'}}
<div class='ipsCoverPhoto__avatar'>
@@ -751,14 +760,14 @@
<div class='ipsCoverPhoto__titles'>
<div class='ipsCoverPhoto__title'>
<h1>
<h1 data-ips-hook='title'>
<a href='{$blog->url()}' title='{lang="go_to_blog" sprintf="$blog->_title"}'>{$blog->_title}</a>
</h1>
{{if $blog->pinned}}
<span class="ipsBadge ipsBadge--icon ipsBadge--positive" data-ipsTooltip title='{lang="pinned"}'><i class='fa-solid fa-thumbtack'></i></span>
{{endif}}
</div>
<div class='ipsCoverPhoto__subTitle'>
<div class='ipsCoverPhoto__subTitle' data-ips-hook='headerMetaData'>
{{if $blog->owner() instanceof \IPS\Member}}
{lang="blog_by" htmlsprintf="$blog->owner()->link(), $blog->category()->link()"}
{{elseif $club = $blog->club()}}
@@ -768,7 +777,7 @@
{{endif}}
</div>
</div>
<ul class='ipsCoverPhoto__stats'>
<ul class='ipsCoverPhoto__stats' data-ips-hook='headerStats'>
<li>
<h4 class='ipsCoverPhoto__statTitle'>{lang="blog_entries" pluralize="$blog->_items"}</h4>
<span class='ipsCoverPhoto__statValue'>{number="$blog->_items"}</span>
@@ -802,7 +811,7 @@
</div>
</div>
</div>]]></template>
<template template_group="view" template_name="blogTable" template_data="$table, $headers, $rows, $quickSearch" template_location="front" template_app="blog"><![CDATA[<section class='ipsBox ipsPull' data-baseurl='{$table->baseUrl}' data-resort='{$table->resortKey}' data-controller='core.global.core.table{{if $table->canModerate()}},core.front.core.moderation{{endif}}' id='elTable_{$table->uniqueId}'>
<template template_group="view" template_name="blogTable" template_data="$table, $headers, $rows, $quickSearch" template_location="front" template_app="blog"><![CDATA[<section class='ipsBox ipsBox--blogTable ipsPull' data-baseurl='{$table->baseUrl}' data-resort='{$table->resortKey}' data-controller='core.global.core.table{{if $table->canModerate()}},core.front.core.moderation{{endif}}' id='elTable_{$table->uniqueId}'>
{{if $table->title}}
<h2 class='ipsInvisible'>{lang="$table->title"}</h2>
{{endif}}
@@ -819,18 +828,22 @@
{{if ( isset( $table->sortOptions ) and !empty( $table->sortOptions ) ) OR $table->advancedSearch}}
<li>
{{if isset($table->sortOptions) }}
<a href="#elSortByMenu_menu" class='ipsDataFilters__button' id="elSortByMenu_{$table->uniqueId}" rel="nofollow" data-role="sortButton" data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active" data-ipsMenu-selectable="radio"><span>{lang="sort_by"}</span><i class="fa-solid fa-caret-down"></i></a>
<ul class="ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide" id="elSortByMenu_{$table->uniqueId}_menu">
{{$custom = TRUE;}}
{{foreach $table->sortOptions as $k => $col}}
<li class="ipsMenu_item {{if $col === $table->sortBy}}{{$custom = FALSE;}}ipsMenu_itemChecked{{endif}}" data-ipsMenuValue="{$col}" data-sortDirection='{$table->getSortDirection( $col )}'><a href="{$table->baseUrl->setQueryString( array( 'filter' => $table->filter, 'sortby' => $col, 'sortdirection' => $table->getSortDirection( $col ) ) )->setPage('page',1)}" rel="nofollow">{lang="{$table->langPrefix}sort_{$k}"}</a></li>
{{endforeach}}
{{if $table->advancedSearch}}
<li class="ipsMenu_item {{if $custom}}ipsMenu_itemChecked{{endif}}" data-noSelect="true">
<a href='{$table->baseUrl->setQueryString( array( 'advancedSearchForm' => '1', 'filter' => $table->filter, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )}' data-ipsDialog data-ipsDialog-title='{lang="custom_sort"}' rel="nofollow">{lang="custom"}</a>
</li>
{{endif}}
</ul>
<button type="button" id="elSortByMenu_{$table->uniqueId}" class='ipsDataFilters__button' popovertarget="elSortByMenu_{$table->uniqueId}_menu" data-role="sortButton"><span>{lang="sort_by"}</span><i class="fa-solid fa-caret-down"></i></button>
<i-dropdown id="elSortByMenu_{$table->uniqueId}_menu" popover data-i-dropdown-selectable="radio">
<div class="iDropdown">
<ul class="iDropdown__items">
{{$custom = TRUE;}}
{{foreach $table->sortOptions as $k => $col}}
<li><a href="{$table->baseUrl->setQueryString( array( 'filter' => $table->filter, 'sortby' => $col, 'sortdirection' => $table->getSortDirection( $col ) ) )->setPage('page',1)}" rel="nofollow" {{if $col === $table->sortBy}}{{$custom = FALSE;}}aria-selected="true"{{endif}} data-ipsMenuValue="{$col}" data-sortDirection='{$table->getSortDirection( $col )}'><i class="iDropdown__input"></i>{lang="{$table->langPrefix}sort_{$k}"}</a></li>
{{endforeach}}
{{if $table->advancedSearch}}
<li>
<a href='{$table->baseUrl->setQueryString( array( 'advancedSearchForm' => '1', 'filter' => $table->filter, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )}' data-ipsDialog data-ipsDialog-title='{lang="custom_sort"}' rel="nofollow" {{if $custom}}aria-selected="true"{{endif}} data-i-dropdown-noselect><i class="iDropdown__input"></i>{lang="custom"}</a>
</li>
{{endif}}
</ul>
</div>
</i-dropdown>
{{elseif $table->advancedSearch}}
<a href='{$table->baseUrl->setQueryString( array( 'advancedSearchForm' => '1', 'filter' => $table->filter, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )}' data-ipsDialog data-ipsDialog-title='{lang="custom_sort"}' rel="nofollow">{lang="custom"}</a>
{{endif}}
@@ -838,36 +851,45 @@
{{endif}}
{{if !empty( $table->filters )}}
<li>
<a href="#elFilterByMenu_menu" class='ipsDataFilters__button' data-role="tableFilterMenu" id="elFilterByMenu_{$table->uniqueId}" data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active" data-ipsMenu-selectable="radio"><span>{lang="filter_by"}</span><i class="fa-solid fa-caret-down"></i></a>
<ul class='ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide' id='elFilterByMenu_{$table->uniqueId}_menu'>
<li data-action="tableFilter" data-ipsMenuValue='{$k}' class='ipsMenu_item {{if !$table->filter}}ipsMenu_itemChecked{{endif}}'>
<a href='{$table->baseUrl->setQueryString( array( 'filter' => '', 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )->setPage('page',1)}' rel="nofollow">{lang="{$table->langPrefix}all"}</a>
</li>
{{foreach $table->filters as $k => $q}}
<li data-action="tableFilter" data-ipsMenuValue='{$k}' class='ipsMenu_item {{if $k === $table->filter}}ipsMenu_itemChecked{{endif}}'>
<a href='{$table->baseUrl->setQueryString( array( 'filter' => $k, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirections ) )->setPage('page',1)}' rel="nofollow">{lang="{$table->langPrefix}{$k}"}</a>
</li>
{{endforeach}}
</ul>
<button type="button" id="elFilterByMenu_{$table->uniqueId}" class='ipsDataFilters__button' popovertarget="elFilterByMenu_{$table->uniqueId}_menu" data-role="tableFilterMenu"><span>{lang="filter_by"}</span><i class="fa-solid fa-caret-down"></i></button>
<i-dropdown id="elFilterByMenu_{$table->uniqueId}_menu" popover data-i-dropdown-selectable="radio">
<div class="iDropdown">
<ul class="iDropdown__items">
<li>
<a href='{$table->baseUrl->setQueryString( array( 'filter' => '', 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )->setPage('page',1)}' rel="nofollow" data-action="tableFilter" data-ipsMenuValue='{$k}' {{if !$table->filter}}aria-selected="true"{{endif}}><i class="iDropdown__input"></i>{lang="{$table->langPrefix}all"}</a>
</li>
<li><hr></li>
{{foreach $table->filters as $k => $q}}
<li>
<a href='{$table->baseUrl->setQueryString( array( 'filter' => $k, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirections ) )->setPage('page',1)}' rel="nofollow" data-action="tableFilter" data-ipsMenuValue='{$k}' {{if $k === $table->filter}}aria-selected="true"{{endif}}><i class="iDropdown__input"></i>{lang="{$table->langPrefix}{$k}"}</a>
</li>
{{endforeach}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
{{if $table->canModerate()}}
<li>
<a class="ipsJS_show ipsDataFilters__button" href="#elCheck_menu" id="elCheck_{$table->uniqueId}" title='{lang="{$table->langPrefix}select_rows_tooltip"}' data-ipsTooltip data-ipsAutoCheck data-ipsAutoCheck-context="#elTable_{$table->uniqueId}" data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active">
<button type="button" id="elCheck_{$table->uniqueId}" class='ipsDataFilters__button' popovertarget="elCheck_{$table->uniqueId}_menu" title='{lang="{$table->langPrefix}select_rows_tooltip"}' data-ipsTooltip data-ipsAutoCheck data-ipsAutoCheck-context="#elTable_{$table->uniqueId}">
<span class="cAutoCheckIcon"><i class="fa-regular fa-square"></i></span> <i class="fa-solid fa-caret-down"></i>
<span class='ipsNotification' data-role='autoCheckCount'>0</span>
</a>
<ul class="ipsMenu ipsMenu_auto ipsMenu_withStem ipsHide" id="elCheck_{$table->uniqueId}_menu">
<li class="ipsMenu_title">{lang="{$table->langPrefix}select_rows"}</li>
<li class="ipsMenu_item" data-ipsMenuValue="all"><a href="#">{lang="all"}</a></li>
<li class="ipsMenu_item" data-ipsMenuValue="none"><a href="#">{lang="none"}</a></li>
{{if \count($table->getFilters())}}
<li class="ipsMenu_sep"><hr></li>
{{foreach $table->getFilters() as $filter}}
<li class="ipsMenu_item" data-ipsMenuValue="{$filter}"><a href="#">{lang="$filter"}</a></li>
{{endforeach}}
{{endif}}
</ul>
</button>
<i-dropdown id="elCheck_{$table->uniqueId}_menu" popover data-i-dropdown-selectable="radio">
<div class="iDropdown">
<ul class="iDropdown__items">
<li class="iDropdown__title">{lang="{$table->langPrefix}select_rows"}</li>
<li><button type="button" data-ipsMenuValue="all"><i class="iDropdown__input"></i>{lang="all"}</button></li>
<li><button type="button" data-ipsMenuValue="none"><i class="iDropdown__input"></i>{lang="none"}</button></li>
{{if \count($table->getFilters())}}
<li><hr></li>
{{foreach $table->getFilters() as $filter}}
<li><button type="button" data-ipsMenuValue="{$filter}"><i class="iDropdown__input"></i>{lang="$filter"}</button></li>
{{endforeach}}
{{endif}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
</ul>
@@ -969,11 +991,11 @@
</section>]]></template>
<template template_group="view" template_name="blogViewLarge" template_data="$entry, $table, $first = FALSE" template_location="front" template_app="blog"><![CDATA[
<article class='cBlogView_entry i-border-bottom_3 {{if $entry->hidden()}}ipsModerated{{endif}} {$entry->ui( 'css' )}' data-controller="core.front.core.lightboxedImages" {$entry->ui( 'dataAttributes' )}>
<header class='i-background_2 i-border-bottom_3 i-padding_2'>
<header class='i-background_2 i-border-bottom_3 i-padding_2' data-ips-hook='header'>
<div class="ipsPhotoPanel">
{template="userPhoto" app="core" params="$entry->author()" group="global"}
<div>
<h2 class='ipsTitle ipsTitle--h4'>
<h2 class='ipsTitle ipsTitle--h4' data-ips-hook='title'>
{$entry->caption}
{{if $entry->prefix()}}
{template="prefix" group="global" app="core" params="$entry->prefix( TRUE ), $entry->prefix()"}
@@ -984,9 +1006,9 @@
{{endif}}
{{if $entry->canEdit()}}<span data-role="editableTitle">{$entry->name}</span>{{else}}{$entry->name}{{endif}}
</a>
<div class="ipsBadges">{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}</div>
<div class="ipsBadges" data-ips-hook='badges'>{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}</div>
</h2>
<ul class='ipsList ipsList--sep i-color_soft i-link-color_inherit'>
<ul class='ipsList ipsList--sep i-color_soft i-link-color_inherit' data-ips-hook='metadata'>
<li>{lang="byline" htmlsprintf="$entry->author()->link()"}</li>
<li>{datetime="$entry->date"}</li>
{{if $entry->category_id}}
@@ -1009,7 +1031,7 @@
<div>
<strong><a href='{$entry->url( "getPrefComment" )}' title="{lang="read_more_about" sprintf="$entry->name"}">{lang="read_more"}</a></strong>
</div>
<ul class='i-margin-start_auto ipsList ipsList--inline i-gap_3 i-row-gap_1'>
<ul class='i-margin-start_auto ipsList ipsList--inline i-gap_3 i-row-gap_1' data-ips-hook='stats'>
<li class="i-margin-end_auto"></li>
{{if \IPS\Settings::i()->blog_enable_rating}}
<li>{template="rating" app="core" params="'small', $entry->averageRating(), 5, $entry->memberRating()" group="global"}</li>
@@ -1029,11 +1051,11 @@
<template template_group="view" template_name="blogViewMedium" template_data="$entry, $table" template_location="front" template_app="blog"><![CDATA[
<!-- This template is used when viewing Profile > See my activity > Blog Entries -->
<article class='cBlogView_entry {{if $entry->hidden()}}ipsModerated{{endif}} {$entry->ui( 'css' )}' data-controller="core.front.core.lightboxedImages" {$entry->ui( 'dataAttributes' )}>
<header class='ipsPhotoPanel ipsPhotoPanel--mini'>
<header class='ipsPhotoPanel ipsPhotoPanel--mini' data-ips-hook='header'>
{template="userPhoto" app="core" params="$entry->author(), 'mini'" group="global"}
<div>
<h2 class='ipsTitle ipsTitle--h5'>
<div class="ipsBadges">
<h2 class='ipsTitle ipsTitle--h5' data-ips-hook='title'>
<div class="ipsBadges" data-ips-hook='badges'>
{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}
{{if $entry->prefix()}}
{template="prefix" group="global" app="core" params="$entry->prefix( TRUE ), $entry->prefix()"}
@@ -1046,7 +1068,7 @@
{$entry->name}
</a>
</h2>
<p class='i-color_soft i-link-color_inherit'>
<p class='i-color_soft i-link-color_inherit' data-ips-hook='metadata'>
{{if $entry->category_id}}<span class="i-color_hard i-font-weight_600">{$entry->category()->name}</span>{{endif}} &middot; {lang="byline_name_date" htmlsprintf="$entry->author()->link(), \IPS\DateTime::ts( $entry->date )"}
</p>
</div>
@@ -1057,7 +1079,7 @@
</section>
<div class="i-flex i-align-items_center i-flex-wrap_wrap i-gap_2">
<ul class='ipsList ipsList--inline i-flex_11'>
<ul class='ipsList ipsList--inline i-flex_11' data-ips-hook='stats'>
{{if $table->canModerate()}}
<li>
{{$idField = $entry::$databaseColumnId;}}
@@ -1166,7 +1188,7 @@
{{endif}}
<div class='ipsCoverPhoto__titles'>
<div class='ipsCoverPhoto__title'>
<div class='ipsCoverPhoto__title' data-ips-hook='title'>
<h1>
<a href='{$blog->url()}' title='{lang="go_to_blog" sprintf="$blog->_title"}'>{$blog->_title}</a>
</h1>
@@ -1174,7 +1196,7 @@
<span class="ipsBadge ipsBadge--icon ipsBadge--positive" data-ipsTooltip title='{lang="pinned"}'><i class='fa-solid fa-thumbtack'></i></span>
{{endif}}
</div>
<div class='ipsCoverPhoto__subTitle'>
<div class='ipsCoverPhoto__subTitle' data-ips-hook='metadata'>
{{if $blog->owner() instanceof \IPS\Member}}
{lang="blog_by" htmlsprintf="$blog->owner()->link(), $blog->category()->link()"}
{{elseif $club = $blog->club()}}
@@ -1184,7 +1206,7 @@
{{endif}}
</div>
</div>
<ul class='ipsCoverPhoto__stats'>
<ul class='ipsCoverPhoto__stats' data-ips-hook='stats'>
<li>
<h4 class='ipsCoverPhoto__statTitle'>{lang="blog_entries" pluralize="$blog->_items"}</h4>
<span class='ipsCoverPhoto__statValue'>{number="$blog->_items"}</span>
@@ -1198,7 +1220,7 @@
<span class='ipsCoverPhoto__statValue'>{number="$blog->num_views"}</span>
</li>
</ul>
<div class='ipsCoverPhoto__buttons'>
<div class='ipsCoverPhoto__buttons' data-ips-hook='buttons'>
{template="follow" app="core" group="global" params="'blog', 'blog', $blog->_id, \IPS\blog\Entry::containerFollowerCount( $blog )"}
</div>
</div>]]></template>
@@ -1218,26 +1240,26 @@
{template="contentItemMessages" group="global" app="core" params="$entry->getMessages(), $entry"}
<article class='ipsBox ipsPull' data-ips-hook="entry__blog">
<article class='ipsBox ipsBox--blogEntry ipsPull' data-ips-hook="entry__blog">
<header class='ipsPageHeader'>
{{if $entry->coverPhoto()}}
{$entry->coverPhoto()|raw}
{{endif}}
<div class='ipsPageHeader__row'>
<div class='ipsPageHeader__primary'>
<div class='ipsPageHeader__primary' data-ips-hook='header'>
<div class='ipsPageHeader__title' data-ips-hook="contentTitle__blog">
<div class='ipsBadges'>
<div class='ipsBadges' data-ips-hook='badges'>
{{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}}
</div>
<h1>
{{if $entry->canEdit()}}
<span data-controller="core.front.core.moderation">
<span data-controller="core.front.core.moderation" data-ips-hook='titleEditable'>
{{if $entry->locked()}}<i class='fa-solid fa-lock'></i> {{endif}}<span data-role="editableTitle" title='{lang="click_hold_edit"}'>
{$entry->name}
</span>
</span>
{{else}}
<span>{{if $entry->locked()}}<i class='fa-solid fa-lock'></i> {{endif}}
<span data-ips-hook='title'>{{if $entry->locked()}}<i class='fa-solid fa-lock'></i> {{endif}}
{$entry->name}
</span>
{{endif}}
@@ -1250,7 +1272,7 @@
{template="tagsWithPrefix" group="global" app="core" params="$entry->tags(), $entry->prefix(), FALSE, FALSE, ( $entry->canEdit() AND ( \count( $entry->tags() ) OR $entry::canTag() ) ) ? $entry->url() : NULL"}
{{endif}}
</div>
<div class='ipsButtons'>
<div class='ipsButtons' data-ips-hook='headerButtons'>
{{if \count( $entry->shareLinks() )}}
{template="shareButton" app="core" group="sharelinks" params="$entry"}
{{endif}}
@@ -1264,7 +1286,7 @@
<div class='ipsPageHeader__primary'>
<div class="ipsPhotoPanel ipsPhotoPanel--inline">
{template="userPhoto" app="core" params="$entry->author(), 'fluid'" group="global"}
<div class='ipsPhotoPanel__text'>
<div class='ipsPhotoPanel__text' data-ips-hook='entryHeaderMetaData'>
<p class="ipsPhotoPanel__primary">
{{if $entry->category_id}}
{{if $entry->date > time()}}
@@ -1289,7 +1311,7 @@
<section class='i-padding_3'>
{{if $poll = $entry->getPoll()}}
<div class='ipsInnerBox ipsInnerBox--inherit i-margin-bottom_3'>
<div class='ipsInnerBox ipsInnerBox--inherit i-margin-bottom_3' data-ips-hook='entryPoll'>
{$poll|raw}
</div>
{{endif}}
@@ -1306,7 +1328,7 @@
{{endif}}
</section>
<div class='ipsEntry__footer'>
<menu class='ipsEntry__controls'>
<menu class='ipsEntry__controls' data-ips-hook='entryMainButtons'>
<li>{$entry->menu()|raw}</li>
</menu>
{{if \IPS\IPS::classUsesTrait( $entry, 'IPS\Content\Reactable' ) AND settings.reputation_enabled}}
@@ -1423,7 +1445,7 @@
{template="blogHeader" group="view" app="blog" params="$blog, (!$club OR !\IPS\Settings::i()->clubs OR \IPS\Settings::i()->clubs_header != 'full')"}
{{if $blog->description}}
<section class='ipsBox ipsBox--padding ipsPull'>
<section class='ipsBox ipsBox--blogDescription ipsBox--padding ipsPull'>
<h3 class='ipsTitle ipsTitle--h5 ipsTitle--margin'>{lang="about_this_blog"}</h3>
{template="richText" group="global" app="core" location="global" params="$blog->description, array('ipsTruncate_4')"}
</section>
@@ -1431,7 +1453,7 @@
{{$menu = $blog->menu();}}
{{if \IPS\blog\Entry::canCreate( \IPS\Member::loggedIn(), $blog ) or $menu->hasContent() or \count( \IPS\blog\Entry\Category::roots( NULL, NULL, array( 'entry_category_blog_id=?', $blog->id ) ) )}}
<ul class="ipsButtons ipsButtons--main">
<ul class="ipsButtons ipsButtons--main" data-ips-hook='blogMainButtons'>
{{if !$blog->club_id and $menu->hasContent()}}
<li>
{$menu|raw}
@@ -1439,17 +1461,21 @@
{{endif}}
{{if \count( \IPS\blog\Entry\Category::roots( NULL, NULL, array( 'entry_category_blog_id=?', $blog->id ) ) )}}
<li>
<a href='#elBlogCategory_menu' id='elBlogCategory' data-ipsMenu class='ipsButton ipsButton--text'>
<button id='elBlogCategory' popovertarget="elBlogCategory_menu" class="ipsButton ipsButton--text">
<span>{{if $category}}{lang="blog_category_viewing" sprintf="$category->name"}{{else}}{lang="blog_category_select"}{{endif}}</span><i class='ipsMenuCaret'></i>
</a>
<ul id='elBlogCategory_menu' class='ipsMenu ipsMenu_normal ipsMenu_selectable ipsHide'>
<li class="ipsMenu_title">
{lang="categories"}{{if $category}} (<a href="{$blog->url()}">{lang="blog_categories_all"}</a>){{endif}}
{{foreach \IPS\blog\Entry\Category::roots( NULL, NULL, array( 'entry_category_blog_id=?', $blog->id ) ) as $cat}}
<li class='ipsMenu_item {{if $category and $category->id == $cat->id}}ipsMenu_itemChecked{{endif}}'>{$cat->link()|raw}</li>
{{endforeach}}
</li>
</ul>
</button>
<i-dropdown id="elBlogCategory_menu" popover>
<div class="iDropdown">
<ul class="iDropdown__items">
<li class="iDropdown__title i-flex i-align-items_center i-justify-content_space-between">
{lang="categories"}{{if $category}} <span>(<a href="{$blog->url()}">{lang="blog_categories_all"}</a>)</span>{{endif}}
</li>
{{foreach \IPS\blog\Entry\Category::roots( NULL, NULL, array( 'entry_category_blog_id=?', $blog->id ) ) as $cat}}
<li>{$cat->link()|raw}</li>
{{endforeach}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
{{if \IPS\blog\Entry::canCreate( \IPS\Member::loggedIn(), $blog )}}
@@ -1497,7 +1523,7 @@
{{else}}
<ul class='ipsEntries ipsEntries--blog-comment-widget'>
{{foreach $comments as $comment}}
<li>
<li class='{$comment->ui('css')}' {$comment->ui('dataAttributes')}>
<article class='ipsEntry ipsEntry--simple'>
<div class='ipsEntry__content'>
<header class='ipsEntry__header'>
@@ -1525,7 +1551,7 @@
</div>
{{if $comment->canReportOrRevoke() === TRUE}}
{{$id = mt_rand();}}
<a href='#elBlogCommentFeed_{$id}_menu' class='ipsEntry__topButton ipsEntry__topButton--ellipsis' id='elBlogCommentFeed_{$id}' title='{lang="more_options"}' data-ipsMenu><i class='fa-solid fa-ellipsis' aria-hidden="true"></i><span class='ipsInvisible'>{lang="more_options"}</span></a>
<button type="button" id="elBlogCommentFeed_{$id}" popovertarget="elBlogCommentFeed_{$id}_menu" class='ipsEntry__topButton ipsEntry__topButton--ellipsis' title='{lang="more_options"}'><i class='fa-solid fa-ellipsis' aria-hidden="true"></i><span class='ipsInvisible'>{lang="more_options"}</span></button>
{{endif}}
</div>
</header>
@@ -1553,9 +1579,13 @@
</div>
</article>
{{if $comment->canReportOrRevoke() === TRUE}}
<ul id='elBlogCommentFeed_{$id}_menu' class='ipsMenu ipsMenu_auto ipsHide'>
<li class='ipsMenu_item'><a href='{$comment->url('report')}' {{if member.member_id or \IPS\Helpers\Form\Captcha::supportsModal()}}data-ipsDialog data-ipsDialog-remoteSubmit data-ipsDialog-size='medium' data-ipsDialog-flashMessage='{lang="report_submit_success"}' data-ipsDialog-title="{lang="report_post"}"{{endif}} data-action='reportComment' title='{lang="report_content"}'>{lang="report"}</a></li>
</ul>
<i-dropdown popover id="elBlogCommentFeed_{$id}_menu">
<div class="iDropdown">
<ul class="iDropdown__items">
<li><a href='{$comment->url('report')}' {{if member.member_id or \IPS\Helpers\Form\Captcha::supportsModal()}}data-ipsDialog data-ipsDialog-remoteSubmit data-ipsDialog-size='medium' data-ipsDialog-flashMessage='{lang="report_submit_success"}' data-ipsDialog-title="{lang="report_post"}"{{endif}} data-action='reportComment' title='{lang="report_content"}'>{lang="report"}</a></li>
</ul>
</div>
</i-dropdown>
{{endif}}
</li>
{{endforeach}}
@@ -1569,7 +1599,7 @@
<i-data>
<ul class='ipsData ipsData--table ipsData--blogs-widget'>
{{foreach $blogs as $blog}}
<li class='ipsData__item'>
<li class="ipsData__item {$blog->ui('css')}" {$blog->ui('dataAttributes')}>
<div class='i-flex_11'>
<h4 class='i-font-weight_600 i-margin-bottom_2'><a href="{$blog->url()}" title='{lang="view_this_blog" sprintf="$blog->_title"}' class="i-color_hard">{$blog->_title}</a></h4>
<ul class='ipsGrid ipsGrid--blog-stats ipsGrid--3'>
@@ -1660,9 +1690,9 @@
{{$recentEntries = iterator_to_array( $blog->_recentEntries );}}
{{if \count( $recentEntries ) > 1}}
<h4 class='ipsTitle ipsTitle--h5 ipsTitle--margin i-margin-top_4'>{lang="recent_entries"}</h4>
<ul class='ipsBlogs__blog-listing-entries'>
<ul class='ipsBlogs__blog-listing-entries' data-ips-hook='recentEntries'>
{{foreach $recentEntries as $entry}}
<li>
<li class="{$entry->ui('css')}" {$entry->ui('dataAttributes')}>
{template="userPhoto" app="core" params="$entry->author(), 'fluid'" group="global"}
<div class='i-flex_11 i-flex i-gap_2 i-row-gap_0 i-flex-wrap_wrap'>
<h4 class='i-font-weight_500 i-flex_11'>
@@ -1716,19 +1746,19 @@
</i-data>
</div>
{{endif}}]]></template>
<template template_group="widgets" template_name="entryRow" template_data="$entry, $layout='table', $isCarousel=false" template_location="front" template_app="blog"><![CDATA[<li class='ipsData__item'>
<template template_group="widgets" template_name="entryRow" template_data="$entry, $layout='table', $isCarousel=false" template_location="front" template_app="blog"><![CDATA[<li class='ipsData__item {$entry->ui('css')}' {$entry->ui('dataAttributes')}>
<a href="{$entry->url('getLastComment')}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$entry->name}</span></a>
<figure class='ipsData__image'>
<div class="ipsData__image" aria-hidden="true" data-ips-hook='image'>
{{if $entry->cover_photo}}
<img src='{file="$entry->cover_photo" extension="blog_Entries"}' alt='' loading='lazy'>
{{else}}
<div class="ipsFallbackImage" aria-hidden="true"></div>
{{endif}}
</figure>
</div>
<div class="ipsData__content">
<div class='ipsData__main'>
<div class='ipsData__title'><h4><a href="{$entry->url('getLastComment')}" title='{lang="view_this_entry" sprintf="$entry->_title"}'>{$entry->name}</a></h4></div>
<div class='ipsData__meta'>{lang="byline_nodate" htmlsprintf="$entry->author()->link()"} {lang="in"} <a href='{$entry->container()->url()}'>{$entry->container()->_title}</a></div>
<div class='ipsData__title'><h4 data-ips-hook='title'><a href="{$entry->url('getLastComment')}" title='{lang="view_this_entry" sprintf="$entry->_title"}'>{$entry->name}</a></h4></div>
<div class='ipsData__meta' data-ips-hook='metadata'>{lang="byline_nodate" htmlsprintf="$entry->author()->link()"} {lang="in"} <a href='{$entry->container()->url()}'>{$entry->container()->_title}</a></div>
{{if \IPS\Settings::i()->blog_enable_rating}}
{template="rating" group="global" location="front" app="core" params="'small', $entry->averageRating(), 5, $entry->memberRating()"}
{{endif}}
@@ -1736,12 +1766,18 @@
<div class='ipsData__desc ipsRichText ipsTruncate_2'>{$entry->truncated()|raw}</div>
{{endif}}
</div>
<ul class="ipsData__stats">
<li data-stattype="comments">
<span class='ipsData__stats-icon' data-stat-value="{number='$entry->num_comments'}" aria-hidden="true" data-ipstooltip title='{number="$entry->num_comments"} {lang="blog_comments" pluralize="$entry->num_comments"}'></span>
<span class='ipsData__stats-label'>{number="$entry->num_comments"} {lang="blog_comments" pluralize="$entry->num_comments"}</span>
</li>
</ul>
<div class="ipsData__extra">
<ul class="ipsData__stats" data-ips-hook='stats'>
<li data-stattype="comments">
<span class='ipsData__stats-icon' data-stat-value="{number='$entry->num_comments'}" aria-hidden="true" data-ipstooltip title='{number="$entry->num_comments"} {lang="blog_comments" pluralize="$entry->num_comments"}'></span>
<span class='ipsData__stats-label'>{number="$entry->num_comments"} {lang="blog_comments" pluralize="$entry->num_comments"}</span>
</li>
<li data-stattype="views">
<span class='ipsData__stats-icon' data-stat-value="{number='$entry->views'}" aria-hidden="true" data-ipstooltip title='{number="$entry->views"} {lang="blog_views" pluralize="$entry->views"}'></span>
<span class='ipsData__stats-label'>{number="$entry->views"} {lang="blog_views" pluralize="$entry->views"}</span>
</li>
</ul>
</div>
</div>
</li>]]></template>
<css css_location="front" css_app="blog" css_attributes="" css_path="." css_name="blog.css">/* Blog index: &quot;View Blogs&quot; */
+50 -1
View File
@@ -348,5 +348,54 @@
"5000071": "5.0.6 Beta 2",
"5000072": "5.0.6 Beta 3",
"5000073": "5.0.6 Beta 4",
"5000074": "5.0.6"
"5000074": "5.0.6",
"5000075": "5.0.7 Beta 1",
"5000076": "5.0.7 Beta 2",
"5000077": "5.0.7 Beta 2",
"5000078": "5.0.7 Beta 3",
"5000079": "5.0.7 Beta 4",
"5000080": "5.0.7",
"5000081": "5.0.7",
"5000082": "5.0.7",
"5000800": "5.0.8 Alpha 1",
"5000801": "5.0.8 Alpha 2",
"5000802": "5.0.8 Beta 1",
"5000803": "5.0.8 Beta 2",
"5000804": "5.0.8 Beta 3",
"5000805": "5.0.8",
"5000900": "5.0.9 Beta 1",
"5000901": "5.0.9 Beta 1",
"5000902": "5.0.9 Beta 1",
"5000903": "5.0.9 Beta 2",
"5000904": "5.0.9",
"5000905": "5.0.9",
"5000906": "5.0.10 Beta 1",
"5000907": "5.0.10 Beta 1",
"5000908": "5.0.10 Beta 1",
"5000909": "5.0.10 Beta 1",
"5000910": "5.0.10 Beta 2",
"5000911": "5.0.10 Beta 3",
"5000912": "5.0.10 Beta 4",
"5000913": "5.0.10 Beta 4",
"5000914": "5.0.10",
"5000915": "5.0.10",
"5000916": "5.0.10",
"5000917": "5.0.10",
"5000918": "5.0.10",
"5000919": "5.0.10",
"5000920": "5.0.10",
"5001100": "5.0.11 Beta 1",
"5001101": "5.0.11 Beta 1",
"5001102": "5.0.11 Beta 2",
"5001103": "5.0.11",
"5001104": "5.0.11",
"5001105": "5.0.11",
"5001200": "5.0.12 Beta 1",
"5001201": "5.0.12 Beta 2",
"5001202": "5.0.12 Beta 3",
"5001203": "5.0.12",
"5001204": "5.0.12",
"5001300": "5.0.13 Beta 1",
"5001301": "5.0.13 Beta 2",
"5001302": "5.0.13"
}
@@ -0,0 +1,53 @@
<?php
/**
* @brief Club plugin
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @subpackage Blogs
* @since 08 Jul 2025
*/
namespace IPS\blog\extensions\core\Club;
/* To prevent PHP errors (extending class does not exist) revealing path */
use IPS\blog\Blog as BlogClass;
use IPS\Content\ContentMenuLink;
use IPS\Helpers\Menu\MenuItem;
use IPS\Member\Club;
use IPS\Extensions\ClubAbstract;
use IPS\Member\Club\Page as ClubPage;
use IPS\Node\Model;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Club Menu plugin
*/
class Blog extends ClubAbstract
{
/**
* Return an array of menu elements to add to the club menu
*
* @param Club $club
* @param Model|ClubPage|null $container
* @return array<string,MenuItem>
*/
public function menu( Club $club, Model|ClubPage|null $container = null ) : array
{
if( $container instanceof BlogClass and $container->canEdit() )
{
$categoryLink = new ContentMenuLink( $container->url()->setQueryString( 'do', 'manageCategories' ), 'blog_manage_entry_categories' );
$categoryLink->opensDialog( 'blog_manage_entry_categories' );
return [ $categoryLink ];
}
return [];
}
}
@@ -13,6 +13,7 @@ namespace IPS\blog\extensions\core\EditorLocations;
/* To prevent PHP errors (extending class does not exist) revealing path */
use Exception;
use InvalidArgumentException;
use IPS\blog\Blog;
use IPS\blog\Entry\Comment;
@@ -27,6 +28,7 @@ use IPS\Text\Parser;
use LogicException;
use RuntimeException;
use function defined;
use function is_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -127,14 +129,20 @@ class Blogs extends EditorLocationsAbstract
*/
public function attachmentLookup( ?int $id1=null, ?int $id2=null, ?string $id3=null ): Model|Content|Url|Member|null
{
/* The attachment is attached to a comment */
if ( $id2 )
{
return Comment::load( $id2 );
try
{/* The attachment is attached to a comment */
if( $id2 )
{
return Comment::load( $id2 );
}
else
{
return Blog::load( $id1 );
}
}
else
catch( Exception $e )
{
return Blog::load( $id1 );
throw new LogicException( );
}
}
@@ -208,7 +216,7 @@ class Blogs extends EditorLocationsAbstract
}
catch( InvalidArgumentException $e )
{
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
{
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $word['word_custom'] );
}
@@ -13,6 +13,7 @@ namespace IPS\blog\extensions\core\EditorLocations;
/* To prevent PHP errors (extending class does not exist) revealing path */
use Exception;
use InvalidArgumentException;
use IPS\Content;
use IPS\Db;
@@ -24,6 +25,7 @@ use IPS\Node\Model;
use IPS\Text\Parser;
use LogicException;
use function defined;
use function is_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -78,7 +80,14 @@ class Categories extends EditorLocationsAbstract
switch ( $id3 )
{
case 'bcategory':
return Url::internal( "app=blog&module=blogs&controller=categories&do=form&id={$id1}", 'admin' );
try
{
return Url::internal( "app=blog&module=blogs&controller=categories&do=form&id={$id1}", 'admin' );
}
catch( Exception $e )
{
throw new LogicException;
}
}
return NULL;
@@ -142,7 +151,7 @@ class Categories extends EditorLocationsAbstract
}
catch( InvalidArgumentException $e )
{
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
{
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $word['word_custom'] );
}
@@ -13,6 +13,7 @@ namespace IPS\blog\extensions\core\EditorLocations;
/* To prevent PHP errors (extending class does not exist) revealing path */
use Exception;
use IPS\blog\Entry;
use IPS\Content;
use IPS\Extensions\EditorLocationsAbstract;
@@ -99,7 +100,14 @@ class Entries extends EditorLocationsAbstract
*/
public function attachmentLookup( ?int $id1=null, ?int $id2=null, ?string $id3=null ): Model|Content|Url|Member|null
{
return Entry::load( $id1 );
try
{
return Entry::load( $id1 );
}
catch( Exception $e )
{
throw new LogicException;
}
}
}
@@ -71,9 +71,9 @@ class Blog extends GroupFormAbstract
/* We intval here because (some of) the columns do not accept null values, but these are null when creating a new group */
$group->g_blog_allowlocal = (int) $values['g_blog_allowlocal'];
$group->g_blog_maxblogs = (int) $values['g_blog_maxblogs'];
$group->g_blog_allowprivate = (int) $values['g_blog_allowprivate'];
$group->g_blog_allowownmod = (int) $values['g_blog_allowownmod'];
$group->g_blog_allowdelete = (int) $values['g_blog_allowdelete'];
$group->g_blog_allowprivate = $values['g_blog_allowlocal'] ? (int) $values['g_blog_allowprivate'] : 0;
$group->g_blog_allowownmod = $values['g_blog_allowlocal'] ? (int) $values['g_blog_allowownmod'] : 0;
$group->g_blog_allowdelete = $values['g_blog_allowlocal'] ? (int) $values['g_blog_allowdelete'] : 0;
}
$group->g_blog_allowcomment = $values['g_blog_allowcomment'];
@@ -67,8 +67,23 @@ class Blogs extends OverviewStatisticsAbstract
*/
public function getBlock( array|string|null $dateRange = NULL, string $subBlock = NULL ): string
{
$total = Db::i()->select( 'COUNT(*)', 'blog_blogs' )->first();
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount(
$this->getBlockNumbers( $dateRange, $subBlock )['statsreports_current_count'],
NULL,
NULL
);
}
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount( $total, NULL, NULL );
/**
* @param array|string $dateRange=null
* @param string $subBlock = null
*
* @return array{statsreports_current_count: number}
*/
public function getBlockNumbers( array|string $dateRange = null, string $subBlock = null ) : array
{
return [
'statsreports_current_count' => Db::i()->select( "COUNT(*)", 'blog_blogs' )->first()
];
}
}
@@ -45,17 +45,6 @@ class RssImport extends RssImportAbstract
$this->classes = array( 'IPS\\blog\\Entry' );
}
/**
* Return available options for a Form\Select
*
* @return array
*/
public function availableOptions(): array
{
/* We don't want to set up Blog feeds in the ACP */
return array();
}
/**
* Show in the Admin CP?
*
@@ -115,7 +104,7 @@ class RssImport extends RssImportAbstract
*/
public function form( Form $form, ?Import $rss=NULL ): void
{
/* Blogs has it's own front end controller */
/* Blogs has its own front end controller */
}
/**
@@ -127,7 +116,7 @@ class RssImport extends RssImportAbstract
*/
public function saveForm( array &$values, Import $rss ): array
{
/* Blogs has it's own front end controller */
/* Blogs has its own front end controller */
return array( $values );
}
}
@@ -169,8 +169,9 @@ class browse extends Controller
/* Set default search option */
Output::i()->defaultSearchOption = array( 'blog_entry', 'blog_entry_pl' );
}
Output::i()->bodyAttributes['contentClass'] = Category::class;
Output::i()->jsFiles = array_merge( Output::i()->jsFiles, Output::i()->js( 'front_browse.js', 'blog', 'front' ) );
Output::i()->title = $category ? $category->_title : Member::loggedIn()->language()->addToStack( 'blogs' );
}
}
@@ -87,6 +87,8 @@ class view extends Controller
{
Output::i()->metaTags['og:image'] = File::get( $this->_coverPhotoStorageExtension(), $this->blog->cover_photo )->url;
}
Output::i()->bodyAttributes['contentClass'] = Blog::class;
parent::execute();
}
+1 -92
View File
@@ -1,92 +1 @@
{
"1": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_allowlocal",
"type": "TINYINT",
"length": 1,
"null": false,
"default": 0,
"comment": "Can create blogs?",
"unsigned": true
}
]
},
"2": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_maxblogs",
"type": "INT",
"length": 10,
"null": false,
"default": 0,
"comment": "Maximum number of blogs",
"unsigned": true
}
]
},
"3": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_allowprivate",
"type": "TINYINT",
"length": 1,
"null": false,
"default": 0,
"comment": "Can create private blogs?",
"unsigned": true
}
]
},
"4": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_allowownmod",
"type": "TINYINT",
"length": 1,
"null": false,
"default": 0,
"comment": "Can moderate own blogs?",
"unsigned": true
}
]
},
"5": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_allowdelete",
"type": "TINYINT",
"length": 1,
"null": false,
"default": 0,
"comment": "Can delete own blogs?",
"unsigned": true
}
]
},
"6": {
"method": "addColumn",
"params": [
"core_groups",
{
"name": "g_blog_allowcomment",
"type": "TINYINT",
"length": 1,
"null": false,
"default": 0,
"comment": "Can comment on blogs?",
"unsigned": true
}
]
}
}
[]
@@ -0,0 +1,22 @@
{
"id": 5000075,
"name": "5.0.7 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,25 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/featuredEntries",
"front\/browse\/index",
"front\/browse\/indexGrid",
"front\/view\/blogHeader",
"front\/view\/blogTable",
"front\/view\/entry",
"front\/view\/view"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000076,
"name": "5.0.7 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000077,
"name": "5.0.7 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000078,
"name": "5.0.7 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000079,
"name": "5.0.7 Beta 4",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000080,
"name": "5.0.7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000081,
"name": "5.0.7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000082,
"name": "5.0.7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000800,
"name": "5.0.8 Alpha 1",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,21 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/featuredEntries",
"front\/browse\/indexGridEntry",
"front\/widgets\/entryRow"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000801,
"name": "5.0.8 Alpha 2",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,20 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/rows",
"front\/widgets\/entryRow"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000802,
"name": "5.0.8 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_blog_view"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000803,
"name": "5.0.8 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000804,
"name": "5.0.8 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000805,
"name": "5.0.8",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000900,
"name": "5.0.9 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000901,
"name": "5.0.9 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000902,
"name": "5.0.9 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000903,
"name": "5.0.9 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000904,
"name": "5.0.9",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000905,
"name": "5.0.9",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000906,
"name": "5.0.10 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,19 @@
{
"html": {
"added": [],
"edited": [
"front\/widgets\/entryRow"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000907,
"name": "5.0.10 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000908,
"name": "5.0.10 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000909,
"name": "5.0.10 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000910,
"name": "5.0.10 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000911,
"name": "5.0.10 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000912,
"name": "5.0.10 Beta 4",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000913,
"name": "5.0.10 Beta 4",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000914,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000915,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000916,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000917,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000918,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000919,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5000920,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001100,
"name": "5.0.11 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001101,
"name": "5.0.11 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,29 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/indexGridEntry",
"front\/browse\/rows",
"front\/view\/blogHeader",
"front\/view\/blogViewLarge",
"front\/view\/blogViewMedium",
"front\/view\/coverPhotoOverlay",
"front\/view\/entry",
"front\/view\/view",
"front\/widgets\/blogCommentFeed",
"front\/widgets\/blogs",
"front\/widgets\/entryRow"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5001102,
"name": "5.0.11 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001103,
"name": "5.0.11",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001104,
"name": "5.0.11",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001105,
"name": "5.0.11",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001200,
"name": "5.0.12 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/indexButtons",
"front\/global\/categoryLink",
"front\/view\/blogTable",
"front\/view\/view",
"front\/widgets\/blogCommentFeed"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5001201,
"name": "5.0.12 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001202,
"name": "5.0.12 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001203,
"name": "5.0.12",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001204,
"name": "5.0.12",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001300,
"name": "5.0.13 Beta 1",
"steps": {
"queries": false,
"lang": true,
"theme": true,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"normal": {
"added": [
"blog_categories_sg"
],
"edited": [],
"removed": []
},
"js": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"html": {
"added": [],
"edited": [
"front\/browse\/indexButtons",
"front\/view\/blogTable",
"front\/view\/view",
"front\/widgets\/blogCommentFeed"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5001301,
"name": "5.0.13 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,22 @@
{
"id": 5001302,
"name": "5.0.13",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
+18 -11
View File
@@ -185,6 +185,11 @@ class Blog extends Model implements Embeddable
*/
public static bool $canBeExtended = true;
/**
* @brief [Node] Sortable?
*/
public static bool $nodeSortable = false;
/**
* Columns needed to query for search result / stream view
*
@@ -240,7 +245,7 @@ class Blog extends Model implements Embeddable
{
/* We don't want any kind of specific comment moderation here, just leave it up to the
general rules */
if( $action == 'moderate_comments' )
if( $action == 'moderate_comments' or $action == 'moderate_items' )
{
return false;
}
@@ -1096,7 +1101,17 @@ class Blog extends Model implements Embeddable
*/
protected function get_description(): ?string
{
return $this->member_id ? $this->desc : Member::loggedIn()->language()->addToStack( static::$titleLangPrefix . $this->_id . static::$descriptionLangSuffix );
if( $this->member_id )
{
return $this->desc;
}
if( Member::loggedIn()->language()->checkKeyExists( static::$titleLangPrefix . $this->_id . static::$descriptionLangSuffix ) )
{
return Member::loggedIn()->language()->addToStack( static::$titleLangPrefix . $this->_id . static::$descriptionLangSuffix );
}
return null;
}
/**
@@ -1348,7 +1363,6 @@ class Blog extends Model implements Embeddable
{
Output::i()->jsFiles = array_merge( Output::i()->jsFiles, Output::i()->js( 'front_view.js', 'blog', 'front' ) );
$form->addTab( 'blog_settings' );
$itemClass = static::$contentItemClass;
$form->add( new Text( 'club_node_name', $this->_id ? $this->_title : Member::loggedIn()->language()->addToStack( 'blogs_sg' ), TRUE, array( 'maxLength' => 255 ) ) );
$form->add( new Editor( 'club_node_description', $this->_id ? Member::loggedIn()->language()->get( static::$titleLangPrefix . $this->_id . '_desc' ) : NULL, FALSE, array( 'app' => 'blog', 'key' => 'Blogs', 'autoSaveKey' => ( $this->id ? "blogs-blog-{$this->id}" : "blogs-new-blog" ), 'attachIds' => $this->id ? array( $this->id, NULL, 'description' ) : NULL, 'minimize' => 'blog_desc_placeholder' ) ) );
@@ -1362,13 +1376,6 @@ class Blog extends Model implements Embeddable
$form->add( new Radio( 'club_node_public', $this->id ? $this->isPublic() : 0, TRUE, array( 'options' => array( '0' => 'club_node_public_no', '1' => 'club_node_public_view', '2' => 'club_node_public_participate' ) ) ) );
}
/* Categories */
if ( $this->id )
{
$form->addTab( 'blog_entry_categories' );
$form->addHtml( Theme::i()->getTemplate( 'view', 'blog', 'front' )->manageCategories( $this ) );
}
}
/**
@@ -1554,7 +1561,7 @@ class Blog extends Model implements Embeddable
if( $this->canDelete() )
{
$deleteLink = new ContentMenuLink( $this->url()->setQueryString( 'do', 'deleteBlog' )->csrf(), 'delete_blog', 'ipsMenu_item', [
$deleteLink = new ContentMenuLink( $this->url()->setQueryString( 'do', 'deleteBlog' )->csrf(), 'delete_blog', 'iDropdown__li', [
'data-confirm' => '',
'data-confirmMessage' => Member::loggedIn()->language()->addToStack( 'delete_blog_confirm' ),
'data-confirmSubMessage' => Member::loggedIn()->language()->addToStack( 'delete_blog_warning' )
+1 -1
View File
@@ -808,7 +808,7 @@ class Entry extends Item implements
and Login::registrationType() != 'disabled' )
{
/* We can override post before register for guests */
return (bool) Group::load( Settings::i()->member_group )->g_blog_allowcomment;
return (bool) Group::load( Settings::i()->guest_group )->g_blog_allowcomment;
}
elseif( $member->member_id )
{
+45
View File
@@ -56,6 +56,51 @@
{$email->language->addToStack("go_to_this_x", FALSE, array( 'htmlsprintf' => array( mb_strtolower( $email->language->addToStack( $content::$title, FALSE ) ) ) ) )}: {$content->url()}
-- {setting="board_name"}]]></template_content_plaintext><template_pinned>0</template_pinned></template><template><template_app>calendar</template_app><template_name>notification_event_rsvp</template_name><template_content_html><![CDATA[
{$email->language->addToStack("email_event_rsvp", FALSE, array( 'sprintf' => array( $member->name, $content->url(), $content->mapped('title') ) ) )}
<br />
<br />
<table cellpadding="0" cellspacing="0" border="0" width="100%" bgcolor="#ffffff" class='responsive_table'>
<tr>
<td dir='{dir}' width="100%" class='responsive_fullwidth' bgcolor="#f9f9f9">
<table cellpadding="10" cellspacing="0" border="0" width="100%">
<tr>
<td dir='{dir}' colspan='2' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px" bgcolor="#f0f0f0">
<strong>{$email->language->get("rsvp_attend_event")}</strong>
</td>
<td dir='{dir}' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px">
{$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_YES ) ) ) )}
</td>
</tr>
<tr>
<td dir='{dir}' colspan='2' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px" bgcolor="#f0f0f0">
<strong>{$email->language->get("rsvp_maybe_event")}</strong>
</td>
<td dir='{dir}' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px">
{$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_MAYBE ) ) ) )}
</td>
</tr>
<tr>
<td dir='{dir}' colspan='2' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px" bgcolor="#f0f0f0">
<strong>{$email->language->get("rsvp_notgoing_event")}</strong>
</td>
<td dir='{dir}' style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; color: #333333; line-height: 21px">
{$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_NO ) ) ) )}
</td>
</tr>
</table>
</td>
</tr>
</table>
<br /><br />
<em style='color: #8c8c8c'>&mdash; {setting="board_name"}</em>]]></template_content_html><template_data>$content, $member, $email</template_data><template_content_plaintext><![CDATA[{$email->language->addToStack("email_event_rsvp_plain", FALSE, array( 'htmlsprintf' => array( $member->name, $content->mapped('title') ) ) )}
{$email->language->get("rsvp_attend_event")}: {$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_YES ) ) ) )}
{$email->language->get("rsvp_maybe_event")}: {$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_MAYBE ) ) ) )}
{$email->language->get("rsvp_notgoing_event")}: {$email->language->addToStack( 'x_members', false, array( 'pluralize' => array( $content->attendeeCount( $content::RSVP_NO ) ) ) )}
-- {setting="board_name"}]]></template_content_plaintext><template_pinned>0</template_pinned></template><template><template_app>calendar</template_app><template_name>notification_new_content</template_name><template_content_html><![CDATA[
{{if $content->author()->member_id}}
{$email->language->addToStack("email_new_calevent", FALSE, array( 'sprintf' => array( $content->author()->url(), $content->author()->name, $content->indefiniteArticle( $email->language ), $content->url(), $content->mapped('title'), $content->fixedDateTimeDescription( $email->language ) ) ) )}
+1 -5
View File
@@ -1,11 +1,7 @@
{
"topLevel": "events",
"pages": {
"featured": {
"friendly": "featured",
"real": "app=calendar&module=calendar&controller=view&view=overview&do=featured"
},
"calendar_calweek": {
"calendar_calweek": {
"friendly": "{#id}-{?}/week/{@w}",
"real": "app=calendar&module=calendar&controller=view&view=week"
},
+16 -42
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="calendar">
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.main.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000250"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -110,7 +110,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.monthView.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000250"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -229,7 +229,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.eventList.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000300"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -347,7 +347,7 @@ var PER_PAGE = 16;
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.nearMe.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000300"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -711,7 +711,7 @@ var PER_PAGE = 16;
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/overview" javascript_name="ips.overview.search.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000300"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -747,7 +747,7 @@ var PER_PAGE = 16;
this._gotCoords = false;
this._offset = 0;
this._limit = 20;
this._currentSort = $('body').find('#elSortMenu_menu .ipsMenu_itemChecked').attr('data-ipsMenuValue');
this._currentSort = $('body').find('#elSortMenu_menu [aria-selected="true"]').attr('data-ipsMenuValue');
this._baseURL = this.scope.attr('action');
this._initialURL = window.location.href;
this._cancelledLookup = false;
@@ -948,10 +948,10 @@ var PER_PAGE = 16;
* @param {object} data Event data object
* @returns {string}
*/
changeSort(e, data) {
changeSort(e, data = e.detail) {
e.preventDefault();
this._currentSort = data.selectedItemID;
const title = data.menuElem.find('[data-ipsMenuValue="' + this._currentSort + '"]').text();
const title = $(data.menuElem).find('[data-ipsMenuValue="' + this._currentSort + '"]').text();
$('body').find('[data-role="searchOrder"]').text( title );
this.doSearch();
},
@@ -1265,7 +1265,7 @@ var PER_PAGE = 16;
});
}(jQuery, _));
]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.dates.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1486,7 +1486,6 @@ var PER_PAGE = 16;
*/
finishRepeat: function () {
this._updateSummary();
$('#elRecurEdit_menu').trigger('closeMenu');
},
/**
@@ -1586,12 +1585,8 @@ var PER_PAGE = 16;
* @returns {void}
*/
updateTimezone: function (e) {
if( e ){
e.preventDefault();
}
// Update displayed timezone
this.scope.find('[data-role="timezone_display"]').text( $('#event_timezone option:selected').data('abbreviated') ).trigger('closeMenu');
this.scope.find('[data-role="timezone_display"]').text( $('#event_timezone option:selected').data('abbreviated') );
},
/**
@@ -1602,30 +1597,9 @@ var PER_PAGE = 16;
* @returns {void}
*/
disableRecurring: function (e) {
if( e )
{
e.preventDefault();
}
this.scope.find('#elRepeatCb').prop( 'checked', false );
this._updateSummary();
},
/**
* Finalize our recurring options
*
* @param {event} e Event object
* @param {object} data Event data object
* @returns {void}
*/
finishRepeatConfiguration: function (e, data) {
e.preventDefault();
// Copy the summary from the menu to the main display and close the menu
this.scope.find('[data-role="recur_summary_final"]').text( this.scope.find('[data-role="recur_summary"]').text() );
this.scope.find('#elRecurEdit').trigger('closeMenu');
},
/**
* Update the recurring string
*
@@ -1813,7 +1787,7 @@ var PER_PAGE = 16;
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/venue" javascript_name="ips.venue.main.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000200"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -1920,7 +1894,7 @@ var PER_PAGE = 16;
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.reminderButton.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -2003,7 +1977,7 @@ var PER_PAGE = 16;
}
});
}(jQuery, _));]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.reminderForm.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000150">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -2113,7 +2087,7 @@ var PER_PAGE = 16;
});
}(jQuery, _));
</file>
<file javascript_app="calendar" javascript_location="front" javascript_path="templates" javascript_name="ips.calendar.templates.js" javascript_type="framework" javascript_version="5000074" 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="5001302" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*/
@@ -2122,9 +2096,9 @@ var PER_PAGE = 16;
ips.templates.set('calendar.reminder.loading', " \
<div class='ipsLoading ipsLoading--tiny'></div>\
");]]></file>
<file javascript_app="calendar" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.overview.js" javascript_type="template" javascript_version="5000074" 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="5001302" javascript_position="1000050"><![CDATA[ips.templates.set("eventLoading", `
<li class='ipsData__item ipsData__item--loading'>
<div class="ipsData__image"></div>
<div class="ipsData__image" aria-hidden="true"></div>
<div class="ipsData__content">
<div class="ipsData__main">
<div class="ipsData__title"></div>
+18 -8
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="calendar" version="5000074">
<app key="calendar" version="5001302">
<word key="__app_calendar" js="0">Events</word>
<word key="frontnavigation_calendar" js="0">Events</word>
<word key="__indefart_calendar_event_comment" js="0">a comment on an event</word>
@@ -245,8 +245,10 @@
<word key="see_more_events_near_you" js="0">See more events by location</word>
<word key="event_album" js="0">Album</word>
<word key="event_album_desc" js="0">You can link an album from the Gallery to this event which will show the images on the event page and cause information about the event to be displayed on the album page.</word>
<word key="submit_event_start" js="0">Event Start</word>
<word key="submit_event_end" js="0">Event End</word>
<word key="submit_event_start_date" js="0">Start date</word>
<word key="submit_event_start_time" js="0">Start time</word>
<word key="submit_event_end_date" js="0">End date</word>
<word key="submit_event_end_time" js="0">End time</word>
<word key="submit_event_summary" js="0">Summary</word>
<word key="submit_event_repeats_check" js="0">This event repeats</word>
<word key="submit_event_repeats" js="0">Repeats</word>
@@ -266,7 +268,6 @@
<word key="you_werent_going" js="0">You didn't go</word>
<word key="you_are_going_to_this" js="0">You are going to this event</word>
<word key="you_are_not_going_to_this" js="0">You are not going to this event</word>
<word key="rsvp_change" js="0">Change RSVP</word>
<word key="confirm_attendance" js="0">Confirm attendance</word>
<word key="featured_events" js="0">Featured Events</word>
<word key="end_date_before_start" js="0">The event must end after it starts</word>
@@ -296,7 +297,7 @@
<word key="rsvp_leave_event" js="0">Leave event</word>
<word key="rsvp_attend_event" js="0">Going</word>
<word key="rsvp_maybe_event" js="0">Maybe</word>
<word key="rsvp_notgoing_event" js="0">Decline</word>
<word key="rsvp_notgoing_event" js="0">Not going</word>
<word key="rsvp_attendees" js="0">Going</word>
<word key="rsvp_attendees_past" js="0">Went</word>
<word key="rsvp_attended_past_event" js="0">Went</word>
@@ -318,7 +319,8 @@
<word key="rsvp_selection_yes" js="0">Your name has been added to the guest list</word>
<word key="rsvp_selection_no" js="0">It's too bad you won't be able to make it to the event!</word>
<word key="rsvp_selection_maybe" js="0">Your name has been added to the maybe list</word>
<word key="rsvp_download" js="0">Download guest list</word>
<word key="rsvp_selection_leave" js="0">Your name has been removed from the guest list for this event</word>
<word key="rsvp_download" js="0">Download list</word>
<word key="event_rsvp_attendees_other" js="0">Other Responses</word>
<word key="recur_human_yearly" js="0">This event {!#[1:began][2:begins]} %s and repeats every year %s</word>
<word key="recur_human_yearly_multi" js="0">This event {!#[1:began][2:begins]} %s and repeats every %s %s</word>
@@ -447,8 +449,11 @@
<word key="__api_calendar_venues" js="0">Venues</word>
<word key="calendar_activity_stream_rsvp" js="0"><![CDATA[%s is attending <a href='%s'>%s</a>]]></word>
<word key="all_activity_calendar_streamitems" js="0">When a member RSVPs to an event</word>
<word key="notifications__calendar_Events" js="0">Event Reminders</word>
<word key="notifications__calendar_Events_desc" js="0">These notifications are sent when an event you have asked to receive a reminder about is coming up.</word>
<word key="notifications__calendar_Events" js="0">Events</word>
<word key="notifications__calendar_Reminders" js="0">Event Reminders</word>
<word key="notifications__calendar_Reminders_desc" js="0">These notifications are sent when an event you have asked to receive a reminder about is coming up.</word>
<word key="notifications__calendar_Rsvp" js="0">Event RSVPs</word>
<word key="notifications__calendar_Rsvp_desc" js="0">These notifications are sent when a member RSVPs to your events.</word>
<word key="mailsub__calendar_notification_event_reminder" js="0"><![CDATA[Event Reminder for {$content->mapped("title")|raw}]]></word>
<word key="email_event_reminder" js="0"><![CDATA[There's now less than %s to go until <a href='%s'>%s</a>.]]></word>
<word key="email_event_reminder_plain" js="0">There's now less than %s to go until %s</word>
@@ -457,6 +462,11 @@
<word key="days_to_go" js="0">{# [1:day][?:days]}</word>
<word key="notification__event_reminder" js="0">Less than %s to go until %s</word>
<word key="notification__event_reminder_title" js="0">Upcoming {!#[1:event][?:events]}</word>
<word key="mailsub__calendar_notification_event_rsvp" js="0"><![CDATA[RSVP for {$content->mapped("title")|raw}]]></word>
<word key="email_event_rsvp" js="0"><![CDATA[%s is attending <a href='%s'>%s</a>.]]></word>
<word key="email_event_rsvp_plain" js="0">%s is attending %s</word>
<word key="notification__event_rsvp" js="0">%s is going to %s</word>
<word key="notification__event_rsvp_title" js="0">Event RSVP</word>
<word key="menu__calendar_calendars_venues" js="0">Venues</word>
<word key="venues" js="0">Venues</word>
<word key="venue_title" js="0">Venue Name</word>
File diff suppressed because it is too large. Load diff
+50 -1
View File
@@ -348,5 +348,54 @@
"5000071": "5.0.6 Beta 2",
"5000072": "5.0.6 Beta 3",
"5000073": "5.0.6 Beta 4",
"5000074": "5.0.6"
"5000074": "5.0.6",
"5000075": "5.0.7 Beta 1",
"5000076": "5.0.7 Beta 2",
"5000077": "5.0.7 Beta 2",
"5000078": "5.0.7 Beta 3",
"5000079": "5.0.7 Beta 4",
"5000080": "5.0.7",
"5000081": "5.0.7",
"5000082": "5.0.7",
"5000800": "5.0.8 Alpha 1",
"5000801": "5.0.8 Alpha 2",
"5000802": "5.0.8 Beta 1",
"5000803": "5.0.8 Beta 2",
"5000804": "5.0.8 Beta 3",
"5000805": "5.0.8",
"5000900": "5.0.9 Beta 1",
"5000901": "5.0.9 Beta 1",
"5000902": "5.0.9 Beta 1",
"5000903": "5.0.9 Beta 2",
"5000904": "5.0.9",
"5000905": "5.0.9",
"5000906": "5.0.10 Beta 1",
"5000907": "5.0.10 Beta 1",
"5000908": "5.0.10 Beta 1",
"5000909": "5.0.10 Beta 1",
"5000910": "5.0.10 Beta 2",
"5000911": "5.0.10 Beta 3",
"5000912": "5.0.10 Beta 4",
"5000913": "5.0.10 Beta 4",
"5000914": "5.0.10",
"5000915": "5.0.10",
"5000916": "5.0.10",
"5000917": "5.0.10",
"5000918": "5.0.10",
"5000919": "5.0.10",
"5000920": "5.0.10",
"5001100": "5.0.11 Beta 1",
"5001101": "5.0.11 Beta 1",
"5001102": "5.0.11 Beta 2",
"5001103": "5.0.11",
"5001104": "5.0.11",
"5001105": "5.0.11",
"5001200": "5.0.12 Beta 1",
"5001201": "5.0.12 Beta 2",
"5001202": "5.0.12 Beta 3",
"5001203": "5.0.12",
"5001204": "5.0.12",
"5001300": "5.0.13 Beta 1",
"5001301": "5.0.13 Beta 2",
"5001302": "5.0.13"
}
@@ -49,7 +49,7 @@ class Rsvp extends AchievementActionAbstract // NOTE: Other classes exist to pro
*/
public function filters( ?array $filters, Url $url ): array
{
$return = array();
$return = parent::filters( $filters, $url );
$return['nodes'] = new Node( 'achievement_filter_Rsvp_nodes', ( $filters and isset( $filters['nodes'] ) and $filters['nodes'] ) ? $filters['nodes'] : 0, FALSE, [
'url' => $url,
@@ -76,7 +76,7 @@ class Rsvp extends AchievementActionAbstract // NOTE: Other classes exist to pro
*/
public function formatFilterValues( array $values ): array
{
$return = [];
$return = parent::formatFilterValues( $values );
if ( isset( $values['achievement_filter_Rsvp_nodes'] ) )
{
$return['nodes'] = array_keys( $values['achievement_filter_Rsvp_nodes'] );
@@ -149,6 +149,37 @@ class Rsvp extends AchievementActionAbstract // NOTE: Other classes exist to pro
{
return [ $extra->author() ];
}
/**
* Determines if the member has already completed this rule.
* Used for retroactive rule completion.
* So far, this is only used in Quests, but may be used elsewhere at a later point.
*
* @param Member $member
* @param array $filters
* @return bool
*/
public function isRuleCompleted( Member $member, array $filters ) : bool
{
$where = [
[ 'rsvp_member_id=?', $member->member_id ]
];
if( !empty( $filters['nodes'] ) )
{
$where[] = [ Db::i()->in( 'event_calendar_id', $filters['nodes'] ) ];
}
$total = Db::i()->select( 'count(*)', 'calendar_event_rsvp', $where )
->join( 'calendar_events', 'rsvp_event_id=event_id' )->first();
if( !empty( $filters['milestone'] ) )
{
return $total >= $filters['milestone'];
}
return $total > 0;
}
/**
* Get identifier to prevent the member being awarded points for the same action twice
@@ -202,7 +233,7 @@ class Rsvp extends AchievementActionAbstract // NOTE: Other classes exist to pro
{
$conditions[] = Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone', FALSE, [
'htmlsprintf' => [
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
],
'sprintf' => [ Member::loggedIn()->language()->addToStack('rsvp') ]
] );
@@ -211,8 +242,12 @@ class Rsvp extends AchievementActionAbstract // NOTE: Other classes exist to pro
{
$conditions[] = $nodeCondition;
}
if( $questCondition = $this->_questFilterDescription( $rule ) )
{
$conditions[] = $questCondition;
}
return Theme::i()->getTemplate( 'achievements' )->ruleDescription(
return Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescription(
Member::loggedIn()->language()->addToStack( 'AchievementAction__Rsvp_title' ),
$conditions
);
@@ -241,7 +276,7 @@ class Rsvp extends AchievementActionAbstract // NOTE: Other classes exist to pro
{
return Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location', FALSE, [
'htmlsprintf' => [
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'location',
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'location',
count( $nodeNames ) === 1 ? $nodeNames[0] : Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location_val', FALSE, [ 'sprintf' => [
count( $nodeNames ),
Member::loggedIn()->language()->addToStack( 'calendars', FALSE, [ 'strtolower' => TRUE ] )
@@ -13,6 +13,7 @@ namespace IPS\calendar\extensions\core\EditorLocations;
/* To prevent PHP errors (extending class does not exist) revealing path */
use Exception;
use IPS\calendar\Event;
use IPS\calendar\Event\Comment;
use IPS\calendar\Event\Review;
@@ -117,20 +118,25 @@ class Calendar extends EditorLocationsAbstract
*/
public function attachmentLookup( ?int $id1=null, ?int $id2=null, ?string $id3=null ): Model|Content|Url|Member|null
{
if ( $id2 )
try
{
if ( $id3 === 'review' )
if( $id2 )
{
return Review::load( $id2 );
}
else
if( $id3 === 'review' )
{
return Review::load( $id2 );
}else
{
return Comment::load( $id2 );
}
}else
{
return Comment::load( $id2 );
return Event::load( $id1 );
}
}
else
catch( Exception $e )
{
return Event::load( $id1 );
throw new LogicException;
}
}
}
@@ -39,17 +39,33 @@ class Events extends NotificationsAbstract
*/
public static function configurationOptions( Member $member = NULL ): array
{
return array(
$return = array(
'event_reminder' => array(
'type' => 'standard',
'notificationTypes' => array( 'event_reminder' ),
'title' => 'notifications__calendar_Events',
'showTitle' => FALSE,
'description' => 'notifications__calendar_Events_desc',
'title' => 'notifications__calendar_Reminders',
'showTitle' => true,
'description' => 'notifications__calendar_Reminders_desc',
'default' => array( 'inline', 'push', 'email' ),
'disabled' => array()
)
);
/* Can we create events? */
if( $member === null or Event::canCreate( $member ) )
{
$return['event_rsvp'] = array(
'type' => 'standard',
'notificationTypes' => array( 'event_rsvp' ),
'title' => 'notifications__calendar_Rsvp',
'showTitle' => true,
'description' => 'notifications__calendar_Rsvp_desc',
'default' => array( 'inline', 'push', 'email' ),
'disabled' => array()
);
}
return $return;
}
/**
@@ -158,4 +174,59 @@ class Events extends NotificationsAbstract
'channelId' => 'events',
);
}
/**
* Parse notification: Event RSVPs
*
* @param Inline $notification The notification
* @param bool $htmlEscape TRUE to escape HTML in title
* @return array
* @code
* return array(
* 'title' => "Mark has replied to A Topic", // The notification title
* 'url' => new \IPS\Http\Url( ... ), // The URL the notification should link to
* 'content' => "Lorem ipsum dolar sit", // [Optional] Any appropriate content. Do not format this like an email where the text
* // explains what the notification is about - just include any appropriate content.
* // For example, if the notification is about a post, set this as the body of the post.
* 'author' => \IPS\Member::load( 1 ), // [Optional] The user whose photo should be displayed for this notification
* );
* @endcode
*/
public function parse_event_rsvp( Inline $notification, bool $htmlEscape=TRUE ): array
{
$item = $notification->item;
if ( !$item )
{
throw new OutOfRangeException;
}
$member = Member::load( $notification->extra['member'] );
return array(
'title' => Member::loggedIn()->language()->addToStack( 'notification__event_rsvp', FALSE, array( 'sprintf' => array( $member->name, $item->mapped( 'title' ) ) ) ),
'url' => $notification->item->url(),
'author' => $member
);
}
/**
* Parse notification for mobile: event_reminder
*
* @param Lang $language The language that the notification should be in
* @param Event $event The event the notification refers to
* @param Member $member The member who RSVPd
* @return array
*/
public static function parse_mobile_event_rsvp( Lang $language, Event $event, Member $member ): array
{
return array(
'title' => $language->addToStack( 'notification__event_rsvp_title' ),
'body' => $language->addToStack( 'notification__event_rsvp', FALSE, array( 'sprintf' => array( $member->name, $event->mapped('title') ) ) ),
'data' => array(
'url' => (string) $event->url(),
'author' => $member
),
'channelId' => 'events',
);
}
}
@@ -32,6 +32,7 @@ use IPS\Helpers\Form;
use IPS\Helpers\Form\Number;
use IPS\Http\Url;
use IPS\Member;
use IPS\Notification;
use IPS\Output;
use IPS\Request;
use IPS\Session;
@@ -414,6 +415,14 @@ class event extends Controller
) );
Member::loggedIn()->achievementAction( 'calendar', 'Rsvp', $this->event );
/* If we responded that we are going, send a notification to the event owner */
if( $_go == EventClass::RSVP_YES )
{
$notification = new Notification( Application::load( 'calendar' ), 'event_rsvp', $this->event, [ $this->event, Member::loggedIn() ], [ 'member' => Member::loggedIn()->member_id ] );
$notification->recipients->attach( $this->event->author() );
$notification->send();
}
}
$webhookData = [
@@ -60,6 +60,8 @@ class venue extends Controller
Output::i()->error( 'node_error', '2L354/1', 404, '' );
}
Output::i()->bodyAttributes['contentClass'] = VenueClass::class;
parent::execute();
}
@@ -22,6 +22,7 @@ use InvalidArgumentException;
use IPS\calendar\Calendar;
use IPS\calendar\Date;
use IPS\calendar\Event;
use IPS\Db;
use IPS\Dispatcher\Controller;
use IPS\GeoLocation;
use IPS\Helpers\Form;
@@ -176,6 +177,8 @@ class view extends Controller
$this->$method( $jump );
Output::i()->bodyAttributes['contentClass'] = Calendar::class;
/* Online User Location */
if ( $this->_calendar )
{
@@ -804,18 +807,9 @@ class view extends Controller
$locations = static::geocodeLocation( Request::i()->location, FALSE );
if( count( $locations ) )
{
if( $locations[0]['value'] )
{
$having[] = "( event_title LIKE CONCAT( '%', '" . $locations[0]['value'] . "', '%' ) OR name LIKE CONCAT( '%', '" . $locations[0]['value'] . "', '%' ) )";
}
$location = array( 'lat' => $locations[0]['lat'], 'lon' => $locations[0]['long'] );
$searchNearLocation = TRUE;
}
else
{
$having[] = "( event_title LIKE CONCAT( '%', '" . Request::i()->location . "', '%' ) OR name LIKE CONCAT( '%', '" . Request::i()->location . "', '%' ) )";
}
}
else if ( isset( Request::i()->lat ) and isset( Request::i()->lon ) and Request::i()->lat !== 0 and Request::i()->lon !== 0 )
{
@@ -840,11 +834,6 @@ class view extends Controller
{
$select = $select . ', ( 3959 * acos( cos( radians(' . $location['lat'] . ') ) * cos( radians( event_latitude ) ) * cos( radians( event_longitude ) - radians(' . $location['lon'] . ') ) + sin( radians(' . $location['lat'] . ') ) * sin(radians(event_latitude)) ) ) AS distance';
if( $searchNearLocation )
{
$having[] = 'distance < 500';
}
if( isset( Request::i()->sortBy ) && Request::i()->sortBy == 'nearest' )
{
$sort = 'distance asc';
@@ -0,0 +1,22 @@
{
"id": 5000075,
"name": "5.0.7 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
}
Loaded 100 of 1407 files, more files were not shown because too many files have changed in this diff. Show more