Version 5.0.13
This commit is contained in:
1 parent
b89858b2ff
commit
5efe744c5f
1407 files changed
+69690
-30177
No files matched your search
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"application_title": "Commerce",
|
||||
"app_author": "",
|
||||
"app_author": "Invision Power Services, Inc.",
|
||||
"app_directory": "nexus",
|
||||
"app_protected": 0,
|
||||
"app_website": "",
|
||||
"app_update_check": "",
|
||||
"app_website": null,
|
||||
"app_update_check": null,
|
||||
"app_hide_tab": 0
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<javascript app="nexus">
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/checkout" javascript_name="ips.checkout.register.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000100">/**
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/checkout" javascript_name="ips.checkout.register.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000100">/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -34,7 +34,7 @@
|
||||
}
|
||||
});
|
||||
}(jQuery, _));</file>
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/checkout" javascript_name="ips.checkout.review.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000100"><![CDATA[/**
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/checkout" javascript_name="ips.checkout.review.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000100"><![CDATA[/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -91,7 +91,7 @@
|
||||
}
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/forms" javascript_name="ips.forms.businessAddressVat.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000150"><![CDATA[/**
|
||||
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/forms" javascript_name="ips.forms.businessAddressVat.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000150"><![CDATA[/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -130,7 +130,7 @@
|
||||
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/gateways" javascript_name="ips.gateways.stripe.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
|
||||
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/gateways" javascript_name="ips.gateways.stripe.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000200"><![CDATA[/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -471,7 +471,7 @@
|
||||
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/gateways" javascript_name="ips.gateways.stripepaymentrequest.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200">/**
|
||||
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/gateways" javascript_name="ips.gateways.stripepaymentrequest.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000200">/**
|
||||
* IPS Community Suite 4
|
||||
* (c) 2017 Invision Power Services - http://www.invisionpower.com
|
||||
*
|
||||
@@ -552,7 +552,7 @@
|
||||
|
||||
});
|
||||
}(jQuery, _));</file>
|
||||
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/misc" javascript_name="ips.misc.print.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000100">/**
|
||||
<file javascript_app="nexus" javascript_location="global" javascript_path="controllers/misc" javascript_name="ips.misc.print.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000100">/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -574,7 +574,7 @@
|
||||
|
||||
});
|
||||
}(jQuery, _));</file>
|
||||
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/notifications" javascript_name="ips.notifications.pendingTransactions.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000100">/**
|
||||
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/notifications" javascript_name="ips.notifications.pendingTransactions.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000100">/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -654,7 +654,7 @@
|
||||
|
||||
});
|
||||
}(jQuery, _));</file>
|
||||
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/store" javascript_name="ips.store.productoptions.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000150"><![CDATA[/**
|
||||
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/store" javascript_name="ips.store.productoptions.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000150"><![CDATA[/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -709,7 +709,7 @@
|
||||
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/store" javascript_name="ips.store.productselector.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000150"><![CDATA[/**
|
||||
<file javascript_app="nexus" javascript_location="admin" javascript_path="controllers/store" javascript_name="ips.store.productselector.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000150"><![CDATA[/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -769,7 +769,7 @@
|
||||
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.cartReview.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200">/**
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.cartReview.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000200">/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -838,16 +838,6 @@
|
||||
e.preventDefault();
|
||||
var self = this;
|
||||
var form = $( e.currentTarget );
|
||||
var menu = form.closest('.ipsMenu');
|
||||
|
||||
// Set menu to loading and hide form
|
||||
menu
|
||||
.css({
|
||||
height: menu.outerHeight() + 'px'
|
||||
})
|
||||
.addClass('ipsLoading');
|
||||
|
||||
form.hide();
|
||||
|
||||
// Do ajax request to update it
|
||||
ips.getAjax()( form.attr('action'), {
|
||||
@@ -857,8 +847,6 @@
|
||||
self.scope.find('[data-role="cart"]').html( response );
|
||||
})
|
||||
.fail(function(response){
|
||||
menu.removeClass( 'ipsLoading' );
|
||||
form.show();
|
||||
ips.ui.alert.show( {
|
||||
type: 'alert',
|
||||
icon: 'warn',
|
||||
@@ -869,7 +857,7 @@
|
||||
}
|
||||
});
|
||||
}(jQuery, _));</file>
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.category.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.category.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000200"><![CDATA[/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -977,7 +965,7 @@
|
||||
}
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.currencySelect.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.currencySelect.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000200"><![CDATA[/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -1027,7 +1015,7 @@
|
||||
}
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.giftCard.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.giftCard.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000200"><![CDATA[/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -1115,7 +1103,7 @@
|
||||
}
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.packagePage.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.packagePage.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000200"><![CDATA[/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -1380,9 +1368,9 @@
|
||||
self.scope.find('[data-role="renewalTerm"]').html( response.renewal );
|
||||
self.scope.find('[data-role="initialTerm"]').html( response.initialTerm );
|
||||
if( response.okay ){
|
||||
self.scope.find('button').removeAttr('disabled').text( ips.getString('add_to_cart_js') );
|
||||
self.scope.find('[type="submit"]').removeAttr('disabled').text( ips.getString('add_to_cart_js') );
|
||||
} else {
|
||||
self.scope.find('button').attr( 'disabled','disabled' ).text( ips.getString('out_of_stock') );
|
||||
self.scope.find('[type="submit"]').attr( 'disabled','disabled' ).text( ips.getString('out_of_stock') );
|
||||
}
|
||||
})
|
||||
.fail(function(response){
|
||||
@@ -1392,7 +1380,7 @@
|
||||
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.register.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000200"><![CDATA[/**
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/store" javascript_name="ips.store.register.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000200"><![CDATA[/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -1541,7 +1529,7 @@
|
||||
},
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/subscriptions" javascript_name="ips.subscriptions.main.js" javascript_type="controller" javascript_version="5000074" javascript_position="1000150">/**
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="controllers/subscriptions" javascript_name="ips.subscriptions.main.js" javascript_type="controller" javascript_version="5001302" javascript_position="1000150">/**
|
||||
* Invision Community
|
||||
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
|
||||
*
|
||||
@@ -1579,7 +1567,7 @@
|
||||
}
|
||||
});
|
||||
}(jQuery, _));</file>
|
||||
<file javascript_app="nexus" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.store.js" javascript_type="template" javascript_version="5000074" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.store.images', `
|
||||
<file javascript_app="nexus" javascript_location="admin" javascript_path="templates" javascript_name="ips.templates.store.js" javascript_type="template" javascript_version="5001302" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.store.images', `
|
||||
<div class='ipsUploader__row ipsUploader__row--image ipsAttach {{#done}}ipsAttach_done{{/done}}' id='{{id}}' data-role='file' data-fileid='{{id}}' data-fullsizeurl='{{imagesrc}}' data-thumbnailurl='{{thumbnail}}' data-fileType='image'>
|
||||
<div class='ipsUploader__rowPreview' data-role='preview'>
|
||||
{{#thumb}}
|
||||
@@ -1612,12 +1600,12 @@
|
||||
ips.templates.set('nexus.store.imagesWrapper', `
|
||||
<div class='ipsUploader__container ipsUploader__container--images'>{{{content}}}</div>
|
||||
`);]]></file>
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.store.js" javascript_type="template" javascript_version="5000074" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.store.productImage', " \
|
||||
<file javascript_app="nexus" javascript_location="front" javascript_path="templates" javascript_name="ips.templates.store.js" javascript_type="template" javascript_version="5001302" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.store.productImage', " \
|
||||
<a href='{{fullURL}}' data-fullURL='{{fullURL}}' class='cNexusProduct_primaryImage' data-ipsLightbox data-ipsLightbox-group='product' style='background-image:url({{thumbURL}})'>\
|
||||
<img src='{{thumbURL}}' alt=''>\
|
||||
</a>\
|
||||
");]]></file>
|
||||
<file javascript_app="nexus" javascript_location="global" javascript_path="templates" javascript_name="ips.templates.gateways.js" javascript_type="template" javascript_version="5000074" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.gateway.vaultAccount', " \
|
||||
<file javascript_app="nexus" javascript_location="global" javascript_path="templates" javascript_name="ips.templates.gateways.js" javascript_type="template" javascript_version="5001302" javascript_position="1000050"><![CDATA[ips.templates.set('nexus.gateway.vaultAccount', " \
|
||||
<li>\
|
||||
<input type='radio' name='{{fieldName}}[stored]' value='{{value}}' id='{{fieldName}}_stored{{random}}' data-control='toggle' data-toggles='{{fieldName}}_existing' class='ipsInput ipsInput--toggle'>\
|
||||
<div class='ipsFieldList__content'>\
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<language>
|
||||
<app key="nexus" version="5000074">
|
||||
<app key="nexus" version="5001302">
|
||||
<word key="__app_nexus" js="0">Commerce</word>
|
||||
<word key="menutab__nexus" js="0">Commerce</word>
|
||||
<word key="menutab__nexus_icon" js="0">usd</word>
|
||||
@@ -1606,6 +1606,12 @@
|
||||
<word key="cf_invoice_desc" js="0">If set to No, this field will be excluded from being displayed on invoices. The field will still display when viewing the actual purchase.</word>
|
||||
<word key="custom_packages" js="0">Custom Packages</word>
|
||||
<word key="cm_fields_modified" js="0">You have modified the values for a field which is being used for stock and price adjustments. You need to update the configuration for each of the products which are affected by this field.</word>
|
||||
<word key="sf_type_UserPass" js="0"><![CDATA[Username & Password]]></word>
|
||||
<word key="sf_type_Ftp" js="0">FTP Details</word>
|
||||
<word key="sf_validate_ftp" js="0">Validate FTP details?</word>
|
||||
<word key="sf_validate_ftp_desc" js="0">If enabled, the system will attempt to make an FTP connection and will not allow the user to continue if the details appear to be incorrect.</word>
|
||||
<word key="sf_validate_ftp_noftp" js="0">Your server does not have the FTP PHP extension enabled and so this option is not available. In order to use this option, contact your hosting provider or system administrator and ask them to enable the FTP and SSH2 PHP extensions.</word>
|
||||
<word key="sf_validate_ftp_nosftp" js="0">Your server does not have the SSH2 PHP extension enabled and so this option is not available. In order to use this option, contact your hosting provider or system administrator and ask them to enable the FTP and SSH2 PHP extensions.</word>
|
||||
<word key="module__nexus_store" js="0">Store</word>
|
||||
<word key="buy" js="0">Buy</word>
|
||||
<word key="redeem" js="0">Redeem</word>
|
||||
|
||||
@@ -5303,6 +5303,18 @@
|
||||
"comment": "",
|
||||
"unsigned": false,
|
||||
"auto_increment": false
|
||||
},
|
||||
"p_email": {
|
||||
"name": "p_email",
|
||||
"type": "TINYINT",
|
||||
"length": null,
|
||||
"decimals": null,
|
||||
"values": null,
|
||||
"allow_null": true,
|
||||
"default": "0",
|
||||
"comment": "",
|
||||
"unsigned": false,
|
||||
"auto_increment": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
|
||||
+295
-260
@@ -230,7 +230,7 @@
|
||||
{{foreach $summary['items'] as $item}}
|
||||
{{if !( $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount )}}
|
||||
<li class='ipsData__item'>
|
||||
<figure class='ipsData__image'>
|
||||
<div class="ipsData__image" aria-hidden="true">
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt="" loading="lazy">
|
||||
{{elseif $item::$icon}}
|
||||
@@ -238,7 +238,7 @@
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</figure>
|
||||
</div>
|
||||
<div class='ipsData__main'>
|
||||
<div><span class='i-color_soft'>{$item->quantity} x </span>{$item->name}</div>
|
||||
{$item->detailsForDisplay( 'checkout' )|raw}
|
||||
@@ -328,7 +328,7 @@
|
||||
{{foreach $recurring['items'] as $rId => $item}}
|
||||
{{if !( $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount )}}
|
||||
<li class='ipsData__item'>
|
||||
<figure class='ipsData__image'>
|
||||
<div class="ipsData__image" aria-hidden="true">
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt="" loading="lazy">
|
||||
{{elseif $item::$icon}}
|
||||
@@ -336,7 +336,7 @@
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</figure>
|
||||
</div>
|
||||
<div class='ipsData__main'>
|
||||
<div><span class='i-color_soft'>{$item->quantity} x </span>{$item->name}</div>
|
||||
{$item->detailsForDisplay( 'checkout' )|raw}
|
||||
@@ -596,13 +596,13 @@
|
||||
{{foreach $summary['items'] as $item}}
|
||||
{{if !( $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount )}}
|
||||
<li class='ipsData__item'>
|
||||
<figure class='ipsData__image'>
|
||||
<div class="ipsData__image" aria-hidden="true">
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt="" loading="lazy">
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</figure>
|
||||
</div>
|
||||
<div class='ipsData__main'>
|
||||
<div><span class='i-color_soft'>{$item->quantity} x </span>{$item->name}</div>
|
||||
{{if \count( $item->details )}}
|
||||
@@ -818,7 +818,7 @@
|
||||
{{endif}}
|
||||
</ul>
|
||||
{{endif}}]]></template>
|
||||
<template template_group="clients" template_name="addresses" template_data="$billingAddress=NULL, $otherAddresses=array()" template_location="front" template_app="nexus"><![CDATA[<div class="ipsBox ipsPull">
|
||||
<template template_group="clients" template_name="addresses" template_data="$billingAddress=NULL, $otherAddresses=array()" template_location="front" template_app="nexus"><![CDATA[<div class="ipsBox ipsBox--commerceAddresses ipsPull">
|
||||
<header class='ipsPageHeader'>
|
||||
<div class="ipsPageHeader__row">
|
||||
<div class="ipsPageHeader__primary">
|
||||
@@ -854,7 +854,7 @@
|
||||
</div>
|
||||
{{endif}}
|
||||
</div>]]></template>
|
||||
<template template_group="clients" template_name="alternatives" template_data="$protected=FALSE" template_location="front" template_app="nexus"><![CDATA[<section class='ipsBox ipsPull'>
|
||||
<template template_group="clients" template_name="alternatives" template_data="$protected=FALSE" template_location="front" template_app="nexus"><![CDATA[<section class='ipsBox ipsBox--cmsAlternativeClients ipsPull'>
|
||||
<header class='ipsPageHeader'>
|
||||
<div class="ipsPageHeader__row">
|
||||
<div class="ipsPageHeader__primary">
|
||||
@@ -1216,7 +1216,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>]]></template>
|
||||
<template template_group="clients" template_name="donations" template_data="" template_location="front" template_app="nexus"><![CDATA[<section class="ipsBox ipsPull">
|
||||
<template template_group="clients" template_name="donations" template_data="" template_location="front" template_app="nexus"><![CDATA[<section class="ipsBox ipsBox--commerceDonations ipsPull">
|
||||
<header class="ipsPageHeader ipsPageHeader--padding">
|
||||
<h1 class='ipsPageHeader__title'>{lang="current_donation_goals"}</h1>
|
||||
</header>
|
||||
@@ -1257,14 +1257,14 @@
|
||||
{{endforeach}}
|
||||
</div>
|
||||
</section>]]></template>
|
||||
<template template_group="clients" template_name="info" template_data="$form" template_location="front" template_app="nexus"><![CDATA[<section class='ipsBox ipsPull'>
|
||||
<template template_group="clients" template_name="info" template_data="$form" template_location="front" template_app="nexus"><![CDATA[<section class='ipsBox ipsBox--cmsClientInfo ipsPull'>
|
||||
<header class="ipsPageHeader ipsPageHeader--padding">
|
||||
<h1 class='ipsPageHeader__title'>{lang="customerinfo_title"}</h1>
|
||||
</header>
|
||||
{$form|raw}
|
||||
</section>]]></template>
|
||||
<template template_group="clients" template_name="invoice" template_data="$invoice" template_location="front" template_app="nexus"><![CDATA[
|
||||
<div class='ipsBox i-padding_3 i-margin-bottom_3'>
|
||||
<div class='ipsBox ipsBox--commerceInvoice i-padding_3 i-margin-bottom_3'>
|
||||
<div class='i-flex i-justify-content_space-between i-margin-bottom_2'>
|
||||
<div>
|
||||
<h1 class='ipsTitle ipsTitle--h3'>{lang="order_title"} #{$invoice->id}</h1>
|
||||
@@ -1348,7 +1348,7 @@
|
||||
|
||||
|
||||
{{$summary = $invoice->summary();}}
|
||||
<div class='ipsBox'>
|
||||
<div class='ipsBox ipsBox--commerceOrderDetails'>
|
||||
<h2 class='ipsBox__header'>{lang="order_details"}</h2>
|
||||
<div class='ipsBox__content'>
|
||||
<i-data>
|
||||
@@ -1356,7 +1356,7 @@
|
||||
{{foreach $summary['items'] as $k => $item}}
|
||||
{{if !( $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount )}}
|
||||
<li class='ipsData__item'>
|
||||
<figure class='ipsData__image'>
|
||||
<div class="ipsData__image" aria-hidden="true">
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt='' loading='lazy'>
|
||||
{{elseif $item::$icon}}
|
||||
@@ -1364,7 +1364,7 @@
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</figure>
|
||||
</div>
|
||||
<div class='ipsData__content'>
|
||||
<div class='ipsData__main'>
|
||||
<h2 class='ipsData__title'>
|
||||
@@ -1437,66 +1437,69 @@
|
||||
<template template_group="clients" template_name="invoiceList" template_data="$invoice, $fromBillingAgreement=NULL" template_location="front" template_app="nexus"><![CDATA[<li class='ipsData__item'>
|
||||
<a href='{$invoice->url()}' class="ipsLinkPanel" aria-hidden="true"><span>{lang="order_view_details"}</span></a>
|
||||
<div class='ipsData__content'>
|
||||
{{if !$fromBillingAgreement}}
|
||||
<div class='ipsData__main'>
|
||||
{{$summary = $invoice->summary();}}
|
||||
{{if \count( $summary['items'] )}}
|
||||
<ul class='i-grid i-gap_3 cNexusOrderList_items'>
|
||||
{{foreach $summary['items'] as $k => $item}}
|
||||
<li class='i-flex i-gap_2'>
|
||||
<div class='i-basis_40 i-flex_00' {{if $item::$title}}title='{lang="$item::$title"}' data-ipsTooltip{{endif}}>
|
||||
<div class="ipsThumb">
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt='' loading='lazy'>
|
||||
{{elseif $item::$icon}}
|
||||
<i class='fa-solid fa-{$item::$icon}'></i>
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</div>
|
||||
</div>
|
||||
<div class='i-flex_11'>
|
||||
{{if $url = $item->url()}}
|
||||
<a href="{$url}" class='i-color_hard i-font-weight_600'>{$item->name}</a>
|
||||
{{else}}
|
||||
<span class='i-color_hard i-font-weight_600'>{$item->name}</span>
|
||||
{{endif}}
|
||||
<p class='i-color_soft'>{lang="quantity"}: {$item->quantity}</p>
|
||||
<p class='i-color_soft'>{lang="invoice_unit_price"}: {$item->price}</p>
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<span class='ipsEmptyMessage'>{lang="orders_no_items"}</span>
|
||||
<div class='ipsData__main'>
|
||||
<div class="ipsColumns ipsColumns--orders">
|
||||
<div class='ipsColumns__secondary i-basis_260'>
|
||||
<a href='{$invoice->url()}' class='ipsData__title'>{datetime="$invoice->date"}</a>
|
||||
<div class='ipsData__meta'><strong class='cNexusPrice'>{$invoice->total}</strong> · {lang="order_title"} #{$invoice->id}</div>
|
||||
<p class='i-flex i-gap_1 i-align-items_center i-flex-wrap_wrap i-margin-top_1'>
|
||||
<span class='cNexusOrderBadge cNexusOrderBadge_{$invoice->status}'>{lang="istatus_{$invoice->status}"}</span>
|
||||
</p>
|
||||
</div>
|
||||
{{if !$fromBillingAgreement}}
|
||||
<div class="ipsColumns__primary i-align-self_center">
|
||||
{{$summary = $invoice->summary();}}
|
||||
{{if \count( $summary['items'] )}}
|
||||
<ul class='i-grid i-gap_3 cNexusOrderList_items'>
|
||||
{{foreach $summary['items'] as $k => $item}}
|
||||
<li class='i-flex i-gap_2'>
|
||||
<div class='i-basis_40 i-flex_00' {{if $item::$title}}title='{lang="$item::$title"}' data-ipsTooltip{{endif}}>
|
||||
<div class="ipsThumb i-width_100p">
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt='' loading='lazy'>
|
||||
{{elseif $item::$icon}}
|
||||
<i class='fa-solid fa-{$item::$icon}'></i>
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</div>
|
||||
</div>
|
||||
<div class='i-flex_11'>
|
||||
{{if $url = $item->url()}}
|
||||
<a href="{$url}" class='i-color_hard i-font-weight_600'>{$item->name}</a>
|
||||
{{else}}
|
||||
<span class='i-color_hard i-font-weight_600'>{$item->name}</span>
|
||||
{{endif}}
|
||||
<ul class='ipsList ipsList--inline i-color_soft i-gap_3 i-row-gap_0'>
|
||||
<li>{lang="quantity"}: {$item->quantity}</li>
|
||||
<li>{lang="invoice_unit_price"}: {$item->price}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<span class='ipsEmptyMessage'>{lang="orders_no_items"}</span>
|
||||
{{endif}}
|
||||
</div>
|
||||
{{endif}}
|
||||
</div>
|
||||
{{endif}}
|
||||
<div class='i-basis_220'>
|
||||
<strong class='i-font-size_2'>{datetime="$invoice->date"}</strong><br>
|
||||
<span class='i-color_soft'>{lang="order_title"} #{$invoice->id}</span>
|
||||
<p class='i-flex i-gap_1 i-align-items_center i-flex-wrap_wrap'>
|
||||
<span class='cNexusOrderBadge cNexusOrderBadge_{$invoice->status}'>{lang="istatus_{$invoice->status}"}</span> <strong class='i-font-size_2 cNexusPrice'>{$invoice->total}</strong>
|
||||
</p>
|
||||
</div>
|
||||
<ul class='ipsButtons ipsButtons--fill i-margin-block_2'>
|
||||
{{if $invoice->status === $invoice::STATUS_PENDING}}
|
||||
{{if $invoice->status === $invoice::STATUS_PENDING}}
|
||||
<ul class='ipsButtons ipsButtons--fill i-flex_00'>
|
||||
<li>
|
||||
<a href='{$invoice->checkoutUrl()}' class='ipsButton ipsButton--primary ipsButton--small' title="{lang="order_pay_now_title"}">{lang="order_pay_now"}</a>
|
||||
<a href='{$invoice->url()->setQueryString( 'do', 'cancel' )->csrf()}' data-confirm class='ipsButton ipsButton--inherit ipsButton--small' title="{lang="orders_cancel_title"}"><i class="fa-solid fa-xmark"></i> {lang="orders_cancel"}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='{$invoice->url()->setQueryString( 'do', 'cancel' )->csrf()}' data-confirm class='ipsButton ipsButton--inherit ipsButton--small' title="{lang="orders_cancel_title"}">{lang="orders_cancel"}</a>
|
||||
<a href='{$invoice->checkoutUrl()}' class='ipsButton ipsButton--primary ipsButton--small' title="{lang="order_pay_now_title"}"><i class="fa-solid fa-check"></i> {lang="order_pay_now"}</a>
|
||||
</li>
|
||||
{{endif}}
|
||||
<li>
|
||||
<a href='{$invoice->url()}' title="{lang="orders_view_details_title"}" class='ipsButton ipsButton--inherit ipsButton--small'>{lang="order_view_details"}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
{{endif}}
|
||||
</div>
|
||||
</li>
|
||||
]]></template>
|
||||
<template template_group="clients" template_name="invoices" template_data="$invoices, $pagination" template_location="front" template_app="nexus"><![CDATA[{template="pageHeader" group="global" app="core" params="\IPS\Member::loggedIn()->language()->addToStack('orders_title')"}
|
||||
<div class="ipsBox ipsPull">
|
||||
<div class="ipsBox ipsBox--commerceInvoices ipsPull">
|
||||
{{if \count( $invoices )}}
|
||||
{{if trim($pagination)}}
|
||||
<div class="ipsButtonBar ipsButtonBar--top">
|
||||
@@ -1638,10 +1641,10 @@
|
||||
</ul>
|
||||
</i-data>]]></template>
|
||||
<template template_group="clients" template_name="purchase" template_data="$purchase" template_location="front" template_app="nexus"><![CDATA[{{$extra = $purchase->clientAreaPage();}}
|
||||
<div class='ipsBox'>
|
||||
<div class='ipsBox ipsBox--commercePurchase'>
|
||||
<div class='ipsColumns cNexusPurchase i-padding_2'>
|
||||
<div class='ipsColumns__secondary i-basis_200'>
|
||||
<span class='ipsThumb'>
|
||||
<span class='ipsThumb i-display_block'>
|
||||
{{if $image = $purchase->image()}}
|
||||
<img src="{expression="str_replace( array( '(', ')' ), array( '\(', '\)' ), $image->url )"}" alt="" loading="lazy">
|
||||
{{elseif $icon = $purchase->getIcon()}}
|
||||
@@ -1792,7 +1795,7 @@
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}]]></template>
|
||||
<template template_group="clients" template_name="purchases" template_data="$purchases" template_location="front" template_app="nexus"><![CDATA[<div class="ipsBox ipsPull">
|
||||
<template template_group="clients" template_name="purchases" template_data="$purchases" template_location="front" template_app="nexus"><![CDATA[<div class="ipsBox ipsBox--commercePurchases ipsPull">
|
||||
<header class="ipsPageHeader ipsPageHeader--padding">
|
||||
<h1 class='ipsPageHeader__title'>{lang="purchases_title"}</h1>
|
||||
{{if \count( $purchases )}}
|
||||
@@ -2501,7 +2504,7 @@
|
||||
</ol>
|
||||
</div>]]></template>
|
||||
<template template_group="forms" template_name="addPaymentMethodForm" template_data="$showSubmitButton, $id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar=NULL, $form=NULL" template_location="global" template_app="nexus"><![CDATA[
|
||||
<div class="ipsBox">
|
||||
<div class="ipsBox ipsBox--commerceAddPaymentMethodForm">
|
||||
<form accept-charset='utf-8' class="ipsFormWrap ipsFormWrap--add-payment" action="{$action}" method="post" {{if $uploadField}}enctype="multipart/form-data"{{endif}} {{foreach $attributes as $k => $v}}{$k}="{$v}"{{endforeach}} data-ipsForm>
|
||||
<input type="hidden" name="{$id}_submitted" value="1">
|
||||
{{foreach $hiddenValues as $k => $v}}
|
||||
@@ -3046,66 +3049,68 @@
|
||||
<template template_group="global" template_name="userNav" template_data="" template_location="front" template_app="nexus"><![CDATA[{{if isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] )}}
|
||||
{{$subtotal = new \IPS\Math\Number('0');}}
|
||||
<li data-el='cart' id='elCart_container'>
|
||||
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class="ipsUserNav__link" id='elCart' data-ipsTooltip title='{lang="your_cart"}' data-ipsMenu data-ipsMenu-closeOnClick='false'>
|
||||
<button type="button" id="elCart" popovertarget="elCart_menu" class="ipsUserNav__link" data-ipsTooltip title='{lang="your_cart"}'>
|
||||
<i class="fa-solid fa-basket-shopping ipsUserNav__icon"></i>
|
||||
<span class='ipsNotification'>{expression="\IPS\nexus\Application::cartCount()"}</span>
|
||||
<span class="ipsUserNav__text ipsInvisible">{lang="cart"}</span>
|
||||
</a>
|
||||
<div id='elCart_menu' class='ipsMenu ipsMenu_wide ipsHide'>
|
||||
<div class="ipsMenu_headerBar"><h4 class="ipsTitle ipsTitle--h3">{lang="your_cart"}</h4></div>
|
||||
<div class='ipsMenu_innerContent'>
|
||||
<i-data>
|
||||
<ul class="ipsData ipsData--table ipsData--compact ipsData--cart-dropdown" data-role='cartList' id='elCartContent'>
|
||||
{{foreach $_SESSION['cart'] as $id => $item}}
|
||||
<li class='ipsData__item'>
|
||||
<figure class='ipsData__image'>
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt="{$item->name}" loading="lazy">
|
||||
{{elseif $icon = $item::$icon}}
|
||||
<i class='fa fa-solid fa-{$icon}'></i>
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</figure>
|
||||
<div class='ipsData__main'>
|
||||
<div class='ipsData__title'>{$item->name}</div>
|
||||
<p class="ipsData__meta">×{$item->quantity}</p>
|
||||
</div>
|
||||
<div class='cNexusPrice'>
|
||||
<strong>
|
||||
{{$location = NULL;}}
|
||||
{{if settings.nexus_show_tax}}
|
||||
{{$location = $location ?: \IPS\nexus\Customer::loggedIn()->estimatedLocation();}}
|
||||
{{$linePrice = $item->grossLinePrice( $location );}}
|
||||
</button>
|
||||
<i-dropdown popover id="elCart_menu">
|
||||
<div class="iDropdown">
|
||||
<div class="iDropdown__header">
|
||||
<h4>{lang="your_cart"}</h4>
|
||||
</div>
|
||||
<div class='iDropdown__content'>
|
||||
<i-data>
|
||||
<ul class="ipsData ipsData--table ipsData--compact ipsData--cart-dropdown" data-role='cartList' id='elCartContent'>
|
||||
{{foreach $_SESSION['cart'] as $id => $item}}
|
||||
<li class='ipsData__item'>
|
||||
<div class='ipsData__image' aria-hidden="true">
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt="{$item->name}" loading="lazy">
|
||||
{{elseif $icon = $item::$icon}}
|
||||
<i class='fa fa-solid fa-{$icon}'></i>
|
||||
{{else}}
|
||||
{{$linePrice = $item->linePrice();}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
{$linePrice}
|
||||
{{$subtotal = $subtotal->add( $linePrice->amount );}}
|
||||
</strong>
|
||||
{{if $item->quantity > 1}}
|
||||
<p class='i-font-size_-2 i-color_soft'>
|
||||
{lang="each_short" sprintf="$item->price"}
|
||||
</p>
|
||||
{{endif}}
|
||||
</div>
|
||||
<div class='ipsData__main'>
|
||||
<div class='ipsData__title'>{$item->name}</div>
|
||||
<p class="ipsData__meta">×{$item->quantity}</p>
|
||||
</div>
|
||||
<div class='cNexusPrice'>
|
||||
<strong>
|
||||
{{$location = NULL;}}
|
||||
{{if settings.nexus_show_tax}}
|
||||
{{$location = $location ?: \IPS\nexus\Customer::loggedIn()->estimatedLocation();}}
|
||||
{{$linePrice = $item->grossLinePrice( $location );}}
|
||||
{{else}}
|
||||
{{$linePrice = $item->linePrice();}}
|
||||
{{endif}}
|
||||
{$linePrice}
|
||||
{{$subtotal = $subtotal->add( $linePrice->amount );}}
|
||||
</strong>
|
||||
{{if $item->quantity > 1}}
|
||||
<p class='i-font-size_-2 i-color_soft'>
|
||||
{lang="each_short" sprintf="$item->price"}
|
||||
</p>
|
||||
{{endif}}
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
<li class='ipsData__item cNexusMenuCart_totalRow'>
|
||||
<div class='ipsData__main i-font-size_2 i-text-align_end'>
|
||||
<strong>{lang="subtotal"}</strong>
|
||||
</div>
|
||||
<div class='i-basis_100 cNexusPrice i-font-size_2 i-text-align_end'>
|
||||
<strong>{money="$subtotal"}</strong>
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
<li class='ipsData__item cNexusMenuCart_totalRow'>
|
||||
<div class='ipsData__main i-font-size_2 i-text-align_end'>
|
||||
<strong>{lang="subtotal"}</strong>
|
||||
</div>
|
||||
<div class='i-basis_100 cNexusPrice i-font-size_2 i-text-align_end'>
|
||||
<strong>{money="$subtotal"}</strong>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</i-data>
|
||||
</ul>
|
||||
</i-data>
|
||||
</div>
|
||||
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class='iDropdown__footer'>{lang="review_and_checkout"}</a>
|
||||
</div>
|
||||
<div class='ipsMenu_footerBar i-text-align_center'>
|
||||
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class='ipsButton ipsButton--small ipsButton--primary'>{lang="review_and_checkout"}</a>
|
||||
</div>
|
||||
</div>
|
||||
</i-dropdown>
|
||||
</li>
|
||||
{{else}}
|
||||
<li class='ipsHide' id='elCart_container'></li>
|
||||
@@ -3122,17 +3127,19 @@
|
||||
<template template_group="invoices" template_name="generate" template_data="$summary, $itemTypes, $url" template_location="admin" template_app="nexus"><![CDATA[<div class="i-padding_3">
|
||||
<ul class="ipsButtons ipsButtons--end ipsButtons--generate-invoice i-margin-bottom_2">
|
||||
<li>
|
||||
<a href="#el_addItem_menu" class="ipsButton ipsButton--secondary ipsButton--small" data-ipsMenu id='el_addItem'><i class="fa-solid fa-plus"></i> {lang="invoice_add_item"} <i class="fa-solid fa-caret-down"></i></a>
|
||||
<div id='el_addItem_menu' class='ipsMenu ipsHide'>
|
||||
<ul>
|
||||
{{foreach $itemTypes as $k => $class}}
|
||||
{{if method_exists( $class, 'form' )}}
|
||||
<li class="ipsMenu_item"><a href="{$url->setQueryString('add', $k )}" data-ipsDialog data-ipsDialog-title="{lang="$class::$title"}"><i class="fa-solid fa-{$class::$icon}"></i> {lang="$class::$title"}</a></li>
|
||||
{{endif}}
|
||||
{{endforeach}}
|
||||
<li class="ipsMenu_item"><a href="{$url->setQueryString('addRenewal', 1 )}" data-ipsDialog data-ipsDialog-title="{lang="renewal"}"><i class="fa-solid fa-rotate-right"></i> {lang="renewal"}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<button type="button" id="el_addItem" popovertarget="el_addItem_menu" class="ipsButton ipsButton--secondary ipsButton--small"><i class="fa-solid fa-plus"></i> {lang="invoice_add_item"} <i class="fa-solid fa-caret-down"></i></button>
|
||||
<i-dropdown popover id="el_addItem_menu">
|
||||
<div class="iDropdown">
|
||||
<ul class="iDropdown__items">
|
||||
{{foreach $itemTypes as $k => $class}}
|
||||
{{if method_exists( $class, 'form' )}}
|
||||
<li><a href="{$url->setQueryString('add', $k )}" data-ipsDialog data-ipsDialog-title="{lang="$class::$title"}"><i class="fa-solid fa-{$class::$icon}"></i> {lang="$class::$title"}</a></li>
|
||||
{{endif}}
|
||||
{{endforeach}}
|
||||
<li><a href="{$url->setQueryString('addRenewal', 1 )}" data-ipsDialog data-ipsDialog-title="{lang="renewal"}"><i class="fa-solid fa-rotate-right"></i> {lang="renewal"}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</i-dropdown>
|
||||
</li>
|
||||
</ul>
|
||||
<table class="ipsTable ipsTable_zebra">
|
||||
@@ -3908,7 +3915,7 @@
|
||||
<div class="i-text-align_center i-margin-top_1">
|
||||
<ul class='ipsButton_split' data-role="buttons">
|
||||
{{foreach $buttons as $k => $button}}
|
||||
<li><a {{if !isset( $button['data']['ipsDialog'] )}}data-action="quickAction"{{else}}{{foreach $button['data'] as $_k => $v}}data-{$_k}="{$v}"{{endforeach}}{{endif}} title="{lang="$button['title']"}" data-ipsTooltip class="ipsButton ipsButton--small {{if $k === 'approve'}}ipsButton--positive{{elseif $k === 'review'}}ipsButton--intermediate{{else}}ipsButton--negative{{endif}}" href="{$button['link']->setQueryString( 'queueStatus', $transaction->status )}"><i class="fa-solid fa-{$button['icon']}"></i></a></li>
|
||||
<li><a {{if !isset( $button['data']['ipsDialog'] )}}data-action="quickAction"{{else}}{{foreach $button['data'] as $_k => $v}}data-{$_k}="{$v}"{{endforeach}}{{endif}} title="{lang="$button['title']"}" data-ipsTooltip class="ipsButton ipsButton--small {{if $k === 'approve'}}ipsButton--positive{{elseif $k === 'review'}}ipsButton--primary{{else}}ipsButton--negative{{endif}}" href="{$button['link']->setQueryString( 'queueStatus', $transaction->status )}"><i class="fa-solid fa-{$button['icon']}"></i></a></li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
</div>
|
||||
@@ -4087,6 +4094,10 @@
|
||||
<span class="i-basis_120"><strong>{lang="advertisement_url"}</strong></span>
|
||||
<span class="ipsData__main">{$advertisement->link}</span>
|
||||
</li>
|
||||
<li class="ipsData__item">
|
||||
<span class="i-basis_120"><strong>{lang="ad_image_alt"}</strong></span>
|
||||
<span class="ipsData__main">{$advertisement->image_alt}</span>
|
||||
</li>
|
||||
<li class="ipsData__item">
|
||||
<span class="i-basis_120"><strong>{lang="ads_ad_impressions"}</strong></span>
|
||||
<span class="ipsData__main">{$advertisement->impressions}{{if $advertisement->maximum_unit == 'i' and $advertisement->maximum_value != -1}} / {$advertisement->maximum_value}{{endif}}</span>
|
||||
@@ -4112,6 +4123,9 @@
|
||||
{{endif}}
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
</div>]]></template>
|
||||
<template template_group="purchases" template_name="advertisementType" template_data="$purchase, $advertisement" template_location="front" template_app="nexus"><![CDATA[<div class='i-font-size_-1'>
|
||||
{{if $advertisement->type == \IPS\core\Advertisement::AD_EMAIL}}{lang="advertisements_emails"}{{else}}{lang="advertisements_site"}{{endif}}
|
||||
</div>]]></template>
|
||||
<template template_group="purchases" template_name="giftVoucher" template_data="$purchase, $data" template_location="admin" template_app="nexus"><![CDATA[
|
||||
<div class='i-padding_3 i-background_2'>
|
||||
@@ -4482,14 +4496,15 @@
|
||||
<hr class='ipsHr i-margin-bottom_4'>
|
||||
{{endif}}
|
||||
|
||||
<br><br>
|
||||
{{if \count( $associatedFiles )}}
|
||||
<h2 class='ipsTitle ipsTitle--h3 i-margin-bottom_2'>{lang="package_downloads"}</h2>
|
||||
<ul class='ipsCarousel ipsCarousel--commerce-package-downloads i-basis_200' id='commerce-package-downloads' tabindex="0">
|
||||
{{foreach $associatedFiles as $idx => $file}}
|
||||
{template="indexBlock" app="downloads" group="browse" params="$file"}
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
<i-data>
|
||||
<ul class='ipsData ipsData--associatedFiles ipsData--grid ipsData--carousel i-basis_200' id='commerce-package-downloads' tabindex="0">
|
||||
{{foreach $associatedFiles as $idx => $file}}
|
||||
{template="indexBlock" app="downloads" group="browse" params="$file"}
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
</i-data>
|
||||
{template="carouselNavigation" group="global" app="core" params="'commerce-package-downloads'"}
|
||||
{{endif}}
|
||||
|
||||
@@ -4687,7 +4702,7 @@
|
||||
<ul class="ipsData ipsData--table ipsData--cart-contents">
|
||||
{{foreach $_SESSION['cart'] as $id => $item}}
|
||||
<li id='elCartItem_{$id}' class="ipsData__item">
|
||||
<figure class='ipsData__image'>
|
||||
<div class="ipsData__image" aria-hidden="true">
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt='' loading='lazy'>
|
||||
{{elseif $icon = $item::$icon}}
|
||||
@@ -4695,7 +4710,7 @@
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</figure>
|
||||
</div>
|
||||
<div class='ipsData__content'>
|
||||
<div class='ipsData__main'>
|
||||
<h2 class='ipsData__title'>{{if $item->canChangeQuantity()}}<span class='i-color_soft'>{$item->quantity} x</span> {{endif}}{$item->name}</h2>
|
||||
@@ -4703,14 +4718,21 @@
|
||||
<div class='ipsData__meta'>
|
||||
<ul class='ipsList ipsList--inline i-font-size_-2'>
|
||||
<li><a href='{url="app=nexus&module=store&controller=cart&do=quantities&item[$id]=0" csrf="1"}' title='{lang="remove_from_cart_title"}' data-action='removeFromCart'>{lang="remove_from_cart"}</a></li>
|
||||
{{if $item->canChangeQuantity()}}<li><a href='#elItemRow{$id}_quantity_menu' data-ipsMenu data-ipsMenu-appendTo='#elCartItem_{$id}' data-ipsMenu-closeOnClick='false' id='elItemRow{$id}_quantity' title='{lang="change_quantity_title"}'>{lang="change_quantity"} <i class='fa-solid fa-caret-down'></i></a></li>{{endif}}
|
||||
{{if $item->canChangeQuantity()}}
|
||||
<li><button type="button" id="elItemRow{$id}_quantity" popovertarget="elItemRow{$id}_quantity_menu" title='{lang="change_quantity_title"}'>{lang="change_quantity"} <i class='fa-solid fa-caret-down'></i></button></li>
|
||||
{{endif}}
|
||||
</ul>
|
||||
<div class='i-padding_2 ipsHide ipsMenu' id='elItemRow{$id}_quantity_menu'>
|
||||
<form action="{url="app=nexus&module=store&controller=cart&do=quantities" seoTemplate="store_cart" csrf="1"}" method="post" data-role='quantityForm' class="i-flex i-gap_2">
|
||||
<input class="ipsInput ipsInput--number" type='number' name="item[{$id}]" value='{$item->quantity}' size="6" min="0">
|
||||
<button type='submit' class='ipsButton ipsButton--primary ipsButton--small'>{lang="update"}</button>
|
||||
</form>
|
||||
</div>
|
||||
<i-dropdown popover id="elItemRow{$id}_quantity_menu">
|
||||
<div class="iDropdown">
|
||||
<form action="{url="app=nexus&module=store&controller=cart&do=quantities" seoTemplate="store_cart" csrf="1"}" method="post" data-role='quantityForm' class="ipsForm">
|
||||
<label class="ipsFieldRow">
|
||||
<span class="ipsFieldRow__label">{lang="change_quantity"}</span>
|
||||
<input class="ipsInput ipsInput--number" type='number' name="item[{$id}]" value='{$item->quantity}' min="0">
|
||||
</label>
|
||||
<div class="ipsSubmitRow"><button type='submit' class='ipsButton ipsButton--primary ipsButton--wide'>{lang="update"}</button></div>
|
||||
</form>
|
||||
</div>
|
||||
</i-dropdown>
|
||||
</div>
|
||||
</div>
|
||||
<div class='i-basis_180'>
|
||||
@@ -4772,68 +4794,68 @@
|
||||
{{if isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] ) and \IPS\Member::loggedIn()->canAccessModule( \IPS\Application\Module::get( 'nexus', 'store' ) )}}
|
||||
{{$subtotal = new \IPS\Math\Number('0');}}
|
||||
<li data-el='cart' id='elCart_container'>
|
||||
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class="ipsUserNav__link" id='elCart' data-ipsTooltip title='{lang="your_cart"}' data-ipsMenu data-ipsMenu-closeOnClick='false'>
|
||||
<button type="button" id="elCart" popovertarget="elCart_menu" class="ipsUserNav__link" data-ipsTooltip title='{lang="your_cart"}'>
|
||||
<i class="fa-solid fa-basket-shopping ipsUserNav__icon"></i>
|
||||
<span class="ipsUserNav__text">{lang="cart"}</span>
|
||||
<span class='ipsNotification'>{expression="\IPS\nexus\Application::cartCount()"}</span>
|
||||
</a>
|
||||
<div id='elCart_menu' class='ipsMenu ipsMenu_wide ipsHide'>
|
||||
<div class="ipsMenu_headerBar"><h4 class="ipsTitle ipsTitle--h3">{lang="your_cart"}</h4></div>
|
||||
<div class='ipsMenu_innerContent'>
|
||||
<i-data>
|
||||
<ul class="ipsData ipsData--table ipsData--compact ipsData--cart-dropdown" data-role='cartList' id='elCartContent'>
|
||||
{{foreach $_SESSION['cart'] as $id => $item}}
|
||||
<li class='ipsData__item'>
|
||||
<figure class='ipsData__image'>
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt="{$item->name}" loading="lazy">
|
||||
{{elseif $icon = $item::$icon}}
|
||||
<i class='fa fa-solid fa-{$icon}'></i>
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</figure>
|
||||
<div class='ipsData__main'>
|
||||
<div class='ipsData__title'>{$item->name}</div>
|
||||
<p class="ipsData__meta">×{$item->quantity}</p>
|
||||
</div>
|
||||
<div class='cNexusPrice'>
|
||||
<strong>
|
||||
{{if settings.nexus_show_tax}}
|
||||
{{$location = $location ?: \IPS\nexus\Customer::loggedIn()->estimatedLocation();}}
|
||||
{{$linePrice = $item->grossLinePrice( $location );}}
|
||||
</button>
|
||||
<i-dropdown popover id="elCart_menu">
|
||||
<div class="iDropdown">
|
||||
<div class="iDropdown__header">
|
||||
<h4>{lang="your_cart"}</h4>
|
||||
</div>
|
||||
<div class='iDropdown__content'>
|
||||
<i-data>
|
||||
<ul class="ipsData ipsData--table ipsData--compact ipsData--cart-dropdown" data-role='cartList' id='elCartContent'>
|
||||
{{foreach $_SESSION['cart'] as $id => $item}}
|
||||
<li class='ipsData__item'>
|
||||
<div class='ipsData__image' aria-hidden="true">
|
||||
{{if $image = $item->image()}}
|
||||
<img src="{$image->url}" alt="{$item->name}" loading="lazy">
|
||||
{{elseif $icon = $item::$icon}}
|
||||
<i class='fa fa-solid fa-{$icon}'></i>
|
||||
{{else}}
|
||||
{{$linePrice = $item->linePrice();}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
{$linePrice}
|
||||
{{$subtotal = $subtotal->add( $linePrice->amount );}}
|
||||
</strong>
|
||||
{{if $item->quantity > 1}}
|
||||
<p class='i-font-size_-2 i-color_soft'>
|
||||
{lang="each_short" sprintf="$item->price"}
|
||||
</p>
|
||||
{{endif}}
|
||||
</div>
|
||||
<div class='ipsData__main'>
|
||||
<div class='ipsData__title'>{$item->name}</div>
|
||||
<p class="ipsData__meta">×{$item->quantity}</p>
|
||||
</div>
|
||||
<div class='cNexusPrice'>
|
||||
<strong>
|
||||
{{if settings.nexus_show_tax}}
|
||||
{{$location = $location ?: \IPS\nexus\Customer::loggedIn()->estimatedLocation();}}
|
||||
{{$linePrice = $item->grossLinePrice( $location );}}
|
||||
{{else}}
|
||||
{{$linePrice = $item->linePrice();}}
|
||||
{{endif}}
|
||||
{$linePrice}
|
||||
{{$subtotal = $subtotal->add( $linePrice->amount );}}
|
||||
</strong>
|
||||
{{if $item->quantity > 1}}
|
||||
<p class='i-font-size_-2 i-color_soft'>
|
||||
{lang="each_short" sprintf="$item->price"}
|
||||
</p>
|
||||
{{endif}}
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
<li class='ipsData__item cNexusMenuCart_totalRow'>
|
||||
<div class='ipsData__main i-font-size_2 i-text-align_end'>
|
||||
<strong>{lang="subtotal"}</strong>
|
||||
</div>
|
||||
<div class='i-basis_100 cNexusPrice i-font-size_2 i-text-align_end'>
|
||||
<strong>{money="$subtotal"}</strong>
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
<li class='ipsData__item cNexusMenuCart_totalRow'>
|
||||
<div class='ipsData__main i-font-size_2 i-text-align_end'>
|
||||
<strong>{lang="subtotal"}</strong>
|
||||
</div>
|
||||
<div class='i-basis_100 cNexusPrice i-font-size_2 i-text-align_end'>
|
||||
<strong>{money="$subtotal"}</strong>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</i-data>
|
||||
</ul>
|
||||
</i-data>
|
||||
</div>
|
||||
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class='iDropdown__footer'>{lang="review_and_checkout"}</a>
|
||||
</div>
|
||||
<div class='ipsMenu_footerBar i-text-align_center'>
|
||||
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class='ipsButton ipsButton--small ipsButton--primary'>{lang="review_and_checkout"}</a>
|
||||
</div>
|
||||
</div>
|
||||
</i-dropdown>
|
||||
</li>
|
||||
{{else}}
|
||||
<li class='ipsHide' id='elCart_container'></li>
|
||||
{{endif}}]]></template>
|
||||
<template template_group="store" template_name="cartHeaderMobile" template_data="" template_location="front" template_app="nexus"><![CDATA[<li data-el='cart' id="elCart_mobileHeaderContainer">
|
||||
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class="ipsMobileNavIcons__button">
|
||||
@@ -4881,26 +4903,28 @@
|
||||
</header>
|
||||
|
||||
{{if \count( $subcategories )}}
|
||||
<section class='ipsBox ipsPull ipsBox--padding'>
|
||||
<ul class='ipsGrid ipsGrid--commerce-subcategories i-basis_280 i-text-align_center'>
|
||||
{{foreach $subcategories as $group}}
|
||||
<li>
|
||||
<figure class='ipsFigure'>
|
||||
<a href='{$group->url()}' class='ipsFigure__main i-aspect-ratio_6'>
|
||||
<section class='ipsBox ipsBox--commerceSubcategories ipsPull'>
|
||||
<i-data>
|
||||
<ul class='ipsData ipsData--wallpaper ipsData--carousel ipsData--commerceCategories'>
|
||||
{{foreach $subcategories as $group}}
|
||||
<li class="ipsData__item">
|
||||
<a href='{$group->url()}' class='ipsLinkPanel' aria-hidden="true" tabindex="-1"><span>{$group->_title}</span></a>
|
||||
<div class="ipsData__image" aria-hidden="true">
|
||||
{{if $group->image}}
|
||||
<img src='{expression="str_replace( array( '(', ')' ), array( '\(', '\)' ), $group->image )"}' alt='' loading='lazy'>
|
||||
{{else}}
|
||||
<i class="ipsFigure__icon"></i>
|
||||
<i></i>
|
||||
{{endif}}
|
||||
<span class="ipsInvisible">{$group->_title}</span>
|
||||
</a>
|
||||
<figcaption class="ipsFigure__footer">
|
||||
<h3 class='i-font-size_2 i-font-weight_600'>{$group->_title}</h3>
|
||||
</figcaption>
|
||||
</figure>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="ipsData__content">
|
||||
<div class="ipsData__main">
|
||||
<h3 class="ipsData__title">{$group->_title}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
</i-data>
|
||||
</section>
|
||||
<br>
|
||||
{{endif}}
|
||||
@@ -4909,7 +4933,7 @@
|
||||
{template="categoryContents" group="store" params="$category, $subcategories, $packages, $pagination, $packagesWithCustomFields, $totalCount"}
|
||||
</div>]]></template>
|
||||
<template template_group="store" template_name="categoryContents" template_data="$category, $subcategories, $packages, $pagination, $packagesWithCustomFields, $totalCount" template_location="front" template_app="nexus"><![CDATA[{{if \count( $packages )}}
|
||||
<section class='ipsBox'>
|
||||
<section class='ipsBox ipsBox--commerceCategoryContents'>
|
||||
<h2 class='ipsBox__header'>{lang="products_count" pluralize="$totalCount"}</h2>
|
||||
<div class="ipsButtonBar ipsButtonBar--top">
|
||||
{{if $pagination}}
|
||||
@@ -4918,20 +4942,20 @@
|
||||
<div class="ipsButtonBar__end">
|
||||
<ul class="ipsDataFilters">
|
||||
<li>
|
||||
<a href="#elSortByMenu_menu" id="elSortByMenu_products" class="ipsDataFilters__button" data-role="sortButton" data-ipsMenu data-ipsMenu-activeclass="ipsDataFilters__button--active" data-ipsMenu-selectable="radio"><span>{lang="sort_by"}</span><i class="fa-solid fa-caret-down"></i></a>
|
||||
<ul class="ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide" id="elSortByMenu_products_menu">
|
||||
{{foreach array( 'default', 'name', 'price_low', 'price_high', 'rating' ) as $k}}
|
||||
<li class="ipsMenu_item {{if ( request.sortby and request.sortby == $k ) or ( !request.sortby and $k === 'default' )}}ipsMenu_itemChecked{{endif}}" data-ipsmenuvalue="{$k}">
|
||||
{{if $k === 'default'}}
|
||||
<a data-action="filter" href="{$category->url()}">
|
||||
{{else}}
|
||||
<a data-action="filter" href="{$category->url()->setQueryString( 'sortby', $k )}">
|
||||
{{endif}}
|
||||
{lang="products_sort_{$k}"}
|
||||
</a>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
<button type="button" id="elSortByMenu_products" popovertarget="elSortByMenu_products_menu" class="ipsDataFilters__button" data-role="sortButton"><span>{lang="sort_by"}</span><i class="fa-solid fa-caret-down"></i></button>
|
||||
<i-dropdown popover id="elSortByMenu_products_menu" data-i-dropdown-selectable="radio">
|
||||
<div class="iDropdown">
|
||||
<ul class="iDropdown__items">
|
||||
{{foreach array( 'default', 'name', 'price_low', 'price_high', 'rating' ) as $k}}
|
||||
<li>
|
||||
<a data-action="filter" {{if $k === 'default'}}href="{$category->url()}"{{else}}href="{$category->url()->setQueryString( 'sortby', $k )}"{{endif}} {{if ( request.sortby and request.sortby == $k ) or ( !request.sortby and $k === 'default' )}}aria-selected="true"{{endif}} data-ipsmenuvalue="{$k}">
|
||||
<i class="iDropdown__input"></i>{lang="products_sort_{$k}"}
|
||||
</a>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
</div>
|
||||
</i-dropdown>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -5368,24 +5392,24 @@
|
||||
</div>
|
||||
{{endif}}
|
||||
|
||||
<section class='ipsBox ipsPull'>
|
||||
<section class='ipsBox ipsBox--commerceCategories ipsPull'>
|
||||
<header class='ipsBox__header'>
|
||||
<h2>{lang="categories"}</h2>
|
||||
{template="carouselNavigation" group="global" app="core" params="'carousel--commerce-categories'"}
|
||||
</header>
|
||||
<nav class='ipsBox__content'>
|
||||
<i-data>
|
||||
<ul class='ipsData ipsData--wallpaper ipsData--carousel ipsData--commerce-categories i-basis_220 i-text-align_center' id='carousel--commerce-categories' tabindex="0">
|
||||
<ul class='ipsData ipsData--wallpaper ipsData--carousel ipsData--commerceCategories' id='carousel--commerce-categories' tabindex="0">
|
||||
{{foreach \IPS\nexus\Package\Group::rootsWithViewablePackages() as $group}}
|
||||
<li class="ipsData__item">
|
||||
<a href='{$group->url()}' class='ipsLinkPanel' aria-hidden="true" tabindex="-1"><span>{$group->_title}</span></a>
|
||||
<figure class="ipsData__image">
|
||||
<div class="ipsData__image" aria-hidden="true">
|
||||
{{if $group->image}}
|
||||
<img src='{expression="str_replace( array( '(', ')' ), array( '\(', '\)' ), $group->image )"}' alt='' loading='lazy'>
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</figure>
|
||||
</div>
|
||||
<div class="ipsData__content">
|
||||
<div class="ipsData__main">
|
||||
<h3 class="ipsData__title">{$group->_title}</h3>
|
||||
@@ -5399,7 +5423,7 @@
|
||||
</section>
|
||||
|
||||
{{if \count( \IPS\nexus\Package\Item::featured() )}}
|
||||
<section class='ipsBox ipsPull'>
|
||||
<section class='ipsBox ipsBox--commerceFeaturedProducts ipsPull'>
|
||||
<header class='ipsBox__header'>
|
||||
<h2>{lang="featured_products"}</h2>
|
||||
{template="carouselNavigation" group="global" app="core" params="'carousel--commerce-featured'"}
|
||||
@@ -5415,7 +5439,7 @@
|
||||
{{endif}}
|
||||
|
||||
{{if \count( $newProducts )}}
|
||||
<section class='ipsBox ipsPull'>
|
||||
<section class='ipsBox ipsBox--commerceNewProducts ipsPull'>
|
||||
<header class='ipsBox__header'>
|
||||
<h2>{lang="new_products"}</h2>
|
||||
{template="carouselNavigation" group="global" app="core" params="'carousel--commerce-new'"}
|
||||
@@ -5431,7 +5455,7 @@
|
||||
{{endif}}
|
||||
|
||||
{{if \count( $popularProducts )}}
|
||||
<section class='ipsBox ipsPull'>
|
||||
<section class='ipsBox ipsBox--commercePopularProducts ipsPull'>
|
||||
<header class='ipsBox__header'>
|
||||
<h2>{lang="popular_products"}</h2>
|
||||
{template="carouselNavigation" group="global" app="core" params="'carousel--commerce-popular'"}
|
||||
@@ -5446,7 +5470,7 @@
|
||||
</section>
|
||||
{{endif}}]]></template>
|
||||
<template template_group="store" template_name="package" template_data="$package, $item, $purchaseForm, $inCart, $renewalTerm, $initialTerm" template_location="front" template_app="nexus"><![CDATA[
|
||||
<div class='ipsBox ipsPull'>
|
||||
<div class='ipsBox ipsBox--commercePackage ipsPull'>
|
||||
<section class='cNexusProduct_header ipsFluid i-basis_400 i-gap_lines' data-controller='nexus.front.store.packagePage' data-itemTitle="{$package->_title}">
|
||||
{{if $images = $item->images() and \count( $images )}}
|
||||
<div class='i-background_2'>
|
||||
@@ -5546,7 +5570,7 @@
|
||||
</div>
|
||||
|
||||
{{if $package->reviewable}}
|
||||
<section class="ipsBox ipsPull">
|
||||
<section class="ipsBox ipsBox--packageReviews ipsPull">
|
||||
<h2 class="ipsBox__header">{lang="product_reviews_pl"}</h2>
|
||||
<div class="ipsBox__content">
|
||||
{template="reviews" group="store" app="nexus" params="$item"}
|
||||
@@ -5556,7 +5580,7 @@
|
||||
<template template_group="store" template_name="packageBlock" template_data="$package, $layout='grid', $isCarousel=false" template_location="front" template_app="nexus"><![CDATA[
|
||||
<li class='ipsData__item {$package->ui( "css" )}' {$package->ui( 'dataAttributes' )}>
|
||||
<a href='{$package->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$package->_title}</span></a>
|
||||
<a href='{$package->url()}' class='ipsData__image'>
|
||||
<a href='{$package->url()}' class='ipsData__image' aria-hidden="true" tabindex="-1">
|
||||
{{if $package->image}}
|
||||
<img src="{$package->image}" alt='{$package->_title}' loading='lazy'>
|
||||
{{else}}
|
||||
@@ -5643,7 +5667,7 @@
|
||||
</div>]]></template>
|
||||
<template template_group="store" template_name="packageBlockWidget" template_data="$package, $mini=FALSE, $showAddToCart=FALSE" template_location="front" template_app="nexus"><![CDATA[<li class="ipsData__item cNexusWidgetProduct {{if $mini}}cNexusProduct_mini{{endif}}">
|
||||
<a href="{$package->url()}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$package->_title}</span></a>
|
||||
<a href='{$package->url()}' class='ipsData__image'>
|
||||
<a href='{$package->url()}' class='ipsData__image' aria-hidden="true" tabindex="-1">
|
||||
{{if $package->image}}
|
||||
<img src="{$package->image}" alt='{$package->_title}' loading='lazy'>
|
||||
{{else}}
|
||||
@@ -5680,7 +5704,7 @@
|
||||
<template template_group="store" template_name="packageRow" template_data="$package, $hasCustomFields=FALSE" template_location="front" template_app="nexus"><![CDATA[
|
||||
<li class='ipsData__item {$package->ui( 'css' )}' {$package->ui( 'dataAttributes' )}>
|
||||
<a href='{$package->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$package->_title}</span></a>
|
||||
<a href='{$package->url()}' class='ipsData__image cNexusProduct_image'>
|
||||
<a href='{$package->url()}' class='ipsData__image cNexusProduct_image' aria-hidden="true" tabindex="-1">
|
||||
{{if $package->image}}
|
||||
<img src="{$package->image}" alt="{$package->_title}" loading="lazy">
|
||||
{{else}}
|
||||
@@ -5701,7 +5725,7 @@
|
||||
</div>
|
||||
{{endif}}
|
||||
</div>
|
||||
<div>
|
||||
<div class="i-flex_00">
|
||||
{{if $package->stock === 0}}
|
||||
<span class='ipsButton ipsButton--primary' aria-disabled="true">{lang="out_of_stock"}</span>
|
||||
{{else}}
|
||||
@@ -6010,7 +6034,7 @@
|
||||
</div>
|
||||
</div>]]></template>
|
||||
<template template_group="store" template_name="register" template_data="$packages" template_location="front" template_app="nexus"><![CDATA[
|
||||
<div class='ipsBox ipsPull'>
|
||||
<div class='ipsBox ipsBox--commerceRegister ipsPull'>
|
||||
<div class="i-padding_3 i-border-bottom_3">
|
||||
<h1 class='i-font-size_4 i-font-weight_600 i-color_hard'>{lang='sign_up'}: {lang="choose_product"}</h1>
|
||||
<p class='i-font-size_2 i-font-weight_500 i-color_soft'>
|
||||
@@ -6315,7 +6339,7 @@
|
||||
{{endforeach}}
|
||||
{{endif}}]]></template>
|
||||
<template template_group="subscription" template_name="status" template_data="$active" template_location="admin" template_app="nexus"><![CDATA[<span class="ipsBadge {{if $active}}ipsBadge--positive{{else}}ipsBadge--neutral{{endif}}">{{if $active}}{lang="active"}{{else}}{lang="inactive"}{{endif}}</span>]]></template>
|
||||
<template template_group="subscription" template_name="table" template_data="$table, $headers, $rows, $quickSearch" template_location="front" template_app="nexus"><![CDATA[<section class='ipsBox ipsPull'>
|
||||
<template template_group="subscription" template_name="table" template_data="$table, $headers, $rows, $quickSearch" template_location="front" template_app="nexus"><![CDATA[<section class='ipsBox ipsBox--commerceSubscription ipsPull'>
|
||||
<header class='ipsPageHeader'>
|
||||
<div class="ipsPageHeader__row">
|
||||
<div class='ipsPageHeader__primary'>
|
||||
@@ -6341,16 +6365,20 @@
|
||||
{{$baseUrl = $baseUrl->setQueryString( 'register', (int) \IPS\Request::i()->register );}}
|
||||
{{endif}}
|
||||
{{$memberCurrency = ( ( isset( \IPS\Request::i()->cookie['currency'] ) and \in_array( \IPS\Request::i()->cookie['currency'], \IPS\nexus\Money::currencies() ) ) ? \IPS\Request::i()->cookie['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency() );}}
|
||||
<a href='#elCurrencyChooser_menu' data-ipsMenu id='elCurrencyChooser' class='ipsButton ipsButton--soft'><span>{$memberCurrency}</span><i class='fa-solid fa-caret-down'></i></a>
|
||||
<ul class='ipsMenu ipsMenu_veryNarrow ipsHide' id='elCurrencyChooser_menu' {{if isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] )}}data-controller="nexus.front.store.currencySelect"{{endif}}>
|
||||
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
||||
<li class='ipsMenu_item' {{if $currency == $memberCurrency}}data-selected{{endif}}>
|
||||
<a href='{$baseUrl->setQueryString( 'currency', $currency )->csrf()}' title='{lang="set_currency_to" sprintf="$currency"}'>
|
||||
{{if $currency == $memberCurrency}}<i class='fa-solid fa-check'></i> {{endif}}{$currency}
|
||||
</a>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
<button type="button" id="elCurrencyChooser" popovertarget="elCurrencyChooser_menu" class='ipsButton ipsButton--soft'><span>{$memberCurrency}</span><i class='fa-solid fa-caret-down'></i></button>
|
||||
<i-dropdown popover id="elCurrencyChooser_menu">
|
||||
<div class="iDropdown">
|
||||
<ul class="iDropdown__items">
|
||||
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
||||
<li>
|
||||
<a href='{$baseUrl->setQueryString( 'currency', $currency )->csrf()}' title='{lang="set_currency_to" sprintf="$currency"}' {{if $currency == $memberCurrency}}data-selected aria-selected="true"{{endif}}>
|
||||
<i class="iDropdown__input"></i>{$currency}
|
||||
</a>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
</div>
|
||||
</i-dropdown>
|
||||
</div>
|
||||
{{endif}}
|
||||
</div>
|
||||
@@ -6608,7 +6636,7 @@
|
||||
{{endif}}
|
||||
</div>
|
||||
</li>]]></template>
|
||||
<template template_group="transactions" template_name="status" template_data="$status" template_location="admin" template_app="nexus"><![CDATA[<span class="ipsBadge ipsBadge--style{{if $status == \IPS\nexus\Transaction::STATUS_PAID}}4{{elseif $status == \IPS\nexus\Transaction::STATUS_HELD}}1{{elseif $status == \IPS\nexus\Transaction::STATUS_REVIEW or $status == \IPS\nexus\Transaction::STATUS_DISPUTED}}7{{elseif $status == \IPS\nexus\Transaction::STATUS_REFUSED}}5{{elseif $status == \IPS\nexus\Transaction::STATUS_REFUNDED or $status == \IPS\nexus\Transaction::STATUS_PART_REFUNDED}}2{{else}}6{{endif}}">
|
||||
<template template_group="transactions" template_name="status" template_data="$status" template_location="admin" template_app="nexus"><![CDATA[<span class="ipsBadge {{if $status == \IPS\nexus\Transaction::STATUS_PAID}}ipsBadge--positive{{elseif $status == \IPS\nexus\Transaction::STATUS_HELD}}ipsBadge--pending{{elseif $status == \IPS\nexus\Transaction::STATUS_REVIEW or $status == \IPS\nexus\Transaction::STATUS_DISPUTED}}ipsBadge--warning{{elseif $status == \IPS\nexus\Transaction::STATUS_REFUSED}}ipsBadge--negative{{elseif $status == \IPS\nexus\Transaction::STATUS_REFUNDED or $status == \IPS\nexus\Transaction::STATUS_PART_REFUNDED}}ipsBadge--neutral{{else}}ipsBadge--intermediary{{endif}}">
|
||||
{lang="tstatus_{$status}"}
|
||||
</span>]]></template>
|
||||
<template template_group="transactions" template_name="stripeData" template_data="$response=NULL, $error=NULL" template_location="admin" template_app="nexus"><![CDATA[{{if isset( $response['outcome'] )}}
|
||||
@@ -7865,7 +7893,7 @@
|
||||
{{$package = \IPS\nexus\Package::load( $review->item()->id );}}
|
||||
<li class='ipsData__item'>
|
||||
<a href="{$package->url()}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$package->_title}</span></a>
|
||||
<a href='{$review->url()}' class='ipsData__image'>
|
||||
<a href='{$review->url()}' class='ipsData__image' aria-hidden="true" tabindex="-1">
|
||||
{{if $package->image}}
|
||||
<img src="{$package->image}" alt="{$package->_title}" loading="lazy">
|
||||
{{else}}
|
||||
@@ -7915,13 +7943,13 @@
|
||||
{{if $package->enabled }}
|
||||
<li class="ipsData__item">
|
||||
<a href="{$package->url()}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{lang="nexus_subs_widget_title_and_price" sprintf="$package->_title, $package->priceBlurb()"}</span></a>
|
||||
<figure class="ipsData__image">
|
||||
<div class="ipsData__image" aria-hidden="true">
|
||||
{{if $package->_image}}
|
||||
<img src='{expression="str_replace( array( '(', ')' ), array( '\(', '\)' ), $package->_image->url )"}' alt='' loading='lazy'>
|
||||
{{else}}
|
||||
<i></i>
|
||||
{{endif}}
|
||||
</figure>
|
||||
</div>
|
||||
<div class="ipsData__content">
|
||||
<div class='ipsData__main'>
|
||||
<h4 class="ipsData__title"><a href="{$package->url()}">{expression="$package->_title"}</a></h4>
|
||||
@@ -8689,7 +8717,14 @@ ul.cInvoiceUnpaidConsequences ul {
|
||||
.ipsUploader__row.ipsAttach_error .cNexusPrimaryRadio {
|
||||
display: none;
|
||||
}]]></css>
|
||||
<css css_location="front" css_app="nexus" css_attributes="" css_path="." css_name="nexus.css">.cNexusPrice {
|
||||
<css css_location="front" css_app="nexus" css_attributes="" css_path="." css_name="nexus.css">/* Category thumbnails */
|
||||
.ipsData--commerceCategories{
|
||||
--i-data--basis: 320px;
|
||||
--i-data--wallpaper-height: calc((16 / 10) * 100% - 100%);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.cNexusPrice {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
|
||||
@@ -348,5 +348,54 @@
|
||||
"5000071": "5.0.6 Beta 2",
|
||||
"5000072": "5.0.6 Beta 3",
|
||||
"5000073": "5.0.6 Beta 4",
|
||||
"5000074": "5.0.6"
|
||||
"5000074": "5.0.6",
|
||||
"5000075": "5.0.7 Beta 1",
|
||||
"5000076": "5.0.7 Beta 2",
|
||||
"5000077": "5.0.7 Beta 2",
|
||||
"5000078": "5.0.7 Beta 3",
|
||||
"5000079": "5.0.7 Beta 4",
|
||||
"5000080": "5.0.7",
|
||||
"5000081": "5.0.7",
|
||||
"5000082": "5.0.7",
|
||||
"5000800": "5.0.8 Alpha 1",
|
||||
"5000801": "5.0.8 Alpha 2",
|
||||
"5000802": "5.0.8 Beta 1",
|
||||
"5000803": "5.0.8 Beta 2",
|
||||
"5000804": "5.0.8 Beta 3",
|
||||
"5000805": "5.0.8",
|
||||
"5000900": "5.0.9 Beta 1",
|
||||
"5000901": "5.0.9 Beta 1",
|
||||
"5000902": "5.0.9 Beta 1",
|
||||
"5000903": "5.0.9 Beta 2",
|
||||
"5000904": "5.0.9",
|
||||
"5000905": "5.0.9",
|
||||
"5000906": "5.0.10 Beta 1",
|
||||
"5000907": "5.0.10 Beta 1",
|
||||
"5000908": "5.0.10 Beta 1",
|
||||
"5000909": "5.0.10 Beta 1",
|
||||
"5000910": "5.0.10 Beta 2",
|
||||
"5000911": "5.0.10 Beta 3",
|
||||
"5000912": "5.0.10 Beta 4",
|
||||
"5000913": "5.0.10 Beta 4",
|
||||
"5000914": "5.0.10",
|
||||
"5000915": "5.0.10",
|
||||
"5000916": "5.0.10",
|
||||
"5000917": "5.0.10",
|
||||
"5000918": "5.0.10",
|
||||
"5000919": "5.0.10",
|
||||
"5000920": "5.0.10",
|
||||
"5001100": "5.0.11 Beta 1",
|
||||
"5001101": "5.0.11 Beta 1",
|
||||
"5001102": "5.0.11 Beta 2",
|
||||
"5001103": "5.0.11",
|
||||
"5001104": "5.0.11",
|
||||
"5001105": "5.0.11",
|
||||
"5001200": "5.0.12 Beta 1",
|
||||
"5001201": "5.0.12 Beta 2",
|
||||
"5001202": "5.0.12 Beta 3",
|
||||
"5001203": "5.0.12",
|
||||
"5001204": "5.0.12",
|
||||
"5001300": "5.0.13 Beta 1",
|
||||
"5001301": "5.0.13 Beta 2",
|
||||
"5001302": "5.0.13"
|
||||
}
|
||||
@@ -48,7 +48,7 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
*/
|
||||
public function filters( ?array $filters, Url $url ): array
|
||||
{
|
||||
$return = array();
|
||||
$return = parent::filters( $filters, $url );
|
||||
|
||||
$return['nodes'] = new Node( 'achievement_filter_Donation_nodes', ( $filters and isset( $filters['nodes'] ) and $filters['nodes'] ) ? $filters['nodes'] : 0, FALSE, [
|
||||
'url' => $url,
|
||||
@@ -75,7 +75,7 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
*/
|
||||
public function formatFilterValues( array $values ): array
|
||||
{
|
||||
$return = [];
|
||||
$return = parent::formatFilterValues( $values );
|
||||
if ( isset( $values['achievement_filter_Donation_nodes'] ) )
|
||||
{
|
||||
$return['nodes'] = array_keys( $values['achievement_filter_Donation_nodes'] );
|
||||
@@ -136,6 +136,30 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the member has already completed this rule.
|
||||
* Used for retroactive rule completion.
|
||||
* So far, this is only used in Quests, but may be used elsewhere at a later point.
|
||||
*
|
||||
* @param Member $member
|
||||
* @param array $filters
|
||||
* @return bool
|
||||
*/
|
||||
public function isRuleCompleted( Member $member, array $filters ) : bool
|
||||
{
|
||||
$query = $this->getQuery( 'count(*)', [
|
||||
[ 'dl_member=?', $member->member_id ]
|
||||
], null, null, $filters );
|
||||
|
||||
$total = $query->first();
|
||||
if( !empty( $filters['milestone'] ) )
|
||||
{
|
||||
return $total >= $filters['milestone'];
|
||||
}
|
||||
|
||||
return $total > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get identifier to prevent the member being awarded points for the same action twice
|
||||
* Must be unique within within of this domain, must not exceed 32 chars.
|
||||
@@ -188,7 +212,7 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
{
|
||||
$conditions[] = Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone', FALSE, [
|
||||
'htmlsprintf' => [
|
||||
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
|
||||
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
|
||||
],
|
||||
'sprintf' => [ Member::loggedIn()->language()->addToStack('donation_lc') ]
|
||||
] );
|
||||
@@ -198,7 +222,12 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
$conditions[] = $nodeCondition;
|
||||
}
|
||||
|
||||
return Theme::i()->getTemplate( 'achievements' )->ruleDescription(
|
||||
if( $questCondition = $this->_questFilterDescription( $rule ) )
|
||||
{
|
||||
$conditions[] = $questCondition;
|
||||
}
|
||||
|
||||
return Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescription(
|
||||
Member::loggedIn()->language()->addToStack( 'AchievementAction__Donation_title' ),
|
||||
$conditions
|
||||
);
|
||||
@@ -227,7 +256,7 @@ class Donation extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
{
|
||||
return Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location', FALSE, [
|
||||
'htmlsprintf' => [
|
||||
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'location',
|
||||
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'location',
|
||||
count( $nodeNames ) === 1 ? $nodeNames[0] : Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location_val', FALSE, [ 'sprintf' => [
|
||||
count( $nodeNames ),
|
||||
Member::loggedIn()->language()->addToStack( 'goals', FALSE, [ 'strtolower' => TRUE ] ) //@todo
|
||||
|
||||
@@ -48,7 +48,7 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
*/
|
||||
public function filters( ?array $filters, Url $url ): array
|
||||
{
|
||||
$return = array();
|
||||
$return = parent::filters( $filters, $url );
|
||||
|
||||
$return['nodes'] = new Node( 'achievement_filter_Package', ( $filters and isset( $filters['nodes'] ) and $filters['nodes'] ) ? $filters['nodes'] : 0, FALSE, [
|
||||
'url' => $url,
|
||||
@@ -75,7 +75,7 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
*/
|
||||
public function formatFilterValues( array $values ): array
|
||||
{
|
||||
$return = [];
|
||||
$return = parent::formatFilterValues( $values );
|
||||
if ( isset( $values['achievement_filter_Package'] ) )
|
||||
{
|
||||
$return['nodes'] = [];
|
||||
@@ -128,6 +128,38 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the member has already completed this rule.
|
||||
* Used for retroactive rule completion.
|
||||
* So far, this is only used in Quests, but may be used elsewhere at a later point.
|
||||
*
|
||||
* @param Member $member
|
||||
* @param array $filters
|
||||
* @return bool
|
||||
*/
|
||||
public function isRuleCompleted( Member $member, array $filters ) : bool
|
||||
{
|
||||
$where = [
|
||||
[ 'ps_member=?', $member->member_id ]
|
||||
];
|
||||
|
||||
iF( !empty( $filters['nodes'] ) )
|
||||
{
|
||||
$where[] = [ Db::i()->in( 'p_group', $filters['nodes'] ) ];
|
||||
}
|
||||
|
||||
$total = Db::i()->select( 'count(*)', 'nexus_purchases', $where )
|
||||
->join( 'nexus_packages', [ 'ps_app=? and ps_type=? ps_item_id=p_id', 'nexus', 'package' ] )
|
||||
->first();
|
||||
|
||||
if( !empty( $filters['milestone'] ) )
|
||||
{
|
||||
return $total >= $filters['milestone'];
|
||||
}
|
||||
|
||||
return $total > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get identifier to prevent the member being awarded points for the same action twice
|
||||
* Must be unique within within of this domain, must not exceed 32 chars.
|
||||
@@ -179,7 +211,7 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
{
|
||||
$conditions[] = Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone', FALSE, [
|
||||
'htmlsprintf' => [
|
||||
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
|
||||
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
|
||||
],
|
||||
'sprintf' => [ Member::loggedIn()->language()->addToStack('AchievementAction__Package_title_generic') ]
|
||||
] );
|
||||
@@ -190,7 +222,12 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
$conditions[] = $nodeCondition;
|
||||
}
|
||||
|
||||
return Theme::i()->getTemplate( 'achievements' )->ruleDescription(
|
||||
if( $questCondition = $this->_questFilterDescription( $rule ) )
|
||||
{
|
||||
$conditions[] = $questCondition;
|
||||
}
|
||||
|
||||
return Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescription(
|
||||
Member::loggedIn()->language()->addToStack( 'AchievementAction__Package_title' ),
|
||||
$conditions
|
||||
);
|
||||
@@ -219,7 +256,7 @@ class Package extends AchievementActionAbstract // NOTE: Other classes exist to
|
||||
{
|
||||
return Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location', FALSE, [
|
||||
'htmlsprintf' => [
|
||||
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'location',
|
||||
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'location',
|
||||
count( $nodeNames ) === 1 ? $nodeNames[0] : Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location_val', FALSE, [ 'sprintf' => [
|
||||
count( $nodeNames ),
|
||||
Member::loggedIn()->language()->addToStack( 'purchase_groups_lc', FALSE )
|
||||
|
||||
@@ -14,6 +14,7 @@ namespace IPS\nexus\extensions\core\AchievementAction;
|
||||
|
||||
use IPS\core\Achievements\Actions\AchievementActionAbstract;
|
||||
use IPS\core\Achievements\Rule;
|
||||
use IPS\Db;
|
||||
use IPS\Helpers\Form\Node;
|
||||
use IPS\Helpers\Form\YesNo;
|
||||
use IPS\Http\Url;
|
||||
@@ -57,7 +58,7 @@ class Subscription extends AchievementActionAbstract // NOTE: Other classes exis
|
||||
*/
|
||||
public function filters( ?array $filters, Url $url ): array
|
||||
{
|
||||
$return = array();
|
||||
$return = parent::filters( $filters, $url );
|
||||
|
||||
$return['subscriptions'] = new Node( 'achievement_filter_Subscriptions', ( $filters and isset( $filters['subscriptions'] ) and $filters['subscriptions'] ) ? $filters['subscriptions'] : 0, FALSE, [
|
||||
'url' => $url,
|
||||
@@ -84,7 +85,7 @@ class Subscription extends AchievementActionAbstract // NOTE: Other classes exis
|
||||
*/
|
||||
public function formatFilterValues( array $values ): array
|
||||
{
|
||||
$return = [];
|
||||
$return = parent::formatFilterValues( $values );
|
||||
if ( isset( $values['achievement_filter_Subscriptions'] ) )
|
||||
{
|
||||
$return['subscriptions'] = array_keys( $values['achievement_filter_Subscriptions'] );
|
||||
@@ -138,6 +139,36 @@ class Subscription extends AchievementActionAbstract // NOTE: Other classes exis
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the member has already completed this rule.
|
||||
* Used for retroactive rule completion.
|
||||
* So far, this is only used in Quests, but may be used elsewhere at a later point.
|
||||
*
|
||||
* @param Member $member
|
||||
* @param array $filters
|
||||
* @return bool
|
||||
*/
|
||||
public function isRuleCompleted( Member $member, array $filters ) : bool
|
||||
{
|
||||
$where = [
|
||||
[ 'ps_app=?', 'nexus' ],
|
||||
[ 'ps_type=?', 'subscription' ],
|
||||
[ 'ps_member=?', $member->member_id ]
|
||||
];
|
||||
|
||||
iF( !empty( $filters['subscriptions'] ) )
|
||||
{
|
||||
$where[] = [ Db::i()->in( 'ps_item_id', $filters['subscriptions'] ) ];
|
||||
}
|
||||
|
||||
if( isset( $filters['subscriptions_active'] ) )
|
||||
{
|
||||
$where[] = [ 'ps_active=?', 1 ];
|
||||
}
|
||||
|
||||
return (bool) Db::i()->select( 'count(*)', 'nexus_purchases', $where )->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get identifier to prevent the member being awarded points for the same action twice
|
||||
@@ -188,7 +219,12 @@ class Subscription extends AchievementActionAbstract // NOTE: Other classes exis
|
||||
$conditions[] = $nodeCondition;
|
||||
}
|
||||
|
||||
return Theme::i()->getTemplate( 'achievements' )->ruleDescription(
|
||||
if( $questCondition = $this->_questFilterDescription( $rule ) )
|
||||
{
|
||||
$conditions[] = $questCondition;
|
||||
}
|
||||
|
||||
return Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescription(
|
||||
Member::loggedIn()->language()->addToStack( 'AchievementAction__Subscription_title' ),
|
||||
$conditions
|
||||
);
|
||||
@@ -218,7 +254,7 @@ class Subscription extends AchievementActionAbstract // NOTE: Other classes exis
|
||||
{
|
||||
return Member::loggedIn()->language()->addToStack( 'achievements_filter_Subscription_type', FALSE, [
|
||||
'htmlsprintf' => [
|
||||
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'achievements_filter_Subscription_type',
|
||||
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'achievements_filter_Subscription_type',
|
||||
count( $nodeNames ) === 1 ? $nodeNames[0] : Member::loggedIn()->language()->addToStack( 'achievements_filter_Subscription_pl', FALSE, [ 'sprintf' => [
|
||||
count( $nodeNames ),
|
||||
Member::loggedIn()->language()->addToStack( 'nexus_sub_package_id', FALSE, [ 'strtolower' => TRUE ] )
|
||||
|
||||
@@ -32,6 +32,7 @@ use LogicException;
|
||||
use OutOfRangeException;
|
||||
use function count;
|
||||
use function defined;
|
||||
use function is_array;
|
||||
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
@@ -222,7 +223,7 @@ class Admin extends EditorLocationsAbstract
|
||||
}
|
||||
catch( InvalidArgumentException $e )
|
||||
{
|
||||
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
|
||||
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
|
||||
{
|
||||
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $word['word_custom'] );
|
||||
}
|
||||
@@ -279,7 +280,7 @@ class Admin extends EditorLocationsAbstract
|
||||
/* Update */
|
||||
try
|
||||
{
|
||||
if( is_string( $package['p_page'] ) AND $callback[1] == 'parseStatic' )
|
||||
if( is_string( $package['p_page'] ) AND is_array( $callback ) and $callback[1] == 'parseStatic' )
|
||||
{
|
||||
$rebuilt = $callback( $package['p_page'], NULL, FALSE, 'nexus_Admin', $package['p_id'], NULL, 'pkg-pg' );
|
||||
}
|
||||
@@ -290,7 +291,7 @@ class Admin extends EditorLocationsAbstract
|
||||
}
|
||||
catch( InvalidArgumentException $e )
|
||||
{
|
||||
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
|
||||
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
|
||||
{
|
||||
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $package['p_page'] );
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ class Customer extends EditorLocationsAbstract
|
||||
}
|
||||
catch( InvalidArgumentException $e )
|
||||
{
|
||||
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
|
||||
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
|
||||
{
|
||||
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $member[ $fieldId ] );
|
||||
}
|
||||
|
||||
@@ -132,7 +132,14 @@ class Purchases extends MemberFilterAbstract
|
||||
}
|
||||
elseif( isset( $post['nexus_bm_filters_pkg_expired'][2] ) AND $post['nexus_bm_filters_pkg_expired'][2] == 'range' )
|
||||
{
|
||||
$return['nexus_bm_filters_pkg_expired'] = array( 'range' => json_decode( json_encode( $post['nexus_bm_filters_pkg_expired'][0] ), TRUE ) );
|
||||
if( empty( $post['nexus_bm_filters_pkg_expired'][0] ) or ( empty( $post['nexus_bm_filters_pkg_expired'][0]['start'] ) and empty( $post['nexus_bm_filters_pkg_expired'][0]['end'] ) ) )
|
||||
{
|
||||
$return['nexus_bm_filters_pkg_expired'] = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
$return['nexus_bm_filters_pkg_expired'] = array( 'range' => json_decode( json_encode( $post['nexus_bm_filters_pkg_expired'][0] ), true ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -182,15 +189,23 @@ class Purchases extends MemberFilterAbstract
|
||||
$types[] = 'purchase.ps_cancelled=1';
|
||||
}
|
||||
|
||||
if ( !empty( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ] ) AND !empty( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'end' ] ) )
|
||||
if ( !empty( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ] ) AND ( !empty( $data['nexus_bm_filters_pkg_expired']['range']['start'] ) or !empty( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'end' ] ) ) )
|
||||
{
|
||||
$start = ( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'start' ] ) ? new DateTime( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'start' ] ) : NULL;
|
||||
$end = new DateTime( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'end' ] );
|
||||
$end = ( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'end' ] ) ? new DateTime( $data[ 'nexus_bm_filters_pkg_expired' ][ 'range' ][ 'end' ] ) : NULL;
|
||||
|
||||
if ( $start )
|
||||
if ( $start and $end )
|
||||
{
|
||||
$types[] = "( purchase.ps_active=0 AND purchase.ps_cancelled=0 AND purchase.ps_expire BETWEEN {$start->getTimestamp()} AND {$end->getTimestamp()})";
|
||||
}
|
||||
elseif( $start )
|
||||
{
|
||||
$types[] = "( purchase.ps_active=0 AND purchase.ps_cancelled=0 AND purchase.ps_expire >= {$start->getTimestamp()} )";
|
||||
}
|
||||
else
|
||||
{
|
||||
$types[] = "( purchase.ps_active=0 AND purchase.ps_cancelled=0 AND purchase.ps_expire < {$end->getTimestamp()} )";
|
||||
}
|
||||
}
|
||||
elseif ( !empty( $data[ 'nexus_bm_filters_pkg_expired' ][ 'days' ] ) )
|
||||
{
|
||||
|
||||
@@ -110,17 +110,31 @@ class Subscriptions extends MemberFilterAbstract
|
||||
$return = array(
|
||||
'nexus_bm_filters_subscription_pkgs' => implode( ',', $ids ),
|
||||
'nexus_bm_filters_subscription_active' => ( in_array( "active", $post['nexus_bm_filters_subscription_type'] ) ),
|
||||
'nexus_bm_filters_subscription_canceled' => ( in_array( "expired", $post['nexus_bm_filters_subscription_type'] ) ),
|
||||
'nexus_bm_filters_subscription_expired' => ( in_array( "expired", $post['nexus_bm_filters_subscription_type'] ) ),
|
||||
);
|
||||
|
||||
if( isset( $post['nexus_bm_filters_type_expired_date'][2] ) AND $post['nexus_bm_filters_type_expired_date'][2] == 'days' )
|
||||
{
|
||||
$return['nexus_bm_filters_type_expired_date'] = $post['nexus_bm_filters_type_expired_date'][1] ? array( 'days' => intval( $post['nexus_bm_filters_type_expired_date'][1] ) ) : FALSE;
|
||||
}
|
||||
elseif( isset( $post['nexus_bm_filters_type_expired_date'][2] ) AND $post['nexus_bm_filters_type_expired_date'][2] == 'days_lt' )
|
||||
{
|
||||
$return['nexus_bm_filters_type_expired_date'] = $post['nexus_bm_filters_type_expired_date'][3] ? array( 'days_lt' => intval( $post['nexus_bm_filters_type_expired_date'][3] ) ) : FALSE;
|
||||
}
|
||||
elseif( isset( $post['nexus_bm_filters_type_expired_date'][2] ) AND $post['nexus_bm_filters_type_expired_date'][2] == 'range' )
|
||||
{
|
||||
if( empty( $post['nexus_bm_filters_type_expired_date'][0] ) or ( empty( $post['nexus_bm_filters_type_expired_date'][0]['start'] ) and empty( $post['nexus_bm_filters_type_expired_date'][0]['end'] ) ) )
|
||||
{
|
||||
$return['nexus_bm_filters_type_expired_date'] = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
$return['nexus_bm_filters_type_expired_date'] = array( 'range' => json_decode( json_encode( $post['nexus_bm_filters_type_expired_date'][0] ), true ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Normalize objects to their array form. Bulk mailer stores options as a json array where as member export does not, so $data['range']['start'] is a DateTime object */
|
||||
$return['nexus_bm_filters_type_expired_date'] = ( empty($post['nexus_bm_filters_type_expired_date'][0]) ) ? FALSE : array( 'range' => json_decode( json_encode( $post['nexus_bm_filters_type_expired_date'][0] ), TRUE ) );
|
||||
$return['nexus_bm_filters_type_expired_date'] = FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -164,25 +178,41 @@ class Subscriptions extends MemberFilterAbstract
|
||||
$types[] = 'nexus_purchases.ps_active=1';
|
||||
}
|
||||
|
||||
if ( isset( $data[ 'nexus_bm_filters_subscription_canceled' ] ) and $data[ 'nexus_bm_filters_subscription_canceled' ] )
|
||||
if( isset( $data['nexus_bm_filters_subscription_expired'] ) and $data['nexus_bm_filters_subscription_expired'] )
|
||||
{
|
||||
$types[] = 'nexus_purchases.ps_cancelled=1';
|
||||
}
|
||||
|
||||
if ( !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ] ) AND !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'end' ] ) )
|
||||
{
|
||||
$start = ( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'start' ] ) ? new DateTime( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'start' ] ) : NULL;
|
||||
$end = new DateTime( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'end' ] );
|
||||
|
||||
if ( $start )
|
||||
if ( !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ] ) AND ( !empty( $data['nexus_bm_filters_type_expired_date']['range']['start'] ) or !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'end' ] ) ) )
|
||||
{
|
||||
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire BETWEEN {$start->getTimestamp()} AND {$end->getTimestamp()})";
|
||||
$start = ( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'start' ] ) ? new DateTime( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'start' ] ) : NULL;
|
||||
$end = ( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'end' ] ) ? new DateTime( $data[ 'nexus_bm_filters_type_expired_date' ][ 'range' ][ 'end' ] ) : NULL;
|
||||
|
||||
if ( $start and $end )
|
||||
{
|
||||
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire BETWEEN {$start->getTimestamp()} AND {$end->getTimestamp()})";
|
||||
}
|
||||
elseif( $start )
|
||||
{
|
||||
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire >= {$start->getTimestamp()} )";
|
||||
}
|
||||
else
|
||||
{
|
||||
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire < {$end->getTimestamp()} )";
|
||||
}
|
||||
}
|
||||
elseif ( !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'days' ] ) )
|
||||
{
|
||||
$date = DateTime::create()->sub( new DateInterval( 'P' . $data[ 'nexus_bm_filters_type_expired_date' ][ 'days' ] . 'D' ) );
|
||||
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire < {$date->getTimestamp()})";
|
||||
}
|
||||
elseif( !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'days_lt' ] ) AND (int) $data[ 'nexus_bm_filters_type_expired_date' ][ 'days_lt' ] )
|
||||
{
|
||||
$date = DateTime::create()->sub( new DateInterval( 'P' . (int) $data[ 'nexus_bm_filters_type_expired_date' ][ 'days_lt' ] . 'D' ) );
|
||||
|
||||
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire > {$date->getTimestamp()})";
|
||||
}
|
||||
else
|
||||
{
|
||||
$types[] = "(nexus_purchases.ps_expire < " . time() . ")";
|
||||
}
|
||||
}
|
||||
elseif ( !empty( $data[ 'nexus_bm_filters_type_expired_date' ][ 'days' ] ) )
|
||||
{
|
||||
$date = DateTime::create()->sub( new DateInterval( 'P' . $data[ 'nexus_bm_filters_type_expired_date' ][ 'days' ] . 'D' ) );
|
||||
$types[] = "( nexus_purchases.ps_active=0 AND nexus_purchases.ps_cancelled=0 AND nexus_purchases.ps_expire < {$date->getTimestamp()})";
|
||||
}
|
||||
|
||||
if ( !empty( $types ) )
|
||||
|
||||
@@ -22,6 +22,7 @@ use IPS\Theme;
|
||||
use function count;
|
||||
use function defined;
|
||||
use function is_array;
|
||||
use function round;
|
||||
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
@@ -73,7 +74,42 @@ class Products extends OverviewStatisticsAbstract
|
||||
{
|
||||
/* Init Chart */
|
||||
$pieBarData = array();
|
||||
|
||||
$numbers = $this->getBlockNumbers( $dateRange, $subBlock );
|
||||
foreach ( $numbers as $key => $value )
|
||||
{
|
||||
if ( $key === 'statsreports_previous_total' or $key === 'statsreports_current_total' )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$pieBarData[] = [
|
||||
'name' => Member::loggedIn()->language()->addToStack( $key ),
|
||||
'value' => $value,
|
||||
'percentage' => $numbers['statsreports_current_total'] ? round( ( $value / $numbers['statsreports_current_total'] ) * 100, 2 ) : 0
|
||||
];
|
||||
}
|
||||
|
||||
$chart = NULL;
|
||||
if( count( $pieBarData ) )
|
||||
{
|
||||
$chart = Theme::i()->getTemplate( 'global', 'core', 'global' )->applePieChart( $pieBarData );
|
||||
}
|
||||
|
||||
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount( $numbers['statsreports_current_total'], $numbers['statsreports_previous_total'], $chart );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the numbers to add to the CSV export
|
||||
*
|
||||
* @param array|string|null $dateRange
|
||||
* @param string|null $subBlock
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getBlockNumbers( array|string $dateRange=null, string $subBlock=null ) : array
|
||||
{
|
||||
$numbers = array();
|
||||
|
||||
/* Add Rows */
|
||||
$where = array( array( 'ps_app=?', 'nexus' ), array( 'ps_type=?', 'package' ) );
|
||||
$previousCount = NULL;
|
||||
@@ -94,7 +130,6 @@ class Products extends OverviewStatisticsAbstract
|
||||
}
|
||||
|
||||
$total = 0;
|
||||
$chart = NULL;
|
||||
|
||||
foreach( Package::roots() as $package )
|
||||
{
|
||||
@@ -106,25 +141,13 @@ class Products extends OverviewStatisticsAbstract
|
||||
if( $value > 0 )
|
||||
{
|
||||
$total += $value;
|
||||
|
||||
$pieBarData[] = array(
|
||||
'name' => Member::loggedIn()->language()->addToStack('nexus_package_' . $package->id ),
|
||||
'value' => $value,
|
||||
'percentage' => 0
|
||||
);
|
||||
$numbers['nexus_package_' . $package->id] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
foreach( $pieBarData as &$package )
|
||||
{
|
||||
$package['percentage'] = round( ( $package['value'] / $total ) * 100, 2 );
|
||||
}
|
||||
$numbers['statsreports_current_total'] = $total;
|
||||
$numbers['statsreports_previous_total'] = $previousCount;
|
||||
|
||||
if( count( $pieBarData ) )
|
||||
{
|
||||
$chart = Theme::i()->getTemplate( 'global', 'core', 'global' )->applePieChart( $pieBarData );
|
||||
}
|
||||
|
||||
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount( $total, $previousCount, $chart );
|
||||
return $numbers;
|
||||
}
|
||||
}
|
||||
@@ -74,7 +74,42 @@ class Subscriptions extends OverviewStatisticsAbstract
|
||||
{
|
||||
/* Init Chart */
|
||||
$pieBarData = array();
|
||||
$numbers = $this->getBlockNumbers( $dateRange, $subBlock );
|
||||
foreach ( $numbers as $key => $value )
|
||||
{
|
||||
if ( $key === 'statsreports_current_total' or $key === 'statsreports_previous_total' )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
$pieBarData[] = [
|
||||
'name' => Member::loggedIn()->language()->addToStack( $key ),
|
||||
'value' => $value,
|
||||
'percentage' => $numbers['statsreports_current_total'] ? round( ( $value / $numbers['statsreports_current_total'] ) * 100, 2 ) : 0
|
||||
];
|
||||
}
|
||||
|
||||
$chart = NULL;
|
||||
if( count( $pieBarData ) )
|
||||
{
|
||||
$chart = Theme::i()->getTemplate( 'global', 'core', 'global' )->applePieChart( $pieBarData );
|
||||
}
|
||||
|
||||
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount( $numbers['statsreports_current_total'], $numbers['statsreports_previous_total'], $chart );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the numbers to add to the CSV export
|
||||
*
|
||||
* @param array|string|null $dateRange
|
||||
* @param string|null $subBlock
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getBlockNumbers( array|string $dateRange=null, string $subBlock=null ) : array
|
||||
{
|
||||
/* Init Chart */
|
||||
$numbers = array();
|
||||
|
||||
/* Add Rows */
|
||||
$where = array( array( 'ps_app=?', 'nexus' ), array( 'ps_type=?', 'subscription' ) );
|
||||
$previousCount = NULL;
|
||||
@@ -90,12 +125,15 @@ class Subscriptions extends OverviewStatisticsAbstract
|
||||
$interval = static::getInterval( $dateRange );
|
||||
$initialTimestamp = $currentDate->sub( $interval )->getTimestamp();
|
||||
$where = array( array( 'ps_start > ?', $initialTimestamp ) );
|
||||
|
||||
$previousCount = Db::i()->select( 'COUNT(*)', 'nexus_purchases', array( array( 'ps_app=?', 'nexus' ), array( 'ps_type=?', 'subscription' ), array( 'ps_start BETWEEN ? AND ?', $currentDate->sub( $interval )->getTimestamp(), $initialTimestamp ) ) )->first();
|
||||
$previousWhere = array(
|
||||
array( 'ps_app=?', 'nexus' ),
|
||||
array( 'ps_type=?', 'subscription' ),
|
||||
array( 'ps_start BETWEEN ? AND ?', $currentDate->sub( $interval )->getTimestamp(), $initialTimestamp )
|
||||
);
|
||||
$previousCount = Db::i()->select( 'COUNT(*)', 'nexus_purchases', $previousWhere )->first();
|
||||
}
|
||||
|
||||
$total = 0;
|
||||
$chart = NULL;
|
||||
|
||||
foreach( Package::roots() as $package )
|
||||
{
|
||||
@@ -108,24 +146,13 @@ class Subscriptions extends OverviewStatisticsAbstract
|
||||
{
|
||||
$total += $value;
|
||||
|
||||
$pieBarData[] = array(
|
||||
'name' => Member::loggedIn()->language()->addToStack('nexus_subs_' . $package->id ),
|
||||
'value' => $value,
|
||||
'percentage' => 0
|
||||
);
|
||||
$numbers['nexus_subs_' . $package->id] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
foreach( $pieBarData as &$package )
|
||||
{
|
||||
$package['percentage'] = round( ( $package['value'] / $total ) * 100, 2 );
|
||||
}
|
||||
$numbers['statsreports_current_total'] = $total;
|
||||
$numbers['statsreports_previous_total'] = $previousCount;
|
||||
|
||||
if( count( $pieBarData ) )
|
||||
{
|
||||
$chart = Theme::i()->getTemplate( 'global', 'core', 'global' )->applePieChart( $pieBarData );
|
||||
}
|
||||
|
||||
return Theme::i()->getTemplate( 'stats' )->overviewComparisonCount( $total, $previousCount, $chart );
|
||||
return $numbers;
|
||||
}
|
||||
}
|
||||
@@ -256,8 +256,8 @@ class Package extends ItemPurchase
|
||||
foreach ( $customFields as $customField )
|
||||
{
|
||||
$field = $customField->buildHelper();
|
||||
$field->label = Member::loggedIn()->language()->addToStack( $customField->name );
|
||||
$field->name = "{$customField->name}_{$id}_{$i}";
|
||||
$field->label = $customField->_title;
|
||||
$field->name .= '_' . $id . '_' . $i;
|
||||
$form->add( $field );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ use IPS\Member;
|
||||
use IPS\MFA\MFAHandler;
|
||||
use IPS\nexus\Customer;
|
||||
use IPS\nexus\Customer\BillingAgreement;
|
||||
use IPS\nexus\Gateway;
|
||||
use IPS\nexus\Gateway\PayPal\Exception;
|
||||
use IPS\Output;
|
||||
use IPS\Patterns\ActiveRecordIterator;
|
||||
@@ -89,6 +90,11 @@ class billingagreements extends Controller
|
||||
$where[] = $id;
|
||||
}
|
||||
}
|
||||
|
||||
$where = [
|
||||
$where,
|
||||
[ Db::i()->in( 'ba_method', array_keys( Gateway::billingAgreementGateways() ) ) ]
|
||||
];
|
||||
|
||||
foreach ( new ActiveRecordIterator( Db::i()->select( '*', 'nexus_billing_agreements', $where ), 'IPS\nexus\Customer\BillingAgreement' ) as $billingAgreement )
|
||||
{
|
||||
|
||||
@@ -21,6 +21,7 @@ use IPS\Member;
|
||||
use IPS\MFA\MFAHandler;
|
||||
use IPS\nexus\Customer;
|
||||
use IPS\nexus\Customer\CreditCard;
|
||||
use IPS\nexus\Gateway;
|
||||
use IPS\Output;
|
||||
use IPS\Patterns\ActiveRecordIterator;
|
||||
use IPS\Request;
|
||||
@@ -74,7 +75,10 @@ class cards extends Controller
|
||||
protected function manage() : void
|
||||
{
|
||||
$cards = array();
|
||||
foreach ( new ActiveRecordIterator( Db::i()->select( '*', 'nexus_customer_cards', array( 'card_member=?', Customer::loggedIn()->member_id ) ), 'IPS\nexus\Customer\CreditCard' ) as $card )
|
||||
foreach ( new ActiveRecordIterator( Db::i()->select( '*', 'nexus_customer_cards', array(
|
||||
array( 'card_member=?', Customer::loggedIn()->member_id ),
|
||||
array( Db::i()->in( 'card_method', array_keys( Gateway::cardStorageGateways() ) ) )
|
||||
) ), 'IPS\nexus\Customer\CreditCard' ) as $card )
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
@@ -236,6 +236,8 @@ class store extends Controller
|
||||
{
|
||||
$packagesWithCustomFields = array_merge( $packagesWithCustomFields, array_filter( explode( ',', $ids ) ) );
|
||||
}
|
||||
|
||||
Output::i()->bodyAttributes['contentClass'] = Group::class;
|
||||
|
||||
/* Output */
|
||||
if ( Request::i()->isAjax() )
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000075,
|
||||
"name": "5.0.7 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": true,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"html": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"front\/clients\/addresses",
|
||||
"front\/clients\/alternatives",
|
||||
"front\/clients\/donations",
|
||||
"front\/clients\/info",
|
||||
"front\/clients\/invoice",
|
||||
"front\/clients\/invoices",
|
||||
"front\/clients\/purchase",
|
||||
"front\/clients\/purchases",
|
||||
"global\/forms\/addPaymentMethodForm",
|
||||
"front\/store\/category",
|
||||
"front\/store\/categoryContents",
|
||||
"front\/store\/index",
|
||||
"front\/store\/package",
|
||||
"front\/store\/register",
|
||||
"front\/subscription\/table"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"css": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"resources": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000076,
|
||||
"name": "5.0.7 Beta 2",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000077,
|
||||
"name": "5.0.7 Beta 2",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000078,
|
||||
"name": "5.0.7 Beta 3",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": true,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"html": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"front\/store\/category",
|
||||
"front\/store\/index"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"css": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"front\/nexus.css"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"resources": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000079,
|
||||
"name": "5.0.7 Beta 4",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000080,
|
||||
"name": "5.0.7",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000081,
|
||||
"name": "5.0.7",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000082,
|
||||
"name": "5.0.7",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000800,
|
||||
"name": "5.0.8 Alpha 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": true,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"html": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"front\/checkout\/confirmAndPay",
|
||||
"front\/checkout\/orderReview",
|
||||
"front\/clients\/invoice",
|
||||
"front\/global\/userNav",
|
||||
"front\/store\/cartContents",
|
||||
"front\/store\/cartHeader",
|
||||
"front\/store\/category",
|
||||
"front\/store\/index",
|
||||
"front\/store\/packageBlock",
|
||||
"front\/store\/packageBlockWidget",
|
||||
"front\/store\/packageRow",
|
||||
"front\/widgets\/recentCommerceReviews",
|
||||
"front\/widgets\/subscriptions"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"css": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"resources": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000801,
|
||||
"name": "5.0.8 Alpha 2",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000802,
|
||||
"name": "5.0.8 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": true,
|
||||
"theme": false,
|
||||
"themeeditor": true,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"normal": {
|
||||
"added": [
|
||||
"sf_type_UserPass",
|
||||
"sf_type_Ftp",
|
||||
"sf_validate_ftp",
|
||||
"sf_validate_ftp_desc",
|
||||
"sf_validate_ftp_noftp",
|
||||
"sf_validate_ftp_nosftp"
|
||||
],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"js": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"categories": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"settings": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"layout_store_view"
|
||||
],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000803,
|
||||
"name": "5.0.8 Beta 2",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": true,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"html": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"admin\/notifications\/transactions"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"css": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"resources": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000804,
|
||||
"name": "5.0.8 Beta 3",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000805,
|
||||
"name": "5.0.8",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000900,
|
||||
"name": "5.0.9 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": true,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"files": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"nexus\/front\/controllers\/store\/ips.store.packagePage.js"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"orders": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000901,
|
||||
"name": "5.0.9 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000902,
|
||||
"name": "5.0.9 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000903,
|
||||
"name": "5.0.9 Beta 2",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000904,
|
||||
"name": "5.0.9",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000905,
|
||||
"name": "5.0.9",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000906,
|
||||
"name": "5.0.10 Beta 1",
|
||||
"steps": {
|
||||
"queries": true,
|
||||
"lang": false,
|
||||
"theme": true,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"1": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"nexus_packages_ads",
|
||||
{
|
||||
"name": "p_email",
|
||||
"type": "TINYINT",
|
||||
"length": null,
|
||||
"decimals": null,
|
||||
"values": null,
|
||||
"allow_null": true,
|
||||
"default": "0",
|
||||
"comment": "",
|
||||
"unsigned": false,
|
||||
"auto_increment": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"html": {
|
||||
"added": [
|
||||
"front\/purchases\/advertisementType"
|
||||
],
|
||||
"edited": [
|
||||
"front\/checkout\/confirmAndPay",
|
||||
"front\/checkout\/orderReview",
|
||||
"front\/clients\/invoice",
|
||||
"front\/clients\/purchase",
|
||||
"front\/global\/userNav",
|
||||
"front\/purchases\/advertisement",
|
||||
"front\/store\/cartContents",
|
||||
"front\/store\/cartHeader",
|
||||
"front\/store\/category",
|
||||
"front\/store\/index",
|
||||
"front\/store\/packageRow",
|
||||
"front\/widgets\/subscriptions"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"css": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"resources": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000907,
|
||||
"name": "5.0.10 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000908,
|
||||
"name": "5.0.10 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000909,
|
||||
"name": "5.0.10 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000910,
|
||||
"name": "5.0.10 Beta 2",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000911,
|
||||
"name": "5.0.10 Beta 3",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000912,
|
||||
"name": "5.0.10 Beta 4",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000913,
|
||||
"name": "5.0.10 Beta 4",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000914,
|
||||
"name": "5.0.10",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000915,
|
||||
"name": "5.0.10",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000916,
|
||||
"name": "5.0.10",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000917,
|
||||
"name": "5.0.10",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000918,
|
||||
"name": "5.0.10",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000919,
|
||||
"name": "5.0.10",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5000920,
|
||||
"name": "5.0.10",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001100,
|
||||
"name": "5.0.11 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": true,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"html": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"front\/purchases\/package"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"css": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"resources": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001101,
|
||||
"name": "5.0.11 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": true,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"html": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"front\/clients\/invoiceList"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"css": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"resources": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001102,
|
||||
"name": "5.0.11 Beta 2",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001103,
|
||||
"name": "5.0.11",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001104,
|
||||
"name": "5.0.11",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001105,
|
||||
"name": "5.0.11",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001200,
|
||||
"name": "5.0.12 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": true,
|
||||
"themeeditor": false,
|
||||
"javascript": true,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"files": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"nexus\/front\/controllers\/store\/ips.store.cartReview.js"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"orders": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"html": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"front\/global\/userNav",
|
||||
"admin\/invoices\/generate",
|
||||
"front\/store\/cartContents",
|
||||
"front\/store\/cartHeader",
|
||||
"front\/store\/categoryContents",
|
||||
"front\/subscription\/table",
|
||||
"admin\/transactions\/status"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"css": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"resources": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001201,
|
||||
"name": "5.0.12 Beta 2",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001202,
|
||||
"name": "5.0.12 Beta 3",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001203,
|
||||
"name": "5.0.12",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001204,
|
||||
"name": "5.0.12",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001300,
|
||||
"name": "5.0.13 Beta 1",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": true,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"html": {
|
||||
"added": [],
|
||||
"edited": [
|
||||
"front\/global\/userNav",
|
||||
"admin\/invoices\/generate",
|
||||
"front\/store\/cartContents",
|
||||
"front\/store\/cartHeader",
|
||||
"front\/store\/categoryContents",
|
||||
"front\/subscription\/table"
|
||||
],
|
||||
"removed": []
|
||||
},
|
||||
"css": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
},
|
||||
"resources": {
|
||||
"added": [],
|
||||
"edited": [],
|
||||
"removed": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001301,
|
||||
"name": "5.0.13 Beta 2",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": 5001302,
|
||||
"name": "5.0.13",
|
||||
"steps": {
|
||||
"queries": false,
|
||||
"lang": false,
|
||||
"theme": false,
|
||||
"themeeditor": false,
|
||||
"javascript": false,
|
||||
"emailTemplates": false,
|
||||
"acpSearchKeywords": false,
|
||||
"settings": false,
|
||||
"tasks": false,
|
||||
"modules": false,
|
||||
"widgets": false,
|
||||
"customOptions": false,
|
||||
"customRoutines": false
|
||||
},
|
||||
"forceMainUpgrader": false,
|
||||
"forceManualDownloadNoCiC": false,
|
||||
"forceManualDownloadCiC": false
|
||||
}
|
||||
@@ -271,7 +271,7 @@ abstract class Gateway extends Model
|
||||
$return = array();
|
||||
foreach ( static::roots() as $gateway )
|
||||
{
|
||||
if ( $gateway->canStoreCards( $adminCreatableOnly ) )
|
||||
if ( $gateway->canStoreCards( $adminCreatableOnly ) and $gateway->active )
|
||||
{
|
||||
$return[ $gateway->id ] = $gateway;
|
||||
}
|
||||
@@ -308,7 +308,7 @@ abstract class Gateway extends Model
|
||||
$return = array();
|
||||
foreach ( static::roots() as $gateway )
|
||||
{
|
||||
if ( $gateway->billingAgreements() )
|
||||
if ( $gateway->billingAgreements() and $gateway->active )
|
||||
{
|
||||
$return[ $gateway->id ] = $gateway;
|
||||
}
|
||||
|
||||
@@ -362,7 +362,7 @@ class Stripe extends Gateway
|
||||
'data-zip' => $invoice->billaddress?->postalCode,
|
||||
'data-country' => $invoice->billaddress?->country,
|
||||
'data-email' => $member ? $member->email : $invoice->member->email,
|
||||
'data-phone' => isset( $member->cm_phone ) ? $member->cm_phone : NULL,
|
||||
'data-phone' => isset( $member->cm_phone ) ? $member->cm_phone : ( $invoice->member->cm_phone ?? null ),
|
||||
'data-amount' => static::_amountAsCents( $amount ),
|
||||
'data-currency' => $amount->currency,
|
||||
'data-setupIntent' => $setupIntent ? $setupIntent['id'] : NULL,
|
||||
@@ -469,47 +469,47 @@ class Stripe extends Gateway
|
||||
}
|
||||
}
|
||||
|
||||
if ( !isset( $data['customer'] ) )
|
||||
{
|
||||
if ( $member->member_id )
|
||||
{
|
||||
$response = $this->api( 'customers', array(
|
||||
'name' => $member->cm_name,
|
||||
'email' => $member->email,
|
||||
'metadata' => array(
|
||||
"Customer ID" => $member->member_id
|
||||
)
|
||||
) );
|
||||
$profiles[ $this->id ] = $response['id'];
|
||||
|
||||
$member->cm_profiles = $profiles;
|
||||
$member->save();
|
||||
}
|
||||
else
|
||||
{
|
||||
$response = $this->api( 'customers', array(
|
||||
'name' => $invoice->member->cm_name,
|
||||
'email' => $invoice->member->email,
|
||||
) );
|
||||
$profiles[ $this->id ] = $response['id'];
|
||||
|
||||
$guestData = $invoice->guest_data;
|
||||
$guestData['member']['cm_profiles'] = $profiles;
|
||||
$guestData['cards'][] = array(
|
||||
'card_method' => $this->id,
|
||||
'card_data' => $paymentMethod
|
||||
);
|
||||
$invoice->guest_data = $guestData;
|
||||
$invoice->save();
|
||||
}
|
||||
|
||||
$data['customer'] = $profiles[ $this->id ];
|
||||
}
|
||||
|
||||
if ( $savePaymentMethod )
|
||||
{
|
||||
$data['save_payment_method'] = 'true';
|
||||
$data['setup_future_usage'] = 'off_session';
|
||||
|
||||
if ( !isset( $data['customer'] ) )
|
||||
{
|
||||
if ( $member->member_id )
|
||||
{
|
||||
$response = $this->api( 'customers', array(
|
||||
'name' => $member->cm_name,
|
||||
'email' => $member->email,
|
||||
'metadata' => array(
|
||||
"Customer ID" => $member->member_id
|
||||
)
|
||||
) );
|
||||
$profiles[ $this->id ] = $response['id'];
|
||||
|
||||
$member->cm_profiles = $profiles;
|
||||
$member->save();
|
||||
}
|
||||
else
|
||||
{
|
||||
$response = $this->api( 'customers', array(
|
||||
'name' => $invoice->member->cm_name,
|
||||
'email' => $invoice->member->email,
|
||||
) );
|
||||
$profiles[ $this->id ] = $response['id'];
|
||||
|
||||
$guestData = $invoice->guest_data;
|
||||
$guestData['member']['cm_profiles'] = $profiles;
|
||||
$guestData['cards'][] = array(
|
||||
'card_method' => $this->id,
|
||||
'card_data' => $paymentMethod
|
||||
);
|
||||
$invoice->guest_data = $guestData;
|
||||
$invoice->save();
|
||||
}
|
||||
|
||||
$data['customer'] = $profiles[ $this->id ];
|
||||
}
|
||||
}
|
||||
|
||||
$response = $this->api( 'payment_intents', $data );
|
||||
|
||||
@@ -24,6 +24,7 @@ use IPS\nexus\Money;
|
||||
use IPS\nexus\Transaction;
|
||||
use LogicException;
|
||||
use function defined;
|
||||
use const IPS\NEXUS_TEST_GATEWAYS;
|
||||
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
|
||||
@@ -523,6 +523,7 @@ class Invoice extends ActiveRecord
|
||||
public function set_guest_data( ?array $data ) : void
|
||||
{
|
||||
$this->_data['guest_data'] = $data ? json_encode( $data ) : NULL;
|
||||
$this->_member = null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -735,6 +736,9 @@ class Invoice extends ActiveRecord
|
||||
|
||||
/* Increase the total */
|
||||
$this->recalculateTotal();
|
||||
|
||||
/* Fire an event */
|
||||
Event::fire( 'onAddToInvoice', $item, [ $this ] );
|
||||
|
||||
/* Return the ID */
|
||||
return $id;
|
||||
|
||||
@@ -13,16 +13,14 @@ namespace IPS\nexus\Package;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
|
||||
use IPS\Application;
|
||||
use IPS\core\AdminNotification;
|
||||
use IPS\core\Advertisement;
|
||||
use IPS\Db;
|
||||
use IPS\Extensions\AdvertisementLocationsAbstract;
|
||||
use IPS\Helpers\Form;
|
||||
use IPS\Helpers\Form\CheckboxSet;
|
||||
use IPS\Helpers\Form\Custom;
|
||||
use IPS\Helpers\Form\Node;
|
||||
use IPS\Helpers\Form\Number;
|
||||
use IPS\Helpers\Form\Radio;
|
||||
use IPS\Helpers\Form\Text;
|
||||
use IPS\Helpers\Form\Upload;
|
||||
use IPS\Helpers\Form\WidthHeight;
|
||||
use IPS\Helpers\Form\YesNo;
|
||||
@@ -60,7 +58,7 @@ class Ad extends Package
|
||||
/**
|
||||
* @brief Which columns belong to the local table
|
||||
*/
|
||||
protected static array $packageDatabaseColumns = array( 'p_locations', 'p_exempt', 'p_expire', 'p_expire_unit', 'p_max_height', 'p_max_width', 'p_settings' );
|
||||
protected static array $packageDatabaseColumns = array( 'p_locations', 'p_exempt', 'p_expire', 'p_expire_unit', 'p_max_height', 'p_max_width', 'p_settings', 'p_email' );
|
||||
|
||||
/**
|
||||
* @brief Icon
|
||||
@@ -85,85 +83,46 @@ class Ad extends Package
|
||||
public static function acpFormFields( Package $package, bool $custom=FALSE, bool $customEdit=FALSE ): array
|
||||
{
|
||||
$return = array();
|
||||
|
||||
|
||||
$currentValues = ( $package->id AND $package->settings ) ? json_decode( $package->settings, true ) : array();
|
||||
$settingFields = Advertisement::locationFields( $currentValues, ( ( $package->id and $package->locations ) ? explode( ",", $package->locations ) : [] ) );
|
||||
$emailFields = Advertisement::emailFields( $currentValues );
|
||||
|
||||
$settingToggles = [];
|
||||
foreach( $settingFields as $field )
|
||||
{
|
||||
$settingToggles[] = $field->htmlId;
|
||||
}
|
||||
$emailToggles = [];
|
||||
foreach( $emailFields as $field )
|
||||
{
|
||||
$emailToggles[] = $field->htmlId;
|
||||
}
|
||||
|
||||
$return['package_settings']['ad_type'] = new Radio( 'ad_type', ( $package->id and $package->email ) ? 'emails' : 'site', true, [
|
||||
'options' => [
|
||||
'site' => 'advertisements_site',
|
||||
'emails' => 'advertisements_emails'
|
||||
],
|
||||
'toggles' => [
|
||||
'site' => $settingToggles,
|
||||
'emails' => $emailToggles
|
||||
],
|
||||
'disabled' => (bool) ( $package->id )
|
||||
], id: 'ad_type' );
|
||||
|
||||
if ( !$customEdit ) // If we're editing a custom package, they can get to this by editing the advertisement
|
||||
{
|
||||
$currentValues = ( $package->id AND $package->settings ) ? json_decode( $package->settings, true ) : array();
|
||||
|
||||
/* Add the location fields, remember to call extensions for additional locations.
|
||||
Array format: location => array of toggle fields to show */
|
||||
$defaultLocations = array(
|
||||
'ad_global_header' => array( 'ad_apps' ),
|
||||
'ad_global_footer' => array( 'ad_apps' ),
|
||||
'ad_sidebar' => array( 'ad_apps' ),
|
||||
);
|
||||
|
||||
$settingFields = [];
|
||||
|
||||
/* Add a field to restrict by app */
|
||||
$settingFields[] = new Node( 'ad_apps', $currentValues['ad_apps'] ?? 0, false, array(
|
||||
'class' => Application::class,
|
||||
'multiple' => true,
|
||||
'zeroVal' => 'all',
|
||||
'subnodes' => false
|
||||
), null, null, null, 'ad_apps' );
|
||||
|
||||
/* Now grab ad location extensions */
|
||||
foreach ( Application::allExtensions( 'core', 'AdvertisementLocations', FALSE, 'core' ) as $key => $extension )
|
||||
{
|
||||
/* @var AdvertisementLocationsAbstract $extension */
|
||||
$result = $extension->getSettings( $currentValues );
|
||||
|
||||
$defaultLocations = array_merge( $defaultLocations, $result['locations'] );
|
||||
|
||||
/* If this is a list view, add setting fields for interaval and repeat */
|
||||
if( $extension::$listView )
|
||||
{
|
||||
$settingFields[] = new Number( 'ad_view_number', ( isset( $currentValues['ad_view_number'] ) AND $currentValues['ad_view_number'] ) ? $currentValues['ad_view_number'] : 1, FALSE, array( 'min' => 1 ), NULL, NULL, Member::loggedIn()->language()->addToStack('ad_view_number_suffix'), 'ad_view_number' );
|
||||
|
||||
$settingFields[] = new Number( 'ad_view_repeat', $currentValues['ad_view_repeat'] ?? 1, FALSE, array( 'unlimited' => -1 ), NULL, NULL, Member::loggedIn()->language()->addToStack('ad_view_repeat_suffix'), 'ad_view_repeat' );
|
||||
|
||||
foreach( $result['locations'] as $location => $toggles )
|
||||
{
|
||||
$defaultLocations[$location][] = 'ad_view_number';
|
||||
$defaultLocations[$location][] = 'ad_view_repeat';
|
||||
}
|
||||
}
|
||||
|
||||
if( isset( $result['settings'] ) )
|
||||
{
|
||||
$settingFields = $settingFields + $result['settings'];
|
||||
}
|
||||
}
|
||||
|
||||
/* Add the locations to the form, and make sure the toggles get set properly */
|
||||
$locations = array();
|
||||
if ( $package->id )
|
||||
{
|
||||
$locations = $package->locations ? explode( ',', $package->locations ) : [];
|
||||
$locations = array_intersect( $locations, array_keys( $defaultLocations ) );
|
||||
}
|
||||
|
||||
/* Make locations optional so that we can have ads for widgets only */
|
||||
$return['package_settings']['p_locations'] = new CheckboxSet( 'p_locations',
|
||||
$locations,
|
||||
false,
|
||||
array(
|
||||
'options' => array_combine( array_keys( $defaultLocations ), array_keys( $defaultLocations ) ),
|
||||
'toggles' => $defaultLocations,
|
||||
'noDefault' => true
|
||||
),
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
'p_locations'
|
||||
);
|
||||
|
||||
foreach( $settingFields as $settingField )
|
||||
{
|
||||
$return['package_settings'][ $settingField->name ] = $settingField;
|
||||
}
|
||||
|
||||
foreach( $emailFields as $emailField )
|
||||
{
|
||||
$return['package_settings'][ $emailField->name ] = $emailField;
|
||||
}
|
||||
|
||||
$return['package_settings']['p_exempt'] = new CheckboxSet( 'p_exempt', ( $package->id and $package->exempt ) ? ( $package->exempt == '*' ? '*' : explode( ',', $package->exempt ) ) : '*', FALSE, array( 'options' => Group::groups(), 'parse' => 'normal', 'multiple' => TRUE, 'unlimited' => '*', 'unlimitedLang' => 'everyone', 'impliedUnlimited' => TRUE ) );
|
||||
|
||||
$return['package_settings']['p_expire'] = new Custom( 'p_expire', array( 'value' => ( $package->id and $package->expire ) ? $package->expire : -1, 'type' => ( $package->id ) ? $package->expire_unit : 'i' ), FALSE, array(
|
||||
@@ -184,7 +143,7 @@ class Ad extends Package
|
||||
|
||||
if ( !$custom )
|
||||
{
|
||||
$return['package_settings']['p_max_dims'] = new WidthHeight( 'p_max_dims', ( $package->id and $package->width ) ? array( $package->max_width, $package->max_height ) : null, FALSE, array( 'unlimited' => array( 0, 0 ), 'resizableDiv' => FALSE ) );
|
||||
$return['package_settings']['p_max_dims'] = new WidthHeight( 'p_max_dims', ( $package->id and $package->max_width ) ? array( $package->max_width, $package->max_height ) : null, FALSE, array( 'unlimited' => array( 0, 0 ), 'resizableDiv' => FALSE ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,51 +177,31 @@ class Ad extends Package
|
||||
unset( $values['p_max_dims'] );
|
||||
}
|
||||
|
||||
if ( isset( $values['p_locations'] ) )
|
||||
if ( isset( $values['ad_location'] ) )
|
||||
{
|
||||
$values['p_locations'] = is_array( $values['p_locations'] ) ? implode( ',', $values['p_locations'] ) : '';
|
||||
$values['p_locations'] = is_array( $values['ad_location'] ) ? implode( ',', $values['ad_location'] ) : '';
|
||||
}
|
||||
|
||||
$additionalSettings = array(
|
||||
'ad_apps' => ( isset( $values['ad_apps'] ) AND $values['ad_apps'] != 0 ) ? array_keys( $values['ad_apps'] ) : 0
|
||||
);
|
||||
|
||||
foreach ( Application::allExtensions( 'core', 'AdvertisementLocations', FALSE, 'core' ) as $key => $extension )
|
||||
$values['p_email'] = ( $values['ad_type'] == 'emails' );
|
||||
if( $values['p_email'] )
|
||||
{
|
||||
/* @var AdvertisementLocationsAbstract $extension */
|
||||
if( $extension::$listView )
|
||||
$additionalSettings = Advertisement::processEmailFields( $values );
|
||||
}
|
||||
else
|
||||
{
|
||||
$additionalSettings = Advertisement::processLocationFields( $values );
|
||||
}
|
||||
|
||||
/* Unset any elements that were added */
|
||||
foreach( $values as $k => $v )
|
||||
{
|
||||
if( str_starts_with( $k, 'ad_' ) or str_starts_with( $k, '_ad' ) )
|
||||
{
|
||||
$additionalSettings['ad_view_number'] = $values['ad_view_number'] ?? 1;
|
||||
$additionalSettings['ad_view_repeat'] = $values['ad_view_repeat'] ?? 0;
|
||||
}
|
||||
|
||||
$settings = $extension->parseSettings( $values );
|
||||
|
||||
$additionalSettings = array_merge( $additionalSettings, $settings );
|
||||
|
||||
/* Unset any elements that were added */
|
||||
$result = $extension->getSettings( $values );
|
||||
if( isset( $result['settings'] ) )
|
||||
{
|
||||
foreach( $result['settings'] as $settingField )
|
||||
{
|
||||
if( isset( $values[ $settingField->name ] ) )
|
||||
{
|
||||
unset( $values[ $settingField->name ] );
|
||||
}
|
||||
}
|
||||
unset( $values[ $k ] );
|
||||
}
|
||||
}
|
||||
|
||||
$values['p_settings'] = json_encode( $additionalSettings );
|
||||
|
||||
foreach( array( 'ad_apps', 'ad_view_number', 'ad_view_repeat' ) as $field )
|
||||
{
|
||||
if( isset( $values[ $field ] ) )
|
||||
{
|
||||
unset( $values[ $field ] );
|
||||
}
|
||||
}
|
||||
|
||||
return parent::formatFormValues( $values );
|
||||
}
|
||||
@@ -384,10 +323,15 @@ class Ad extends Package
|
||||
{
|
||||
Member::loggedIn()->language()->words['advertisement_image_desc'] = Member::loggedIn()->language()->addToStack( 'advertisement_image_max_w', FALSE, array( 'sprintf' => array( $this->max_width ) ) );
|
||||
}
|
||||
|
||||
$form->add( new YesNo( 'ad_image_more', FALSE, FALSE, array( 'togglesOn' => array( 'ad_image_small', 'ad_image_medium' ) ), NULL, NULL, NULL, 'ad_image_more' ) );
|
||||
$form->add( new Upload( 'ad_image_small', NULL, FALSE, array( 'image' => TRUE, 'storageExtension' => 'nexus_Ads' ), NULL, NULL, NULL, 'ad_image_small' ) );
|
||||
$form->add( new Upload( 'ad_image_medium', NULL, FALSE, array( 'image' => TRUE, 'storageExtension' => 'nexus_Ads' ), NULL, NULL, NULL, 'ad_image_medium' ) );
|
||||
|
||||
$form->add( new Text( 'ad_image_alt', NULL, FALSE, array(), NULL, NULL, NULL, 'ad_image_alt' ) );
|
||||
|
||||
if( !$this->email )
|
||||
{
|
||||
$form->add( new YesNo( 'ad_image_more', FALSE, FALSE, array( 'togglesOn' => array( 'ad_image_small', 'ad_image_medium' ) ), NULL, NULL, NULL, 'ad_image_more' ) );
|
||||
$form->add( new Upload( 'ad_image_small', NULL, FALSE, array( 'image' => TRUE, 'storageExtension' => 'nexus_Ads' ), NULL, NULL, NULL, 'ad_image_small' ) );
|
||||
$form->add( new Upload( 'ad_image_medium', NULL, FALSE, array( 'image' => TRUE, 'storageExtension' => 'nexus_Ads' ), NULL, NULL, NULL, 'ad_image_medium' ) );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -400,8 +344,9 @@ class Ad extends Package
|
||||
*/
|
||||
public function addToCart(\IPS\nexus\Invoice\Item $item, array $values, string $memberCurrency ): array
|
||||
{
|
||||
$item->extra['image'] = json_encode( array( 'large' => (string) $values['advertisement_image'], 'medium' => (string) $values['ad_image_medium'], 'small' => (string) $values['ad_image_small'] ) );
|
||||
$item->extra['image'] = json_encode( array( 'large' => (string) $values['advertisement_image'], 'medium' => (string) ( $values['ad_image_medium'] ?? '' ), 'small' => (string) ( $values['ad_image_small'] ?? '' ) ) );
|
||||
$item->extra['link'] = (string) $values['advertisement_url'];
|
||||
$item->extra['alt'] = $values['ad_image_alt'];
|
||||
return parent::addToCart( $item, $values, $memberCurrency );
|
||||
}
|
||||
|
||||
@@ -432,7 +377,7 @@ class Ad extends Package
|
||||
$advertisement = Advertisement::load( $purchase->extra['ad'] );
|
||||
|
||||
return array(
|
||||
'packageInfo' => $parent['packageInfo'],
|
||||
'packageInfo' => $parent['packageInfo'] . Theme::i()->getTemplate( 'purchases' )->advertisementType( $purchase, $advertisement ),
|
||||
'purchaseInfo' => $parent['purchaseInfo'] . Theme::i()->getTemplate('purchases')->advertisement( $purchase, $advertisement ),
|
||||
);
|
||||
}
|
||||
@@ -461,18 +406,25 @@ class Ad extends Package
|
||||
$field = new Upload( 'ad_image' . $k, NULL, TRUE, array( 'image' => TRUE, 'storageExtension' => 'nexus_Ads' ) );
|
||||
$field->label = Member::loggedIn()->language()->addToStack('ad_image');
|
||||
$form->add( $field );
|
||||
|
||||
$field = new YesNo( 'ad_image_more' . $k, FALSE, FALSE, array( 'togglesOn' => array( 'ad_image_small' . $k, 'ad_image_medium' . $k ) ) );
|
||||
$field->label = Member::loggedIn()->language()->addToStack('ad_image_more');
|
||||
|
||||
$field = new Text( 'ad_image_alt' . $k, NULL, FALSE );
|
||||
$field->label = Member::loggedIn()->language()->addToStack( 'ad_image_alt' );
|
||||
$form->add( $field );
|
||||
|
||||
$field = new Upload( 'ad_image_small' . $k, NULL, FALSE, array( 'image' => TRUE, 'storageExtension' => 'nexus_Ads' ), NULL, NULL, NULL, 'ad_image_small' . $k );
|
||||
$field->label = Member::loggedIn()->language()->addToStack('ad_image_small');
|
||||
$form->add( $field );
|
||||
|
||||
$field = new Upload( 'ad_image_medium' . $k, NULL, FALSE, array( 'image' => TRUE, 'storageExtension' => 'nexus_Ads' ), NULL, NULL, NULL, 'ad_image_medium' . $k );
|
||||
$field->label = Member::loggedIn()->language()->addToStack('ad_image_medium');
|
||||
$form->add( $field );
|
||||
|
||||
if( !$this->email )
|
||||
{
|
||||
$field = new YesNo( 'ad_image_more' . $k, FALSE, FALSE, array( 'togglesOn' => array( 'ad_image_small' . $k, 'ad_image_medium' . $k ) ) );
|
||||
$field->label = Member::loggedIn()->language()->addToStack('ad_image_more');
|
||||
$form->add( $field );
|
||||
|
||||
$field = new Upload( 'ad_image_small' . $k, NULL, FALSE, array( 'image' => TRUE, 'storageExtension' => 'nexus_Ads' ), NULL, NULL, NULL, 'ad_image_small' . $k );
|
||||
$field->label = Member::loggedIn()->language()->addToStack('ad_image_small');
|
||||
$form->add( $field );
|
||||
|
||||
$field = new Upload( 'ad_image_medium' . $k, NULL, FALSE, array( 'image' => TRUE, 'storageExtension' => 'nexus_Ads' ), NULL, NULL, NULL, 'ad_image_medium' . $k );
|
||||
$field->label = Member::loggedIn()->language()->addToStack('ad_image_medium');
|
||||
$form->add( $field );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -486,8 +438,9 @@ class Ad extends Package
|
||||
*/
|
||||
public function acpAddToInvoice(\IPS\nexus\Invoice\Item $item, array $values, string $k, Invoice $invoice ): void
|
||||
{
|
||||
$item->extra['image'] = json_encode( array( 'large' => (string) $values[ 'ad_image' . $k ], 'medium' => (string) $values[ 'ad_image_medium' . $k ], 'small' => (string) $values[ 'ad_image_small' . $k ] ) );
|
||||
$item->extra['image'] = json_encode( array( 'large' => (string) $values[ 'ad_image' . $k ], 'medium' => (string) ( $values[ 'ad_image_medium' . $k ] ?? '' ), 'small' => (string) ( $values[ 'ad_image_small' . $k ] ?? '' ) ) );
|
||||
$item->extra['link'] = (string) $values[ 'advertisement_url' . $k ];
|
||||
$item->extra['alt'] = $values['ad_image_alt' . $k ];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -547,6 +500,7 @@ class Ad extends Package
|
||||
'ad_html' => NULL,
|
||||
'ad_images' => $purchase->extra['image'],
|
||||
'ad_link' => $purchase->extra['link'],
|
||||
'ad_image_alt' => $purchase->extra['alt'] ?? '',
|
||||
'ad_impressions' => 0,
|
||||
'ad_clicks' => 0,
|
||||
'ad_exempt' => $this->exempt === '*' ? '*' : json_encode( explode( ',', $this->exempt ) ),
|
||||
@@ -559,7 +513,7 @@ class Ad extends Package
|
||||
'ad_additional_settings'=> $this->settings,
|
||||
'ad_html_https_set' => 0,
|
||||
'ad_member' => $purchase->member->member_id,
|
||||
'ad_type' => Advertisement::AD_IMAGES,
|
||||
'ad_type' => ( $this->email ? Advertisement::AD_EMAIL : Advertisement::AD_IMAGES ),
|
||||
) );
|
||||
|
||||
$extra = $purchase->extra;
|
||||
|
||||
@@ -155,7 +155,8 @@ class Package extends Model
|
||||
|
||||
foreach( Application::allExtensions( 'nexus', 'PackageType', null, null, null, false ) as $key => $ext )
|
||||
{
|
||||
$return[ $key ] = $ext;
|
||||
$className = mb_substr( $ext, mb_strrpos( $ext, '\\' ) + 1 );
|
||||
$return[ IPS::mb_ucfirst( mb_strtolower( $className ) ) ] = $ext;
|
||||
}
|
||||
|
||||
return $return;
|
||||
|
||||
@@ -19,6 +19,7 @@ use IPS\Db;
|
||||
use IPS\IPS;
|
||||
use IPS\nexus\Purchase;
|
||||
use IPS\Patterns\ActiveRecord;
|
||||
use OutOfRangeException;
|
||||
use function count;
|
||||
use function defined;
|
||||
use function get_class;
|
||||
@@ -97,7 +98,13 @@ abstract class LicenseKey extends ActiveRecord
|
||||
public static function constructFromData( array $data, bool $updateMultitonStoreIfExists = TRUE ): static
|
||||
{
|
||||
$types = static::licenseKeyTypes();
|
||||
$classname = $types[ IPS::mb_ucfirst( $data['lkey_type'] ) ];
|
||||
$licenseKeyType = IPS::mb_ucfirst( $data['lkey_type'] );
|
||||
if( !array_key_exists( $licenseKeyType, $types ) )
|
||||
{
|
||||
throw new OutOfRangeException;
|
||||
}
|
||||
|
||||
$classname = $types[ $licenseKeyType ];
|
||||
|
||||
/* Initiate an object */
|
||||
$obj = new $classname;
|
||||
|
||||
@@ -1106,7 +1106,7 @@ class Transaction extends ActiveRecord
|
||||
* @apiresponse \IPS\nexus\Money amount Amount
|
||||
* @apiresponse \IPS\nexus\Money refundAmount If partially refunded, the amount that has been refunded
|
||||
* @apiresponse \IPS\nexus\Money credit If credited, the amount that has been credited
|
||||
* @apiresponse \IPS\nexus\Gateway gateway The gateway
|
||||
* @apiresponse \IPS\nexus\Gateway gateway The used gateway, or null if account credit was used
|
||||
* @clientapiresponse string gatewayId Any ID number provided by the gateway to identify the transaction on their end
|
||||
* @apiresponse datetime date Date
|
||||
* @apiresponse \IPS\nexus\Customer customer Customer
|
||||
|
||||
Loaded 100 of 1407 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user