Version 4.7.8

This commit is contained in:
Neo committed 2025-12-19 16:10:42 -08:00
1 parent 7b7404e741
commit fd22d99e69
688 files changed
+19814 -10890

No files matched your search

+15 -8
View File
@@ -66,14 +66,6 @@
"downloads category"
]
},
"app=downloads&module=downloads&controller=categories&searchResult=form_1_allow_anonymous": {
"lang_key": "allow_anonymous",
"restriction": "categories_manage",
"keywords": [
"anonymous",
"anonymously"
]
},
"app=downloads&module=downloads&controller=categories&do=permissions": {
"lang_key": "menu__downloads_downloads_categories",
"restriction": "categories_manage",
@@ -215,6 +207,14 @@
"revisions"
]
},
"app=downloads&module=downloads&controller=categories&searchResult=form_1_allow_anonymous": {
"lang_key": "allow_anonymous",
"restriction": "categories_manage",
"keywords": [
"anonymous",
"anonymously"
]
},
"app=downloads&module=downloads&controller=categories&searchResult=form_2_cbitoptions_moderation": {
"lang_key": "cbitoptions_moderation",
"restriction": "categories_manage",
@@ -685,6 +685,13 @@
"prevent direct linking"
]
},
"app=downloads&module=downloads&controller=settings&searchResult=form_idm_gridview": {
"lang_key": "idm_gridview",
"restriction": "settings_manage",
"keywords": [
"grid"
]
},
"app=downloads&module=downloads&controller=settings&searchResult=form_idm_link_blacklist": {
"lang_key": "idm_link_blacklist",
"restriction": "settings_manage",
+7 -4
View File
@@ -6,15 +6,17 @@
<task frequency="P0Y0M1DT0H0M0S">tempFileCleanup</task>
<task frequency="P0Y0M1DT0H0M0S">logCleanup</task>
<setting key="idm_antileech"><![CDATA[{"key":"idm_antileech","default":"1","report":"full"}]]></setting>
<setting key="idm_default_view"><![CDATA[{"key":"idm_default_view","default":"table","report":"bool"}]]></setting>
<setting key="idm_default_view_choose"><![CDATA[{"key":"idm_default_view_choose","default":"1","report":"bool"}]]></setting>
<setting key="idm_featured_count"><![CDATA[{"key":"idm_featured_count","default":"4","report":"full"}]]></setting>
<setting key="idm_highest_rated_categories"><![CDATA[{"key":"idm_highest_rated_categories","default":"0","report":"bool"}]]></setting>
<setting key="idm_highest_rated_categories"><![CDATA[{"key":"idm_highest_rated_categories","default":"","report":"bool"}]]></setting>
<setting key="idm_link_blacklist"><![CDATA[{"key":"idm_link_blacklist","default":"","report":"bool"}]]></setting>
<setting key="idm_newest_categories"><![CDATA[{"key":"idm_newest_categories","default":"0","report":"bool"}]]></setting>
<setting key="idm_newest_categories"><![CDATA[{"key":"idm_newest_categories","default":"","report":"bool"}]]></setting>
<setting key="idm_rss"><![CDATA[{"key":"idm_rss","default":"1","report":"full"}]]></setting>
<setting key="idm_show_featured"><![CDATA[{"key":"idm_show_featured","default":"1","report":"full"}]]></setting>
<setting key="idm_show_highest_rated"><![CDATA[{"key":"idm_show_highest_rated","default":"1","report":"full"}]]></setting>
<setting key="idm_show_most_downloaded"><![CDATA[{"key":"idm_show_most_downloaded","default":"1","report":"full"}]]></setting>
<setting key="idm_show_most_downloaded_categories"><![CDATA[{"key":"idm_show_most_downloaded_categories","default":"0","report":"bool"}]]></setting>
<setting key="idm_show_most_downloaded_categories"><![CDATA[{"key":"idm_show_most_downloaded_categories","default":"","report":"bool"}]]></setting>
<setting key="idm_show_newest"><![CDATA[{"key":"idm_show_newest","default":"1","report":"full"}]]></setting>
<setting key="idm_watermarkpath"><![CDATA[{"key":"idm_watermarkpath","default":"","report":"bool"}]]></setting>
<widget key="topSubmitters"><![CDATA[{"class":"\\IPS\\Widget\\StaticCache","restrict":[],"default_area":"","allow_reuse":false,"menu_style":"menu","embeddable":true}]]></widget>
@@ -30,7 +32,6 @@
<acpsearch key="app=core&amp;module=members&amp;controller=members&amp;searchResult=form_idm_block_submissions"><![CDATA[{"lang_key":"idm_block_submissions","restriction":null,"keywords":["Files","Submit"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories"><![CDATA[{"lang_key":"menu__downloads_downloads_categories","restriction":"categories_manage","keywords":["categories","download categories"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;do=form"><![CDATA[{"lang_key":"menu__downloads_downloads_categories","restriction":"categories_manage","keywords":["add category","downloads category"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;searchResult=form_1_allow_anonymous"><![CDATA[{"lang_key":"allow_anonymous","restriction":"categories_manage","keywords":["anonymous","anonymously"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;do=permissions"><![CDATA[{"lang_key":"menu__downloads_downloads_categories","restriction":"categories_manage","keywords":["category permissions"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;searchResult=cbitoptions_allowss"><![CDATA[{"lang_key":"cbitoptions_allowss","restriction":"categories_manage","keywords":["allow screenshots","screenshots"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;searchResult=cbitoptions_comment_moderation"><![CDATA[{"lang_key":"cbitoptions_comment_moderation","restriction":"categories_manage","keywords":["comments approved","comments must","must approved"]}]]></acpsearch>
@@ -48,6 +49,7 @@
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;searchResult=ctags_noprefixes"><![CDATA[{"lang_key":"ctags_noprefixes","restriction":"categories_manage","keywords":["allow prefixes","prefixes"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;searchResult=ctypes"><![CDATA[{"lang_key":"ctypes","restriction":"categories_manage","keywords":["allowed extensions","allowed file","allowed file extensions"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;searchResult=cversioning"><![CDATA[{"lang_key":"cversioning","restriction":"categories_manage","keywords":["number revisions","revisions"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;searchResult=form_1_allow_anonymous"><![CDATA[{"lang_key":"allow_anonymous","restriction":"categories_manage","keywords":["anonymous","anonymously"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;searchResult=form_2_cbitoptions_moderation"><![CDATA[{"lang_key":"cbitoptions_moderation","restriction":"categories_manage","keywords":["approved","fies must","files approved"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;searchResult=form_2_cbitoptions_reviews"><![CDATA[{"lang_key":"cbitoptions_reviews","restriction":"categories_manage","keywords":["allow reviews","reviews"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=categories&amp;searchResult=form_2_cdesc"><![CDATA[{"lang_key":"cdesc","restriction":"categories_manage","keywords":["subcategory description"]}]]></acpsearch>
@@ -105,6 +107,7 @@
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=fields&amp;searchResult=pf_search_type"><![CDATA[{"lang_key":"pf_search_type","restriction":"fields_manage","keywords":["search behavior","search type"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=settings"><![CDATA[{"lang_key":"menu__downloads_downloads_settings","restriction":"settings_manage","keywords":["downloads","downloads settings","files"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=settings&amp;searchResult=form_idm_antileech"><![CDATA[{"lang_key":"idm_antileech","restriction":"settings_manage","keywords":["anti-leech","antileech","direct","hotlink","link","prevent direct linking"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=settings&amp;searchResult=form_idm_gridview"><![CDATA[{"lang_key":"idm_gridview","restriction":"settings_manage","keywords":["grid"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=settings&amp;searchResult=form_idm_link_blacklist"><![CDATA[{"lang_key":"idm_link_blacklist","restriction":"settings_manage","keywords":["blacklist","link","submissions","url"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=settings&amp;searchResult=form_idm_nexus_display"><![CDATA[{"lang_key":"idm_nexus_display","restriction":"settings_manage","keywords":["downloads statistics","statistics"]}]]></acpsearch>
<acpsearch key="app=downloads&amp;module=downloads&amp;controller=settings&amp;searchResult=form_idm_nexus_on"><![CDATA[{"lang_key":"idm_nexus_on","restriction":"settings_manage","keywords":["downloads","marketplace","nexus","paid downloads","paid files"]}]]></acpsearch>
+9 -10
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="downloads">
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/downloads" javascript_name="ips.downloads.browse.js" javascript_type="controller" javascript_version="107601" javascript_position="1000050">/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/downloads" javascript_name="ips.downloads.browse.js" javascript_type="controller" javascript_version="107643" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -59,7 +59,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/pending" javascript_name="ips.pending.buttons.js" javascript_type="controller" javascript_version="107601" javascript_position="1000100">/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/pending" javascript_name="ips.pending.buttons.js" javascript_type="controller" javascript_version="107643" javascript_position="1000100">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -87,7 +87,7 @@
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="admin" javascript_path="controllers/settings" javascript_name="ips.settings.settings.js" javascript_type="controller" javascript_version="107601" javascript_position="1000050">/**
<file javascript_app="downloads" javascript_location="admin" javascript_path="controllers/settings" javascript_name="ips.settings.settings.js" javascript_type="controller" javascript_version="107643" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -140,7 +140,7 @@
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.linkedScreenshots.js" javascript_type="controller" javascript_version="107601" javascript_position="1000150">/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.linkedScreenshots.js" javascript_type="controller" javascript_version="107643" javascript_position="1000150">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -212,7 +212,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.main.js" javascript_type="controller" javascript_version="107601" javascript_position="1000150"><![CDATA[/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.main.js" javascript_type="controller" javascript_version="107643" javascript_position="1000150"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -655,7 +655,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.changeLog.js" javascript_type="controller" javascript_version="107601" javascript_position="1000200"><![CDATA[/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.changeLog.js" javascript_type="controller" javascript_version="107643" javascript_position="1000200"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -778,7 +778,7 @@
});
}(jQuery, _));]]></file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.download.js" javascript_type="controller" javascript_version="107601" javascript_position="1000200">/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.download.js" javascript_type="controller" javascript_version="107643" javascript_position="1000200">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -906,7 +906,7 @@
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.subscribe.js" javascript_type="controller" javascript_version="107601" javascript_position="1000200">/**
<file javascript_app="downloads" javascript_location="front" javascript_path="controllers/view" javascript_name="ips.view.subscribe.js" javascript_type="controller" javascript_version="107643" javascript_position="1000200">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -969,7 +969,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="downloads" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.submit.js" javascript_type="template" javascript_version="107601" javascript_position="1000250"><![CDATA[/* VIEW TEMPLATES */
<file javascript_app="downloads" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.submit.js" javascript_type="template" javascript_version="107643" javascript_position="1000250"><![CDATA[/* VIEW TEMPLATES */
ips.templates.set('downloads.submit.screenshot', " \
<div class='ipsUploader__row ipsUploader__row--withBorder ipsUploader__row--image ipsAttach ipsContained {{#done}}ipsAttach_done{{/done}}' id='{{id}}' data-role='file' data-fileid='{{id}}' data-filesize='{{sizeRaw}}' data-fullsizeurl='{{imagesrc}}' data-thumbnailurl='{{thumbnail}}' data-fileType='image'>\
<div class='ipsUploader__rowPreview ipsType_center' data-role='preview'>\
@@ -1042,7 +1042,6 @@ controllers</order>
<order app="global" path="/dev/js//library/">underscore
jquery
mustache
jstz
IntersectionObserver
Debug.js
app.js</order>
+9 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="downloads" version="107601">
<app key="downloads" version="107643">
<word key="__app_downloads" js="0">Downloads</word>
<word key="frontnavigation_downloads" js="0">Downloads</word>
<word key="__indefart_downloads_file_comment" js="0">a comment on a file</word>
@@ -189,6 +189,13 @@
<word key="idm_watermarkpath_desc" js="0">The image provided will be overlaid on all screenshot images (for example, to show a copyright message). For best results, use a small image with a transparent background.</word>
<word key="acplogs__downloads_recount_downloads" js="0">Recounted downloads for category: %s</word>
<word key="download_settings_saved_rebuilding" js="0">Saved. Your screenshots are rebuilding in the background.</word>
<word key="idm_default_view" js="0">Default category view</word>
<word key="idm_default_view_choose" js="0">Member can choose?</word>
<word key="downloads_default_view_table" js="0">Table: A traditional table view</word>
<word key="downloads_default_view_grid" js="0">Grid: Display files as cards in a grid</word>
<word key="downloads_default_view_choose" js="0">Members can choose?</word>
<word key="downloads_default_view_choose_desc" js="0">Select the views you will allow members to choose from</word>
<word key="downloads_default_view_choose_none" js="0">Do not allow members to choose</word>
<word key="idm_view_approvers" js="0">Can view who approved files?</word>
<word key="idm_bypass_revision" js="0">Can manage versions?</word>
<word key="idm_view_downloads" js="0">Can view who has downloaded files?</word>
@@ -612,6 +619,7 @@
<word key="AchievementAction__DownloadFile_title_generic" js="0">file downloaded</word>
<word key="AchievementAction__DownloadFile_title" js="0">User downloads a file</word>
<word key="AchievementAction__DownloadFile" js="0">Member downloads a Downloads File</word>
<word key="webhook_downloads_new_version" js="0">Fired when a new version gets available</word>
<word key="makePrimaryScreenshot" js="1">Make this the primary screenshot for this file</word>
<word key="makePrimary" js="1">Primary</word>
<word key="removeScreenshot" js="1">Remove this screenshot</word>
+53
View File
@@ -1389,6 +1389,18 @@
"comment": "",
"unsigned": false,
"auto_increment": false
},
"file_last_comment_anon": {
"name": "file_last_comment_anon",
"type": "TINYINT",
"length": null,
"decimals": null,
"values": null,
"allow_null": true,
"default": "0",
"comment": "",
"unsigned": true,
"auto_increment": false
}
},
"indexes": {
@@ -3027,5 +3039,46 @@
]
}
}
},
"downloads_view_method": {
"name": "downloads_view_method",
"columns": {
"member_id": {
"name": "member_id",
"type": "BIGINT",
"length": "20",
"decimals": null,
"values": null,
"allow_null": false,
"default": 0,
"comment": "ID Number",
"unsigned": true,
"auto_increment": false
},
"method": {
"name": "method",
"type": "VARCHAR",
"length": 16,
"decimals": null,
"values": null,
"allow_null": true,
"default": "table",
"comment": "",
"unsigned": false,
"auto_increment": false
}
},
"indexes": {
"uniquemember": {
"type": "unique",
"name": "uniquemember",
"columns": [
"member_id"
],
"length": [
null
]
}
}
}
}
+13 -3
View File
@@ -4,6 +4,16 @@
"default": "1",
"report": "full"
},
{
"key": "idm_default_view",
"default": "table",
"report": "bool"
},
{
"key": "idm_default_view_choose",
"default": "1",
"report": "bool"
},
{
"key": "idm_featured_count",
"default": "4",
@@ -11,7 +21,7 @@
},
{
"key": "idm_highest_rated_categories",
"default": "0",
"default": "",
"report": "bool"
},
{
@@ -21,7 +31,7 @@
},
{
"key": "idm_newest_categories",
"default": "0",
"default": "",
"report": "bool"
},
{
@@ -46,7 +56,7 @@
},
{
"key": "idm_show_most_downloaded_categories",
"default": "0",
"default": "",
"report": "bool"
},
{
+378 -207
View File
@@ -131,7 +131,9 @@
{{if $category->club()}}
</div>
{{endif}}]]></template>
<template template_group="browse" template_name="categoryButtons" template_data="$canSubmitFiles, $currentCategory=NULL, $showReadButtonOnMobile=FALSE" template_location="front" template_app="downloads"><![CDATA[
<template template_group="browse" template_name="categoryButtons" template_data="$canSubmitFiles, $currentCategory=NULL, $showReadButtonOnMobile=FALSE" template_location="front" template_app="downloads"><![CDATA[{{if $currentCategory}}
{template="viewChange" group="browse" params="$currentCategory" }
{{endif}}
{{if $canSubmitFiles}}
<li class='ipsToolList_primaryAction'>
{{if $currentCategory OR $currentCategory = \IPS\downloads\Category::theOnlyNode()}}
@@ -321,6 +323,98 @@
</div>
</div>
</li>]]></template>
<template template_group="browse" template_name="fileGrid" template_data="$file, $table" template_location="front" template_app="downloads"><![CDATA[<div class="ipsBox ipsBox--child ">
{{if $table AND method_exists( $table, 'canModerate' ) AND $table->canModerate()}}
<div class='ipsDataItem_modCheck'>
<span class='ipsCustomInput'>
<input type='checkbox' data-role='moderation' name="moderate[{$file->id}]" data-actions="{expression="implode( ' ', $table->multimodActions( $file ) )"}" data-state='{{if $file->tableStates()}}{$file->tableStates()}{{endif}}'>
<span></span>
</span>
</div>
{{endif}}
{template="thumbImage" group="global" app="core" params="$file->primary_screenshot_thumb, $file->name, 'medium', '', 'view_this', $file->url( 'getPrefComment' ), 'core_Attachment', '', true"}
<h4 class='ipsDataItem_title ipsType_sectionHead ipsContained_container'>
{{if $file->unread()}}
<span><span class='ipsItemStatus ipsItemStatus_small' data-ipsTooltip title='{{if $file->unread() === -1}}{lang="new"}{{else}}{lang="updated"}{{endif}}'><i class="fa fa-circle"></i></span>&nbsp;</span>
{{endif}}
{{if $file->mapped('pinned') || $file->mapped('featured') || $file->hidden() === -1 || $file->hidden() === 1}}
{{if $file->hidden() === -1}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$file->hiddenBlurb()}'><i class='fa fa-eye-slash'></i></span></span>
{{elseif $file->hidden() === 1}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="pending_approval"}'><i class='fa fa-warning'></i></span></span>
{{endif}}
{{if $file->mapped('pinned')}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="pinned"}'><i class='fa fa-thumb-tack'></i></span></span>
{{endif}}
{{if $file->mapped('featured')}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="featured"}'><i class='fa fa-star'></i></span></span>
{{endif}}
{{endif}}
{{if $file->prefix()}}
<span>{template="prefix" group="global" app="core" params="$file->prefix( TRUE ), $file->prefix()"}</span>
{{endif}}
<span class='ipsType_break ipsContained'><a href='{$file->url( "getPrefComment" )}' title='{lang="view_this_file" sprintf="$file->name"} {{if $file->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $file->canEdit()}}data-role="editableTitle"{{endif}}>{$file->name}</a></span>
</h4>
<p class='ipsType_reset ipsType_light ipsType_blendLinks'>
{lang="byline_nodate" htmlsprintf="$file->author()->link( NULL, NULL, $file->isAnonymous() )"}
{{if \IPS\Request::i()->app != 'downloads'}}
{lang="in"} <a href="{$file->container()->url()}">{$file->container()->_title}</a>
{{endif}}
</p>
<div class='ipsDataItem_generic ipsDataItem_size8'>
<p class='ipsType_medium'><strong>{{if $file->updated == $file->submitted}}{lang="submitted"} {datetime="$file->submitted" lowercase="true"}{{else}}{lang="updated"} {datetime="$file->updated" lowercase="true"}{{endif}}</strong></p>
</div>
<!-- Rating -->
{{if $file->container()->bitoptions['reviews']}}
{template="rating" group="global" location="front" app="core" params="'large', $file->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $file->memberReviewRating()"}&nbsp;&nbsp; <span class='ipsType_normal ipsType_light'>({lang="num_reviews" pluralize="$file->reviews"})</span>
{{endif}}
<!-- Comments -->
{{if $file->container()->bitoptions['comments']}}
<p class='ipsType_normal'>
{{if $file->comments}}
<a href='{$file->url()->setQueryString( 'tab', 'comments' )->setFragment('replies')}'>
{{endif}}
<i class='fa fa-comment'></i> {lang="num_comments" pluralize="$file->comments"}
{{if $file->comments}}
</a>
{{endif}}
</p>
{{endif}}
<!-- Price -->
{{if \IPS\Application::appIsEnabled( 'nexus' ) and settings.idm_nexus_on}}
<p class='ipsType_large ipsType_center ipsType_reset ipsSpacer_top ipsSpacer_half'>
<span class='cFilePrice'>
{{if $file->isPaid()}}
{{if $price = $file->price()}}
{$price|raw}
{{endif}}
{{else}}
{lang="file_free"}
{{endif}}
</span>
</p>
<!-- Purchase Count -->
<p class='ipsType_normal'>
{{if $file->isPaid() and !$file->nexus and \in_array( 'purchases', explode( ',', settings.idm_nexus_display ) )}}
<span {{if !$file->purchaseCount()}}class='ipsType_light'{{endif}}><i class='fa fa-shopping-cart'></i> {lang="x_purchases" pluralize="$file->purchaseCount()"}</span>&nbsp;&nbsp;
{{endif}}
{{if !$file->isPaid() or \in_array( 'downloads', explode( ',', settings.idm_nexus_display ) )}}
<span {{if !$file->downloads}}class='ipsType_light'{{endif}}><i class='fa fa-arrow-circle-down'></i> {lang="num_downloads" pluralize="$file->downloads"}</span>
{{endif}}
</p>
<!-- Tags -->
{{if \count( $file->tags() )}}
{template="tags" group="global" app="core" params="$file->tags(), TRUE"}
{{endif}}
{{endif}}
</div>]]></template>
<template template_group="browse" template_name="index" template_data="$featured, $new, $rated, $downloaded" template_location="front" template_app="downloads"><![CDATA[<div class="ipsPageHeader ipsClearfix ipsFlex ipsFlex-ai:center ipsFlex-jc:between sm:ipsFlex-fd:column sm:ipsFlex-ai:stretch ipsMargin_bottom sm:ipsMargin:none">
<h1 class="ipsType_pageTitle">{lang="downloads"}</h1>
<ul class="ipsToolList ipsToolList_horizontal ipsClearfix ipsFlex-flex:11 ipsMargin_bottom:none sm:ipsMargin_bottom sm:ipsMargin_top:half">
@@ -509,101 +603,170 @@
{lang="submit_first_file"}</a>
{{endif}}
</div>]]></template>
<template template_group="browse" template_name="rows" template_data="$table, $headers, $files" template_location="front" template_app="downloads"><![CDATA[{{if \count( $files )}}
{{foreach $files as $file}}
<li class='ipsDataItem {{if $file->unread()}}ipsDataItem_unread{{endif}} {{if method_exists( $file, 'tableClass' ) && $file->tableClass()}}ipsDataItem_{$file->tableClass()}{{endif}} {{if $file->hidden()}}ipsModerated{{endif}}' data-ipsLazyLoad>
<div class='ipsDataItem_generic ipsDataItem_size3 ipsPos_top'>
{template="thumbImage" group="global" app="core" params="$file->primary_screenshot_thumb, $file->name, 'medium', '', 'view_this', $file->url( 'getPrefComment' ), 'core_Attachment', '', true"}
<template template_group="browse" template_name="rows" template_data="$table, $headers, $files" template_location="front" template_app="downloads"><![CDATA[
{{if \count( $files )}}
{{if \IPS\downloads\Category::getMemberView() == 'grid'}}
<div class="ipsFluidGrid ipsFluidGrid--downloads">
{{foreach $files as $file}}
<li>
<div class='ipsMargin_bottom:half'>
{template="thumbImage" group="global" app="core" params="$file->primary_screenshot_thumb, $file->name, 'large', '', '', $file->url( 'getPrefComment' )"}
</div>
{{$price = NULL;}}
{{if \IPS\Application::appIsEnabled( 'nexus' ) and settings.idm_nexus_on}}
<p class='ipsType_large ipsType_center ipsType_reset ipsSpacer_top ipsSpacer_half'>
<span class='cFilePrice'>
{{if $file->isPaid()}}
{{if $price = $file->price()}}
{$price|raw}
{{endif}}
{{else}}
{lang="file_free"}
<div class="cWidgetPrice ipsType_light ipsType_semiBold">
{{if $file->isPaid()}}
{{if $price = $file->price()}}
{$price|raw}
{{endif}}
</span>
</p>
{{else}}
{lang="file_free_feed"}
{{endif}}
</div>
{{endif}}
</div>
<div class='ipsDataItem_main'>
<h4 class='ipsDataItem_title ipsType_sectionHead ipsContained_container'>
{{if $file->unread()}}
<span><span class='ipsItemStatus ipsItemStatus_small' data-ipsTooltip title='{{if $file->unread() === -1}}{lang="new"}{{else}}{lang="updated"}{{endif}}'><i class="fa fa-circle"></i></span>&nbsp;</span>
<div class='ipsFlex ipsFlex-jc:between ipsGap:1'>
<div class='ipsType_semiBold ipsType_normal ipsType_break ipsContained'><a href="{$file->url( "getPrefComment" )}" title='{lang="view_this_file" sprintf="$file->name"}'>{$file->name}</a></div>
{{if $file->container()->bitoptions['reviews']}}
<div class='ipsFlex-flex:00'>
{template="rating" group="global" location="front" app="core" params="'small', $file->rating, \IPS\Settings::i()->reviews_rating_out_of"}
</div>
{{endif}}
{{if $file->mapped('pinned') || $file->mapped('featured') || $file->hidden() === -1 || $file->hidden() === 1}}
{{if $file->hidden() === -1}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$file->hiddenBlurb()}'><i class='fa fa-eye-slash'></i></span></span>
{{elseif $file->hidden() === 1}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="pending_approval"}'><i class='fa fa-warning'></i></span></span>
{{endif}}
{{if $file->mapped('pinned')}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="pinned"}'><i class='fa fa-thumb-tack'></i></span></span>
{{endif}}
{{if $file->mapped('featured')}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="featured"}'><i class='fa fa-star'></i></span></span>
{{endif}}
{{endif}}
{{if $file->prefix()}}
<span>{template="prefix" group="global" app="core" params="$file->prefix( TRUE ), $file->prefix()"}</span>
{{endif}}
<span class='ipsType_break ipsContained'><a href='{$file->url( "getPrefComment" )}' title='{lang="view_this_file" sprintf="$file->name"} {{if $file->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $file->canEdit()}}data-role="editableTitle"{{endif}}>{$file->name}</a></span>
</h4>
<p class='ipsType_reset ipsType_light ipsType_blendLinks'>
{lang="byline_nodate" htmlsprintf="$file->author()->link( NULL, NULL, $file->isAnonymous() )"}
{{if \IPS\Request::i()->app != 'downloads'}}
{lang="in"} <a href="{$file->container()->url()}">{$file->container()->_title}</a>
{{endif}}
</p>
<div class='ipsType_medium ipsType_richText ipsType_break ipsSpacer_top' data-ipsTruncate data-ipsTruncate-type="remove" data-ipsTruncate-size="2 lines">
</div>
<div class='ipsType_richText ipsType_break ipsMargin_bottom:half' data-ipsTruncate data-ipsTruncate-type="remove" data-ipsTruncate-size="2 lines">
{$file->truncated()|raw}
</div>
<p class='ipsType_normal'>
{{if $file->isPaid() and !$file->nexus and \in_array( 'purchases', explode( ',', settings.idm_nexus_display ) )}}
<span {{if !$file->purchaseCount()}}class='ipsType_light'{{endif}}><i class='fa fa-shopping-cart'></i> {lang="x_purchases" pluralize="$file->purchaseCount()"}</span>&nbsp;&nbsp;
{{endif}}
{{if !$file->isPaid() or \in_array( 'downloads', explode( ',', settings.idm_nexus_display ) )}}
<span {{if !$file->downloads}}class='ipsType_light'{{endif}}><i class='fa fa-arrow-circle-down'></i> {lang="num_downloads" pluralize="$file->downloads"}</span>
{{endif}}
</p>
{{if \count( $file->tags() )}}
{template="tags" group="global" app="core" params="$file->tags(), TRUE"}
{{endif}}
</div>
<div class='ipsDataItem_generic ipsDataItem_size8'>
{{if $file->container()->bitoptions['reviews']}}
{template="rating" group="global" location="front" app="core" params="'large', $file->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $file->memberReviewRating()"}&nbsp;&nbsp; <span class='ipsType_normal ipsType_light'>({lang="num_reviews" pluralize="$file->reviews"})</span>
{{endif}}
{{if $file->container()->bitoptions['comments']}}
<p class='ipsType_normal'>
{{if $file->comments}}
<a href='{$file->url()->setQueryString( 'tab', 'comments' )->setFragment('replies')}'>
{{endif}}
<i class='fa fa-comment'></i> {lang="num_comments" pluralize="$file->comments"}
{{if $file->comments}}
</a>
{{endif}}
</p>
{{endif}}
<p class='ipsType_medium'><strong>{{if $file->updated == $file->submitted}}{lang="submitted"} {datetime="$file->submitted" lowercase="true"}{{else}}{lang="updated"} {datetime="$file->updated" lowercase="true"}{{endif}}</strong></p>
</div>
{{if $table AND method_exists( $table, 'canModerate' ) AND $table->canModerate()}}
<div class='ipsDataItem_modCheck'>
<span class='ipsCustomInput'>
<input type='checkbox' data-role='moderation' name="moderate[{$file->id}]" data-actions="{expression="implode( ' ', $table->multimodActions( $file ) )"}" data-state='{{if $file->tableStates()}}{$file->tableStates()}{{endif}}'>
<span></span>
</span>
<div class='ipsFlex ipsFlex-ai:center ipsFlex-fw:wrap ipsFlex-jc:between ipsGap:1'>
<div class='ipsFlex-flex:11 ipsType_light ipsType_medium ipsType_blendLinks'>{lang="byline_nodate" htmlsprintf="$file->author()->link( NULL, NULL, $file->isAnonymous() )"}</div>
<div>
<div class='ipsFlex ipsFlex-ai:center ipsGap:4 ipsGap_row:2 ipsType_light'>
{{if $file->isPaid() and !$file->nexus and \in_array( 'purchases', explode( ',', settings.idm_nexus_display ) )}}
<span {{if !$file->purchaseCount()}}class='ipsType_light'{{endif}} title='{lang="idm_purchases"}' data-ipsTooltip><i class='fa fa-shopping-cart'></i> {$file->purchaseCount()}</span>
{{endif}}
{{if !$file->isPaid() or \in_array( 'downloads', explode( ',', settings.idm_nexus_display ) )}}
<span {{if !$file->downloads}}class='ipsType_light'{{endif}} title='{lang="downloads"}' data-ipsTooltip><i class='fa fa-download'></i> {number="$file->downloads"}</span>
{{endif}}
{{if $file->container()->bitoptions['comments']}}<span {{if !$file->comments}}class='ipsType_light'{{endif}} title='{lang="total_comments"}' data-ipsTooltip><i class='fa fa-comments-o'></i> {$file->comments}</span>{{endif}}
</span>
</div>
</div>
</div>
{{endif}}
</li>
{{endforeach}}
</li>
{{endforeach}}
</div>
{{else}}
{{foreach $files as $file}}
{template="tableRow" group="browse" app="downloads" params="$file, $table"}
{{endforeach}}
{{endif}}
{{endif}}]]></template>
<template template_group="browse" template_name="tableRow" template_data="$file, $table" template_location="front" template_app="downloads"><![CDATA[<li class='ipsDataItem {{if $file->unread()}}ipsDataItem_unread{{endif}} {{if method_exists( $file, 'tableClass' ) && $file->tableClass()}}ipsDataItem_{$file->tableClass()}{{endif}} {{if $file->hidden()}}ipsModerated{{endif}}' data-ipsLazyLoad>
<div class='ipsDataItem_generic ipsDataItem_size3 ipsPos_top'>
{template="thumbImage" group="global" app="core" params="$file->primary_screenshot_thumb, $file->name, 'medium', '', 'view_this', $file->url( 'getPrefComment' ), 'core_Attachment', '', true"}
{{if \IPS\Application::appIsEnabled( 'nexus' ) and settings.idm_nexus_on}}
<p class='ipsType_large ipsType_center ipsType_reset ipsSpacer_top ipsSpacer_half'>
<span class='cFilePrice'>
{{if $file->isPaid()}}
{{if $price = $file->price()}}
{$price|raw}
{{endif}}
{{else}}
{lang="file_free"}
{{endif}}
</span>
</p>
{{endif}}
</div>
<div class='ipsDataItem_main'>
<h4 class='ipsDataItem_title ipsType_sectionHead ipsContained_container'>
{{if $file->unread()}}
<span><span class='ipsItemStatus ipsItemStatus_small' data-ipsTooltip title='{{if $file->unread() === -1}}{lang="new"}{{else}}{lang="updated"}{{endif}}'><i class="fa fa-circle"></i></span>&nbsp;</span>
{{endif}}
{{if $file->mapped('pinned') || $file->mapped('featured') || $file->hidden() === -1 || $file->hidden() === 1}}
{{if $file->hidden() === -1}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$file->hiddenBlurb()}'><i class='fa fa-eye-slash'></i></span></span>
{{elseif $file->hidden() === 1}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="pending_approval"}'><i class='fa fa-warning'></i></span></span>
{{endif}}
{{if $file->mapped('pinned')}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="pinned"}'><i class='fa fa-thumb-tack'></i></span></span>
{{endif}}
{{if $file->mapped('featured')}}
<span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="featured"}'><i class='fa fa-star'></i></span></span>
{{endif}}
{{endif}}
{{if $file->prefix()}}
<span>{template="prefix" group="global" app="core" params="$file->prefix( TRUE ), $file->prefix()"}</span>
{{endif}}
<span class='ipsType_break ipsContained'><a href='{$file->url( "getPrefComment" )}' title='{lang="view_this_file" sprintf="$file->name"} {{if $file->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $file->canEdit()}}data-role="editableTitle"{{endif}}>{$file->name}</a></span>
</h4>
<p class='ipsType_reset ipsType_light ipsType_blendLinks'>
{lang="byline_nodate" htmlsprintf="$file->author()->link( NULL, NULL, $file->isAnonymous() )"}
{{if \IPS\Request::i()->app != 'downloads'}}
{lang="in"} <a href="{$file->container()->url()}">{$file->container()->_title}</a>
{{endif}}
</p>
<div class='ipsType_medium ipsType_richText ipsType_break ipsSpacer_top' data-ipsTruncate data-ipsTruncate-type="remove" data-ipsTruncate-size="2 lines">
{$file->truncated()|raw}
</div>
<p class='ipsType_normal'>
{{if $file->isPaid() and !$file->nexus and \in_array( 'purchases', explode( ',', settings.idm_nexus_display ) )}}
<span {{if !$file->purchaseCount()}}class='ipsType_light'{{endif}}><i class='fa fa-shopping-cart'></i> {lang="x_purchases" pluralize="$file->purchaseCount()"}</span>&nbsp;&nbsp;
{{endif}}
{{if !$file->isPaid() or \in_array( 'downloads', explode( ',', settings.idm_nexus_display ) )}}
<span {{if !$file->downloads}}class='ipsType_light'{{endif}}><i class='fa fa-arrow-circle-down'></i> {lang="num_downloads" pluralize="$file->downloads"}</span>
{{endif}}
</p>
{{if \count( $file->tags() )}}
{template="tags" group="global" app="core" params="$file->tags(), TRUE"}
{{endif}}
</div>
<div class='ipsDataItem_generic ipsDataItem_size8'>
{{if $file->container()->bitoptions['reviews']}}
{template="rating" group="global" location="front" app="core" params="'large', $file->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $file->memberReviewRating()"}&nbsp;&nbsp; <span class='ipsType_normal ipsType_light'>({lang="num_reviews" pluralize="$file->reviews"})</span>
{{endif}}
{{if $file->container()->bitoptions['comments']}}
<p class='ipsType_normal'>
{{if $file->comments}}
<a href='{$file->url()->setQueryString( 'tab', 'comments' )->setFragment('replies')}'>
{{endif}}
<i class='fa fa-comment'></i> {lang="num_comments" pluralize="$file->comments"}
{{if $file->comments}}
</a>
{{endif}}
</p>
{{endif}}
<p class='ipsType_medium'><strong>{{if $file->updated == $file->submitted}}{lang="submitted"} {datetime="$file->submitted" lowercase="true"}{{else}}{lang="updated"} {datetime="$file->updated" lowercase="true"}{{endif}}</strong></p>
</div>
{{if $table AND method_exists( $table, 'canModerate' ) AND $table->canModerate()}}
<div class='ipsDataItem_modCheck'>
<span class='ipsCustomInput'>
<input type='checkbox' data-role='moderation' name="moderate[{$file->id}]" data-actions="{expression="implode( ' ', $table->multimodActions( $file ) )"}" data-state='{{if $file->tableStates()}}{$file->tableStates()}{{endif}}'>
<span></span>
</span>
</div>
{{endif}}
</li>]]></template>
<template template_group="browse" template_name="viewChange" template_data="$currentCategory, $hideMobile=FALSE" template_location="front" template_app="downloads"><![CDATA[{{if settings.idm_default_view_choose and member.member_id}}
{{$chosen = \IPS\downloads\Category::getMemberView();}}
<li>
<ul class='ipsButton_split'>
<li>
<a href='{$currentCategory->url()->setQueryString("do", "setMethod")->setQueryString("method","table")->csrf()}' class='ipsButton {{if $chosen == 'table'}}ipsButton_primary{{else}}ipsButton_veryLight{{endif}} ipsButton_narrow ipsButton_medium' data-ipsTooltip data-ipsTooltip-safe title='{lang='downloads_default_view_table' escape='true'}' rel='nofollow'>
<i class='fa fa-align-justify'></i>
</a>
</li>
<li>
<a href='{$currentCategory->url()->setQueryString('do', 'setMethod')->setQueryString('method','grid')->csrf()}' class='ipsButton {{if $chosen == 'grid'}}ipsButton_primary{{else}}ipsButton_veryLight{{endif}} ipsButton_narrow ipsButton_medium' data-ipsTooltip data-ipsTooltip-safe title='{lang='downloads_default_view_grid' escape='true'}' rel='nofollow'>
<i class='fa fa-th-large'></i>
</a>
</li>
</ul>
</li>
{{endif}}]]></template>
<template template_group="dashboard" template_name="overview" template_data="$data" template_location="admin" template_app="downloads"><![CDATA[<ul class="ipsDataList">
{{foreach $data as $k => $v}}
@@ -693,7 +856,7 @@
{{else}}
<a href='{$item->url('buy')->csrf()}' class='ipsButton ipsButton_fullWidth ipsButton_small ipsButton_primary'><i class='fa fa-shopping-cart'></i> &nbsp;{lang="buy_now"}{{if $price = $item->price()}} - {$price|raw}{{endif}}</a>
{{endif}}
{{elseif !$item->isPurchasable( FALSE )}}
{{elseif $item->isPaid() AND !$item->isPurchasable( FALSE )}}
{lang="purchasing_disabled"}
{{else}}
{{if $item->canDownload() or !$item->downloadTeaser()}}
@@ -2112,7 +2275,7 @@
</div>
</div>
<div class='ipsFlex-flex:01 ipsResponsive_hidePhone'>
<div class='ipsFlex ipsFlex-ai:center ipsFlex-jc:center ipsGap:3 ipsGap_row:0'>
<div class='ipsShareLinks'>
{{if \count( $file->shareLinks() )}}
{template="shareButton" app="core" group="sharelinks" params="$file"}
{{endif}}
@@ -2132,9 +2295,19 @@
<div class="ipsMessage ipsMessage_warning ipsSpacer_both ipsClearfix">
<p class="ipsType_reset">
{lang="file_pending_approval_version"}
{{if $file->canUnhide() OR $file->canHide()}}
<a href="{expression="\IPS\downloads\File\PendingVersion::load($file->id, 'pending_file_id')->url()"}" class="ipsPos_right ipsButton ipsButton_positive ipsButton_verySmall sm:ipsMargin_top:half sm:ipsPos_left" title='{lang="file_pending_version_button"}'>{lang="file_pending_version_button"}</a>
{{endif}}
<ul class='ipsList_inline ipsPos_right' data-controller="downloads.front.pending.buttons">
{{if $file->canUnhide() OR $file->canHide()}}
<li>
<a href="{expression="\IPS\downloads\File\PendingVersion::load($file->id, 'pending_file_id')->url()"}" class="ipsPos_right ipsButton ipsButton_positive ipsButton_verySmall sm:ipsMargin_top:half sm:ipsPos_left" title='{lang="file_pending_version_button"}'>{lang="file_pending_version_button"}</a>
</li>
{{endif}}
{{if $file->canDeletePendingVersion() }}
<li>
<a href="{expression="\IPS\downloads\File\PendingVersion::load($file->id, 'pending_file_id')->url()->setQueryString('do','delete')->csrf()"}" class="ipsPos_right ipsButton ipsButton_negative ipsButton_verySmall sm:ipsMargin_top:half sm:ipsPos_left" title='{lang="delete"}' data-confirm>{lang="delete"}</a>
</li>
{{endif}}
</ul>
</p>
</div>
{{endif}}
@@ -2457,21 +2630,13 @@
</div>
<div class='ipsBox ipsPadding ipsResponsive_pull ipsResponsive_showPhone ipsMargin_top'>
<div class='ipsGap_row:3'>
<div>
{template="notify" app="downloads" group="view" params="$file"}
</div>
<div class='ipsShareLinks'>
{template="notify" app="downloads" group="view" params="$file"}
{{if \count( $file->shareLinks() )}}
<div>
{template="shareButton" app="core" group="sharelinks" params="$file, 'verySmall', 'light'"}
</div>
{template="shareButton" app="core" group="sharelinks" params="$file, 'verySmall', 'light'"}
{{endif}}
<div>
{template="follow" app="core" group="global" params="'downloads', 'file', $file->id, $file->followersCount()"}
</div>
<div>
{template="promote" app="core" group="global" params="$file"}
</div>
{template="follow" app="core" group="global" params="'downloads', 'file', $file->id, $file->followersCount()"}
{template="promote" app="core" group="global" params="$file"}
</div>
</div>
@@ -2510,7 +2675,7 @@
<template template_group="widgets" template_name="downloadsCommentFeed" template_data="$comments, $title, $orientation='vertical'" template_location="front" template_app="downloads"><![CDATA[{{if !empty( $comments ) }}
<h3 class='ipsType_reset ipsWidget_title'>{$title}</h3>
{{if $orientation == 'vertical'}}
<div class='ipsWidget_inner ipsPad_half'>
<div class='ipsWidget_inner'>
<ul class='ipsDataList ipsDataList_reducedSpacing'>
{{foreach $comments as $comment}}
<li class='ipsDataItem'>
@@ -2518,8 +2683,8 @@
{template="userPhoto" group="global" app="core" params="$comment->author(), 'tiny'"}
</div>
<div class='ipsDataItem_main'>
<div class='ipsType_break ipsContained'><a href="{$comment->url()}" class='ipsType_medium ipsTruncate ipsTruncate_line'>{$comment->item()->name}</a></div>
<p class='ipsType_reset ipsType_light ipsType_medium ipsType_blendLinks'>{lang="byline_nodate" htmlsprintf="$comment->author()->link( NULL, NULL, $comment->isAnonymous() )"} &middot; <a href='{$comment->item()->url()->setQueryString( array( 'do' => 'findComment', 'comment' => $comment->id ) )}' class='ipsType_blendLinks'>{$comment->dateLine()|raw}</a></p>
<div class='ipsType_break ipsContained'><a href="{$comment->url()}" class='ipsDataItem_title'>{$comment->item()->name}</a></div>
<p class='ipsType_reset ipsType_light ipsType_blendLinks'>{lang="byline_nodate" htmlsprintf="$comment->author()->link( NULL, NULL, $comment->isAnonymous() )"} &middot; <a href='{$comment->item()->url()->setQueryString( array( 'do' => 'findComment', 'comment' => $comment->id ) )}' class='ipsType_blendLinks'>{$comment->dateLine()|raw}</a></p>
<div class='ipsType_medium ipsType_textBlock ipsType_richText ipsType_break ipsContained ipsSpacer_top ipsSpacer_half' data-ipsTruncate data-ipsTruncate-type='remove' data-ipsTruncate-size='{{if $orientation == 'vertical'}}6 lines{{else}}2 lines{{endif}}' data-ipsTruncate-watch='false'>
{$comment->truncated( true )|raw}
</div>
@@ -2603,7 +2768,7 @@
<template template_group="widgets" template_name="downloadsReviewFeed" template_data="$comments, $title, $orientation='vertical'" template_location="front" template_app="downloads"><![CDATA[{{if !empty( $comments ) }}
<h3 class='ipsType_reset ipsWidget_title'>{$title}</h3>
{{if $orientation == 'vertical'}}
<div class='ipsWidget_inner ipsPad_half'>
<div class='ipsWidget_inner'>
<ul class='ipsDataList ipsDataList_reducedSpacing'>
{{foreach $comments as $comment}}
<li class='ipsDataItem'>
@@ -2611,8 +2776,8 @@
{template="userPhoto" group="global" app="core" params="$comment->author(), 'tiny'"}
</div>
<div class='ipsDataItem_main'>
<div class='ipsType_break ipsContained'><a href="{$comment->url()}" class='ipsTruncate ipsTruncate_line'>{$comment->item()->name}</a></div>
<span class='ipsType_light ipsType_small'>{lang="byline_nodate" htmlsprintf="$comment->author()->link()"} &middot; <a href='{$comment->item()->url()->setQueryString( array( 'do' => 'findReview', 'review' => $comment->id ) )}' class='ipsType_blendLinks'>{$comment->dateLine()|raw}</a></span>
<div class='ipsType_break ipsContained'><a href="{$comment->url()}" class='ipsDataItem_title'>{$comment->item()->name}</a></div>
<span class='ipsType_light ipsType_blendLinks'>{lang="byline_nodate" htmlsprintf="$comment->author()->link()"} &middot; <a href='{$comment->item()->url()->setQueryString( array( 'do' => 'findReview', 'review' => $comment->id ) )}' class='ipsType_blendLinks'>{$comment->dateLine()|raw}</a></span>
{template="rating" group="global" location="front" app="core" params="'small', $comment->rating, \IPS\Settings::i()->reviews_rating_out_of"}
<div class='ipsType_medium ipsType_textBlock ipsType_richText ipsType_break ipsContained' data-ipsTruncate data-ipsTruncate-type='remove' data-ipsTruncate-size='{{if $orientation == 'vertical'}}6 lines{{else}}2 lines{{endif}}' data-ipsTruncate-watch='false'>
{$comment->truncated( true )|raw}
@@ -2688,116 +2853,112 @@
<template template_group="widgets" template_name="downloadStats" template_data="$stats, $latestFile, $orientation='vertical'" template_location="front" template_app="downloads"><![CDATA[<h3 class='ipsType_reset ipsWidget_title'>{lang="block_downloadStats"}</h3>
<div class='ipsWidget_inner'>
{{if $orientation == 'vertical'}}
<div class='ipsPad_half'>
<ul class='ipsDataList' id='elDownloadsStats'>
<ul class='ipsDataList' id='elDownloadsStats'>
<li class='ipsDataItem'>
<div class='ipsDataItem_main ipsPos_middle'>
<strong>{lang="total_files_front"}</strong>
</div>
<div class='ipsDataItem_stats ipsDataItem_statsLarge'>
<span class='ipsDataItem_stats_number'>{number="$stats['totalFiles']"}</span>
</div>
</li>
{{if $stats['totalComments']}}
<li class='ipsDataItem'>
<div class='ipsDataItem_main ipsPos_middle'>
<strong>{lang="total_files_front"}</strong>
<strong>{lang="total_comments"}</strong>
</div>
<div class='ipsDataItem_stats ipsDataItem_statsLarge'>
<span class='ipsDataItem_stats_number'>{number="$stats['totalFiles']"}</span>
<span class='ipsDataItem_stats_number'>{number="$stats['totalComments']"}</span>
</div>
</li>
{{if $stats['totalComments']}}
<li class='ipsDataItem'>
<div class='ipsDataItem_main ipsPos_middle'>
<strong>{lang="total_comments"}</strong>
</div>
<div class='ipsDataItem_stats ipsDataItem_statsLarge'>
<span class='ipsDataItem_stats_number'>{number="$stats['totalComments']"}</span>
</div>
</li>
{{endif}}
{{if $stats['totalReviews']}}
<li class='ipsDataItem'>
<div class='ipsDataItem_main ipsPos_middle'>
<strong>{lang="total_reviews"}</strong>
</div>
<div class='ipsDataItem_stats ipsDataItem_statsLarge'>
<span class='ipsDataItem_stats_number'>{number="$stats['totalReviews']"}</span>
</div>
</li>
{{endif}}
</ul>
<hr class='ipsHr'>
{{if $latestFile}}
<div id='elDownloadStatsLatest' class='ipsClearfix'>
{template="thumbImage" group="global" app="core" params="$latestFile->primary_screenshot, $latestFile->name, 'small', 'ipsPos_left'"}
<div class='ipsWidget_latestItem'>
<strong class='ipsType_small ipsType_uppercase'>{lang="latest_file"}</strong><br>
<div class='ipsType_break ipsContained'><a href="{$latestFile->url( "getPrefComment" )}" title='{lang="view_this_file" sprintf="$latestFile->name"}' class='ipsTruncate ipsTruncate_line'>{$latestFile->name}</a></div>
<span class='ipsType_light ipsType_medium'>{lang="byline_nodate" htmlsprintf="$latestFile->author()->link( NULL, NULL, $latestFile->isAnonymous() )"}</span>
<p class='ipsType_medium ipsType_reset'>{{if !$latestFile->downloads}}<span class='ipsType_light'>{{endif}}<i class='fa fa-arrow-circle-down'></i> {number="$latestFile->downloads"}{{if !$latestFile->downloads}}</span>{{endif}} {{if $latestFile->container()->bitoptions['comments']}}&nbsp;&nbsp;{{if !$latestFile->comments}}<span class='ipsType_light'>{{endif}}<i class='fa fa-comment'></i> {$latestFile->comments}{{endif}}{{if !$latestFile->comments}}</span>{{endif}}</p>
</div>
</div>
{{endif}}
</div>
{{else}}
{{$columns = 2;}}
{{$columns += ( $stats['totalComments'] ) ? 1 : 0;}}
{{$columns += ( $stats['totalReviews'] ) ? 1 : 0;}}
{{$span = 12 / $columns;}}
<div class='ipsGrid ipsGrid_collapsePhone ipsWidget_stats'>
<div class='ipsGrid_span{$span} ipsType_center cDownloadsWidget_statsNumber'>
<span class='ipsType_large ipsWidget_statsCount'>{number="$stats['totalFiles']"}</span><br>
<span class='ipsType_light ipsType_medium'>{lang="total_files_front"}</span>
</div>
{{if $stats['totalComments']}}
<div class='ipsGrid_span{$span} ipsType_center cDownloadsWidget_statsNumber'>
<span class='ipsType_large ipsWidget_statsCount'>{number="$stats['totalComments']"}</span><br>
<span class='ipsType_light ipsType_medium'>{lang="total_comments"}</span>
</div>
{{endif}}
{{if $stats['totalReviews']}}
<div class='ipsGrid_span{$span} ipsType_center cDownloadsWidget_statsNumber'>
<span class='ipsType_large ipsWidget_statsCount'>{number="$stats['totalReviews']"}</span><br>
<span class='ipsType_light ipsType_medium'>{lang="total_reviews"}</span>
</div>
{{endif}}
{{if $latestFile}}
<div class='ipsGrid_span{$span} ipsType_left cNewestMember'>
<div id='elDownloadStatsLatest' class='ipsClearfix'>
<span class='ipsType_minorHeading'>{lang="latest_file"}</span><br>
<div class='ipsType_break ipsContained'><a href="{$latestFile->url( "getPrefComment" )}" title='{lang="view_this_file" sprintf="$latestFile->name"}' class='ipsTruncate ipsTruncate_line'>{$latestFile->name}</a></div>
<span class='ipsType_light ipsType_medium'>{lang="byline_nodate" htmlsprintf="$latestFile->author()->link()"}</span>
<p class='ipsType_medium ipsType_reset'>{{if !$latestFile->downloads}}<span class='ipsType_light'>{{endif}}<i class='fa fa-arrow-circle-down'></i> {number="$latestFile->downloads"}{{if !$latestFile->downloads}}</span>{{endif}} {{if $latestFile->container()->bitoptions['comments']}}&nbsp;&nbsp;{{if !$latestFile->comments}}<span class='ipsType_light'>{{endif}}<i class='fa fa-comment'></i> {$latestFile->comments}{{endif}}{{if !$latestFile->comments}}</span>{{endif}}</p>
<li class='ipsDataItem'>
<div class='ipsDataItem_main ipsPos_middle'>
<strong>{lang="total_reviews"}</strong>
</div>
</div>
<div class='ipsDataItem_stats ipsDataItem_statsLarge'>
<span class='ipsDataItem_stats_number'>{number="$stats['totalReviews']"}</span>
</div>
</li>
{{endif}}
</ul>
<hr class='ipsHr'>
{{if $latestFile}}
<div id='elDownloadStatsLatest' class='ipsClearfix ipsPadding:half ipsPadding_top:none'>
{template="thumbImage" group="global" app="core" params="$latestFile->primary_screenshot, $latestFile->name, 'small', 'ipsPos_left'"}
<div class='ipsWidget_latestItem'>
<strong class='ipsType_small ipsType_uppercase ipsType_light'>{lang="latest_file"}</strong><br>
<div class='ipsType_break ipsContained'><a href="{$latestFile->url( "getPrefComment" )}" title='{lang="view_this_file" sprintf="$latestFile->name"}' class='ipsDataItem_title'>{$latestFile->name}</a></div>
<span class='ipsType_light ipsType_medium'>{lang="byline_nodate" htmlsprintf="$latestFile->author()->link( NULL, NULL, $latestFile->isAnonymous() )"}</span>
<p class='ipsType_medium ipsType_reset'>{{if !$latestFile->downloads}}<span class='ipsType_light'>{{endif}}<i class='fa fa-arrow-circle-down'></i> {number="$latestFile->downloads"}{{if !$latestFile->downloads}}</span>{{endif}} {{if $latestFile->container()->bitoptions['comments']}}&nbsp;&nbsp;{{if !$latestFile->comments}}<span class='ipsType_light'>{{endif}}<i class='fa fa-comment'></i> {$latestFile->comments}{{endif}}{{if !$latestFile->comments}}</span>{{endif}}</p>
</div>
</div>
{{endif}}
{{else}}
<div class='ipsPadding'>
<div class='ipsFlex ipsFlex-ai:center ipsFlex-fw:wrap ipsGap:5 ipsWidget_stats'>
<div class='ipsFlex-flex:11 ipsType_center cDownloadsWidget_statsNumber'>
<span class='ipsType_large ipsWidget_statsCount'>{number="$stats['totalFiles']"}</span><br>
<span class='ipsType_light ipsType_medium'>{lang="total_files_front"}</span>
</div>
{{if $stats['totalComments']}}
<div class='ipsFlex-flex:11 ipsType_center cDownloadsWidget_statsNumber'>
<span class='ipsType_large ipsWidget_statsCount'>{number="$stats['totalComments']"}</span><br>
<span class='ipsType_light ipsType_medium'>{lang="total_comments"}</span>
</div>
{{endif}}
{{if $stats['totalReviews']}}
<div class='ipsFlex-flex:11 ipsType_center cDownloadsWidget_statsNumber'>
<span class='ipsType_large ipsWidget_statsCount'>{number="$stats['totalReviews']"}</span><br>
<span class='ipsType_light ipsType_medium'>{lang="total_reviews"}</span>
</div>
{{endif}}
{{if $latestFile}}
<div class='cNewestMember'>
<div id='elDownloadStatsLatest' class='ipsClearfix'>
<span class='ipsType_small ipsType_uppercase ipsType_light'>{lang="latest_file"}</span><br>
<div class='ipsType_break ipsContained'><a href="{$latestFile->url( "getPrefComment" )}" title='{lang="view_this_file" sprintf="$latestFile->name"}' class='ipsDataItem_title'>{$latestFile->name}</a></div>
<span class='ipsType_light ipsType_medium'>{lang="byline_nodate" htmlsprintf="$latestFile->author()->link()"}</span>
<p class='ipsType_medium ipsType_reset'>{{if !$latestFile->downloads}}<span class='ipsType_light'>{{endif}}<i class='fa fa-arrow-circle-down'></i> {number="$latestFile->downloads"}{{if !$latestFile->downloads}}</span>{{endif}} {{if $latestFile->container()->bitoptions['comments']}}&nbsp;&nbsp;{{if !$latestFile->comments}}<span class='ipsType_light'>{{endif}}<i class='fa fa-comment'></i> {$latestFile->comments}{{endif}}{{if !$latestFile->comments}}</span>{{endif}}</p>
</div>
</div>
{{endif}}
</div>
</div>
{{endif}}
</div>]]></template>
<template template_group="widgets" template_name="fileFeed" template_data="$files, $title, $orientation='vertical'" template_location="front" template_app="downloads"><![CDATA[<h3 class='ipsType_reset ipsWidget_title'>{$title}</h3>
<div class='ipsWidget_inner'>
{{if $orientation == 'vertical'}}
<div class='ipsPad_half'>
{{if \count( $files )}}
<ul class='ipsDataList ipsDataList_reducedSpacing'>
{{foreach $files as $file}}
{template="fileRow" group="widgets" app="downloads" params="$file, $orientation"}
{{endforeach}}
</ul>
{{else}}
{{if \count( $files )}}
<ul class='ipsDataList ipsDataList_reducedSpacing'>
{{foreach $files as $file}}
{template="fileRow" group="widgets" app="downloads" params="$file, $orientation"}
{{endforeach}}
</ul>
{{else}}
<div class='ipsPad_half'>
<p class='ipsType_reset'>{lang="no_new_files"}</p>
{{endif}}
</div>
</div>
{{endif}}
{{else}}
{{if \count( $files )}}
<div class='ipsPad'>
<div class='ipsCarousel ipsClearfix' data-ipsCarousel data-ipsCarousel-showDots>
<div class='ipsCarousel_inner'>
<ul class='cDownloadsCarousel' data-role="carouselItems">
{{foreach $files as $idx => $file}}
{template="indexBlock" group="browse" app="downloads" params="$file"}
{{endforeach}}
</ul>
</div>
<span class='ipsCarousel_shadow ipsCarousel_shadowLeft'></span>
<span class='ipsCarousel_shadow ipsCarousel_shadowRight'></span>
<a href='#' class='ipsCarousel_nav ipsHide' data-action='prev'><i class='fa fa-chevron-left'></i></a>
<a href='#' class='ipsCarousel_nav ipsHide' data-action='next'><i class='fa fa-chevron-right'></i></a>
</div>
</div>
<div class='ipsPad'>
<div class='ipsCarousel ipsClearfix' data-ipsCarousel data-ipsCarousel-showDots>
<div class='ipsCarousel_inner'>
<ul class='cDownloadsCarousel' data-role="carouselItems">
{{foreach $files as $idx => $file}}
{template="indexBlock" group="browse" app="downloads" params="$file"}
{{endforeach}}
</ul>
</div>
<span class='ipsCarousel_shadow ipsCarousel_shadowLeft'></span>
<span class='ipsCarousel_shadow ipsCarousel_shadowRight'></span>
<a href='#' class='ipsCarousel_nav ipsHide' data-action='prev'><i class='fa fa-chevron-left'></i></a>
<a href='#' class='ipsCarousel_nav ipsHide' data-action='next'><i class='fa fa-chevron-right'></i></a>
</div>
</div>
{{else}}
<p class='ipsType_reset'>{lang="no_new_files"}</p>
{{endif}}
@@ -2820,8 +2981,8 @@
{{endif}}
</div>
<div class='ipsDataItem_main'>
<div class='ipsType_break ipsContained'><a href="{$file->url( "getPrefComment" )}" title='{lang="view_this_file" sprintf="$file->name"}' class='ipsTruncate ipsTruncate_line'>{$file->name}</a></div>
<span class='ipsType_light ipsType_medium ipsType_blendLinks'>{lang="byline_nodate" htmlsprintf="$file->author()->link( NULL, NULL, $file->isAnonymous() )"}</span><br>
<div class='ipsType_break ipsContained'><a href="{$file->url( "getPrefComment" )}" title='{lang="view_this_file" sprintf="$file->name"}' class='ipsDataItem_title'>{$file->name}</a></div>
<span class='ipsType_light ipsType_blendLinks ipsType_break'>{lang="byline_nodate" htmlsprintf="$file->author()->link( NULL, NULL, $file->isAnonymous() )"}</span><br>
{{if $file->container()->bitoptions['reviews']}}
{template="rating" group="global" location="front" app="core" params="'small', $file->rating, \IPS\Settings::i()->reviews_rating_out_of"} &nbsp;&nbsp;
{{endif}}
@@ -3327,7 +3488,17 @@ html[dir="rtl"] #elDownloadStatsLatest > .ipsWidget_latestItem {
position: relative;
top: 1px;
}
]]></css>
.ipsFluidGrid--downloads{
padding: var(--sp-6);
--FluidGrid--width: 280px;
--FluidGrid--gap: var(--sp-9) var(--sp-7);
}
.ipsFluidGrid--downloads .ipsThumb{
width: 100%;
max-width: none;
}]]></css>
<css css_location="front" css_app="downloads" css_attributes="" css_path="." css_name="embed.css">.cFilePrice {
color: rgb( var(--theme-price) );
text-transform: uppercase;
+15 -1
View File
@@ -529,5 +529,19 @@
"107504": "4.7.5",
"107505": "4.7.5",
"107600": "4.7.6 Beta 1",
"107601": "4.7.6"
"107601": "4.7.6",
"107602": "4.7.6",
"107620": "4.7.7 Beta 1",
"107621": "4.7.7 Beta 2",
"107622": "4.7.7 Beta 2",
"107623": "4.7.7 Beta 3",
"107624": "4.7.7 Beta 4",
"107625": "4.7.7",
"107626": "4.7.7",
"107627": "4.7.7",
"107628": "4.7.7",
"107640": "4.7.8 Beta 1",
"107641": "4.7.8 Beta 2",
"107642": "4.7.8 Beta 3",
"107643": "4.7.8"
}