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

+10
View File
@@ -155,4 +155,14 @@ class _Application extends \IPS\Application
return array( 'idm_watermarkpath' );
}
/**
* Returns a list of all existing webhooks and their payload in this app.
*
* @return array
*/
public function getWebhooks(): array
{
return array_merge( parent::getWebhooks(), [ 'downloads_new_version' => \IPS\downloads\File::class ] );
}
}
+2 -1
View File
@@ -33,6 +33,7 @@ class _files extends \IPS\Content\Api\ItemController
* Get list of files
*
* @note For requests using an OAuth Access Token for a particular member, only files the authorized user can view will be included
* @apiparam string ids Comma-delimited list of file IDs
* @apiparam string categories Comma-delimited list of category IDs
* @apiparam string authors Comma-delimited list of member IDs - if provided, only files started by those members are returned
* @apiparam int locked If 1, only files which are locked are returned, if 0 only unlocked
@@ -859,7 +860,7 @@ class _files extends \IPS\Content\Api\ItemController
}
else
{
$price = new \IPS\nexus\Money( $cost, $currency );
$price = new \IPS\nexus\Money( $costs, $currency );
}
/* Create the item */
+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"
}
@@ -41,12 +41,14 @@ class _settings extends \IPS\Dispatcher\Controller
if ( $values = $form->values( TRUE ) )
{
$this->_saveSettingsForm( $form, $values );
$this->_saveSettingsForm( $form, $values, $redirectMessage );
/* Clear guest page caches */
\IPS\Data\Cache::i()->clearAll();
\IPS\Session::i()->log( 'acplogs__downloads_settings' );
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=downloads&module=downloads&controller=settings' ), $redirectMessage );
}
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('settings');
@@ -99,6 +101,13 @@ class _settings extends \IPS\Dispatcher\Controller
$form->add( new \IPS\Helpers\Form\Stack( 'idm_link_blacklist', explode( ',', \IPS\Settings::i()->idm_link_blacklist ), FALSE, array( 'placeholder' => 'example.com' ) ) );
$form->add( new \IPS\Helpers\Form\YesNo( 'idm_antileech', \IPS\Settings::i()->idm_antileech ) );
$form->add( new \IPS\Helpers\Form\YesNo( 'idm_rss', \IPS\Settings::i()->idm_rss ) );
$form->add( new \IPS\Helpers\Form\Radio( 'idm_default_view', \IPS\Settings::i()->idm_default_view, FALSE, array(
'options' => array(
'table' => 'downloads_default_view_table',
'grid' => 'downloads_default_view_grid',
),
) ) );
$form->add( new \IPS\Helpers\Form\YesNo( 'idm_default_view_choose', \IPS\Settings::i()->idm_default_view_choose ) );
if ( \IPS\Application::appIsEnabled( 'nexus' ) )
{
@@ -120,8 +129,9 @@ class _settings extends \IPS\Dispatcher\Controller
*
* @param \IPS\Helpers\Form $form The Form Object
* @param array $values Values
* @param string $redirectMessage Message to show on redirect
*/
protected function _saveSettingsForm( \IPS\Helpers\Form $form, array $values )
protected function _saveSettingsForm( \IPS\Helpers\Form $form, array $values, ?string &$redirectMessage )
{
/* We can't store '' for idm_nexus_display as it will fall back to the default */
if ( \IPS\Application::appIsEnabled( 'nexus' ) and !$values['idm_nexus_display'] )
@@ -141,11 +151,11 @@ class _settings extends \IPS\Dispatcher\Controller
\IPS\Db::i()->delete( 'core_queue', array( '`app`=? OR `key`=?', 'downloads', 'RebuildScreenshotWatermarks' ) );
\IPS\Task::queue( 'downloads', 'RebuildScreenshotWatermarks', array( ), 5 );
\IPS\Output::i()->inlineMessage = \IPS\Member::loggedIn()->language()->addToStack('download_settings_saved_rebuilding');
$redirectMessage = 'download_settings_saved_rebuilding';
}
else
{
\IPS\Output::i()->inlineMessage = \IPS\Member::loggedIn()->language()->addToStack('saved');
$redirectMessage ='saved';
}
}
}
@@ -258,4 +258,24 @@ class _browse extends \IPS\Dispatcher\Controller
\IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( 'app=downloads&module=downloads&controller=browse&do=categories', 'front', 'downloads_categories' ), \IPS\Member::loggedIn()->language()->addToStack('download_categories') );
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'browse' )->categories();
}
/**
* Set the viewing method
*
* @return void
*/
protected function setMethod()
{
\IPS\Session::i()->csrfCheck();
$method = ( isset( \IPS\Request::i()->method ) ) ? \IPS\Request::i()->method : \IPS\Settings::i()->idm_default_view;
\IPS\Request::i()->setCookie( 'idm_category_view', $method, ( new \IPS\DateTime )->add( new \DateInterval( 'P1Y' ) ) );
if ( \IPS\Member::loggedIn()->member_id )
{
\IPS\Db::i()->replace( 'downloads_view_method', array( 'member_id' => \IPS\Member::loggedIn()->member_id, 'method' => $method ) );
}
\IPS\Output::i()->redirect( \IPS\downloads\Category::load( \IPS\Request::i()->id )->url() );
}
}
@@ -26,7 +26,7 @@ class _pending extends \IPS\Content\Controller
/**
* [Content\Controller] Class
*/
protected static $contentModel = 'IPS\downloads\File\PendingVersion';
protected static $contentModel = \IPS\downloads\File\PendingVersion::class;
/**
* @brief Storage for loaded file
@@ -55,7 +55,7 @@ class _pending extends \IPS\Content\Controller
throw new \OutOfRangeException;
}
if ( !$this->version->canUnhide() )
if ( !$this->version->canUnhide() AND !$this->version->canDelete())
{
\IPS\Output::i()->error( 'node_error', '2D417/1', 404, '' );
}
@@ -167,4 +167,23 @@ class _pending extends \IPS\Content\Controller
return parent::moderate();
}
/**
* Method used to allow pending version approval for authors
*
* @return void
*/
protected function delete()
{
if( !$this->version->canDelete())
{
\IPS\Output::i()->error( 'file_version_pending_cannot_delete', '2D417/4', 403, '' ); //TODO error code
}
/* Make sure the user confirmed the deletion */
\IPS\Request::i()->confirmedDelete();
$this->version->delete();
\IPS\Session::i()->modLog( 'modlog__action_deletedpending', array( (string) $this->file->url() => FALSE, $this->file->name => FALSE ), $this->file );
\IPS\Output::i()->redirect( $this->file->url() , 'deleted');
}
}
@@ -0,0 +1,23 @@
{
"id": 107602,
"name": "4.7.6",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107620,
"name": "4.7.7 Beta 1",
"steps": {
"queries": true,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": true,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": true,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,14 @@
{
"files": {
"added": [],
"edited": [],
"removed": []
},
"orders": {
"added": [],
"edited": [
"global\/\/dev\/js\/\/library\/"
],
"removed": []
}
}
@@ -0,0 +1,20 @@
{
"1": {
"method": "addColumn",
"params": [
"downloads_files",
{
"name": "file_last_comment_anon",
"type": "TINYINT",
"length": null,
"decimals": null,
"values": null,
"allow_null": true,
"default": "0",
"comment": "",
"unsigned": true,
"auto_increment": false
}
]
}
}
@@ -0,0 +1,23 @@
{
"id": 107621,
"name": "4.7.7 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107622,
"name": "4.7.7 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107623,
"name": "4.7.7 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107624,
"name": "4.7.7 Beta 4",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107625,
"name": "4.7.7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107626,
"name": "4.7.7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107627,
"name": "4.7.7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107628,
"name": "4.7.7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,7 @@
{
"added": [
"app=downloads&module=downloads&controller=settings&searchResult=form_idm_gridview"
],
"edited": [],
"removed": []
}
@@ -0,0 +1,23 @@
{
"id": 107640,
"name": "4.7.8 Beta 1",
"steps": {
"queries": true,
"lang": true,
"theme": true,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": true,
"settings": true,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,21 @@
{
"normal": {
"added": [
"idm_default_view",
"idm_default_view_choose",
"downloads_default_view_table",
"downloads_default_view_grid",
"downloads_default_view_choose",
"downloads_default_view_choose_desc",
"downloads_default_view_choose_none",
"webhook_downloads_new_version"
],
"edited": [],
"removed": []
},
"js": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,48 @@
{
"1": {
"method": "createTable",
"params": [
{
"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
]
}
}
}
]
}
}
@@ -0,0 +1,12 @@
{
"added": [
"idm_default_view",
"idm_default_view_choose"
],
"edited": [
"idm_highest_rated_categories",
"idm_newest_categories",
"idm_show_most_downloaded_categories"
],
"removed": []
}
@@ -0,0 +1,33 @@
{
"html": {
"added": [
"front\/browse\/fileGrid",
"front\/browse\/tableRow",
"front\/browse\/viewChange"
],
"edited": [
"front\/browse\/categoryButtons",
"front\/browse\/rows",
"front\/global\/embedFile",
"front\/view\/view",
"front\/widgets\/downloadsCommentFeed",
"front\/widgets\/downloadsReviewFeed",
"front\/widgets\/downloadStats",
"front\/widgets\/fileFeed",
"front\/widgets\/fileRow"
],
"removed": []
},
"css": {
"added": [],
"edited": [
"front\/downloads.css"
],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,23 @@
{
"id": 107641,
"name": "4.7.8 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107642,
"name": "4.7.8 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,23 @@
{
"id": 107643,
"name": "4.7.8",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeSettings": false,
"javascript": false,
"emailTemplates": false,
"hooks": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -825,7 +825,7 @@ class _Category extends \IPS\Node\Model implements \IPS\Node\Permissions
if( $club->type == 'closed' )
{
$form->add( new \IPS\Helpers\Form\YesNo( 'club_node_public', $this->id ? $this->isPublic() : FALSE ) );
$form->add( new \IPS\Helpers\Form\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' ) ) ) );
}
}
@@ -902,4 +902,41 @@ class _Category extends \IPS\Node\Model implements \IPS\Node\Permissions
break;
}
}
/**
* Get the member's view method
*
* @return string
*/
public static function getMemberView()
{
$method = ( isset( \IPS\Request::i()->cookie['idm_category_view'] ) ) ? \IPS\Request::i()->cookie['idm_category_view'] : NULL;
$chooseable = \IPS\Settings::i()->idm_default_view_choose;
if ( ! $chooseable or !\IPS\Member::loggedIn()->member_id )
{
return \IPS\Settings::i()->idm_default_view;
}
if ( ! $method )
{
try
{
$method = \IPS\Db::i()->select( 'method', 'downloads_view_method', array( 'member_id=?', \IPS\Member::loggedIn()->member_id ) )->first();
}
catch( \UnderFlowException $e )
{
$method = \IPS\Settings::i()->idm_default_view;
}
/* Attempt to set the cookie again */
\IPS\Request::i()->setCookie( 'idm_category_view', $method, ( new \IPS\DateTime )->add( new \DateInterval( 'P1Y' ) ) );
}
if ( ! $method or !$chooseable )
{
$method = \IPS\Settings::i()->idm_default_view;
}
return $method;
}
}
@@ -122,7 +122,7 @@ class _Field extends \IPS\CustomField
unset( $form->elements['']['pf_search_type'] );
\IPS\Member::loggedIn()->language()->words['pfield_displayoptions'] = \IPS\Member::loggedIn()->language()->addToStack('field_displayoptions');
\IPS\Member::loggedIn()->language()->words['field_displayoptions'] = \IPS\Member::loggedIn()->language()->addToStack('pfield_displayoptions');
$form->add( new \IPS\Helpers\Form\Radio( 'downloads_field_location', $this->id ? $this->display_location : 'below', FALSE, array( 'options' => array( 'sidebar' => 'idm_cfield_sidebar', 'below' => 'idm_cfield_below', 'tab' => 'idm_cfield_tab' ) ), NULL, NULL, NULL, 'idm_field_location' ) );
@@ -152,7 +152,7 @@ class _Field extends \IPS\CustomField
if ( \IPS\Application::appIsEnabled( 'forums' ) AND isset( $values['cf_topic'] ) )
{
/* Forcibly disable include in topic option if it is a paid field */
$values['topic'] = ( isset( $values['downloads_field_paid'] ) AND $values['downloads_field_paid'] ) ? $values['cf_topic'] : 0;
$values['topic'] = ( isset( $values['downloads_field_paid'] ) AND $values['downloads_field_paid'] ) ? 0 : $values['cf_topic'];
unset( $values['cf_topic'] );
}
@@ -81,11 +81,6 @@ class _Comment extends \IPS\Content\Comment implements \IPS\Content\EditHistory,
* @brief [Content] Key for hide reasons
*/
public static $hideLogKey = 'downloads-files';
/**
* @brief Whether to track the sentiment scores in cloud_sentiment_scores for this content
*/
public $trackSentimentScore = true;
/**
* Get URL for doing stuff
+24 -1
View File
@@ -113,7 +113,8 @@ class _File extends \IPS\Content\Item implements
'edit_member_name' => 'edit_name',
'edit_show' => 'append_edit',
'edit_reason' => 'edit_reason',
'is_anon' => 'is_anon'
'is_anon' => 'is_anon',
'last_comment_anon' => 'last_comment_anon'
);
/**
@@ -2416,6 +2417,7 @@ class _File extends \IPS\Content\Item implements
$this->_primaryScreenshotThumb = FALSE;
$this->syncTopic();
}
\IPS\Api\Webhook::fire( 'downloads_new_version', array( $this ) );
}
/* !Embeddable */
@@ -2740,4 +2742,25 @@ class _File extends \IPS\Content\Item implements
return parent::modAction( $action, $member, $reason, $immediately );
}
/**
* Can the member delete the pending version
*
* @param \IPS\Member|NULL $member
* @return bool
*/
public function canDeletePendingVersion( \IPS\Member $member = NULL): bool
{
if( !$this->hasPendingVersion() )
{
return FALSE;
}
if( $this->canEdit($member) )
{
return TRUE;
}
return FALSE;
}
}
@@ -109,6 +109,29 @@ class _PendingVersion extends \IPS\Content\Item implements \IPS\Content\Hideable
{
return FALSE;
}
/**
* Can delete pending version?
*
* @param \IPS\Member|NULL $member The member to check for (NULL for currently logged in member)
* @return bool
*/
public function canDelete( $member=NULL )
{
$member = $member ?: \IPS\Member::loggedIn();
if( !$member->member_id )
{
return FALSE;
}
if( !$this->author()->member_id == $member->member_id AND !$this->file()->canDeletePendingVersion( $member ) )
{
return FALSE;
}
return TRUE;
}
/**
* Returns the content
@@ -288,6 +311,7 @@ class _PendingVersion extends \IPS\Content\Item implements \IPS\Content\Hideable
{
/* Moderator log */
\IPS\Session::i()->modLog( 'modlog__action_newversion_approved', array( (string) $this->file()->url() => FALSE, $this->file()->name => FALSE ), $this->file() );
\IPS\Api\Webhook::fire( 'downloads_new_version_approved', $this );
}
return parent::modAction( $action, $member, $reason, $immediately );
@@ -85,11 +85,6 @@ class _Review extends \IPS\Content\Review implements \IPS\Content\EditHistory, \
* @brief [Content] Key for hide reasons
*/
public static $hideLogKey = 'downloads-files-rev';
/**
* @brief Whether to track the sentiment scores in cloud_sentiment_scores for this content
*/
public $trackSentimentScore = true;
/**
* Get URL for doing stuff