v 6.9 Release date: 16 Nov, 2022

Full Release Notes

BACKLOG

Zapier: contact fields extending with secure zone data
Extend Zapier functionality:
  • add contact secure zones output to the contact object (as a list with their expiration dates, zone ids, and zone names).
    • contact object that returns after 
      • Add contact trigger
      • Edit contact trigger
      • Add contact action
      • Edit contact action
      • Search contact action
Show/Hide Inactive/Disabled Items
Add additional filter on module items list view in admin UI (near enabled/disabled filter https://www.screencast.com/t/FCtVkiLom)
  • Label
    • Expired State
  • Type
    • dropdown
  • options
    • All
      • default
    • Active
    • Inactive
Don't show Expired State drop if:
  • Enable Release Date and Enable Expiration Date (Module -> Default properties settings https://prnt.sc/m71sDpZF3D00) are false for the parent and child module
  • Enable Release Date and Enable Expiration Date (Module -> Default properties settings https://prnt.sc/m71sDpZF3D00) are false for the current module
Don't filter by item's Release Date on filtering inactive items if Enable Release Date (Module -> Default properties settings https://prnt.sc/m71sDpZF3D00) are false Don't filter by item's Expiration Date on filtering inactive items if Enable Expiration Date (Module -> Default properties settings https://prnt.sc/m71sDpZF3D00) are false
Logic:
  • Determines whether the list should contain inactive items or not
    • inactive items are items whose release date is greater than the current date or whose expiry date is less than the current date
Portal automations improvements: Site reactivation on payment and recurring period switching

1) Site reactivation and Billing Cycle change (Portal)

When site is reaching its subscription expiry date AND payment is not recived yet: If payment is recieved
  • show status Activated
Display columns on live site table as shown in design:
When clicking payment button
  • Show popup with ability to change Billing Cycle or reactivate current subscription
  • Reactivation will be applied if selected Billing Cycle is the same as the site already has.
    If another Billing Cycle is selected - create new subscription with the new Billing Cycle
    • in both cases - after payment is received
      • cancel previous subscription
On reactivation
  • If reactivation applied in Grace period
    • Set recurring date to the same day of the next month or year when the previous subsctiption should be paid if there would be no issues with it.
      And in the payment date just charge the amount for the selected cycle. Example:
      • if payment $20 per month is created 01-01-2022 than grace period starts after 01-02-2022. And if reactivation is made on 05-02-2022 than payer will be charged for $20 right away and than next recurring day will be assigned as 01-03-2022 (same day as previous subscription had)
  • If Billing Cycle is changed during the active subscription period. Example:
      • charge amount for the selected cycle right away (lets say we are changing billing cycle from anually $200 to monthy $20 - then charging $20)/
        And set recurring date for +1 selected billing cycle after the expiration date of the previous subscription (for this example +1 month to the expiration date).

When trying to change site plan in Grace period - show error
    • Site plan changing is not allowed during the grace period
Payment button should show different labels based on the site status (Grace period or active period)
  • In Grace period
    • Reactivate
  • In default active period
    • Change Billing Cycle

2) Site reactivation and Billing Cycle change (CMS)

If Direct Billing extension is enabled for the site:
    • Add the ability to see Billing (/admin/billing) button on the site admin UI and add the ability to pay for the site subscription in Grace period

3) Reminder emails

Use default email template.
1) After 1 day (24 hours) after Expiry date (in Grace period)
  • Send Email notification to the reseller
    • Subject:
      • <sitename> (<siteURL>) will be deactivated due to non-payment
    • Body
      • Your site <sitename> will be deactivated due to non-payment on <dateOfDeactivation>. Please log in to your PayPal account and make sure your billing is up-to-date. If you have any questions, please contact us at support@treepl.co.
    • Format of date
      • 11 Sep, 2022 (GMT +10:00)
      • time zone
        • site
2) After 9 days (24*9 hours) after Expiry date (in Grace period)
  • Send Email notification to the reseller
    • Subject
      • <sitename (<siteURL>)> will be deactivated due to non-payment
    • Body
      • Your site <sitename> will be deactivated due to non-payment on <dateOfDeactivation>. Please log in to your Treepl Portal to set up a new PayPal subscription to address the issue. If you have any questions, please contact us at support@treepl.co.
    • Format of date
      • 11 Sep, 2022(GMT +10:00)
      • time zone
        • site
Portal automations improvements: Invoicing fix

Invoice email fix

On invoice sending for the recurring plan payment
  • send invoice based on the plan from webhook instead of the very first created plan
This is to avoid the wrong plan name being displaying in the invoice email after changing site plan.

Orders list retrieving optimization Optimize the algorithm of Order list retrieving in the admin UI
  • Reduce the load time
Error notification on payment gateway webhooks setup On saving payment credentials
  • if there are any errors regarding adding webhooks for this site
    • show an error from the API response (like this https://prnt.sc/CgPfZCnET0iD)
    • Error pattern
      • An error occurred during the payment gateway webhook setup: <detailsFormGatewayError>
reCaptcha v2 to v3 start transition - Step#1 Since reCaptcha v2 couldn't save from bot attacks well enough - we are highly recommended to replace all reCaptcha v2 implementations on your sites with v3. Also, we are starting reCaptcha v2 deprecating process. The first step will be to remove the ability to add reCaptcha v2 to all new forms.

Remove from the form builder the ability to choose reCaptcha v2 for the form
HTTP Headers Settings (plans restrictions change) Change plan restriction for feature HTTP Headers Settings
  • Change minimum site plan requirement
    • From Pro to Essential

BUG FIXES

Form with two paid secure zones

On one form use two paid secure zones -> One zone daily $10, Second zone $5 -> assigned those two secure zones on one form and buy - display error https://prnt.sc/3B58_ool2W2g

Site Global - do sorting of properties like in v6.7

Go to Site Global and return sorting like in v6.7 https://prnt.sc/rOzuxOlxmrYA

https://treepl.slack.com/archives/C023SU50YQP/p1667500781050629

Products - inventory control

1. Go to products

2. Create a new product with inventory control "In Stock" = 1 https://prnt.sc/ye6QLngYGrQi

3. Go to frontend and buy this product

4. Go to the product INVENTORY tab

the "In Stock" field again = 1

Form submission export with new fields

1. Create a form with some custom fields https://prnt.sc/KcEDf6y4KXT0 ->

after filling this form from the front

2. After going admin-> forms -> add new custom field in the form and save

3. Go to form submission -> try to do export from this form -> display error in console https://prnt.sc/80hq6WiGSZpT

https://treepl.slack.com/archives/C023SU50YQP/p1667285126096139

Inactive item - shouldn't display in sitemap and site search

1. The inactive item shouldn't display in the sitemap and site search

https://treepl.slack.com/archives/C023SU50YQP/p1667908702650059

Rename Site information to Site Globals -  liquidcontext

Rename Site information to Site Globals -  liquidcontext

https://treepl.slack.com/archives/C023SU50YQP/p1667950955117169

Custom module - delete URL in module

Go to settings of custom module -> delete URL and save https://prnt.sc/40C-StA2OBaU

Go to list of custom module -> return again to setting in Custom module and click Save -> display internal error

https://treepl.slack.com/archives/C023SU50YQP/p1667397356707039

Admin User - can't see details of order in Product tab

1. Go to admin like admin user

2. Switch off in Admin User Roles “Can Edit Products”  checkbox  https://prnt.sc/i6gWS5DgWW-3

3. Admin user can't see info about shipping option, tax, discount and gift voucher BUT all info should return https://prnt.sc/oH7R1dyMwbKA

https://treepl.slack.com/archives/C023SU50YQP/p1666236903237889

"Delete Selected" button in Contacts - Form Submission and Event Bookings tabs

1. Go to Contact and open the Form Submission tab -> If the user has more than 20 submissions and display pagination when selecting all on the second page and click Delete Selected -> deleted all items https://prnt.sc/6xxfcduYtQtM

Contacts - uppercase letters

1. Go to contacts

2. Pay attention to the member with uppercase letters in the "email" field

3. After submitting any form from a member with uppercase letters a duplicate of that user with a letter with lowercase letters is created in the email field

Fix - migration where the original and duplicate contacts were merged into one with all cases, bookings, orders, and secure zones

Show more less
Improvement

Misc Improvements (v6.9)

- Improvements based on support tickets. More details will be provided in the release notes.
  • Admin Panel
  • General
  • UI/UX
v 6.8 Release date: 03 Oct, 2022

Full Release Notes

BACKLOG

E-commerce Quoting Option

Original Description:

E-commerce quoting option so that when an order goes through the admin it can be edited or completed before the quote is transformed into an order and the invoice is issued for payment in full or for a deposit payment. A workflow can then also be generated for the order to go to the client/accountant/franchisee.

DESIGN

https://invis.io/YAX7PB2EC3Q 

1) Create Order functionality

Provide ability to create new order from the admin

Default status is ‘New’

Invoice Number should not be generated during this action

  • Form fields
    • Order Name
    • Domain (Dropdown - list of available site domains)
    • Status (Dropdown - list of available statuses)
    • Assigned To (Required - CRM lookup field)
    • Invoice Number
    • Invoice Date (preset to current date)
    • AWB Number
    • Tracking Url
    • Shipping address
    • City
    • State
    • Zipcode
    • Country
    • Advanced CRM groups assigned to the order
    • Add Custom Fields (available after saving the order)

2) Change products in the order

Provide ability to edit order products from the admin

BC reference:
https://prnt.sc/s2oblz 

Design:

https://projects.invisionapp.com/share/YAX7PB2EC3Q#/screens/415110743

Implement following functionality:

  • Add/Edit product
  • Disallow adding products if they are recurring products
    • Show error message “Recurring product is not allowed to be added”
  • Disallow editing products data if an order is a recurring order
    • Show error message “Orders with recurring products are not allowed to be edited”
  • Change inventory accordingly if there is are quantity changes to any ecommerce product order lines
  • Provide the ability to edit the product name
  • Provide the ability to change prices https://prnt.sc/x5cffi
    • implement linked recalculation between
      • Unit Price, Units, and Total Price
        (the Unit Price and Total Price should be calculated according to the applied tax)
    • once Unit Price or Total Price change is applied
      • do not apply volume discounts to this orderline any more
      • tax settings still should be applied to this product after quantity change
  • Provide the ability to delete the product from the order

If saving order with changed products, gift vouchers, discount codes, or shipping options and the order has an active recurring subscription:

  • show error
    • This order data is not allowed to be changed for orders with recurring subscriptions

3) Change overall order data

Provide ability to change the following data for an Order:

  • tax
  • giftvouchers
  • discount codes
  • shipping options
  • Disallow editing this data if:
    • an order contains an active recurring subscription

Provide ability to Generate Invoice Number via admin UI ( https://projects.invisionapp.com/share/A8W5SNPF5QX#/screens)

  • if generate invoice number action performed to the order that already has a system or custom invoice number
    • show an error message “This order already has an invoice number”
  • Show ‘Generate Invoice Number’ button only on orders that don't have a system generated or manually added invoice number.

4) New Payment type of “Refund”

Provide ability to add “Refund” as a payment type

  • Refund type can be added:
    • manually from the admin (in Order payments tab)
    • via webhooks:
      • Stripe: refund, cancel(only automatic flow)
      • Paypal: refund
      • Authorize: refund, void(cancel)
      • Bambora: -
      • Eway: -
  • Allowed to be deleted (if manual added only)
  • Value should be shown as a negative value (currency format should be taken according to the current format setting on the current domain)

5) Form changes

Create a new form type of “Quote” (for requesting a quote in the ecommerce quoting process)

  • Logic is the same as for the Checkout but
    • generates order without an invoice number.
  • On Edit form action (tab ‘Form Builder’ or tab ‘Settings’)
    • do not show recurring secure zones on the Settings tab if the selected form type is Quote
    • if the selected type is Quote and there are paid secure zones attached to the form
      • Show error message “Quote form can't be saved with the attached recurring secure zones”
  • On Edit form action (tab ‘Form Builder’)
    • if Form Type is Quote
      • If the "Accept Payment" field is selected on the form builder - show an error: “Quote form can't be saved with the "Accept Payment" field”
      • Do not show the following field buttons in the system fields list https://prnt.sc/GtfaxcIGuoPO
        • Accept Payment
        • Discount Code
        • Gift Voucher
        • Accept Event Booking
    • if Form Type is Checkout
      • Do not show the following field buttons in the system fields list https://prnt.sc/GtfaxcIGuoPO
        • Discount Code
        • Gift Voucher
        • Accept Event Booking
  • On Form submit:
    • if Form Type is Quote AND "Accept Payment" field is selected on the form builder - show an error: “Quote form can't be submitted with the ‘Accept Payment’ field”
    • if Form Type is Quote AND there is no shipping option selected on the shopping cart DO NOT stop processing the form.
    • if Form Type is Quote AND there is at least one recurring product in the shopping cart - show an error: “Quote form can't be submitted with recurring products in the shopping cart”
    • if Form Type is ‘Quote’ OR Form Type is ‘Checkout’ and there is a product in the shopping cart that was deleted - show an error: “Your shopping cart contains deleted products. Please review and remove all deleted products from the shopping cart and proceed once again”
  • On loading ‘Checkout’ or ‘Quote’ page from the shopping cart:
    • if there is a product in the shopping cart that was deleted - show an error: “Your shopping cart contains deleted products. Please review and remove all deleted products from the shopping cart and proceed once again”

6) Shopping cart changes

Add request quote button to shopping cart liquid object:

{% component type:"shopping_cart" %}

  • QuoteButtonHtml:
    <button class="system_button" data-cms_cart_quote="">Get a quote</button>
  • clicking on the button should lead to /quote
  • apply Before After and trigger js events
    • CMS_BeforeGoToQuote
    • CMS_AfterGoToQuote
    • CMS_TriggerGoToQuote
  • clicking Quote button validation should not require a shipping option to be selected

7) Request a quote system pages

Create system pages for Quotes

  • Get A Quote (/quote)
    • redirect here if clicked on the request quote button on the checkout
    • see content in page ‘Settings’ > ‘System Pages’ > ‘quote’
  • Quote Receipt (/quote-receipt)
    • user will be redirected here after quote form submission (default page)
    • see content in page ‘Settings’ > ‘System Pages’ > ‘quote-receipt’

8) System emails

Create System email for Quotes

  • For Quote Orders, send in place of Invoice email
    • sent on quote order create
    • ability to send quote if clicked ‘send quote’ button in the Order detail page (instead of ‘send invoice’)
  • Default From Email
    • admin@trustedemail.co
  • Default Subject
    • Quote
  • Default From Name
    • Admin
  • Content
    • see content in file ‘Email Notifications’ > ‘System Emails > ‘Quote’

9) Secure zone logic

On Quote form submit with Secure Zones assigned:

  • If there are paid secure zones assigned - show error message “Recurring secure zone subscription is not allowed for the ‘Quote’ form type”
  • else; immediately subscribe user to all free secure zones assigned to the form.

10) Precreate Request Quote form on all sites with default styles

Replicate default HTML/styles from the Checkout form, but remove payment fields and Total Amount field.

Create the form on all sites with the alias of ‘quote’

Fields on formbuilder:

  • firstname
  • lastname
  • email
  • phone
  • Shipping Address
  • reCAPTCHA v3

11) Plan restrictions

Disallow submission of forms with type ‘Quote’ on plans lower than eCommerce.

Show error message “Quote forms are not available on current site plan”

12) Admin User Role Restrictions

Add following admin user role restrictions

  • Orders
    • Can Add
    • Can Edit Details
    • Can Edit Payments
    • Can Edit Products

For all roles that have Orders -> Can View=true set Orders -> Can Edit Details=true (for backward compatibility)

For all roles that have Orders -> Can View=true set Orders -> Can Edit Payments=true (for backward compatibility)

Logic

  • Orders -> Can Add=false
  • Orders -> Edit Details=false
    • Removes Edit button from UI ( https://prnt.sc/qJv5vry38oQU)
    • Blocks update order details form url /admin/orders/123456/details
    • Blocks update order details request
    • Blocks generate invoice request
    • Removes Generate Invoice button from UI
  • Orders -> Edit Payments=false
  • Orders -> Edit Products=false
    • Blocks all update request for
      • orderlines
      • taxes
      • giftvouchers
      • shipping options
      • discounts

eWay payment field expiration workaround

1) Extend eWAY payment gateway settings

Adds new option for how the payment integration displays in payment forms.

When configuring eWay as a payment option under ‘Settings’ > ‘Payments’ new option for:

  • Checkout Integration Type (dropdown)
    • Inline (default - current implementation)
    • Modal (new implementation)

2) Logic for Modal

Do not show payment fields on the form.

Instead, once form is submitted show popup modal with payment fields.

3) Improve payment fields validation

After form submit:

  • if payment fields error occurred
    • reload payment fields iframe

This should avoid issue when credit card data determined as expired after second form submit even after payment data was fixed

Event payment to include tax and volume discounts

Event payments now honor tax settings and volume discount brackets assigned to Event prices.

Liquid output improvement of the event item:

Add following properties to liquid output of the event item:

"priceWithTax": 11.00,
"RecommendedPrice": 5.0000,
"RecommendedPriceWithTax": 5.50,
"taxRate": 0.1000,
"VolumeDiscount":
[
{
"Price": 10.0000,
"Quantity": 0
},
{
"Price": 8.0000,
"Quantity": 5
},
{
"Price": 5.0000,
"Quantity": 10
}
]

JS for volume discount:

When changing allocation field:

  • recalculate total amount based on volume discount settings of the price

On page load:

  • recalculate total price via API call based on
    • price in data-event_one_item_price
    • quantity in Payment_ItemQuantity
    • quantity discount
  • and paste totalAmount to the value of
    • field by selector [name="Payment_Amount"]
    • field by selector #PaymentTotalCost

Headers settings custom setup

1) Add header settings page

Add new menu item and page under ‘Settings’ > ‘HTTP Header Settings’

DESIGN

https://invis.io/M4107BHKYUDC

Content

  • list of allowed headers
  • Ability to enable/disable header
  • Ability to setup header's specific settings
    • ability to enable header
    • ability to setup header value (described below)


>> Strict-Transport-Security



>> X-Content-Type-Options



>> X-Frame-Options



>> Access-Control-Allow-Origin



>> Content-Security-Policy

  • Documentation
  • Options (text)
    • child-src
    • connect-src
    • default-src
    • font-src
    • frame-src
    • img-src
    • manifest-src
    • media-src
    • object-src
    • prefetch-src
    • script-src
    • script-src-elem
    • script-src-attr
    • style-src
    • style-src-elem
    • style-src-attr
    • worker-src
    • base-uri
    • sandbox
    • form-action
    • frame-ancestors
    • navigate-to
    • report-uri
    • report-to
    • require-sri-for
    • require-trusted-types-for
    • trusted-types
    • upgrade-insecure-requests


>> Referrer-Policy



>> Permissions-Policy

  • Documentation
  • Options (text - disallow to input following characters: ,() [replace to empty string])
    • accelerometer
    • ambient-light-sensor
    • autoplay
    • battery
    • camera
    • display-capture
    • document-domain
    • encrypted-media
    • execution-while-not-rendered
    • execution-while-out-of-viewport
    • fullscreen
    • gamepad
    • geolocation
    • gyroscope
    • layout-animations
    • legacy-image-formats
    • magnetometer
    • microphone
    • midi
    • navigation-override
    • oversized-images
    • payment
    • picture-in-picture
    • publickey-credentials-get
    • speaker-selection
    • sync-xhr
    • unoptimized-images
    • unsized-media
    • usb
    • screen-wake-lock
    • web-share
    • xr-spatial-tracking
  • Example of usage:
    • fullscreen
      • self "https://example.com" "https://another.example.com"
    • geolocation
      • *
    • camera
      • 'none'
  • Resulting Header from example:
    • Permissions-Policy: fullscreen=(self "https://example.com" "https://another.example.com"), geolocation=*, camera=()


>> (For page requests) Cache-Control

  • Content is same as below


>> (For files requests) Cache-Control



>> (For page requests) Age

  • Content is same as below


>> (For files requests) Age



>> (For page requests) Expires

  • Content is same as below


>> (For files requests) Expires

2) Logic

For ANY URL request (to any page or file) that is NOT related to the admin files and requests

  • add selected and configured headers to the response
    • if header is enabled AND there is at least one not empty option inside
      • add header with the selected options
        • checkbox options
          • if true - add option to the header. Else - ignore this option
        • text options
          • if NOT empty string - add option with the value to the header. Else - ignore this option
        • dropdown options
          • if NOT empty option selected - add option with the  selected value to the header. Else - ignore this option

3) Admin user role restrictions

Add following admin user role restrictions

  • HTTP Header Settings
    • Can View
    • Can Manage

4) Site plan restrictions

Show ‘Settings’ > ‘HTTP Header Settings’ page starting from plan

  • Pro

----------

Headers Validator Site: https://securityheaders.com/

Checklist values with commas improvement

1) Request params improvement

Add new property to ‘request.request_url’ liquid object

  • request.request_url.originalParams

Value is an object of all URL params however arrays should be represented as arrays instead of as CSV string

Example:

  • /lab?myArrayProp=option%201&myArrayProp=opti,on%202&myTextprop=textValue

<pre>{{request.request_url.params}}</pre>

Outputs:

{ 
"myarrayprop": "option 1,opti,on 2",
"mytextprop": "textValue"
}

<pre>{{request.request_url.originalParams}}</pre>

Outputs:

{ 
"myarrayprop": ["option 1", "opti,on 2"],
"mytextprop": "textValue"
}

2) Advanced CRM group field liquid object improvement

Add ‘ArrayValue’ property. If a field is checklist or dropdown (multiple) - paste selected options as an array to this property.

For all other fields paste value as first element of the array

Example:

{% component groupAlias: "MyAdvancedCRMGroup", entityType: "contact", entityId: "12345", collectionVariable: "groupFieldsList", layout: "", type: "CRMContactCustomGroup" %}

{{groupFieldsList}}

Output:

{ 
"Name" : "My Checklist",
"Alias" : "MyChecklist",
"Value" : "check 1,che,ck 3,check 4",
"ArrayValue" : ["check 1", "che,ck 3", "check 4"]
},
{
"Name" : "My Text",
"Alias" : "MyText",
"Value" : "my, some text",
"ArrayValue" : ["my, some text"]
},
{
"Name" : "My Number",
"Alias" : "MyMuber",
"Value" : 123,
"ArrayValue" : ["123"]
}

3) Save entity improvement

For the following property types:

  • checklist
  • dropdown multiple

View selected options of the property of type checklist or dropdown multiple as CSV string on list and detail layouts in Admin UI

  • If options are like
    • option 5
    • option 6
    • option 7,7
  • CSV string should be like
    • option 5 5,option 6,option 7,7

Provide the ability to save selected options if they contain "," character

  • via Admin UI
    • Create module item
    • Edit module item
    • Create CRM Contanct (advanced CRM fields)
    • Edit  CRM Contanct (advanced CRM fields)
    • Create CRM Form Submission  (advanced CRM fields)
    • Edit  CRM Form Submission (advanced CRM fields)
    • Create CRM Event Booking (advanced CRM fields)
    • Edit  CRM Event Booking (advanced CRM fields)
    • Create CRM Order (advanced CRM fields)
    • Edit  CRM Order (advanced CRM fields)
  • via save/edit entity frontent form
    • Form submission
    • Edit account form
    • Create module item form
    • Edit module item form

Entities that requires this improvement (admin UI)

  • module item
  • case
    • custom form fields
    • advanced crm fields
  • order
    • advanced crm fields
  • event booking
    • advanced crm fields

Add also following updates to module item update and search forms (site frontend forms)

  • Module item update form
    • For Checklist property type

      var propertyValues="{{this.ListcheckboxList | join:","}}".split(',');

      change to

      var propertyValues="{{this.ListcheckboxList | join:"|||;/;|||"}}".split('|||;/;|||');
    • For Dropdown (multiple) property type

      var values='{{this.ListListbox_list}}'.split(',');

      change to

      var values='{{this.ListListbox_list | join:"|||;/;|||"}}'.split('|||;/;|||');
  • Module item search form
    • For Checklist property type

      var propertyValues="{{request.request_url.params.prop_ListcheckboxList}}".split(',');

      change to

      var propertyValues="{{request.request_url.originalParams.prop_ListcheckboxList | join:"|||;/;|||"}}".split('|||;/;|||');
    • For Dropdown (multiple) property type

      var values='{{request.request_url.params.prop_ListListbox_list}}'.split(',');

      change to

      var values='{{request.request_url.originalParams.prop_ListListbox_list | join:"|||;/;|||"}}'.split('|||;/;|||');

4) Custom report improvement

According to the Save entity improvement improve custom report results searching by filters that contain value with "," character

  • filtering by custom form field on the following report types
    • Contacts and Cases
    • Contacts and Orders
    • Contacts and Event Bookings
  • filtering by advanced crm field on the following report types
    • Contacts
    • Contacts and Cases
    • Contacts and Orders
    • Contacts and Event Bookings
    • Contacts and Secure Zones

5) Import/Export improvement

Add following logic to import/export process for the following entities:

  • Module item
  • Contact
  • Case
  • Booking
  • Order

Logic:
For any property with type Checklist or Dropdown (multiple)

  • On Export
    • When generating CSV string of selected options replace "," substring with "%2С"
  • On Import
    • After retrieving list of selected options from CSV string for each option replace "%2С" substring with ","

Example:

  • Export
    • options
      • option 5
      • option 6
      • option 7,7
  • CSV string for the property (to the excel cell)
    • option 5,option 6,option 7%2С7
  • Import
    • CSV string for the property (from excel cell)
      • option 5,option 6,option 7%2С7
    • result list of options to be applied
      • option 5
      • option 6
      • option 7,7

6) Improve filters on custom reports

`In` and `NotIn` filters:
Add a new setting to the filter called:

  • Values Filter Condition (dropdown)
    • OR (default)
    • AND

Logic:

  • If OR selected (current logic will be applied) - will find all items that have at least one value from the filter values list
  • If AND selected - will find all items that have all values from the filter values list

Design: https://prnt.sc/KsffJVqXl2pm

Example:

Add an advanced CRM group with the field “theChecklist” to the contact of type Checkbox:

  • options
    • 1
    • 2
    • 3
    • 4

Select the following values for the contacts:

  • Contact1
    • theChecklist
      • 1
      • 3
  • Contact2
    • theChecklist
      • 1
      • 3
      • 4
  • Contact3
    • theChecklist
      • 2
      • 3

Setup Custom report for contacts and:

  • Add filter (using OR):
    • theChecklist
      • 1
      • 4
    • Values Filter Condition
      • OR
    • Results should be
      • Contact1
      • Contact2
  • Add filter (using AND):
    • theChecklist
      • 1
      • 4
    • Values Filter Condition
      • AND
    • Results should be
      • Contact2

"Remember Me" for CRM login form

Provide the ability to remember the logged-in state for CRM Members and configure its duration

Settings:

Add new setting to ‘Settings’ > ‘Misc’ > ‘CRM Settings’

  • Remember me lifetime (numeric)
    • 30 (default)
  • Logic
    • Determines how many days should logged in state be held after login form submit

Login form upgrade:

Add Remember me checkbox to login form layout when retrieve login form from Components toolbox (Secure Zone -> Login Form)

Add following html code to the form layout (after password fields):

<label for="RememberMe">Remember me</label>
<input type="checkbox" name="RememberMe" id="RememberMe">

Example: https://prnt.sc/mhd_q974tKDb

Login form logic:

When user submit login form with checked Remember me checkbox

  • set member logged-in cookie lifetime based on Remember me lifetime setting

if not checked

  • Member logged-in cookie lifetime defaults to 1 day

Improve Site load speed while saving module item

Replace the current solution with a materialized view to the DB table supported by triggers to sync data.

Improve the following logic that using the Table solution

  • Add DB Table solution to drafts
  • Improve saving module item when keywords was changed
  • Improve Import module items process

Tax rounding strategy setting

1) Add a new eCommerce setting

Add new setting to ‘Ecommerce’ > ‘Settings’ > Tax and Shipping’ > ‘Tax Settings’

  • “Tax rounding strategy” (dropdown)
    • Banker rounding + error compensation (unit price and total price) [default]
    • Banker rounding (unit price only)

2) Rounding Logic on shopping cart calculation

When banker rounding + error compensation (unit price and total price) applied

  • use current price rounding strategy (banker rounding + error compensation)
  • rounding applied to
    • unit price separately
    • total price separately

When banker rounding (unit price only) applied:

  • use banker rounding to unit price. Then calculate orderline total price as rounded unit price multiplied by quantity.
    Error compensation mechanism is not needed here
  • apply rounding to
    • unit price only

Abandon Cart Functionality

1) Extension setup

Add new Extension to the portal and to extension JSON file so portal user could enable and disable extension on the ‘Site’ > ‘Extensions’ tab in the Portal

“Abandoned Cart Recovery”

Short Description:
With abandoned cart recovery functionality (for logged-in users only), you can automatically send reminders to customers who add products to their cart and leave without completing an order.

Information:
According to statistics, about 80 percent of customers abandon purchases for different reasons after adding items to their shopping carts. With Treepl abandoned cart recovery you can automatically email users after a cart or checkout is abandoned. And you have the ability to set the time when the email will be automatically sent. So you can stay in touch with your customers while they still remember your store and products.

For logged-in users only.

Design: https://invis.io/JP13194K9QFA

​Pricing: Free during the beta period

Extension Restrictions logic:

  • Disallow enabling the extension on the site if its plan is lower than eCommerce
  • This extension is only available for Ecommerce plan

2) Abandoned Cart Recovery extension not installed or subscription expired error message

When admin performs any action related to Abandoned cart admin UI (listed in the list below) layouts AND Abandoned Cart Recovery extension is Disabled or Abandoned Cart Recovery extension subscription is expired

  • Show error message: “This action can't be performed: Abandoned Cart Recovery extension is disabled or expired for this site”

Likewise, if the Restore cart functionality is attempted:

  • Following the restore cart link
    • redirect to the system page "error-page" and set error message to the liquid - this.ErrorMessage

3) Add shop settings for abandoned carts and improve current settings

Add following setting to ‘eCommerce’ > ‘Settings’ > ‘Shop Settings’:

  • “Abandoned cart time in Hours” (number)
    • 4 (default)
    • Default adjustment based on Shopping Cart Lifetime:
      • if shopping cart lifetime is less than or equal to 4 AND greater than 1
        • set Abandoned cart time to (shoppingCartLifetime minus 1) as default value
      • if shopping cart lifetime is equal to 1
        • set Abandoned cart time to 1 as default value
      • if shopping cart lifetime is equal to 0
        • set Abandoned cart time to 1 as default value
        • set shopping cart lifetime=1
    • allowed range between 1 and 876000

Logic:

Applied to the shopping cart created via add to cart process (skip shopping carts that is created on generic payment form submissions, event payment forms, and recurring forms):

  • Number of hours after latest update in the cart that determine shopping cart as Abandoned (should be always less or equal to the shopping cart lifetime)
  • When shopping cart becomes Abandoned; create a history record (Shopping Cart Become Abandoned Recording). See “History Data” below.

Validation:

  • If Abandoned cart time is bigger than shopping cart lifetime, show Error Message “The abandoned cart time shouldn't be bigger than the shopping cart lifetime”
  • If there is an enabled abandoned cart email notification which time is bigger than the shopping cart lifetime, show Error Message “There is at least one abandoned cart notification which time is bigger than the shopping cart lifetime”
  • Update allowed range for Shopping Cart Lifetime (it should be in range between 1 and 876000)

DESIGN: https://invis.io/CW10NLS86GBJ 

4) Abandoned Cart Emails

Add tab to ‘Email Notifications’ > ‘Emails’ page called “Abandoned Cart Emails”

Shows list of emails by new email type "Abandoned Cart Email"

Tab will only be visible when the Abandoned Cart Recovery extension is enabled/active.

5) Abandoned Cart Email

LIQUID object should contain following data:

  • ShoppingCart
    • same object as on shopping cart
  • TrackingURL
    • see (6) Tracking URL logic
  • RestoreCartURL
    • see (7) Restore cart functionality

Email Sending Logic:

  • Create a history record (Email Sent Recording) regarding Email sent. See “History Data” below.
  • Add following image tag before closing </body> tag of the email content
    •  <img src="{{this.trackingURL}}" height="1" width="1">
  • Send email

On email save:

  • disallow saving if there is no </body> tag in this email content OR the assigned email template (since this is required for the pixel image tracking). Show error message “Email content should contains <body></body> tag”
  • disallow saving if there is no{{this.RestoreCartURL}}tag in the content. Show error message “Email content must contains{{this.RestoreCartURL}}liquid tag”

6) Tracking URL logic

  • Pattern
    • https://<siteDomain>/public/api/track-email/abandoned-cart/open?id=<ShoppingCartid>&notificationId=<idOfAbandonedCartNotificationStep>&guid=<guid>
  • Logic
    • If there is NO Email Opened Recording history record with such guid in the history:
      • Create a history record (Email Opened Recording) to track email opening events. See “History Data” below.
    • return 1px x 1px transparent png image as a response (with Content-Type: image/png)

7) Restore cart functionality

  • Restore cart link Pattern
    • https://<siteDomain>/public/api/abandoned-cart/restore?id=<ShoppingCartid>&abandonedCartNotificationId=<idOfAabandonedCartNotificationStep>
  • Logic
    • this request should restore the shopping cart and redirect the user to the shopping cart page
      • Get Shopping Cart by id
      • Create a history record (Shopping Cart Recovered Recording) to track shopping cart recovery. See “History Data” below.
      • restore Shopping Cart
        • set it as a current active shopping cart
      • redirect a user to the /shopping-cart page

8) Abandoned Cart Extension Page

Add new menu item

  • ‘Extensions’ > ‘Abandoned Cart Recovery’

Content

  • Notifications
  • Abandoned Carts
  • Reports

Menu item and page will only display if the Abandoned Cart Recovery extension is enabled/active.

9) Abandoned Cart Recovery -> Notifications tab

List of all Abandoned Cart Notifications ordered by interval set in ‘Send Email After’ setting.

  • Table columns
    • Send Email After
      • {SendEmailAfter value}Hours From Abandonment
    • Emails Sent
      • Number of sent emails
    • Email Open Rate
      • Percent of unique opened emails among all sent emails
    • Cart Recovery Rate
      • Percent of all Recovered shopping carts among all shopping carts marked as Abandoned
    • Actions
  • each row
    • has edit button
    • has delete buttons
      • when deleting the notification - do not restore its hour statistics when new notification with the same interval will be created, for example:
        • 12 hours notification has 25% recovery rate  and 30% open rate
        • user deletes this notification
        • then user creates new notification and sets interval to 12 hours
        • new created notification should have 0% recovery rate and 0% open rate
    • may display disabled state
  • ability to sort by columns - Name ASC (default)
  • pagination
  • ability to bulk delete selected items
  • ability to filter items by state:
    • All (default)
    • Enabled
    • Disabled
  • Remember last selected show filter

DESIGN: https://invis.io/8C10J9OPQM7D 

Add new notification functionality:

  • “Add New Notification” button
    • Display Add/Edit Form side panel
      • Send Email After Cart Abandonment Delay (in hrs) (numeric)
        • allowed range between 1 and 876000
        • number of hours should be less than eCommerce -> Settings -> Shop Settings -> Shopping Cart Lifetime In Hours. Else error message: “Abandoned cart notification can't be created outside of the shopping cart lifetime.”
        • validate that selected number of hours is still not selected for another email. Else error message: “Abandoned cart notification for the selected delay is already exists”
      • Email (dropdown - list of Abandoned Cart Emails)
      • Enabled

DESIGN: https://projects.invisionapp.com/share/8C10J9OPQM7D#/screens/447828839

10) ‘Abandoned Cart Recovery’ > ‘Abandoned Carts’ tab

List of all abandoned carts.

  • Table columns
    • Name (left empty if shopping cart has no owner)
    • Email
    • Total Cost
    • Lifetime
      • Difference in hours between Current Date Time and Created Date Time
      • Pattern
        • if difference is more than 24 hours:
          [<numberOfDays> days  ]<numberOfHours> hours
        • if difference is less than 24 hours:
          [<numberOfHours> hours]<numberOfMinutes> minutes
      • Sorting should be done by decimal, eg:
        • 3 hrs and 30 minutes would be 3.50
        • 3 hrs and 31 minutes would be 3.52
    • Created Date Time
    • Last Update Date
    • Expiry Date (datetime when shopping cart will be deleted)
    • Actions
  • each row
    • has view and delete buttons
  • ability to sort by columns (Lifetime DESC - default)
  • pagination
  • ability to bulk delete selected items

DESIGN: https://projects.invisionapp.com/share/8C10J9OPQM7D#/screens/447828837

Abandoned Cart Details page

  • Details tab ( https://prnt.sc/ZIAX_np-6OGI)
    • Currency/Country
    • Assigned To (email)
    • Total Cost
    • Created Date Time
    • Last Update Date
    • Expiry Date
  • Products tab
    • shows shopping cart info (order lines, discount, gift voucher, shipping option data, etc.)

DESIGN: https://projects.invisionapp.com/share/8C10J9OPQM7D#/screens/447828838

11) History data

  1. Email Sent Recording (Store the following data)
    1. ShoppingCartId
    2. Email (shopping cart owner email)
    3. AbandonedCartNotificationId
    4. Record DateTime
    5. Type (EmailSent)
  2. Email Opened Recording (Store the following data)
    1. ShoppingCartId
    2. Email (shopping cart owner email)
    3. AbandonedCartNotificationId
    4. Record DateTime
    5. Type (EmailOpened)
  3. Shopping Cart Recovered Recording (Store the following data)
    1. ShoppingCartId
    2. Email (shopping cart owner email)
    3. AbandonedCartNotificationId
    4. Record DateTime
    5. Type (ShoppingCartRecovered)
  4. Shopping Cart Become Abandoned Recording (Store the following data)
    1. ShoppingCartId
    2. TotalCost
    3. Email (shopping cart owner email)
    4. Record DateTime
    5. Type (ShoppingCartBecomeAbandoned)
  5. Shopping Cart Become Deleted Recording (Store the following data)
    1. ShoppingCartId
    2. TotalCost
    3. Email (shopping cart owner email)
    4. Record DateTime
    5. Type (ShoppingCartDeleted)

12) Shopping cart delete operation upgrade

Before shopping cart delete action add a history record (Shopping Cart Become Deleted Recording). See (11.5)

13)  ‘Abandoned Cart Recovery’ > ‘Reports’ tab

  • Abandoned and recovered carts
  • Abandoned and recovered carts amounts
  • Abandoned and recovered carts report

DESIGN: https://projects.invisionapp.com/share/C2130V1FMP5X#/screens

14) Analytics dashboard charts

Provide ability to add

  • Abandoned and recovered carts
  • Abandoned and recovered carts amounts
  • Abandoned and recovered carts report

Show these charts only if Abandoned Cart Recovery extension is enabled/active

DESIGN: https://invis.io/7910J9P1H3CG

15) Admin User Role Restrictions

Add following admin user role restrictions

  • Abandoned Carts
    • Can View
    • Can Delete
  • Abandoned Cart Notifications
    • Can View
    • Can Add
    • Can Edit
    • Can Delete
  • Abandoned Cart Emails
    • Can View
      • allows to see Abandoned Cart Emails tab on ‘Email Notifications’ > ‘Emails’ page
    • Can Add
      • allows to show add button on ‘Email Notifications’ > ‘Emails’ page (tab Abandoned Cart Emails).
      • allows to show add new follow-up email button on create follow-up form
    • Can Edit
    • Can Delete
      • these 2 restriction above should allow to view ‘edit’ and ‘delete’ buttons on ‘Email Notifications’ > ‘Emails’ page (tab Abandoned Cart Emails)
  • Abandoned Cart Report
    • Can View

Show these restrictions only if Abandoned Cart Recovery extension is enabled/active.

On create new admin user role set all restrictions above to true by default.

Disable detail layout feature

New module setting:

Add new module setting called “Disable detail layout” (checkbox - false by default)

Logic:

If ‘Disable detail layout’ is TRUE:

  • Make unreachable all module items URLs of the module
  • Show module URL field as inactive.
    • Show but do not allow to change it from Admin UI and ignore changing on Backend
  • Show module item URL field as inactive.
    • Show but do not allow to change it from Admin UI and ignore changing on Backend
      • on edit module item action from Admin UI
      • on edit module item from frontend action
  • Hide Detail Layout dropdown on add/edit module item form in admin UI
    • preset "Don't use" value as default on backend on create item
  • Do not add items of the module to the SITEMAP
  • On Import process if creating a new item
    • if there is a detail layout column and it's value is empty set ‘Don't use’ layout instead of the first existed detail layout of the module (like it works now and should work when ‘Disable detail layout’ is FALSE)

The logic of Detail layout "Don't use" logic improvement

If module item has Detail layout property selected as "Don't use"

  • show 404 page content (with 404 status code) when accessing the item by URL
  • Do not add such items to the SITEMAP

Module item rating

1) Module item rating in the items list and detail forms (admin UI)

Provide ability to add Item Rating column in module -> table setup to show rating in item list view

Add new system property to Edit module item form

  • “Item Rating” (text)
    • Always readonly
    • if somehow value is posted via edit item endpoint, ignore value from request AND do NOT override value in DB (it should be calculated automatically once comments rating for this item are added edited or deleted)
    • Value=Average rating posted via comments to this item (Approved ratings counted only)

2) New module item liquid property

Add a new property to the module item (in liquid)

  • “Item_Rating” (numeric)
    • Value=Average rating posted via comments to this item (Approved ratings counted only)

3) Searching logic

Provide the ability to search by ‘Item_Rating’ property when using{% component type:"module", isSearchResult:"true"%}for searching, same as for Number custom property - via requesting a range using:

  • prop_Item_Rating_Min
  • prop_Item_Rating_Max

4) Sorting logic

Provide the ability to sort by ‘Item_Rating’ field in module component tag, eg:

{% component type:"module", sortBy: "Item_Rating", sortOder: "ASC/DESC" %}

Add full Urls to Export

Add additional column in the export module item file (as a display value only) for the full item URL (parent and slug)

  • Column title “URL list”
    • list of all item URLs separated by ;
    • placed after ‘Parents’ column
    • on import action; ignore this column (for display/export purpose only)

Example:
/module-slug/item-slug;/module-slug/parent-item-slug/item-slug

Rename Site information to Site Globals

1) Rename "Site information" to "Site Globals" in ‘Settings’ > ‘Site Information’ page

Example: https://prnt.sc/KpeG14rpKr4w

2) Change liquid aliases accordingly

  • {{siteinformation}}to{{siteglobals}}
  • {{si}}to{{sg}}

NOTE: Provide backward compatibility so that{{siteinformation}}and{{si}}will still continue to work.

3) Change "Site information" to "Site Globals" in OSE

OSE Related Improvements

  • Change the page tab title to “Edit <Page name>'”
  • If a multiline custom property or a Content system property contains <script, <style, {{, {% this property should be blocked for editing via OSE.
  • If a multiline custom property or a Content system property contains blocks with a data attribute 'cms_ose_editable_text' all content from this block should be parsed into a separate WYSIWYG like a multiline custom property. A title for this section should be determined from a data attribute 'cms_ose_editable_text_title'. If this attribute is not found the title for this WYSIWYG should be constructed as follows: '<this property name> Text Block <index>'.
  • If some page doesn't have custom modules for editing and this page can be edited, all editable properties should be shown by default on the toolbox.
  • Add a javascript event trigger 'CMS_TriggerRefreshOSEItems' for a 'load more' function on the site frontend for a list of module items refreshing on the toolbox. This one should be triggered after AJAX.
  • Do some small UI/UX changes: https://invis.io/9U12ZSAU5NZY
  • Add a module name to the toolbox title
  • Add an "add new item" button on the items list at the first position (if it's available on a module).

Multiline Text property changes

Change custom property settings in Modules for text (multiline) fields.
  • Rename ‘Enable WYSIWYG’ to ‘WYSIWYG’
    • default unchecked
    • if selected - allow the ability to use WYSIWYG view on add/edit item form in Admin
  • add ‘Code Editor‘ setting
    • default checked
    • if selected - allow the ability to use Code view on add/edit item form in Admin
  • if no option is selected - show the property as general textarea.

Eg: https://prnt.sc/c4PmuscwOLMd

Feature flags changes (v6.8)

Remove the following feature flag: ‘Improved Custom Reporting’

BUG FIXES

Bug

Liquid in domain_settings

https://treepl.slack.com/archives/C023SU50YQP/p1659597522511109

Liquid data is not correctly outputting the Currency Name.

Bug

CRM Contact - in secure zone not display ID

https://treepl.slack.com/archives/C023SU50YQP/p1655388079321519

CRMContacts component is not displaying the Secure Zone ID in the Secure Zone data.

Bug

Site Information - edit datapicker

Go to Site Information

In option Date Time add possibility to set time https://prnt.sc/aE6rxofG-tnr

https://treepl.slack.com/archives/C023SU50YQP/p1658336160885129

Bug

Page caching - desktop/mobile

Page is caching ‘device_type’ value in Liquid ‘request’ object.

Bug

Create/update item from front

Using <input type="checkbox" name="prop_Enabled" value="false"> in a custom module Add and Edit form to set it’s Enabled state doesn't seem to work.   https://treepl.slack.com/archives/C023SU50YQP/p1663164691768169

Show more less
New Feature

Abandoned Cart Functionality

Add Abandoned Cart functionality to eCommerce.
  • BC Equivalent
  • Ecommerce
New Feature

E-commerce Quoting Option

E-commerce quoting option so that when order goes through the admin it can be edited, changed, completed before the quote is transformed into an order and the invoice is issued for payment in full or for a deposit payment. A workflow can then also be generated for the order to go to the client/accountant/franchisee.

As part of this feature...
  • CRM
  • Ecommerce
New Feature

Headers settings custom setup

Header settings page. Ability to enable/disable header(s), ability to setup header's specific settings.
New Feature

Module item rating

Ability to add Item Rating column in module -> table setup and show rating in item list view.
New system property to Edit module item form,
new module item liquid property.
Ability to search by Item_Rating property when using {% component type:"module", isSearchResult:"true"%} for searching.
Ability to sort by Item_Rating field in {% component type:"module" %}. ...
Improvement

Add view only column Item Urls to Export

When exporting the products to a CSV file (export table), include the full product URL’s rather than just the parent so products can be linked to their URL’s.
Improvement

Checklist values with comma saving Fix

The created element from the frontend doesn't save the "checkbox list" property with the "," symbol. This will be addressed.
Improvement

Disable detail layout feature

If Disable detail layout is TRUE, make unreachable all module items URLs of the module.
If module item has Detail layout property selected as "Don't use", show 404 page content (with 404 status code) when accessing the item by URL.
Improvement

Event payment order with tax

Event payment should create order with tax now.
Improvement

eWay payment field expiration workaround

Extend eWAY payment gateway settings to avoid issue when credit card data determined as expired after second form submit even after payment data was fixed.
Improvement

"Remember Me" for CRM login form

Provide the ability to remember the logged-in state for CRM Members and configure its duration.
Improvement

Rename Site information to Site Globals

"Site information" block renaming to "Site Globals". Typical use-cases for Site Globals might be to store the company name, address, contacts, logo, etc. in one handy location and render that information throughout the site via Liquid.
Improvement

Tax rounding strategy setting

Ability to select tax rounding strategy:
- banker rounding + error compensation (unit price and total price)
- banker rounding (unit price only).
v 6.7 Release date: 08 Jun, 2022

Full Release Notes

BACKLOG

Feature flags changes (v6.7)

Apply the following changes to feature flags:

Move “Improved Custom Reporting” to internal section AND set enabled by default.

Zapier Integration

1) SSO oauth for zapier (+scopes)

Add oAuth 2.0 APIs

  • Authorization
  • Access Token Request
  • Refresh Token Request

Retrieved Bearer token should get access to Treepl CMS APIs created specially for Zapier (for the site that should be determined by domain)

Request Domain field on Zapier in order to retrieve access token to the particular site only

2) Extension rule

Add new Extension to the portal and to extension JSON file so portal user could enable and disable extension on the ‘Site’ -> ‘Extensions’ tab in the Portal

  • Title
    • Zapier Integration (beta)
  • Short Description
    • Allows handling the connection between Treepl CMS and apps that Zapier supports.
  • Information
    • Triggers

      (should be performed by Treepl once appropriate action is made in the CMS):

      -New Module Item
      -Updated Module Item
      -New CRM Member
      -Updated CRM Member
      -New CRM Form Submission
      -Updated CRM Form Submission
      -New CRM Event Booking
      -Updated CRM Event Booking
      -New Order
      -Updated Order
      -New Gift Voucher
      -Updated Gift Voucher
      -Triggered Workflow

    • Actions:

      -Create Module Item
      -Update Module Item
      -Create CRM Member
      -Update CRM Member
      -Create CRM Form Submission
      -Update CRM Form Submission
      -Create CRM Event Booking
      -Update CRM Event Booking
      -Update Order Details
      -Create Gift Voucher
      -Update Gift Voucher

    • Searches:

      -Find Module Item
      -Find CRM Member
      -Find CRM Form Submission
      -Find CRM Event Booking
      -Find Order
      -Find Gift Voucher
  • Pricing
    • Free during the beta period

3) Triggers

Return models for triggers:

  • Module Item
    {
       "Id":5661,
        "Name":"Item 1",
        "URL":"/svsdv/sdv/sdv/sdv/ad/item-1",
        "URL_List":[
            "/svsdv/sdv/sdv/sdv/ad/item-1"
        ],
        "URLSlug":"item-1",
        "ParentId":5654,
        "ParentId_List":[
            -1
        ],
        "ParentName":"",
        "ParentUrl":"",
        "TemplateName":"Don't Use Template",
        "Module_Alias":"MyModule",
        "Module_Id":5654,
        "Enabled":true,
        "ReleaseDate":"2023-03-03T01:00:00",
        "ExpiryDate":"9999-12-31T18:59:00",
        "SiteSearchKeywords":[
           
        ],
        "Description":"desc 1",
        "Weighting":0,
        "DisableForSiteSearch":false,
        "SKUCode":"",
        "Price":0,
        "CreatedByMemberId":"0",
        "ItemCategories":[
           
        ],
        "ItemCategoryIdList":[
           
        ],
        "ItemTags":[
           
        ],
        "Author":0,
        "Author_Name":"",
        "Author_Url":"",
        "ShowPageForSearchEngine":true,
        "MetaTitle":"",
        "SEOTitle":"",
        "MetaDescription":"",
        "CanonicalLink":"",
        "SocialMetaTags":"",
        "SeoPriority":0.5,
        "EnableAMP":false,
        "AMPContent":"",
        "OpenGraphProperties":{
            "Title":"test",
            "Type":"test",
            "Url":"test",
            "Locale":"test",
            "Image":""
        },
        "EventProperties":{
            " | HideWhenFull":false,
            " | AllowMultipleSubscriptionPerEmail":false,
            " | Capacity":0,
            " | Allocation":0,
            " | EventDateStart":"2022-04-26T08:07:54",
            " | EventDateEnd":"2022-04-26T08:07:54"
        },
        "ProductProperties":{
            " | SmallImage":"/Images/productimages/books/computers/flashmx_small.jpg",
            " | LargeImage":"/Images/productimages/books/computers/flashmx_large.jpg",
            " | OnSale":true,
            " | IsGiftVoucher":false,
            " | ProductWeight":0,
            " | ProductWidth":0,
            " | ProductHeight":0,
            " | ProductDepth":0,
            " | EnableDropShipping":false,
            " | UnitType":"",
            " | MinimumUnits":1,
            " | MaximumUnits":0,
            " | RecurringType":"None",
            " | IsShippable":false,
            " | IsDownloadable":false,
            " | NumberOfPossibleDownloads":0,
            " | Supplier":"test@test.test"
        },
        "CustomProperties":{
            " | Custom Property name 1":"",
            " | Custom Property name 2":0
        }
    }
  • CRM Member
    {
        "Id":1442,
        "Email":"test@test.com",
        "FirstName":"Jhon",
        "LastName":"Doe",
        "Address":"",
        "City":"",
        "State":"",
        "ZipCode":"",
        "Country":"",
        "BillingAddress":"",
        "BillingCity":"",
        "BillingState":"",
        "BillingZipCode":"",
        "BillingCountry":"",
        "Site":"",
        "Phone":"123456789",
        "Status":"",
        "Notes":"",
        "Type":"Consumer",
        "CreatedDateTime":"2019-06-12T17:28:59.07",
        "UpdatedDateTime":"2020-08-07T06:56:27.713",
        "CrmType":"Member",
        "CrmGroup":{
            " | My Group Name 1 | ":{
                "My Field Name 1.1":"field Value 1",
                "My Field Name 1.2":"field Value 2"
            },
            " | My Group Name 2 | ":{
                "My Field Name 2.1":"field Value 1",
                "My Field Name 2.2":"field Value 2"
            }
        }
    }
  • CRM Form Submission
    {
        "Id":1442,
        "Form":"form_alias",
        "Email":"test@test.com",
        "FormField":{
            " | My Field Name 1":"field Value 1",
            " | My Field Name 2":"field Value 2"
        },
        "CrmGroup":{
            " | My Group Name 1 | ":{
                "My Field Name 1.1":"field Value 1",
                "My Field Name 1.2":"field Value 2"
            },
            " | My Group Name 2 | ":{
                "My Field Name 2.1":"field Value 1",
                "My Field Name 2.2":"field Value 2"
            }
        }
    }
  • CRM Event Booking
    {
        "Id":1442,
        "Form":"form_alias",
        "Email":"test@test.com",
        "ModuleItem":123,
        "Allocation":1,
        "FormField":{
            " | My Field Name 1":"field Value 1",
            " | My Field Name 2":"field Value 2"
        },
        "CrmGroup":{
            " | My Group Name 1 | ":{
                "My Field Name 1.1":"field Value 1",
                "My Field Name 1.2":"field Value 2"
            },
            " | My Group Name 2 | ":{
                "My Field Name 2.1":"field Value 1",
                "My Field Name 2.2":"field Value 2"
            }
        }
    }
  • Order
    {
        "Id":1442,
        "Email":"test@test.com",
        "OrderName":"Checkout",
        "Status":"Paid",
        "InvoiceNumber":"1234",
        "InvoiceDate":"2022-01-01T13:34:44",
        "AWBNumber":"",
        "TrackingURL":"",
        "ShippingAddress":"",
        "ShippingCity":"",
        "ShippingState":"",
        "ShippingZip":"",
        "ShippingCountry":"",
        "CrmGroup":{
            " | My Group Name 1 | ":{
                "My Field Name 1.1":"field Value 1",
                "My Field Name 1.2":"field Value 2"
            },
            " | My Group Name 2 | ":{
                "My Field Name 2.1":"field Value 1",
                "My Field Name 2.2":"field Value 2"
            }
        },
        "PaymentType":"CreditCard",
        "FormId":13,
        "MemberId":47,
        "CaseId":89,
        "AmountPending":"0.0000",
        "AmountPaid":"10.0500",
        "PaymentIntentId":"XXXXXXXXXXXXXX",
        "PaymentIntentClientSecret":"XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "FormatSetting":{
            "Name":"AU",
            "Culture":"en-AU",
            "DecimalsQuantity":2,
            "Currency":{
                "Code":"AUD",
                "Symbol":"$",
                "DigitalCode":"36",
                "Name":"Australian Dollar"
            }
        },
        "DomainCountry":{
            "Name":"AUSTRALIA",
            "Code":"AU"
        },
        "DestinationCountry":{
            "Name":"AUSTRALIA",
            "Code":"AU"
        },
        "ShippingOption":{
            "Id":"12252410371037462605",
            "ShippingOptionId":"7361027874612052004",
            "Name":"AustraliaPost - Parcel Post",
            "Price":8.1364,
            "TaxPercent":10,
            "TaxRate":0.1,
            "TaxPrice":0.81,
            "TotalPrice":8.95,
            "SubTotalPrice":8.14
        },
        "Discount":{
            "Id":null,
            "Code":null,
            "Type":null,
            "Amount":0
        },
        "GiftVoucher":{
            "Id":null,
            "Code":null,
            "Amount":0,
            "Balance":0
        },
        "SubTotalPrice":"1.0000",
        "TaxPercent":"10.0000",
        "TaxRate":"0.1000",
        "TaxPrice":"0.9100",
        "DiscountPrice":"0",
        "TotalPrice":"10.0500",
        "ShippingPrice":"8.1364",
        "ShippingTaxRate":"0.1000",
        "ShippingTaxPrice":"0.81",
        "ShippingSubTotalPrice":"8.14",
        "ShippingTotalPrice":"8.95",
        "GiftVoucherPrice":"0",
        "SubTotalTaxPrice":"0.1000",
        "DiscountedSubTotalTaxPrice":"0.1000",
        "GrandTotalPrice":"1.1000",
        "TotalPriceExcludingTax":"9.1400",
        "TotalPriceExcludingTaxAndGiftVoucherAmount":"9.1364",
        "TaxCode":"GST",
        "Items":[
            {
                "Id":"15049017874163171386",
                "EcommerceItemId":2139,
                "SmallImage":null,
                "Name":"product 1",
                "Type":"ModuleItem",
                "ModuleId":0,
                "SKUCode":"39207d4d-c9c0-4a9d-a435-f2c8f8778e68/Size/Large",
                "Quantity":1,
                "ProductFileLink":null,
                "URL":"/shop/product1",
                "TaxCode":"GST",
                "OnSalse":false,
                "Price":0,
                "TaxPercent":10,
                "UnitPrice":1,
                "TaxPrice":0.1,
                "UnitTotalPrice":1.1,
                "TotalPrice":1.1,
                "UnitTaxPrice":0.1,
                "TaxRate":0.1,
                "TotalPriceExcludingTax":1,
                "UnitRecommendedPrice":0,
                "UnitRecommendedTaxPrice":0,
                "UnitRecommendedTotalPrice":0,
                "AttributesString":"Size: Large; Color: Green,Yellow",
                "Attributes":{
                    "Size":[
                        "Large"
                    ],
                    "Color":[
                        "Green",
                        "Yellow"
                    ]
                }
            },
            {
                "Id":"435",
                "EcommerceItemId":3453,
                "SmallImage":null,
                "Name":"product 2",
                "Type":"ModuleItem",
                "ModuleId":0,
                "SKUCode":"39207d4d-c9c0-4a9d-a435-f2c8f8778e68/Size/Large",
                "Quantity":1,
                "ProductFileLink":null,
                "URL":"/shop/product1",
                "TaxCode":"GST",
                "OnSalse":false,
                "Price":0,
                "TaxPercent":10,
                "UnitPrice":1,
                "TaxPrice":0.1,
                "UnitTotalPrice":1.1,
                "TotalPrice":1.1,
                "UnitTaxPrice":0.1,
                "TaxRate":0.1,
                "TotalPriceExcludingTax":1,
                "UnitRecommendedPrice":0,
                "UnitRecommendedTaxPrice":0,
                "UnitRecommendedTotalPrice":0,
                "AttributesString":"Color: Red",
                "Attributes":{
                    "Color":[
                        "Red"
                    ]
                }
            }
        ]
    }
  • Gift Voucher
    {
        "Id":27729,
        "OrderId":27725,
        "Balance":15.04,
        "Country/Currency":"US/USD",
        "Country":"US",
        "Currency":"USD",
        "Name":"GV000001",
        "Amount":34.04,
        "Enabled":true,
        "Type":"ViaShop",
        "RecipientName":"test 1",
        "RecipientEmail":"receiver1@test.test",
        "RecipientMessage":"svssv"
    }
  • Workflow
    {
        "Id":27877,
        "Name":"Custom Workflow name",
        "FromEmail":"sender@test.test",
        "FromName":"sender@test.test",
        "Recipients":[
            "receiver1@test.test",
            "receiver2@test.test"
        ],
        "EmailSubject":"Workflow Email Subject",
        "EmailBody":"Workflow Email Body"
    }
  • Comment
    {
        "Id":27877,
        "ModuleItemId":6212,
        "ParentId":null,
        "ThreadId":27877,
        "Rating":60,
        "Comment":"test3",
        "DateAdded":"2021-12-01T04:13:48.620183",
        "AuthorId":24071,
        "AuthorFirstName":"Jhon",
        "AuthorLastName":"Doe",
        "AuthorEmail":"testauthor@test.test",
        "AuthorIsAdmin":false
    }

Public Triggers (should be performed by Treepl once appropriate action is made in the CMS):

  • New Module Item
    • Module [dropdown (multiple)]
      • list of module names
  • Update Module Item
    • Module [dropdown (multiple)]
      • list of module names
  • New CRM Member
  • Updated CRM Member
  • New CRM Form Submission
    • Form Name [dropdown (multiple)]
      • list of forms
  • Updated CRM Form Submission
    • Form Name [dropdown (multiple)]
      • list of forms
  • New CRM Event Booking
    • Form Name [dropdown (multiple)]
      • list of forms
  • Updated CRM Event Booking
    • Form Name [dropdown (multiple)]
      • list of forms
  • New Order
  • Updated Order
  • New Gift Voucher
  • Updated Gift Voucher
  • Triggered Workflow
    • Workflow [dropdown (multiple)]
  • New Comment
    • Module [dropdown (multiple)]
      • list of module names
  • Updated Comment
    • Module [dropdown (multiple)]
      • list of module names

4) Actions

Once module item created/updated

  • add rollback with new source "Zapier"

Dropdowns in zapier forms

  • Secure Zone
    • Value: SecureZoneId
    • Display Name: SecureZoneName
  • Country
    • Value: CountryCode
    • Display Name: CountryName
  • Form
    • Value: FormAlias
    • Display Name: FormName
  • Module
    • Value: ModuleId
    • Display Name: ModuleName
  • ModuleItem
    • Value: ModuleItemId
    • Display Name: ModuleItemName
  • ContactCRMType
    • Value: TypeName (Consumer/Wholesaler)
    • Display Name: TypeName (Consumer/Wholesaler)
  • CRMRecord property
    • Value: Email
    • Display Name: Email
  • Datasource property
    • Value: ModuleItemId
    • Display Name: ModuleItemName
  • Tags property
    • Value: TagName
    • Display Name: TagName
  • Categories property
    • Value: CategoryFullName
    • Display Name: CategoryFullName
  • Template property
    • Value: TemplateId
    • Display Name: TemplateName
  • Detail layout property
    • Value: DetailLayoutId
    • Display Name: DetailLayoutName
  • Country/Currency
    • Value: Country/Currency string
    • Display Name: Country/Currency string
  • Order Status
    • Value: OrderStatusName
    • Display Name: OrderStatusName
  • Parents
    • Value: -1 or ModuleItemId
    • Display Name: / or Module Item Url
  • Workflow
    • Value: WorkflowId
    • Display Name: WorkflowName
  • Recurring Type
    • Value: RecurringTypeName
    • Display Name: RecurringTypeName

Public Actions (allows to create or edit items in Treepl  performed by Zapier):

  • Create Module Item
  • Update Module Item
    • Module [dropdown REQUIRED]
      • list of module names
    • Item Name [string REQUIRED]
    • URL Slug [string]
    • Description [string (multiline)]
    • System Fields (dynamic list of property names)
      Add an info block with the  name of the group of fields (before listing of fields)
      • Parents [dropdown (or dropdown multiple)]
        • list of parent module items
      • Template [dropdown]
        • list of templates
      • Detail Layout [dropdown]
        • list of templates
      • Enabled [boolean]
      • Disable from site search [boolean]
      • Release Date [date]
      • Expiry Date [date]
      • Weighting [string]
      • Site Search Keywords [string]
      • Added by [string]
        • value is email
        • if not found in CRM - skip this value
      • Secure Zones [dropdown]
        • list of secure zones
        • adds an item to secure zones
      • Tags [dropdown]
        • list of module tags
      • Categories [dropdown]
        • flat list of categories (labels are path-like: "/category/subcategory")
      • Author [dropdown]
        • list of authors
    • Event Fields (dynamic list of property names).
      Show these fields only if the selected module has "Enable bookings == true"  in (Module details => advanced settings).
      Add an info block with the name of the group of fields (before listing of fields).
      • Hide When Full [boolean]
      • Allow Multiple Bookings Per Email [boolean]
      • Capacity [number]
      • Event Date Start [date]
      • Event Date End [date]
    • Product Fields (dynamic list of property names).
      Show these fields only if the selected module is Product.
      Add an info block with the  name of the group of fields (before listing of fields)
      • Small Image [string]
      • Large Image [string]
      • On Sale [boolean]
      • Is Gift Voucher [boolean]
      • Product Weight [number]
      • Product Width [number]
      • Product Height [number]
      • Product Depth [number]
      • Enable Drop Shipping [boolean]
      • Unit Type [string]
      • Minimum Units [number]
      • Maximum Units [number]
      • Recurring Type [dropdown]
        • list of recurring types
      • Is Shippable [boolean]
      • Is Downloadable [boolean]
      • Number Of Possible Downloads [number]
      • Supplier [string]
    • Custom fields (dynamic list of property names).
      Each Zapier field should have the same type as the module property.
      Add an info block with the  name of the group of fields (before listing of fields)
      • Custom Fields…
  • Create CRM Member
  • Update CRM Member
    • First Name
    • Last Name
    • Email [REQUIRED]
    • Address
    • City
    • State
    • Zip
    • Country [dropdown]
      • list of countries
    • Site
    • Phone
    • Status
    • Notes
    • Type [dropdown]
      • list of types
    • Billing Address
    • Billing City
    • Billing State
    • Billing Zip
    • Billing Country [dropdown]
      • list of countries
    • Advanced Fields (dynamic list of property names).
      Each Zapier field should have the same type as advanced CRM group property.
      For each advanced CRM group add an info block with the Advanced CRM Group name - https://prnt.sc/kdChsqRILvXT
      • Advanced Fields…
  • Create CRM Form Submission
  • Update CRM Form Submission
    • Id [REQUIRED - for update form only]
    • Email [REQUIRED - for update form only]
    • Form Name [dropdown REQUIRED - for create form only]
      • list of forms
    • Form Fields (dynamic list of property names).
      List of all system and custom form fields.
      Add an info block with the name of the group of fields (before listing of fields)
    • Advanced Fields (dynamic list of property names).
      Each Zapier field should have the same type as advanced CRM group property.
      For each advanced CRM group add an info block with the Advanced CRM Group name - https://prnt.sc/kdChsqRILvXT
      • Advanced Fields…
  • Create CRM Event Booking
  • Update CRM Event Booking
    • Id [REQUIRED - for update form only]
    • Email [REQUIRED - for update form only]
    • Form Name [dropdown REQUIRED - for create form only]
      • list of forms
    • Module [dropdown REQUIRED - for create form only]
      • list of modules that have Enable Booking = true
    • Module Item [dropdown REQUIRED - for create form only]
      • list of forms
    • Allocation [number (default = 1)]
    • Form Fields (dynamic list of property names).
      List of all system and custom form fields.
      Add an info block with the name of the group of fields (before listing of fields)
    • Advanced Fields (dynamic list of property names).
      Each Zapier field should have the same type as advanced CRM group property.
      For each advanced CRM group add an info block with the Advanced CRM Group name - https://prnt.sc/kdChsqRILvXT
      • Advanced Fields…
  • Update Order Details
    Base information update only
    • Id [REQUIRED - for update form only]
    • Order Details (group of fields listing all system order fields)
      • Order Name [REQUIRED]
      • Status [dropdown]
        • list of statuses
      • Invoice Number
      • Invoice Date
      • AWB Number
      • Tracking URL
      • Shipping Address
      • Shipping City
      • Shipping State
      • Shipping Zip
      • Shipping Country [dropdown]
        • list of countries
      • Order Details…
        Add an info block with the  name of the group of fields (before listing of fields)
    • Advanced Fields (dynamic list of property names).
      Each Zapier field should have the same type as advanced CRM group property.
      For each advanced CRM group add an info block with the Advanced CRM Group name - https://prnt.sc/kdChsqRILvXT
      • Advanced Fields…
  • Create Gift Voucher
  • Update Gift Voucher
    • Id [REQUIRED - for update form only]
    • Name [string]
    • Recipient Name [string]
    • Recipient Email [string (email) REQUIRED]
    • Recipient Message [string (multiline)]
    • Country/Currency [dropdown]
      • list of Country/Currency pairs available for the site
    • Amount [number]
    • Enabled [boolean]
  • Create Comment
  • Update Comment
    • Id [REQUIRED - for update form only]
    • Module Item Id
    • Thread Id
    • Parent Id
    • First Name
    • Last Name
    • Email [REQUIRED]
    • Rating
    • Comment

5) Searches

Public Searches Form:

  • Find Module Item
    • Id
    • Module [dropdown]
      • list of module names
    • Item Name [string]
    • URL Slug [string]
    • Description [string (multiline)]
    • System Fields (dynamic list of property names).
      Add an info block with the name of the group of fields (before listing of fields).
      • Parents [dropdown (or dropdown multiple)]
        • list of parent module items
      • Release Date [date]
      • Expiry Date [date]
      • Weighting [string]
      • Added by [string]
        • value is email
        • if not found in CRM - skip this value
      • Tags [dropdown]
        • list of module tags
      • Categories [dropdown]
        • flat list of categories (labels are path-like: "/category/subcategory")
      • Author [dropdown]
        • list of authors
    • Event Fields (dynamic list of property names).
      Show these fields only if selected module has Enable bookings == true  in (Module details => advanced settings).
      Add an info block with the  name of the group of fields (before listing of fields)
      • Capacity [number]
      • Event Date Start [date]
      • Event Date End [date]
    • Product Fields (dynamic list of property names).
      Show these fields only if the selected module is Product.
      Add an info block with the  name of the group of fields (before listing of fields)
      • Small Image [string]
      • Large Image [string]
      • On Sale [boolean]
      • Is Gift Voucher [boolean]
      • Product Weight [number]
      • Product Width [number]
      • Product Height [number]
      • Product Depth [number]
      • Enable Drop Shipping [boolean]
      • Unit Type [string]
      • Minimum Units [number]
      • Maximum Units [number]
      • Recurring Type [dropdown]
        • list of recurring types
      • Is Shippable [boolean]
      • Is Downloadable [boolean]
      • Number Of Possible Downloads [number]
      • Supplier [string]
    • Custom fields (dynamic list of property names).
      Each Zapier field should have the same type as the module property.
      Add an info block with the  name of the group of fields (before listing of fields)
      • Custom Fields…
  • Find CRM Member
    • Id
    • First name
    • Last Name
    • Email
    • Address
    • City
    • State
    • Zip
    • Country [dropdown]
      • list of countries
    • Site
    • Phone
    • Status
    • Notes
    • Type [dropdown]
      • list of types
    • Billing Address
    • Billing City
    • Billing State
    • Billing Zip
    • Billing Country [dropdown]
      • list of countries
  • Find CRM Form Submission
    • Id
    • Form Name [dropdown]
      • list of forms
    • Email
  • Find CRM Event Booking
    • Id
    • Form Name [dropdown]
      • list of forms
    • Email
  • Find Order
    • Id
    • Email
    • Order Name
    • Status [dropdown]
      • list of statuses
    • Invoice Number
    • Invoice Date
    • AWB Number
    • Tracking URL
    • Shipping Address
    • Shipping City
    • Shipping State
    • Shipping Zip
    • Shipping Country [dropdown]
      • list of countries
  • Find Gift Voucher
    • Id
    • Name [string]
    • Recipient Name
    • Recipient Email
    • Recipient Message [string (multiline)]
    • Country/Currency [dropdown]
      • list of Country/Currency pairs available for the site
    • Amount [number]
  • Find Comment
    • Id
    • Module Item Id
    • Email
    • Rating
    • Comment
  • Find Workflow
    • Id
    • Name

6) Restrictions

Do not allow to process triggers, actions and searches if zapier extension is disabled for the site

BUG FIXES

Blog - Advanced Settings

  1. Go to Blogs -> Settings -> Advanced Settings
  2. Check the checkboxes https://prnt.sc/2LZBske6Eoq4
  3. Create a new blog post at the root https://prnt.sc/WGxwtVVnkrfU
  4. Pay attention to the Blog field https://prnt.sc/ZJ7OZPf8pl2O

Expected: The field should be auto-filled
Actual: The Blog field is empty https://prnt.sc/ZJ7OZPf8pl2O
Actual2: After clicking save with an empty Blog field alert is shown https://prnt.sc/i6h5n1vtO3_V

Categories - delete info about ParentID and URL SLUG

https://treepl.slack.com/archives/CC1074CQM/p1635205184014000

  1. Create on a page this component {% component type: "module_category_list", module: "Blog Post",  collectionVariable: "test" %}
    <pre>{{test}}</pre>
  2. On front shouldn't display ParentID and URL SLUG https://prnt.sc/1xd4lla
  3. ALSO when you filter Without ParentItemId - shouldn't display URL slag https://prnt.sc/1xd6vyw Screen from v5 https://prnt.sc/1xd6xfq

Actual:

Display ParentID and URL SLUG https://prnt.sc/1xd4lla AND filter https://prnt.sc/1xd6vyw

Expected:

Screen from v5 https://prnt.sc/1xd4o4n AND filter https://prnt.sc/1xd6xfq

Custom Module - create/update item

Add ‘Release Date’ field to the layout of the form for creating and updating an item with a custom module

1) creating https://www.screencast.com/t/LOdThMS6beL

<label>Release Date</label>

<input type="datetime-local" name="prop_ReleaseDate" value="" >

2) update https://www.screencast.com/t/FAQTcDc2lr33

<label>Release Date</label>

<input type="datetime-local" name="prop_ReleaseDate" value="{{this.ReleaseDate | date: "%Y-%m-%dT%H:%M"}}" >

Show more less
New Feature

Zapier Integration

Zapier integration to handle the connection between Treepl CMS and apps that Zappier supports.
Support of the following Zapier integrations:

Triggers (should be performed by Treepl once appropriate action is made in the CMS):

  • New Module Item
  • Updated Module Item
  • New CRM Member
  • Updated CRM Member
  • New CRM Form Submission
  • Updated CRM Form Submission
  • New CRM Booking Subscription
  • Updated...
  • Extensions
v 6.6 Release date: 11 May, 2022

Full Release Notes

BACKLOG

Site Storage Email Notification

Extend the "approaching limit" email notification repetition for site storage (when storage exceeds 90% capacity)

Now to be once a week instead of once a day

Preview and Draft Mode

Preview and Draft mode on pages and custom modules.

DESIGN:

https://invis.io/TXX3577QCWJ 

1) Draft Mode logic

Provide the ability to:

  • save draft content of ‘Settings’ and ‘SEO’ tabs for Module Items
  • save draft content of ‘Settings’ tab for Content Templates
  • delete the draft version of the content
  • switch between draft and live mode
  • preview draft
    • the draft should be accessible by the same URL but with GET param ?DraftPreview=true
    • if no draft content is available - show live content of the item
  • Save draft content to live
    • clicking on the ‘Publish’ button commits the draft version to live (overriding the previous live version)
    • draft content should be deleted on this operation

On opening edit item form

  • always show live version of the content

2) FTP sync of pages logic

  • Changes made via FTP applied to Live content ONLY

3) Special Properties Exceptions

Changing these fields on draft should be ignored:

  • SKU Code
  • URL slug
  • Parent items
  • Home page state
  • Secure zone assignment
  • Product Downloadable File
  • Recurring Type

eg: https://prnt.sc/sba18v 

4) Draft accessibility

Ability to switch to draft mode should be allowed/restricted via Admin User Roles for the ‘Can View And Manage Draft’ option.

5) Admin User Roles/Permissions

Add permissions option to the following module groups:

  • Each Custom module permissions group
  • Default Custom Module permissions group
  • Page permissions group
  • Content Template permissions group
  • Blogs permissions group
  • Blog Posts permissions group
  • Banner Groups permissions group
  • Banners permissions group
  • Galleries/Sliders permissions group
  • Slides permissions group
  • FAQ Groups permissions
  • FAQ Questions permissions
  • Authors permissions group
  • Products permissions group
  • Catalogs permissions group
  • Events Group permissions
  • Event permissions group

Permissions option:

  • Can View And Manage Draft
    if restriction is disabled; do not show switcher between draft and live mode on item edit form in admin [UI]

{{order}} Object To Be Generally Available

Original request:
https://treepl.co/public-backlog-state/request/_order-object-to-be-generally-available

Documentation (shown all places where order object is not available but should)
https://docs.treepl.co/liquid/order-object#secOrderObjectAvailability
Screen shot: https://prnt.sc/ytsrt6

1) BUG Fix:

Supplier System Email:
In ‘Email template’ - {{this.order}} data not working

2) BUG Fix:

All system Emails and autoresponders:
‘From name’ and ‘Subject’ are not parsed via liquid with the same context as body.

3) Improvement: When product with supplier is purchased add supplier email to the order line object https://prnt.sc/s5dy3k 

4) Improvement: Further ‘order’ object support:
Add ‘this.order’ object to the following places (set null value if no payment occurred)

  • form thankyou page
    • for paid secure membership (generic form)
  • workflow (Body)
    • for paid secure membership (generic form)
  • workflow (From, Subject fields)
    • for paid secure membership (generic form)
    • for paid form (generic form)
    • for paid form (single item form)
    • for paid form (checkout form)
  • autoresponer (Body)
    • for paid secure membership (generic form)
  • autoresponer (From, Subject fields)
    • for paid secure membership (generic form)
  • Supplier Email (From, Subject fields)
    • for paid form (checkout form)
  • Low Stock Email (From, Subject fields)
    • for paid form (checkout form)
  • Gift Voucher Email (Body)
  • Gift Voucher Email (From, Subject fields)
  • Secure Zone Details Email (Body)
    • for paid secure membership (generic form)
  • Secure Zone Details Email (From, Subject fields)
    • for paid secure membership (generic form)

[Portal] Emergency Settings

Add a new page in the Portal for Emergency Settings

Page should contain the following settings (just store saved data. No additional logic based on these are required)

All fields are NOT required

  • First name
  • Last name
  • Email
  • Phone number
  • Any additional info

Design:
https://invis.io/8512E2GQU7XY 

Add Shipping Address Fields to Form Builder

1) Address fields on the form settings

Add ‘Shipping Address’ and ‘Billing Address’ buttons to Form builder http://prntscr.com/1juqgk3.

Once selected add a group of fields to the default layout of the form.

Show them on the form builder as a group of fields: https://prnt.sc/fVWSzhSGvoa-

Fields that should be added to the form layout are:

  • Shipping Address
    • Payment_ShippingAddress (Shipping Address)
    • Payment_ShippingCity (Shipping City)
    • Payment_ShippingState (Shipping State)
    • Payment_ShippingZipCode (Shipping ZIP Code)
    • Payment_ShippingCountry (Shipping Country)
  • Billing Address
    • Payment_BillingAddress (Billing Address)
    • Payment_BillingCity (Billing City)
    • Payment_BillingState (Billing State)
    • Payment_BillingZipCode (Billing ZIP Code)
    • Payment_BillingCountry (Billing Country)

Both fields can be marked as required. And once marked as required - all fields inside the group become required (address, city, zip etc) and vice-versa.

2) Form submission flow

When such a form is submitted - add ‘Shipping Address’ and ‘Billing Address’ data to the CRM Order object (like it works previously for Shipping Address fields)

NOTE:

  • For backward compatibility - use value of the ‘formData.Zip_Code’ as value for shipping zip code as well as the value of ‘formData.Payment_ShippingZipCode’
    • if both occurred in the ‘formData’ then use ‘formData.Payment_ShippingZipCode’
  • For backward compatibility - always check if Shipping fields are present in ‘formData’ even if they are not selected on the form builder.
  • Do not use value of ‘Payment_ShippingCountry’ on form (type “checkout”). Use value of the selected shipping country from the shopping cart.

3) Attach billing and shipping address fields to appropriate CRM entities

  • Add ‘billing address’ fields to the ‘contact’ entity
    • migrate data from contact address to contact billing address
    • setup payment logic to take the address from the contact billing address field instead of the contact address field
      • if the billing address field is empty - use the contact address fields
  • Add ‘shipping address’ fields to the ‘order’ entity

4) Update the billing address from the payment gateway

  • When changes to the billing address come from payment providers update ‘contact billing address’ fields instead of ‘contact address’ fields

5) Liquid output

  • Add the following properties to the ‘contact’ liquid object
    • BillingAddress
    • BillingCity
    • BillingState
    • BillingZipCode
    • BillingCountry
  • Contact liquid object occurrence
    • {{request.currentmember}}
    • item from {% component type: "CRMContacts" %}
    • {{ this.member }} on system pages
    • {{ this.member }} on system emails
    • {{ this.member }} on autoresponder emails
      • on form submission
      • on create module item submission
    • {{ this.member }} on workflow and follow-up emails

6) Add these fields to Import/Export processes

  • add billing address fields to contact import/export
  • add shipping address to order import/export

7) Restore to default "checkout" form upgrade

  • Remove adding hard-coded shipping fields to the HTML layout of the form with the type "checkout" when clicking "restore to default" on form layout

Alphabetised Related Products list

Original description:

Currently the ‘related products’ for any product are not listed in alphabetical order and there is no search field.

This means you have to try to locate the product you want by scrolling through a random list of products, to try and find the right product to add as ‘related’.

This needs to be alphabetised based on the name of the product as well as have a search function so you can quickly locate the correct product to add.

Improvement:

Both alphabetical list and search fields added to Related Products UI.

DESIGN:
https://invis.io/V810G318WBN6

eCommerce User Input Field For Products

Allow the capture of user input data (text) against a purchased product.

New Attribute type

  • User Input field

Output via liquid

  • Add new attribute type to ‘item_attributes’ liquid component.
  • Should be output as a text input on the default attributes layout.
  • Add it to the orderline of ‘order’ and ‘shopping cart’ object (the same as any other attribute data)

Advanced Logic of the attribute type

  • If a product with User Input attribute is added to cart more than once, unique text input should specify unique orderline (order, shopping cart), as opposed to adding an additional quality to the same product orderline.

Product Import/Export

Output value via Export function and apply value via an Import

Format:

  • [attribute name][is_required]|[attribute_type]|[is_inventory_item]:;
    • [attribute_type] is ‘8’ or ‘UserInput’

Example

  • Test attr text*|UserInput|False:;

Output via admin UI

  • Display in “Order” > “Products” on orderline

Updated Output in default layouts

  • invoice email
  • shopping cart
  • item_attributes component default layout

DESIGN:
https://invis.io/DY10G2CWHK9S 

Custom reCAPTCHA Key Setup

1) Add new properties to the Settings -> Misc => Recaptcha Settings group (under Recaptcha Version field)

  • reCAPTCHA v2 Site Key
  • reCAPTCHA v2 Secret Key
  • reCAPTCHA v3 Site Key
  • reCAPTCHA v3 Secret Key

All of these fields should be empty by default

2) Rename incorrect reCAPTCHA labels

  • Rename all ‘Recaptcha’ labels in admin to ‘reCAPTCHA’

3) Add the reCaptcha property to the ‘this’ object of the form:

  • {{this.recaptcha_sitekey}}  
    • the value should be determined based on what reCaptcha is added to the form.
    • If no reCaptcha is added to the form - set null

Use Settings -> Misc => reCAPTCHA Settings group fields to retrieve keys for the object.

  • If reCAPTCHA v2 Site Key, reCAPTCHA v3 Site Key are empty - use our system keys

4) Add property ‘system_recaptcha_sitekey’ property to the ‘request’ liquid object which renders the key as saved above or the system key if no custom key is available:

  • {{request.system_recaptcha_sitekey}}

5) Replace reCAPTCHA key instances for the following:

  • all web form layouts
  • default form layouts  (when generated by restore to default request)
  • system form layouts (when generated by toolbox request)
  • System pages
    • 401
    • reset-password
    • request-reset-password
  • System pages default layouts (when generated by restore to default request)
    • 401
    • reset-password
    • request-reset-password
  • CMS ‘Add scripts to head’ functionality (for Google reCAPTCHA API)

6) Change reCaptcha validation logic to use the secret key and site key stored in Settings -> Misc => reCAPTCHA Settings (or system keys if null)

The feature is based on:
https://treepl.co/public-backlog-state/request/custom-recaptcha-key-setup

Custom Modules - Show Image thumbnail in Table Columns

Original Description

The ability to show thumbnail in Custom Module table.

Where a Custom Module has an Item Property>Custom Property that is type Media.

In that Custom Module’s > Table of items can we add the option to show a thumbnail of the actual image as well as the current option to show its path.

https://treepl.co/public-backlog-state/request/custom-modules-show-image-thumbnail-in-table-columns

Improvement:

Show the value of the media property type (if it’s a displayable image format) as an image thumbnail.

Add tooltip on hover that will show image URL.

Images Caching Issues

Add ‘Empty Image Cache’ button to the gear menu.

Once clicked - clear all Image processor cache.

Once done - show message: “Image cache was successfully cleared.”

DESIGN:
https://invis.io/N4YDTMBRUFY

Source:
https://forum.treepl.co/t/images-caching-issues-in-custom-modules-blog-posts/106

Event Anniversary Emails

1) Create a new Settings section on a module settings page

Called “Follow Up Emails” which includes the option:

  • Enable Follow-Up Emails (checkbox) - preset to ‘true’ for Events module

Show section only if “Module” > “Advanced Settings” > “Enable bookings” is true.

2) Create a new tab "DEFAULT FOLLOW-UP EMAILS" on a module edit page

Display only if the module has ‘Follow Up Emails’ -> ‘Enable Follow-Up Emails’ setting set to ‘true’ AND if ‘Module’ -> ‘Advanced Settings’ -> ‘Enable bookings’ is true

Content:

  • List of default follow-up emails
  • ability to add new default follow-up email
  • ability to edit and delete default follow up email

DESIGN:
https://projects.invisionapp.com/share/JA10JVKP2K78#/screens/447175909

Add ‘Date Field’ column after ‘Delivery Type’

  • Show field display name if field exists
  • Show saved field alias if field doesn't exist any more (but alias is saved for a follow-up)

3) Create a new tab "CUSTOM FOLLOW-UP EMAILS" on a module item edit page

  • Display only if the module has ‘Follow Up Emails’ -> ‘Enable Follow-Up Emails’ setting set to ‘true AND if ‘Module’ -> ‘Advanced Settings’ -> ‘Enable bookings’ is true.

Content

  • “Send only custom follow-up emails” (checkbox)
    • When enabled, allow to add/edit/delete custom follow-up emails
      • List of custom follow-up emails
      • ability to add new custom follow-up email
      • ability to edit and delete custom follow up email

DESIGN:
https://projects.invisionapp.com/share/JA10JVKP2K78#/screens/447175909

  • Set title Delivery Time instead Delivery Date
  • Add Date Field column after Delivery Type
    • Show field display name if field exists
    • Show saved field alias if field doesn't exist any more (but alias is saved for a follow-up)

4) Change “Email Notification” -> “Workflow emails” page

Rename default admin menu item name from “Workflow Emails” to “Emails” and EntityAlias from ‘WorkflowEmails’ to ‘Emails’

In custom admin menus, find menu item with alias ‘WorkflowEmails’ and rename to ‘Emails’

Add tabs:

  • Workflow Emails
    • Place existing listing and “add workflow emails” logic here
  • Follow-Up Emails
    • Add listing and add/edit/delete Follow-up emails logic here
    • Show tab only if site plan is BUSINESS or higher

Set following restrictions based on site plan

  • Show ‘Email Notification’ -> ‘Emails’ page starting from BUSINESS plan
    • Show ‘Workflow Emails’ tab starting from PRO plan
    • Show ‘Follow-Up Emails’ tab starting from BUSINESS plan

5) Create/edit follow up email logic

  • Select one of the already created follow-up emails or create a new one (like it works on workflows - https://prnt.sc/TyNsogEjZwIa)
  • Choose the trigger date field
    • Release Date
    • Expiry Date
    • Event Date Start
      • show if the module has ‘Advanced Settings’ -> ‘Enable Booking’ = true
    • Event Date End
      • show if the module has ‘Advanced Settings’ -> ‘Enable Booking’ = true
    • all custom properties with type datetime
  • Choose a time shift for the chosen trigger date field: https://prnt.sc/nKOv35KSrxTw
    • Delivery Time (numeric)
    • Delivery Type (dropdown)
      • Days After
      • Days Before
      • Hours After
      • Hours Before
    • Date Field (dropdown) - list of module item date fields
      • system fields:
        • Release Date
        • Expiration Date
        • Event Date Start
        • Event Date End
      • custom fields (display name is the name of the custom field)
    • on edit
      • do not allow to save follow-up if Date Field is empty (only set field to be empty if the saved alias belongs to the date field that doesn't exist anymore)

6) Follow-Up Email sending logic

If the module has’Follow Up Emails’ -> ‘Enable Follow-Up Emails’ setting set to ‘true’ AND ‘Module’ -> ‘Advanced Settings’ -> ‘Enable bookings’ is true

  • Schedule sending follow-up emails for each module item (for each subscriber to this module item) based on the selected date field:
    • For module items that have ‘Send only custom follow-up emails’ = true
      • send only custom follow-up emails
        • if there are no custom follow-up emails in the list - no email will be sent for this module item
    • For module items that have ‘Send only custom follow-up emails’ = false
      • send only default follow-up emails

7) Email liquid

‘this’ object should contain the following properties:

  • item
    • object that contains same fields as item from component type module (including event fields)
  • member
    • module item subscriber

8) Site Plan Restrictions

Allow view and use of ‘Follow Up Emails’ on module settings if site plan is PRO or higher

Hide DEFAULT FOLLOW-UP EMAILS on module view and CUSTOM FOLLOW-UP EMAILS tab on module item view if site plan is lower than BUSINESS

If site's plan is ESSENTIAL

  • disallow sending followup emails
  • if plan will be restored to BUSINESS or higher all follow-up emails that wasn't sent while site plan was ESSENTIAL should NOT be sent after plan upgrade

9) Admin User Role permissions

Ability to enable/disable Default and custom followup emails should be managed by ‘Can Edit Basic Module Settings’ module's restriction

Add following admin user role permissions:

  • Emails
    • Can View
      • if disabled; hide 'Email Notifications' -> 'Emails' menu item and do not allow to open 'Email Notifications' -> 'Emails' page
  • Follow-ups
    • Can View
      • if disabled; hide DEFAULT FOLLOW-UP EMAILS on module view and CUSTOM FOLLOW-UP EMAILS tab on module item view
    • Can Add
    • Can Edit
    • Can Delete
      • these 3 restriction above should allow to view ‘add’, ‘edit’ and ‘delete’ buttons on DEFAULT and CUSTOM follow-ups pages
  • Follow-up Emails
    • Can View
      • allows to see ‘Follow-up Emails’ tab on mail ‘Notifications’ -> ‘Emails’ page
    • Can Add
      • allows to show ‘add’ button on 'Email Notifications' -> 'Emails' page (tab ‘Follow-up Emails’)
      • allows to show ‘Add new follow-up email’ button on create follow-up form
    • Can Edit
    • Can Delete
      • these 2 restriction above should allow to view ‘edit’ and ‘delete’ buttons on 'Email Notifications' -> 'Emails' page (tab ‘Follow-up Emails’)

On create new admin user role

  • set all permissions above to true by default

For all existed admin user roles

  • All permissions above should be false
  • On update from v6.5 to v6.6
  • Add to all existing admin user roles following permissions with preset value
    • ‘Emails’ -> ‘Can View’ with value TRUE if
      • current user role permission has ‘Workflow Emails’ -> ‘Can View’ == true

10) Duplicating module item logic

Duplicate ‘Send only custom follow-up emails’ checkbox when duplicating the module item

Duplicate ‘Custom follow-ups’  when duplicating the module item

11) Duplicating module logic

Duplicate ‘Enable Default Follow-Up Emails’ AND ‘Enable Custom Follow-Up Emails’ settings

Duplicate ‘Default follow-ups’  when duplicating the module

12) Import/Export of module items

Add ‘Send only custom follow-up emails’ checkbox to import/export process

‘Follow-ups’ should NOT be added to module item import/export process

13)  Import/Export of module logic

Add ‘Enable Default Follow-Up Emails’ AND ‘Enable Custom Follow-Up Emails’ checkboxes to module import/export process

Do NOT add ‘Default follow-ups’  to export file

HTML security for GET url params in liquid request object

Add new filter to liquid

  • unescape

This filter should decode html entities to its original strings (as an opposite to ‘escape’ filter)

Example

  • {{"&lt;br&gt;" | unescape}}
  • result = <br>

Improve liquid XSS security by implementing the following improvements in the ‘request.request_url.params’ liquid object

  • convert all URL get parameters values to become HTML decoded

Example:

  • URL:
    /my_page?myParam=<script>alert(1);</script>
  • page content:
    {{request.request_url.params.myParam}}
  • expected output
    • &lt;script&gt;alert(1);&lt;/script&gt;
  • in case you will need to output original html - using this filter should help
    • {{request.request_url.params.myParam | unescape }}

 Add "Is Main Order" and "Is Recurring Order" property to order fields on Contact and order custom report

Improve Contacts and Orders custom report

  • Add "Is Main Order" property to order fields
    • type
      • boolean
    • Add it to the 'Fields' tab ('Order Fields 'section)
    • Add it to the ‘Filters’ tab
    • Logic: Shows if the current order is a main or a suborder
  • Add "Is Recurring Order" property to order fields
    • type
      • boolean
    • Add it to the 'Fields' tab ('Order Fields 'section)
    • Add it to the ‘Filters’ tab
    • Logic: Shows if the current order is a main or a suborder

BUG FIXES

Secure media file - uploaded images display broken

Secure media file - uploaded images display broken

If the user creates an item from the front and upload an image - (media-files folder should be SECURE https://prnt.sc/PsCLJTjnbpig 

Search engineer - expire date

https://treepl.slack.com/archives/C023SU50YQP/p1650902685179869

If item or custom module has expiry date and those modules expire - they should disappear from site map.

Sitemap and robots.txt

If there is no robot.txt file or it is there but empty, paste it there:

User-agent:*
Disallow:

Sitemap: link to sitemap as it is now

otherwise, we do not update the robots.txt file at all

in this way, we will pre-install default settings on all new sites - and if the file is not empty, then we consider that it is already customized and we do not touch it

and if they want to reset to default - let them delete the file or make it empty

Custom module - name of properties with "-"

https://treepl.slack.com/archives/C023SU50YQP/p1643293254025400

If create name of propery with "-" they do not display correctly on "Update form” on front-end: https://skr.sh/sCIsq9GzArG

ALSO doesn't work in JSON {% component source: "2", layout: "List", object: "collection", collectionVariable: "family", type: "module" %}
<pre>{{family.items[0].mother-in-law}}</pre>

Parent/Child custom module - not correctly display name of properties

  1. Go to Event and open settings
  2. Create several properties on Events and on Event Group
  3. After that change location for those properties
  4. Click on the first property and display not correct name of the property https://prnt.sc/KVh33JDdU6NV 

VIDEO:

https://treepl.slack.com/archives/C023SU50YQP/p1650437259226309

Show more less
New Feature

Event Anniversary Emails

The ability to send a custom email to the subscriber with information about the event they had purchased and anniversary emails to subscribers based on the course date ie. -3, +3 so you can easily remind participants of the event and then request feedback about it.
And being able to download a report of all event participants.


  • BC Equivalent
  • Emails
  • Events
  • Workflow
New Feature

Preview And Draft Mode For Pages And Module Items

The ability to save a draft and preview this, before the page/item is published.

  • BC Equivalent
  • Custom Modules
  • Pages and Templates
Improvement

Add Shipping Address Fields to Form

Add Shipping Address fields to System Form Properties.

Shipping Address
Shipping City
Shipping State
Shipping Zip
Shipping Country
  • BC Equivalent
  • Forms
Improvement

Custom Modules - Show Image thumbnail in Table Columns

The ability to show thumbnail in Custom Module table. Where a Custom Module has an Item Property>Custom Property that is type Media. In that Custom Module’s > Table of items can we add the option to show a thumbnail of the actual image as well as the current option to show its path.
  • Custom Modules
Improvement

Custom reCAPTCHA Key Setup

Ability to setup your own reCAPTCHA key to the particular site (in such way you will have all reCAPTHA statistics in google reCAPTCHA dashboard).
  • Forms
  • Secure Zones
Improvement

eCommerce User Input Field For Products

Request for BC Equivalent Functionality - The ability to add a user-input field to a product listing to capture details specific to that product. For example - embroidery on a shirt, message on flowers or icing on a cake etc.

This is functionality that BC provided and appears to be common in eCommerce solutions, it would be great to...
  • BC Equivalent
  • Ecommerce
Improvement

{{order}} Object To Be Generally Available

Currently, the Liquid {{order}} object is accessible only in the system Invoice layout.

If possible, requesting this be made generally available - the same as the other form submission related objects: {{formSubmissionData}}, {{workflow}} and {{member}}.

ie: in the forms autoresponder fields, workflow notification email fields and the forms JSON response/confirmation page (system or custom page)....
  • Liquid
Improvement

Related Products Alphabetised

Currently the ‘related products’ for any product are not listed in alphabetical order and there is no search field.

This means you have to try to locate the product you want by scrolling through a random list of products, to try and find the right product to add as ‘related’.

This needs to be alphabetised based on the...
  • Admin Panel
  • BC Equivalent
  • Ecommerce
v 6.5 Release date: 16 Mar, 2022

Full Release Notes

BACKLOG

Custom Reports Filter improvement

Create Feature flag in Beta section called “Improved Custom Reporting”

1) Create new filters for the custom reports:

LOGIC:

  • in
    • Found all items that have a property value that is equal to one of the supplied list of values
  • not in
    • Found all items that have a property value that is not equal to all of the supplied list of values

DESIGN:

https://www.screencast.com/t/VPxURiSmdzC

2) Provide the ability to select several secure zones (like on tags):

https://www.screencast.com/t/nLWIsnTY 

https://www.screencast.com/t/coZTiKynZ 

3) Order Status filtering improvement:

Rename current filter ‘Order Status’ to ‘Order Status Type’ (https://prnt.sc/hdByF4EMuxnC)

  • It should search by type name as it did before

Create new filter ‘Order Status’

  • It should search by status name

DESIGN:

https://invis.io/MQ12BUHBSXCF

4) Restrictions

Add following validation error messages:

On Saving filters if there is at least one ‘In’ or ‘Not In’ filter in filters list AND “Improved Custom Reporting” is disabled:

“Filters “In” and “Not in” are not allowed if feature flag “Improved Custom Reporting” is disabled.”

On Retrieving report results if there is at least one ‘In’ or ‘Not In’ filter in filters list AND “Improved Custom Reporting” is disabled:

“Results can’t be retrieved: Filters “In” and “Not in” are not allowed if feature flag “Improved Custom Reporting” is disabled.”

Custom Reports Generation Improvement

Improvements:

‘Report’ -> ‘Results’ tab

  • Improve speed of report generation and pagination.
  • Improved logic should be used only if feature flag is enabled

‘Report’ -> ‘Filters’ tab

Server monitoring inside dashboard

Provide the ability to manually set up server instances of the web farm to the CMS DB

If web-farm is enabled for the site - show charts of CPU Utilization for each server on the analytics dashboard

DESIGN:
https://invis.io/6T12DFCCWRGA

Server enabling by schedule inside dashboard + hours balance

Ability to schedule second server enabling for the period of time

Add/edit slot form fields:

  • Each slot should be at least 3 hrs long (if you need more time - you can add more duration). Available durations:
    • 3
    • 6
    • 9
    • 12
    • 15
    • 18
    • 21
    • 24
  • Allow to choose start time with 1hr step starting from 0:00 AM  till 11:00PM
  • Allow to setup slot name

When adding/editing slot:

  • do not allow to choose duration;
    • that overlap the next slot
    • if there is no gap (at least 1h) between current slot and next slot
  • do not allow to choose time that is busy by another slot or if this time is 1hr gap between slots
  • do not allow to decrease slot if it is currently active (only increase slot duration allowed)

Do not allow to delete past and currently active slots:

  • Allow deleting of future slots

Show time when next server enabling will be performed

Show hours balance

  • Buy more button should show popup with text:
    “Please contact us at support@treepl.co to schedule an extra server upgrade.”

DESIGN:
https://invis.io/6T12DFCCWRGA

Public API for Orders

Create public API endpoints:

  • CRM ORDERS
    • [GET] Get Orders List
    • [GET] Get Single Order
    • [PUT] Update Order

See temporary API endpoint documentation here.

API Applications setup:

Add new page:

  • Settings -> API Applications

Allow to:

  • list applications
  • create new application
    • Fields
      • Name [string] required
      • Enabled [boolean] default: true
    • DESIGN
  • Edit application
    • Fields
      • Name [string] required
      • Enabled [boolean] default: true
    • Allow to
      • copy `ClientId` and `ClientSecret`
      • regenerate `ClientSecret`
        • once regenerated - revoke all existed access tokens for the public API
    • DESIGN
  • Delete application
    • Show confirm dialog:
      “Are you sure you want to delete this app?”

Site Plan Restrictions:

Allow using Public API starting Pro plan

Admin User Restrictions:

Add restrictions

  • API Applications
    • Can View
    • Can Add
    • Can Edit
    • Can Delete

Retrieve access token endpoint:

  • URL
    • /api/v1/oauth/token
  • Type
    • POST
  • Content-Type
    • application/x-www-form-urlencoded
  • POST params
    • grant_type
      • client_credentials
    • client_id
      • {{client_id}}
    • client_secret
      • {{client_secret}}
    • scope
      • public_api

On Success return bearer token (life time 4 hours):

{
"access_token": "tokenStringHere",
"expires_in": 14400,
"scope": "public_api",
"token_type": "Bearer"
}

If an app is disabled - return error:

{
"ErrorCode" : 401001,
"Message"   : "The application is disabled"
}

If clientId/clientSecret pair wasn't found - return error:

{
"ErrorCode" : 401002,
"Message"   : "Invalid client_id and/or client_secret"
}

If site plan is less than Pro:

{
"ErrorCode" : 401003,
"Message"   : "Public API is restricted for your site plan"
}

If scope is invalid:

{
"ErrorCode" : 401006,
"Message"   : "Invalid Scope"
}

If grant_type is invalid

{
"ErrorCode" : 401007,
"Message"   : "Invalid Grant Type"
}

API version 1

All of the following endpoints requires Authorization header with the token retrieved by retrieve access token endpoint

​If any request doesn't contain access token or token can't be found in DB, show error:

{
"ErrorCode" : 401000,
"Message"   : "Invalid Access Token"
}

ElseIf any request contains access token but it has been expired, show error:

{
"ErrorCode" : 401004,
"Message"   : "Access Token expired"
}

ElseIf an app associated with the access token - is disabled:

{
"ErrorCode" : 401001,
"Message"   : "The application is disabled"
}

ElseIf access token - is revoked:

{
"ErrorCode" : 401005,
"Message"   : "The Access Token has been revoked"
}

BUG FIXES

Update item from front-end - rewrites ‘media’ type data

When user updates custom module item from front-end it rewrites data in any "Media" type properties.

Show more less
New Feature

API Access - open up the API (phase #1)

Opening up the API for authorised access to site data would really enhance the already excellent functions available within each site. It could allow access to site data for external software, programs and other websites and I believe would increase the appeal of the platform.

Current phase API's:
1) AUTH
- Retrieve access token

2) CRM ORDERS
...
  • API
  • BC Equivalent
New Feature

New Service (Enterprise)

Details and presentation coming soon 😏
Improvement

Customers And Products Report

Currently, the system will allow for a report on Customers and Orders, which can be filtered by Product, however, the results display ALL of the customer’s products in the order that contains the product that you’re filtering by. What we really need to is to be able to see all customers who purchased a specific product – but without displaying...
  • BC Equivalent
  • CRM
  • General
Improvement

Improved Custom Reporting

Custom Reports would be generated significantly faster than before.
Improved Custom Reporting would be available through feature flag (disabled by default).
You need to enable it manually for each site if you want to experience the improvement.
  • CRM
v 6.4 Release date: 07 Feb, 2022

Full Release Notes

BACKLOG

Extension manager improvement

Portal Changes

Rework ‘Site’ -> ‘Extensions’ tab in the Portal

Create extensions listing:
https://projects.invisionapp.com/share/GK120JMFPQMZ#/screens/460427508

The list should be limited by partner role.

Exclusive Extensions:

  • Granular white-labeling (for Agency only)
  • Import/export of modules (for Agency only)
  • Direct billing (for Agency and Partner)

Provide the ability to:

Allow Portal Users to get full access to the ‘Extensions’ tab (like Agency user has)

Extension: Website Backup

Add new extension to the list of current extensions:

  • Website Backup (beta)
  • Short Description:
    Manage your site backups (schedule, restore, etc.)
  • Information:
    Manage your complete site backups (manual, automated schedule, restore, etc.) and enable item rollback capabilities for Content Templates, Pages and other Modules

​Pricing is free during the beta period

Note: Backup extension is only available for sites running v6.4 or higher

Backup listing page

Design:
https://projects.invisionapp.com/share/FW121SWA84TV#/screens/460427502

Displays list of backup records, with actions/info:

  • Download Backup File
  • Restore Backup (see logic in Restore Backup Process)
  • Delete Backup
  • Pagination
  • Storage/Size info
  • Bulk delete operations
  • Backup now (see logic in “Backup Process”)
  • Upload Backup File (creates new backup record)

Settings page

Design:
https://projects.invisionapp.com/share/FW121SWA84TV#/screens/460427501

Scheduled backup settings:

  • Repeat Every (number 1 through 31)
  • Repeat Period
    • Day
    • Week (default)
    • Month
    • Year
  • Repeat Time (with hourly time increments)
  • Behavior On Low Storage
    • Email Portal Owner and skip new (default)
    • Remove oldest and create new
  • Storage
    • Treepl Storage (default)
    • Google Drive [possible future option]
    • Dropbox [possible future option]

Note: Treepl storage packages to come after Beta version.

Extension in Admin UI

Add menu item to admin menu titled “Extensions” showing the installed extension/s as a sub-menu item (ie; Website Backup)

The UI for the Backup extension here will be the same as in the Portal.

Backup Process

Design:
https://projects.invisionapp.com/share/FW121SWA84TV#/screens/460427504

Once backup process is triggered:

  • Show loader with progress
  • create new backup record
    • set type ‘Manual’ or ‘Scheduled’ based on the trigger source
    • set date of the backup
  • follow Backup logic described below
  • Once process is finished
    • remove loaders and enable all backups

Actions and buttons:

  • Cancel backup
    • shows confirm message before perform the action:
      “Are you sure you want to cancel the create backup process”

Scheduled Backup Process

Setup schedule checker based on Scheduled backup settings:

  • Trigger Backup Process once
    • difference between current date and latest backup date is bigger than Repeat frequency
    • AND
    • current time is the same as selected in Time field
      (the Time field is represented by the timezone of the site, not UTC)

Restore Backup Process

Design:
https://projects.invisionapp.com/share/FW121SWA84TV#/screens/460427505

Once Restore backup process is triggered, show confirmation window with the following text and buttons:
“Your current version of the site will be restored to the backup version.
Please make sure you have made a backup of the site before starting the restoration if this data is important for you.”

Ok | Cancel

If clicked Ok:

  • check if site is live or trial
    • if trial - check if site plan is lower than plan of the backup
      • if site plan is lower than in backup - upgrade site plan to the one from backup
        • Show loader with progress
        • Disable all backups (show in gray and hide action buttons)
        • Check if reseller from the backup is the same as the current site's reseller
          • if true
            • Show loader with progress
            • Disable all backups (show in gray and hide action buttons)
          • If false
            • Show error popup:
              “You cannot restore a site from the backup due to permissions issue.”
        • restore
          • Custom Icons for admin menu
          • Appdata -> Custom Admin Menu json file
          • FTP files and folders
          • DB
        • restart site
        • remove loaders and enable all backups

Actions and buttons:

  • Cancel backup restoring
    • shows confirm message before perform the action:
      “Are you sure you want to cancel the restore backup process”

Upload Backup Process

Design:
https://projects.invisionapp.com/share/F2126E6QCRMB#/screens/462403051

Actions and buttons

  • Cancel backup uploading
    • shows confirm message before performing the action:
      “Are you sure you want to cancel the upload backup process”

Error message when there is not enough storage for uploaded backup file:
“You've run out of storage for the backups. Please upgrade your storage.”

Backup logic

1) Steps

  • Backup
    • DB
    • FTP files and folders
    • Appdata -> Custom Admin Menu JSON file
    • Custom Icons for admin menu
  • Store them to the encrypted file with the name
    • {siteSubdomain}-{datetime}.seed
  • Update progress on each step

2) Exceptions flows

  • Backup file size is greater than available storage
    • Based on the value of ‘Behavior On Low Storage’
      • Email me and skip new
        • Delete attempted backup files
        • Send “Low Storage Email” system email to reseller
      • Remove oldest and create new
        • if Backup file size is greater than full storage limit
          • Show message:
            “You've run out of storage for the backups. Your backup request has been cancelled. Please upgrade your storage and launch a new backup request.”
          • Follow ‘Email me and skip new’ flow
        • else
          • Get list of backups in order: createDate DESC
          • Delete backups starting from the first in the list until there will be enough space to store the backup
  • Only one backup or restore process is allowed for the same time. Show error message if trying to perform backup or restore once another process is working:
    “Only one backup or restoration process is allowed for the site at a time. Please wait until the current process is finished or cancel it and try again.”

Low Treepl Storage Email:

Send to

  • {ResellerEmail}

Subject

  • You've run out of storage for the {site_name} backups.

Content

  • You've run out of storage for the {site_name} backups. Your backup request has been cancelled. Please upgrade your storage and launch a new backup request.

    Upgrade

Logic

  • “Upgrade” button will lead to the ‘Portal’ -> ‘Site’ -> ‘Extensions’ -> ‘Website Backup’ settings page

Treepl Storage

Setup S3 bucket storage for all backups of Treepl storage.

Setup it on the same DC where the Treepl portal is located.

Setup 1GB of storage by default.

Extension uninstall behaviour

Do not delete all backup data stored on Treepl storage if partner clicks uninstall backup extension.

So if the extension is reinstalled at a later time - all previous backups would still be available.

Page Rollback Option

0) Store files for downloadable products on FTP

Move all current files for all products to ftp folder "/_downloadable_products", with file path using the folwing format: “/{productId}/{filename}.{fileext}”

  • New files stored in folder "/_downloadable_products" on product saving using the above file path format.
  • Deny access by URL to any file in this folder (show 404 page not found)
  • When new file is uploaded - do not delete previous file from the folder. So if you apply rollback to the version where another file was set, you can restore access to it.

1) Rollback setting in module settings

Create new collapsable section in module settings titled “Extension Settings” which provides the ability to enable rollback options in the module.

NOTE: Rollback is enabled by default for ‘Page’ module and ‘Content Templates’ for all site plans regardless of the Backup extension being installed or not.

Design:

https://projects.invisionapp.com/share/W6X356SMH23#/screens

2) Restriction logic

Rollback options are only provided for the site if the Backup extension is installed and is not expired - except for ‘Pages’ and ‘Content Templates’ which have rollback turned on by default.

3) Rollback listing on Items and Content Templates

Once Rollback is enabled for the item

4) Rollback recording logic

Recording logic should be applied to the following editing points:

  • Editing via admin UI
    • Save type is ‘Settings’ or ‘SEO’ (based on wich tab user is on saving)
  • Editing via FTP
    • Save type is ‘Settings’
  • Editing from the Edit Item Form (front-end)
    • Save type is ‘Settings’
  • Editing via import
    • Save type is ‘Settings’ AND ‘SEO’ (because import row may contain properties from both sections. Create 2 rollback records in this case)

Rollback records should be applied for different sets of item properties:

  •  type ‘Settings’
    • All fields that are shown in the ‘Settings’ tab of the item edit page in admin UI
    • For ‘Content Templates’ the fields include:
      • Name
      • IsDefault
      • Content
      • AmpContent
      • TemplateSettings
        • EcommerceJS
        • MainCSS
        • PaymentJS
        • RecaptchaJS
  •  type ‘SEO’
    • All fields that are shown in ‘SEO’ tab of the item edit page in admin UI

Once item or content template is edited (with changes made) in any editing point:

  • Create Rollback record (as type ‘Settings’) with the following info:
    • Source
      • Admin UI
      • FTP
      • Edit Item Form (from front-end)
      • OSE
      • Import
    • Data
      • all values of all properties of the item or template that they had before saving
    • Editor
      • Store CRM record Id or Admin record Id for linkage
      • View Format
        • Type
          • CRM Member
          • Admin User
          • Portal Owner
          • Portal User
            Display CRM Member and Admin User as links to the CRM contacts and Admin users details respectively.
    • Date
      • Create Datetime of the rollback

5) Rollback records delete flow

Every 6 hrs collect all rollback records that are older than 90 days and delete them.

6) Rollback flow

Design:
https://projects.invisionapp.com/share/XZ1228SX8M7N#/screens/461401436

When clicking ‘Restore’ rollback button:

  • If some values could not be restored (if value options no longer exist or property from rollback has another type then the current one)
  • else
    • Show Confirmation popup:
      “This version will now be loaded for previewing where you will have the option to 'Restore' the changes.”
      • clicking on ‘Restore’ rollback button:
        • Will preset edit form by the values from the rollback record (omitting values that could not be restored. If the property type is not the same as in the rollback - set empty value to the property)
        • change name of the Save button to Restore
        • This action requires user to click Restore in order to finalize restoring process
        • Show warning messages near fields that are not restored correctly

When clicking ‘Delete’ rollback button:

  • Delete rollback record from DB
  • Restrict Delete operation for all admin users except Partners.
    If user with another role triggers Delete rollback action, show message: “You don't have permission to perform this action”

7) Permissions

Add permissions to the following modules:

  • Each Custom module permissions group
  • Default Custom Module permissions group
  • Page permissions group
  • Content Template permissions group
  • Blogs permissions group
  • Blog Posts permissions group
  • Banner Groups permissions group
  • Banners permissions group
  • Galleries/Sliders permissions group
  • Slides permissions group
  • FAQ Groups permissions group
  • FAQ Questions permissions group
  • Authors permissions group
  • Products permissions group
  • Catalogs permissions group
  • Events Group permissions group
  • Event permissions group

Restrictions:

  • Can View And Manage Rollback History, if restriction is disabled:
    • do not show history button on item edit form in admin [UI]
    • block get history api endpoint [BE]
  • Can Enable/Disable Rollback On Module Settings, if restriction is disabled:
    • Hide Enable Rollback checkbox on module settings [UI]
    • Skip saving new value of Enable Rollback checkbox on editing module settings [BE]

DESIGN:

Rollback option in module settings:
https://invis.io/W6X356SMH23

Main design:
https://projects.invisionapp.com/share/XZ1228SX8M7N

domain redirects and non-www to www redirect

Domain redirects management (Portal)

Add Page for domain redirects management under ‘Site’ -> ‘Domain Redirects’ tab (next to Domains tab - https://www.screencast.com/t/t94mO7GEmy )

Show list of redirects

Provide ability to add, edit and delete redirects

Domain redirects management (CMS Admin)

Add Page for domain redirects management under ‘Settings’ -> ‘Domains’ -> ‘Domain Redirects’ tab ( https://invis.io/TQ11WXQDKYE4 )

Logic is the same as for the portal

Add/edit redirect form

  • From URL (dropdown)
    {list of all existing domains for the site, including www versions if existed}
  • To URL (dropdown)
    {list of all existing domains for the site, including www versions if existed, except domain selected in From URL}
  • Enabled (boolean) determines if redirect should be applied to the site or not

Add/edit redirect form logic

  • Add js that will exclude a domain from ‘To URL’ each time ‘From URL’ is changed
  • In order to apply redirects, the user needs to click ‘Apply’ button under the list of redirects. Otherwise, all changes will be lost once the user leaves the page
    • Show standard warning message if a user made any changes and go out of the tab without clicking ‘Apply’
  • Once clicked ‘Apply’:
    • Show confirmation popup with text:
      “Please note that we'll need to restart the site in order to apply the changes. The site will be unavailable for a few minutes right after the restart. Do not refresh the page, this will result in the"service unavailable" error.”
    • If clicked OK - show full page locking loader and wait until the site will be reloaded.
      Then hide loader

Portal: Leadership Team page

Add page to the portal titled “Leadership Team”

Design:
https://projects.invisionapp.com/share/ZJ122U2JWAGS#/screens 

Show Page for the following roles:

  • Partners
  • Agencies

Workflow notifications improvement for payments

Add sending form workflows after retrieving successful payment webhook (missing workflow logic for payment forms that redirects to payment site after submit)

  • Use Cases
    • Payment method = PayPal
    • Stripe 3D secure
  • Logic
    • if Form Submission Data contains customWorkflows field
      • take a list of workflow ids from it
    • else
      • take a list of workflows attached to the form in the settings tab

BUG FIXES

In SEO tab - SEO priority change after every saving

https://treepl.slack.com/archives/C023SU50YQP/p1641319429078700

  1. Go to page -> SEO tab -> set up SEO priority 1 https://prnt.sc/2640kr5
  2. After go to SETTINGS tab and click Save button https://prnt.sc/2640off
  3. Return to SEO tab - SEO priority change on 0.5 again

Actual: After saving, changes SEO priority

Expected: after any changes on page - all previously saved information shouldn't be changed

Orders - filter by caseid or orders doesn't works

https://treepl.slack.com/archives/C023SU50YQP/p1641438488002500

Actual: display error Liquid Error: FilterBy/SortBy value 'caseid' is incorrect

Expected: display form submission

Custom Module - edits to Table not correct

https://treepl.slack.com/archives/C023SU50YQP/p1642361221011500

Actual: Duplicates column after edit

Expected: After edited name of table - on list of modules display correct names of columns

[Portal] Display "Last updates" time is local for each partner

  1. Go to Portal -> Support page https://forum.treepl.co/t/portal-bug-ux-fix-support-ticket-last-updates-time-is-not-local/1081
  2. Column Last Update display not local time for each partner https://prnt.sc/1g215ux

Advanced CRM Group - not correct order after edit group

  1. Create advanced CRM Group and assigned to Contact
  2. Go to Contact and fill all fields https://prnt.sc/1w7wung
  3. After go to group and change order of fields
  4. Go to contact and  display old order BUT if open edit - display correct https://prnt.sc/1w7wzfi 
  5. THE SAME problem with UPDATE account form where use advanced CRM Group and assigned to Contact - https://prnt.sc/1w7xvmn

Offline payment - add ability to edit and delete from all types

  1. Create Offline Order
  2. Add an offline payment type https://prnt.sc/1wy0qig

Actual: Not display edit/delete buttons https://prnt.sc/1wy0qig

Expected: Should display edit/delete buttons
https://treepl.slack.com/archives/CRUAT8GGZ/p1634754580137000

Discount Codes - Release/Expiry Dates to match timezone

  1. Go to discount codes and create a new code with release and expiry dates as now

    Expected: Dates must match the time zone on the site
    Actual: Dates match the UTC time zone

Export Event Bookings with custom fields

  1. Create form SingleItem with custom fields and Adv CRM group
  2. After go to Events bookings and make export exactly from this new form
  3. In file not display custom fields
Show more less
New Feature

Page Rollback Option

Roll back function on pages, custom modules etc.

  • Admin Panel
  • BC Equivalent
  • Custom Modules
New Feature

Website Backup

Extra add-on that allows performing scheduled automatic backups of FTP files and database of the site saving it to an archive that can be stored locally or within a 3rd party storage service (Dropbox, Google Drive, etc.).
  • Extensions
v 6.3 Release date: 24 Nov, 2021

Full Release Notes

Features

Set “Enable Shipping” to true by default

Change the default value to “true” that is set for ‘Enable Shipping’ property on Product create action

Action Sources:

  • Product create form (admin UI http://prntscr.com/1w8tfm6 )
  • Import Product (for new products only AND if Enable Shipping column is not specified in the file)

Send Invoice number to payment provider

On Payment Form submit after successful validation:

  • If current shoppingCart.invoiceNumber == null
  • Generate invoiceNumber
  • Set invoiceNumber to the shoppingCart.invoiceNumber
  • Set shoppingCart.invoiceNumber to payment data of the payment providers:
    • Eway
    • Authorize
    • PayPal Flow (simple payment)
    • Stripe (in metadata)

Recurring products + canceling subscriptions for recurring product

Reworked recurring models so they all work the same:

  • StripeWebHook
    • + Stripe Customer Portal
  • PayPalWebHook
  • AuthorizeWebHook
  • Create Subscriptions
    • RecurringForms
    • Products
    • Events
    • New form type handler
      • + Discount/GiftVoucher logic

Original Request

Ability to create products with recurring subscription.

It will operate in a similar way it did in BC.

0) Fix logic for forms that are NOT type "Generic" that have recurring secure zone/s attached

Add new validation rule on form submission handler:

  • If form type is NOT "Generic" AND any of the secure zones attached to the form are recurring
    • Return error with message:
      Recurring secure zone subscription is not allowed for the "{formTypeAlias}" form type

Add new validation rule on form edit action (tab settings) in the admin:

  • If form type is NOT "Generic" AND any of the secure zone attached to the form are recurring
    • Return error with message
      "{formTypeAlias}" form type is not allowed for the form that has recurring secure zones subscriptions assigned.
  • If form type is NOT "Generic"
    • Show all non-recurring secure zones AND any already selected secure zones (even if they are recurring secure zones)

1) Shopping cart recurring rules

Add validation for ‘add to cart’ and ‘buy now’ functions

  • All products in the shopping cart should have the same recurring type
  • allow only products with the same recurring type to be added to the shopping cart.
    (This restriction should be applied because token payments don't allow creating multiple subscriptions for different recurring periods using one single payment token)

2) Recurring Orders

Once recurring order is created - mark it as “Main”

All orders that will be created by recurring payments for future payment cycles should be marked as “Suborder”. Link this order to the “Main” order.

Design for displaying “Main” and “Suborders” in the order list:

https://projects.invisionapp.com/share/FTZVU4BE9HS#/screens

Add suborders tab to the “Main” and “Suborders” detail page (api/orders/{id}/suborders)

Add ‘IsRecurring’ and ‘MainOrderId' to Order object: https://prnt.sc/1xpmgbd

3) Canceling Recurring Subscriptions

Provide ability to:

Cancel recurring subscriptions on “Order” > “Suborder” tab (api/orders/{orderId}/cancel-subscription-on-secure-zone)
- from the main order or any suborders
https://projects.invisionapp.com/share/FTZVU4BE9HS#/screens/441983574

Cancel subscription by logged in user:

  • Add new properties to the order object in liquid:
    • `mainOrderId` (int)
      • Tag output: {{order.mainOrderId}}
      • Description:
        instance id of the main order if current order is a recurring sub order
        • if order has NO recurring subscriptions or the order is Main in recurring order sequence
          • null
        • else
          • id of the main order
    • `isRecurring` (boolean)
      • Tag output: {{order.isRecurring}}
      • Description:
        true if order has attached recurring subscription
    • `hasActiveSubscription` (boolean)
      • Tag output: {{order.hasActiveSubscription}}
      • Description:
        true if order has attached recurring subscription AND it's state is Active, PastDue or Incomplete
  • [UI] Add "Cancel Subscription Form" to "CRM" toolbox menu (Show starting Pro plan)
    • Code Generated:
      {% if order.hasActiveSubscription %}  

      <form action="/public/api/subscriptions/{{order.id}}/cancel-subscription" method="post" onsubmit="return confirm('Are you sure you want to cancel this subscription?')"><input type="submit" value="Cancel Subscription"></form>

      {% endif %}  
  • if the form is submitted by a user who is not logged in 
    • show system error-page. With message:
      Not logged in users are not allowed to cancel subscriptions
  • if the form is submitted by a user that doesn't belong to the subscription
    • show system error-page. With message:
      You can't cancel the subscription that wasn't created by you

After cancelling a subscription:

  • Still show main order and sub orders on “order” > “suborder” tab
  • do not show cancel subscription button

4) Recurring Events

Add ability to create recurring event subscriptions.

  • add system field “Recurring Type” to the event system fields list
    (same field that is used for secure zones)
  • once payment is made using ‘SingeItem’ form linked to the event with “Recurring Type” not equal to None
    • create recurring subscription order using event price and period selected in Recurring Type
  • On event delete action - if it has active recurring subscriptions - show an error message:
    The item with active recurring subscriptions can't be deleted

5) Recurring Generic Forms

  • Create a new form type for general recurring payment
    • “Recurring” (for general forms with arbitrary recurring payment collection)
  • Only show and allow recurring secure zones via form’s Settings -> Secure Zones dropdown
  • add “Recurring Type” setting on Form -> Form Builder tab.
    • Do NOT show “None” option for Recurring Type
    • [UI] Show “Recurring Type” only if selected form type is “Recurring” (for both: create and edit form layouts)
  • ​On Create form action
    • if Form Type is Recurring
      • Automatically add "Accept Payment" field to the form
      • If Recurring Type accidentally comes as NULL or None
        • Set ‘Daily’ by default
  • On Edit form action (Form Builder tab)
    • if Form Type is Recurring
      • If the "Accept Payment" field is not selected on the form builder - show an error:
        Recurring form can't be saved without the "Accept Payment" field
      • If the "Email" field is not selected on the form builder - show an error:
        Recurring form can't be saved without the "Email" field
  • on Recurring from submitting (accident cases that should be prevented by the logic described above but still may happen due to unexpected errors)
    • if Recurring Type is (NOT equal to None AND is NOT NULL)
      • create recurring subscription order using form price and period selected in Recurring Type
    • else - show error message:
      Recurring form can't be submitted without the "Recurring Type" field
    • if the "Accept Payment" field is not selected on the form - show an error message:
      Recurring form can't be submitted without the "Accept Payment" field

6) Recurring Product

  • Change “Recurring Type” property options to be the same as for secure zones
  • Show error on checkout submit if products with different Recurring Types are added to the shopping cart:
    Recurring type [typeName] is not allowed for the current payment: gateway
  • create recurring subscription order using product price and period selected in Recurring Type
  • On product delete action - if it has active recurring subscriptions - show an error message:
    The item with active recurring subscriptions can't be deleted

7) Submitting form with recurring payment error cases

  • On form with recurring payment submit
    • If PaymentMethod is CreditCard OR Paypal
      • if PaymentMethod is FREE AND totalPrice after discount  is 0 AND discount applies for ALL recurring payments
        • proceed request and create order
      • else
      • Show validation error:
        • This payment type is not allowed for the recurring subscription

OSE (Nice)

UI

  • add new Froala WYSIWYG editor
  • remove jQuery dependency from nice frontend implementation

BE

  • Add Nice content wrapping logic (like it was in v5)
  • Add simple text blocks wrapping logic (like it was in v5)
  • Add Nice scope collection and output via js for frontend scripts

CRM contact ‘States’ improvements

Add new Secure Zone verification setting to:

  • Settings -> Misc -> CRM Settings   ️
    • Enable email verification flow (Default = true)
    • When false: ️
      • Do not send (or require) a verification email for secure zone subscriptions
      • On login - do not show validation error if isEmailVerified property of the member is false and just log the user in

Improve Secure Zone registration logic️:

  • If a user submits registration form with correct email and password (or if EnableEmailVerificationFlow=false AND if is first registration form submit)​:  ️
    • automatically log user in if isEmailVerified=true or EnableEmailVerificationFlow=false

Edit Account form - change email address

  • When member changes email address - create internal request for new email  ️
  • Validate if new email is not used ️
    • if used - return false result
  • If Enable email verification flow == true ️
    • Set new email to desiredEmail property of the contact record
    • Send verification email ️
    • If verified ️
      • replace email with desiredEmail value
    • Else ️
      • allow login under old email until confirmed
  • else  ️
    • replace email with desiredEmail value

CRM contacts ‘states’ indicator ️

Ability to see state of the CRM contact  ️

  • CRM contact crmType=Contact (no icon)
  • CRM contact crmType=Member AND isEmailVerified=true  (blue icon)
  • CRM contact crmType=Member AND isEmailVerified=false AND EnableEmailVerificationFlow=false (blue icon)
  • CRM contact crmType=Member AND isEmailVerified=false AND EnableEmailVerificationFlow=true (grey icon)

DESIGN:

https://invis.io/TPZ0MD55NJA

Liquid improvement

Extend object of {% component type: "CRMContacts" %}  ️

  • add crmType property to contact object:️
    • values
      • Contact
      • Member
  • add isEmailVerified property to contact object️ (Boolean)
  • Extend filtering of {% component type: "CRMContacts" %} (add to toolbox also)️
  • add to ‘filterBy’:
    • crmType
      • Contact
      • Member️
    • isEmailVerified
      • true
      • false
  • Note: these filters would search by actual CRM contact records data, regardless of the state of Enable email verification flow flag.

Logic improvement

  • When the registration form is submitted
    • set crmType=Member  ️
  • When CRM contact edited by admin when a new password is set
    • set crmType=Member ️
    • set isEmailVerified to true️

Resend Verification Email

CRM Contacts Advanced Search

  • Add searching and sorting to CRM contacts
    • CRM Type
      • all
      • contacts
      • members
    • Member Type
      • all
      • non-confirmed member
      • confirmed member
  • Remove member type options if CRM Type == contact

DESIGN:
https://invis.io/TPZ0MD55NJA

Update CRM Contact data scopes improvements and refactoring

Update CRM Contact data scopes improvements

Refactor the CRM contact update function based on the following existing update scopes:

  1. Update CRM contact from Admin UI Scope
    1. Allow editing if
      1. User is logged in into Admin UI via admin login form
    2. Disallow editing following fields
      1. IsDataUsingAllowed
  2. Update Account Form Scope
    1. Allow editing if
      1. User is logged in via site login form
    2. Disallow editing following fields
      1. Role
  3. Update CRM Contact Form Scope (form rendered by {% component type:"member_update_form" %})
    1. Allow editing if
      1. User is logged in via site login form AND has Role==Admin
    2. Disallow editing following fields
      1. IsDataUsingAllowed
      2. Role
  4. Update CRM Contact via general form submit Scope
    1. Disallow editing following fields
      1. All Contact Fields 
        1. If (see Update CRM Contact and related data fix)
  5. Update CRM Contact via stripe customer portal Scope
    1. Edit following fields on "customer.updated" webhook retrieve:
      1. Email
      2. Country
      3. City
      4. State
      5. Address
      6. ZipCode
      7. Phone

Update Stripe customer data on update CRM contact action

On any update account scopes (except Update CRM Contact via stripe customer portal scope)

  • if CRM customer has stripe customer relationship.
    • update the following stripe customer's fields:
      • Email
      • Country
      • City
      • State
      • Address
      • ZipCode
      • Phone

Update CRM Contact and related data fix

On general form submit

  • 1) If CRM Contact by formSubmissionData.Email is already exists AND CRMContactRecord.crmType==Member
    • if form is a registration form AND Enable email verification flow == true AND CRMContactRecord.isEmailVerified==False
      • Go to Point 2)
  • else
    • Skip updating existed CRM Contact data by info in formSubmissionData
    • Skip updating Advanced CRM Group fileds if group is attached to the Contact data
      • however create groups for Form Submissions, Orders and Event Bookings with the info from formSubmissionData if group is also attached to the appropriate CRM entity
  • 2) else
    • Create or update CRM Contact data by formSubmissionData
      • If formSubmissionData.<contactFieldAlias> == "" - DO NOT update CRMContactRecord.<contactFieldAlias> ️
  • Create or update Advanced CRM Group fileds if group is attached to the Contact data using info in formSubmissionData
    • If formSubmissionData.<AdvancedCRMGroupfiledAlias> == "" - DO NOT update AdvancedCRMGroup.<AdvancedCRMGroupfiledAlias> attached to the CRM Contact ️
  • If form is a registration form
    • follow the registration process (improvements to the registration process are described in CRM contacts states improvements)

Update form field names for consistency

Change names for all fields from Camel Case to Pascal Case (start with capitalized letter) in order to set them to standard.

This change is backward compatible.

Change names on ‘Update Account Form’ layout:

  • email => Email
  • firstName => FirstName
  • lastName => LastName
  • confirmPassword => ConfirmPassword
  • password => Password
  • oldPassword => OldPassword
  • site => Site
  • address => Address
  • phone => Phone
  • city => City
  • state => State
  • zipCode   => ZipCode
  • country => Country
  • status => Status
  • notes => Notes
  • All advanced crm group fields => UpCase first letter
    • example: dealersettings_FreeEuTaxation => Dealersettings_FreeEuTaxation

Change names on ‘General Form’ layout:

  • All advanced crm group fields => UpCase first letter
    • example: dealersettings_FreeEuTaxation => Dealersettings_FreeEuTaxation

Invoice number sequence shift on edit order

When editing order and changing invoice number

  • If new invoice number is bigger or equal to the next invoice number in invoice number sequence
    • next invoice number value in invoice number sequence to new invoice number+1

Check Wholesaler status on payment flows

For all forms

  • if from has field Accept Payment AND (formType is SingleItem OR Checkout)
    • Compare current logged in user type with CRM contact record determined by email in formSubmissionData (if no user is logged in - set as Consumer)
      • If they are different - show an error message:
        The submitter and CRM member types do not match.

Import Contacts improvement (update email flow)

On import for each contact record

  • if row contains id
    • if contact record found (by id)
      • if record email is different from import value
        • if there is no such email in the DB
          • change email for the record
        • else
          • skip whole record update process
      • else
        • update record
    • else
      • skip whole record update process
  • else
    • try find contact record by email
      • if found
        • update record
      • else
        • create record

Add .stl .dcm extensions to the CMS

Add ability to upload files with extensions:

  • .stl
  • .dcm

Restrict selecting child module that is already set as parent to another module

Module -> Settings -> Advanced settings:

  • Allow creating foreign items from other existing Custom Modules setting
    • if the selected module is changed:
      • Do not allow to save linkage to that new module if it is already linked to another module as a parent or a child module.
        Show error:
        This module already has parent-child relation

Bug Fixes

Import the same items - doesn't work autocomplete URL's

https://treepl.slack.com/archives/C023SU50YQP/p1636929659049100

  1. Create custom module and import files
  2. In files create several the same items with the same name and URL's (settings "disable autocomplete" should be turn off)

Actual:

After importing display items with the same URL's

Expected:

If URL' s repeated - should be added 1 to URL's

Contacts - import with 100+ CRM fields doesn't work

  1. Go to CRM -> Contacts
  2. Import file from attachments

    Expected:
    Contacts imported
    Actual:
    Error is shown http://joxi.net/xAeoWX8UM7Mgzm

Price is not showing correctly  for the 'Monthly' secure zone

it does not change from $40 to $12 which is how it is set up in the system

https://services.treepl.co/developer-dashboard-tickets/5492/team_chat

Advanced CRM group in Custom Report, Contact, Form Submission, Order Import/Export

https://treepl.slack.com/archives/C023SU50YQP/p1633928363236300

  1. Create or Update Advanced CRM group (change order of fields)
  2. Go to Custom Report (after Export file) -> all order fields display not like in Adv CRM Group VIDEO

recapcha v3 - add CMS_CustomSubmit

Add in recaptcha v3 (live and trial sites) info about CMS_CustomSubmit https://www.screencast.com/t/rs4jGR6iNl - as on right side

Сustom module - create custom property with system name

  1. Create custom property with name - "Name"  https://prnt.sc/1wlilt4
  2. After create the second custom property with the name  "test" - display error https://prnt.sc/1wlio9x
  3. After trying to add a new column in the table - display error too https://prnt.sc/1wlirp1

Expected:

Create custom property without errors

Actual:

Display error 1wlio9x

Issue with the extension being in uppercase (.PNG)

https://treepl.slack.com/archives/CC1074CQM/p1637197285103200

  1. Go to file manager and upload PNG with uppercase
  2. png files don’t show a preview thumbnail (in module image list)

Custom module - "media" property doesn't work in form CreateCustom Module

  1. Go to custom -> settings -> site user permissions and enable "Allow Adding New Items" http://joxi.ru/BA0YlbaC146Eqr
  2. Go to item properties and add custom property "media" http://joxi.ru/Vm6Y13kC37LMPr
  3. Add form on page
  4. Go to front end this form and submit form http://joxi.ru/V2V7ovGtBv7yPA

    Expected:
    New module item was created

    Actual:
    Error is shown http://joxi.ru/KAgVLJET59MvJ2

{{this}} on Product not correct display ID of item

https://treepl.slack.com/archives/C023SU50YQP/p1635113198006700

  1. Put on the order page, invoice or workflow {{this}} - in this object not correct display id of the product https://prnt.sc/1xa0rsw

Actual:

https://prnt.sc/1xa0rsw

Expected:

Should be 2214

In JSON not correct display "Pagination"

https://treepl.slack.com/archives/C023SU50YQP/p1636064810034300

  1. Put on page component with collectionvariable
  2. In JSON display "Params" except "Pagination" https://prnt.sc/1yeln01
  3. Also check this tag {{this.pagination.totalItemsCount}}

Actual:

In JSON display "Params" except "Pagination" https://prnt.sc/1yeln01

Expected:

In JSON display "Pagination"

CRMContacts - sortBy: "UpdatedDateTime" liquid error

Put this code on page

{% component type: "CRMContacts", sortBy: "UpdatedDateTime", sortOrder: "DESC", collectionVariable: "customer", layout: "" %}

<pre>{{customer}}</pre>

Display

it results in Liquid Error: Expression of type 'System.Nullable`1[System.DateTime]' cannot be used for return type 'System.Object'

Admin Reset Member Password - in liquid add info about who was reset password

  1. Go to system email -> Admin Reset Member Password
  2. Put in email {{this}} tag  and reset some user password - email doesn't receive https://prnt.sc/1wmyclo

Expected:

In liquid should display email and name that user who change password https://prnt.sc/1wmypip

Actual:

Email doesn't work with {{this}} tag

https://treepl.slack.com/archives/C023SU50YQP/p1634433420261700

Custom reports - filtering by crm group fields doesn't show fields of other crm groups in results

ticket - https://services.treepl.co/qa-dashboard-tickets/5302/issues

  1. Go to https://justicenet.org.au/admin/custom-reports/14081/filters
  2. Check tab filers with one filter http://joxi.ru/brRxondHB46z42
  3. Pay attention these fields do not appear in the results http://joxi.ru/a2XNoY7TQ7gWLr although they are in contact and are filled

Menu/Domains - not correct order in links

Go to Menu -> create a new item and assigned link -> in list of pages not correct order https://prnt.sc/1yr1vu6 AND https://prnt.sc/1yr3z1e

Liquid Error in Deferred Order Payment Email

Go to https://stage-test.trialsite.co/admin/system-emails/336 and add {{this}} on email content

Notify the client with this message http://joxi.ru/L21BOJ3twvzX4A

Expected: the customer received an email with the correct content

Actual: Liquid Error: Self referencing loop detected for property 'OrderStatus' with type 'eCommerce.BusinessModel.DomainModel.OrderStatus'. Path 'Order.OrderStatus.CustomWorkflows[0]'. http://joxi.net/gmvXNVjCewd93A

Time zone - incorrect time

  1. Create and update item
  2. Check output {{this.LastUpdatedDate | date: "%a, %b %e, %Y - %r" }}
  3. Site time differs from update time http://joxi.ru/Vm6Y13kC37WOKr

Group layout - should be {{this.id}}

In layout of group item not correct display

{{this.id}} https://prnt.sc/1wzn9tv

Actual:

{{{this.id}}}

Expected:

{{this.id}}

https://treepl.slack.com/archives/CRUAT8GGZ/p1634840447001700

Custom Module - module export doesn't work

Attempting Export of Module, Error is shown on console http://joxi.ru/eAOOo65cv7awxA

Update item from front - update info deleting media fields

https://treepl.slack.com/archives/C023SU50YQP/p1631146501107000

  1. Update item from front with media
  2. On front not edit media - click edit - info about media - will be deleting https://prnt.sc/1rm4oa5
Show more less
New Feature

Recurring Products

Abiity to create products with rucurring subscription.
It will operate similar way it did in BC.
  • BC Equivalent
  • Ecommerce
Improvement

OSE Editor (former nICE)

nICE editor functionality with removed jQuery dependency.
v 6.2.0 - 6.2.1 Release date: 13 Oct, 2021

Full Release Notes

6.2.1

Features

Module Item Import Improvement (parent assignment improved logic)

Implemented improved logic of parent item assignment.

(1) When performing import from:

  • Tree View Root or List View
    • If the `Parents` column is empty - all items will be assigned to the root level (they will have URLs like "/module-slug/item-slug")
  • Particular folder item from Tree View
    • If the `Parents` column is empty - all items will be assigned to that particular item (they will have URLs like "/module-slug/particular-folder-item-slug/item-slug")

(2) If `Parents` column is not present in the import file

  • if row represents new item - take parent like described above for empty column (1)
  • if row represents existing item (`External Id` column contains ID of the existing item in DB) - do not apply any changes to Parents relationship.

(3) Added improved logic for parent relationships in import/export file

  • Now item’s sequence is not required to be order "parent items first then child items". 
    • Import process will determine relations between all items based on 
      • url list from `Parents` column
      • slug from column `Url Slug`
      • existing URLs from DB 
    • and will create proper tree based on that data. So if you are trying to assign new item in row #2 to the parent that should be an item from row #3 - the only thing you should do is to use the correct parent URLs in `Parents` column. Example:

External ID

Item Name

Url Slug

Parents

Test SubItem

test-subitem

/module-slug/test-parent

Test Parent

test-parent

/module-slug

In this case the import will determine that ”Test Subitem” should be a child item to ”Test Parent” (regardless of the fact that is in the next row). 
So it will create the item from row #3 first and then create the item from row #2 and it will attach ”Test Subitem” to the ”Test Parent”, eg:

  • Test Parent
    |___Test Subitem

(4) When retrieving new URLs after the new parent’s assignment:

  • If any of them already exists
  • If ’Settings’ > ‘Misc’ > ’Disable autocomplete for already taken URL slugs’
    • is true:
      show error and will skip applying changes to the item
    • is false:
      find such "-[number]" suffix to the item slug that all new urls of the item is not existing in the DB or prepare to be added from the current import file - see (3)

(5) If item contains several parents (or should be attached to several parent items) - their URLs should be listed in column `Parents` separated by ";":

Parents

/module-slug;/module-slug/test-parent

  • When applying parent relationship changes, import will show error and will skip applying changes to the item, if:
    • at least one of the parent urls
      • is not existing in the DB
        OR
      • is not successfuly prepared to be added from the current import file - see (3) and (4)
    • Import will show error and will skip applying changes to the item if you set up several parents to the item and the parent item Module doesn't have setting "Allow multiple parents" == true.

6) Import will show error and will skip applying changes to the item on update item if `Parents` column contains URL of the current item (item could not be set as child to itself!)

NOTE: If an error will be applied to the item that is supposed to be a parent to some other items in the import file - all those child items will not be added/updated as well because of the error that one of the parent URLs does not exist as described above in (5).

Page Caching Improvement

Caching Logic:

When site visitor requests a page, try to find the page in the cache by URL

  • (A) If found and could be shown (see The logic when show page from the cache below)
    • If page was cached less then 10 seconds ago
      • render html from cache
    • else
      • go to (B)
  • (B) else
    • render the page via liquid engine 
    • If page could be added based on the ‘The logic of adding to the cache’ described below
      • add the page to cache
      • set timeout for page - 10 seconds
      • if while page parsing there was a parse of the {% component type:"shopping_cart" %}
        • Set to cache objectCachedPageObject.UsedShoppingCartOnPage = true

Cached page object should contain following data:

  • URL [string]
  • DateCached [datetime] (default)
    • Current DateTime
  • HTML [string]
  • UsedShoppingCartOnPage [bool]

The logic of adding to the cache:

  • If a visitor is a logged in user
    • DISALLOW add to Cache
  • else
    • If ShoppingCart == null or ShoppingCart.items == 0
      • ALLOW add to Cache
    • else
      • If CachedPageObject.UsedShoppingCartOnPage == true
        • DISALLOW add to Cache
      • else
        • ALLOW add to Cache


The logic when show page from the cache:

  • (1) If a visitor is a logged in user
    • DISALLOW show page from the cache
  • else
    • (2) If ShoppingCart == null or ShoppingCart.items == 0
      • ALLOW show page from the cache
    • else
      • (3) If CachedPageObject.UsedShoppingCartOnPage == true
        • DISALLOW show page from the cache
      • else
        • ALLOW show page from the cache

Here are the tables that represent all rules above:

(1)

Visitor is logged in user

FALSE

TRUE

ToShow

See table 3

FALSE

ToCache

See table 2

FALSE

(2)

ShoppingCartIsNullOrEmpty

TRUE

FALSE

UsedShoppingCartOnPage

TRUE

FALSE

TRUE

FALSE

ToCache

TRUE

FALSE

TRUE

(3)

ShoppingCartIsNullOrEmpty

TRUE

FALSE

UsedShoppingCartOnPage

TRUE

FALSE

TRUE

FALSE

ToShow

TRUE

FALSE

TRUE

FTP sync time improvement

Significantly increased sync time when update pages, templates, snippets etc via FTP

Fixed site errors when upload more then 100 files at once

Bug Fixes

Slowly works page

Fixed slow page load speed when used a lot of content for secure zone

Events - Start Date change after update 6.1.8

Ticket - https://services.treepl.co/qa-dashboard-tickets/4990/team_chat

Go to https://www.tlcc.com.au/admin/module/1827/list-view?pageIndex=0&view=list-view

Search 2022 or 2021 years

Pay attention the name, start date and url, they have different dates http://joxi.net/a2XNoY7TQ4jzBr http://joxi.net/12MRoxVigkyDOA

Sitemap - Release date issue for blog post

Create new blog with future release date

Go to site map and generate new sitemap

New created blog with future release date should not showing in sitemap http://joxi.ru/Y2LaoD8txMekOA

Misc settings - checkbox in CRM settings is not saved

Go to Misc -> CRM settings and enable checkbox "Secure Uploads"

Reload the page

Pay attention on checkbox in CRM settings is not saved http://joxi.ru/YmE5opqTG9BRlm

JSON - not correct display custom properties and pagination

Create custom module with data source and CRM group

Use this code {% component source: "__test team", layout: "", limit: "100", collectionVariable: "data", type: "module" %}

Not display correct custom properties https://prnt.sc/1rkf2bd

And info about pagination display not correct If you go to the second page https://prnt.sc/1rkui7t

favorites component

Not correct work includeItemData false.

Not display correct ProductDataJsonHTML.

Not correct display pagination and quantity.

Products - Sorting of group items doesn't work

Not correct order in group items http://joxi.net/V2V7ovGtB8JKEA http://joxi.net/MAj5aeRTd1K112

Secure Zone - secured files were opening to not logged users (If name secure item contains spec symbol)

Make the folder secure and add several files to it (https://stage-test.trialsite.co/admin/file-manager?path=%2f__SZ%20folder)

Files can be accessed and downloaded even by unregistered users http://joxi.ru/EA4YxbaCXxaE5r http://joxi.ru/BA0YlbaC1V46Vr

Import contacts - secure zone is not deleted via import

Do export contacts

Delete "Secure Zone" and "Secure Zone Expiration Date" fields in xlsx file and do import

Go to imported contact and pay attention that the secure zone is not deleted http://joxi.ru/gmvXNVjCeM9BjA (works in v5)

Edit item from front - can't save empty field from front

Go to front and edit Description - delete all info and save

In admin changes not applied https://prnt.sc/1v1eqou

https://treepl.slack.com/archives/C023SU50YQP/p1633532626211100

not correct  this.RecipientName where it should be this.PurchaserName

In Gift Voucher layout Uses this.RecipientName where it should be this.PurchaserName

http://prntscr.com/t0ibqq

/admin vs /Admin

Go to https://stage.treepl.co/Admin and https://furnitura-copy-site.etrnl.me/Admin

Error 404 on v6 http://joxi.ru/DrlW3MEhK0MwzA

Export - Secure Zone Expiry dates wrong/Import - assign Secure Zone

Go to Contacts and do export

Pay attention on exportin file all Expiry Dates = "2099-12-11" http://joxi.ru/Y2LaoD8txvRpvA

URL with symbols doesn't open / download

Upload file via form (attached or https://stage-test.trialsite.co/admin/contacts/10163/form-submissions/10302)

Try download file from form http://joxi.ru/D2Pnoy6twRlJyr or file manager http://joxi.ru/p27YyEgCLxvn6r

Attributes - set up a lot of domains

Create on Domains more than 3 and set up different currency

Go to Product -> cteate attributes -> save all prices 0 https://prnt.sc/1v0q2z9 -> display "show more" https://prnt.sc/1v0q4fv

Order of catalogs not correct

Go to Products

Open Catalogs tab - catalogs display is not correct order like on page Catalogs https://prnt.sc/1u8adja

Custom module - sorting by tags doesn't work

Go to custom modules and enable tags

Add some items with tags

Create new table with property "Item Tag " http://joxi.ru/L21BOJ3twVDRbA

Try sorting items in list view http://joxi.net/YmE5opqTG9LbPm (it works in v5)

Error after clicking on the "login" button

Click on the "login" button without filling in the email address and password field https://prnt.sc/1upqpsv

The following error will be displayed https://prnt.sc/1uqyzqy

Orders - Order statuses

Go to https://furnitura-copy-site.etrnl.me/admin/ecommerce-settings/statuses

first bug - http://joxi.ru/xAeoWX8UMVqObm deleted items are showing in order editing

second bug - http://joxi.ru/GrqakBVtzbq7nr after renaming the order status changed the name to the previous one after editing the content http://joxi.ru/ZrJKojEFQkljNm

third bug - new order status emails used the content of previous emails http://joxi.ru/eAOOo65cvGl3zA

Advanced CRM Groups - Сhanges order after creating a new field and reloading the page

Go to Advanced CRM Groups

Create new fields in any CRM group and click save

Reload page

Pay attention new fields change their position (https://www.dropbox.com/s/giv4det5q1faf2x/CRM%20random%20fields.webm?dl=0)

Advanced CRM Group - not display on thanky, workflow and autoresponder

create form with adc crm group (set up all types https://prnt.sc/1ubwm1q)

On thank you, workflow and autoresponder - not display info https://prnt.sc/1ubjuh1 https://prnt.sc/1ubjwcn

6.2.0

Public Backlog Features

Unassign secure zone from front-end

CRM contact Role field

Add system field to the CRM contact record. Place it on the edit contact form and contact details page in the admin. Add Admin User indicator on the contact list.

Field description:

  • Name
    • Role
  • Type
    • select
    • Values
      • General
        • default
      • Admin User

Restrictions:

  • Count CRM users with role Admin User as invited admin users to the site. Apply Site Plan restrictions to invite admin user or save new CRM record with role Admin User based on SUM of admin users plus CRM records with role Admin User
  • Show same error message on trying to create CRM contact with role Admin User as on inviting admin users.

DESIGN:

Component for the subscriptions form

{% component type:"member_update_form", source:"subscriptions", userId:"123", layout:"", collectionVariable:"" %}

  • Params Description
    • Source (required)
      • can take one of the following values
        • subscriptions
          • renders form that updates secure zone subscriptions info
        • info
          • renders form that updates contact info
    • userId (required)
      • id of the contact record
      • if empty or user can not be found - do not render the layout. CollectionVariable should be null.
      • if current logged-in user is NOT CRM contact with role Admin User - do not render the layout. CollectionVariable should be null.
  • this object
    • Add ordering to the Show Secure Zones list
      • show in alphabetical order by secure zone name
    {
        // all fields like in {{request.currentmember}} https://docs.treepl.co/liquid/request-object#secCurrentMember
        // new fields marked in orange
        member : {
            "id": 162,
            "email": "asmith@example.com",
            "firstname": "Alex",
            "lastname": "Smith",
            "address": null,
            "city": null,
            "state": null,
            "zipcode": null,
            "country": "Australia",
            "site": null,
            "phone": null,
            "status": "",
            "notes": "",
            "type": 2,
            "isDataUsingAllowed": true,
            "createddatetime": "9/11/2019 3:32:23 AM",
            "updateddatetime": "3/24/2021 2:44:32 AM",
            // Add this field to the {{request.currentmember}} also
            "role": "Admin User",
            // Get ALL secure zones and add flag "issubscribed" : true|false
            // Do NOT change the {{request.currentmember}} object thisway
            "securezones": [
                {
                    "id": 1,
                    "name": "Secure Zone 1",
                    "landingpageid": 2541,
                    "createddatetime": "2018-11-21T15:17:23",
                    "updateddatetime": "2018-11-21T15:17:23",
                    "expirydatetime": "2022-11-21T15:17:23"                
    
                    "issubscribed": true
                },
                {
                    "id": 2,
                    "name": "Secure Zone 2",
                    "landingpageid": 1234,
                    "createddatetime": "2018-11-21T15:17:23.037",
                    "updateddatetime": "2018-11-21T15:17:23.037",
                    "expirydatetime": "9999-12-30T13:00:00"                
    
                    "issubscribed": false
                }
            ]
        }
    }   
        
  • Subscriptions Default layout
      <form> action="/forms/members/update-subscriptions.ashx" method="POST" enctype="multipart/form-data"> 
      
          <input type="hidden" name="userId" value="{{this.member.id}}"/ >  
      
          {% for zone in this.member.securezones %}  
      
              <input type="hidden" name="SecureZone[{{zone.id}}][id]" value="{{zone.id}}"/ >  
      
              <input id="SecureZoneSubscribed_{{zone.id}}" type="checkbox" name="SecureZone[{{zone.id}}][isSubscribed]" value="true" {% if zone.isSubscribed == true %}checked="checked"{% endif %} / >
      
              <label for="SecureZoneSubscribed_{{zone.id}}">{{zone.name}}</label>
      
              <label for="SecureZoneExpireDate_{{zone.id}}">Expiry Date</label>
      
              <input id="SecureZoneExpireDate_{{zone.id}}" type="datetime-local" name="SecureZone[{{zone.id}}][expiryDateTime]" value="{{zone.expiryDateTime | date: '%Y-%m-%dT%H:%M'}}">
      
      {% endfor %}
      
          <input type="submit" value="Save">
      
      </form>
              
      

Toolbox

Secure Zone -> Update Member Form

Form validation and processing

Create update member subscriptions form handler API

  • endpoint
    • /forms/members/update-subscriptions.ashx
  • Add support of the jsonResponse param in GET params of the endpoint

Validate submission:

  • If the currently logged in user is not null AND he has Role == Admin User
    • if formData.userId is empty - show validation message
      • UserId field is required
    • elseif user can't be found by formData.userId - show validation message
      • User with specified id doesn't exist
    • elseif user found by formData.userId has role Role == Admin User - show validation message
      • Users with "Admin User" role can't be updated
    • else
      • Proceed to update member data the same way as it works in the admin UI
  • else
    • Set Error message to the formSubmissionData:
      • Action restricted for your user role
    • if jsonResponse
      • render formSubmissionData as json response similar to other form submissions
    • else If current logged in user is null
      • Redirect to the 401 system page.

Admin UI -> CRM contact -> Subscriptions sort order

Add ordering to the Show Secure Zones list

  • show in alphabetical order by secure zone name

Component for the info form

{% component type:"member_update_form", source:"info", userId:"123", layout:"", collectionVariable:"" %}

  • Default layout
        <form action="/forms/members/update-member.ashx" method="POST" enctype="multipart/form-data">  
        
            <input type="hidden" name="userId" value="{{this.member.id}}"/>  
        
        
            //similar content as generates for update account form in /api/forms/system-form-templates ProfileFormTemplate
            // including advanced crm groups attached to the Contacts
            // replace request.currentmember. in values with this.member. in order to correctly fill the data into the form
        
        </form>
        
     

Toolbox

Secure Zone -> Update Member Form

Form validation and processing

Create update member form handler API

  • endpoint
    • /forms/members/update-member.ashx
  • Add support of the jsonResponse param in GET params of the endpoint

Validate submission:

  • If the current logged in user is not null AND he has Role == Admin User
    • if formData.userId is empty - show validation message
      • UserId field is required
    • elseif user can't be found by formData.userId - show validation message
      • User with specified id doesn't exist
    • elseif user found by formData.userId has role Role == Admin User - show validation message
      • Users with "Admin User" role can't be updated
    • else
      • Proceed to update member data the same way as it works in the admin UI EXCEPT of the Role and IsDataUsingAllowed fields.
        These fields are not allowed to be updated via this API. No error message is needed just skip the role field from the formData if it occurs there.
    • else
      • Set Error message to the formSubmissionData:
        • Action restricted for your user role
      • if jsonResponse
        • render formSubmissionData as json response similar to other form submissions
    • else
      • Redirect to the 403 system page.

Import/Export Process for field Role

Do not add this field to the import and export contacts process. The role could be assigned only via admin UI

Create mailing list based on custom report

Custom Report Changes

Add Mailing List Sync group to the Custom Report -> Settings tab Fields:

  • Enable Sync With Mailing List
    • checkbox
    • once selected - show fields below
  • Mailing List
    • dropdown
    • required once Enable Sync With Mailing List is selected
      • values
        • List of all mailing lists
      • DO NOT ALLOW to select a mailing list that has already been used by another custom report
  • Update Period (in hours)
    • number (int)
      • save 0 by default
  • Sync Type
    • dropdown
      • values
        • "Add All Users From Report" (default)
        • "Adjust Mail List Users To Be The Same As In The Report"
        • "Remove Mail List Users That Are Collected In The Report"

DESIGN (take labels from task)

Update Report Logic

Every hour try to find a custom report by condition:

  • report.EnableSyncWithMailingList == true AND
  • report.UpdatePeriod > 0 AND
  • (report.LastUpdatedDate + report.UpdatePeriod) < nowDate

If found - force Generate Report flow

Sync Logic

Once Generate Report flow is triggered

  • Generate Report
  • If report.EnableSyncWithMailingList == true
    • Get all contacts from the report
    • Get mailing list by report.MailingList
    • Get all contacts added to a mailing list
    • if report.SyncType == "Add All Users From Report"
      • find all contacts from the report that are not added to the mailing list
      • add those to the mailing list
    • else if report.SyncType == "Adjust Mail List Users To Be The Same As In The Report"
      • unsubscribe all contacts from the mailing list that are not matched to the report contacts
      • subscribe to the mailing list all contacts from the report contacts that are not subscribed yet
    • else if report.SyncType == "Remove Mail List Users That Are Collected In The Report"
      • unsubscribe all contacts from the mailing list that are matched to the report contacts

Native Comments

Plan Restriction

  • Available starting from Pro

Comments General logic description

  • Comments may be threaded (i.e. commenters can respond to existing comments) or flat (a chronological listing of comments).
  • We should have the ability natively to emphasize the module item’s author comments.
    • use item.addedBy of the module item and comment.author.id in condition in liquid comment layout
  • Comments should have the ability to be added to any module items and products.
  • Prevent liquid and html in comments
    • html encode and wrap {% raw %}{% endraw %} on liquid
  • Ability to mark comment links as “no-follow” for SEO reasons (auto-apply nofollow to the links on rendering or saving process)
  • Allow sending rating with comment
    • Available rating range 1-100
  • Add ability to delete comments
  • Add ability to edit comments
  • Add admin UI for comments and comment settings
  • Add ability to assign workflow notification once a comment is created

Comments Moderation

Add ability to moderate comments

  • Add page Content -> Comments

Apply workflow to send a notification once the comment is created Moderators would receive a notification of new comments and have the ability to approve or deny comments.

Design:

Comments Admin UI

Show comment list on the page Content -> Comments Add filters for the comment list

  • Period
    • Show date picker to choose a date range
  • Status
    • Approved
    • Pending
    • Spam
  • Module
    • List of modules
  • Module Item
    • List of module items

Design;

Comments settings

Add settings to the page Content -> Comments Allow to setup

  • moderation of the new comments
  • moderation of the edited comments
  • comment sending policy
    • Options
      • Comment Once Only
      • Comments unlimited
  • workflow notifications

Design

Comments body saving rules

  • Prevent liquid in comments
    • wrap in {% raw %}{% endraw %} content before adding it to the liquid object
  • Prevent HTML in comments
    • strip all HTML from the body
    • find all links in the content and wrap it in <a href="[link]" rel="noindex, nofollow" >[link]</a>

Comment submit form

The form should contain the following fields

  • Body
    • string (multiline)
  • Rating
    • number
      • min 1
      • max 100
  • reCaptcha v3

Send workflow once a comment is created (if comment settings for the module contain workflows)

If comment settings (moderation of the new comments) for the module required moderation - set the status to Pending If not - set the status to Approved

Use Comment body saving rules once saving the item

Show error message if comment settings (comment sending policy) is Comment Once Only and currently logged-in member already has at least one comment to the current item

  • Error message
    • You can't leave more than one comment for this item

[Create Comment] Form Example

    <form action="/public/api/comment/{{moduleItemId}}}?layout={{Layout}}" method="post">

[Reply to comment] Form Example

    <form action="/public/api/comment/{{moduleItemId}}/{{parentCommentId}}?layout={{Layout}}"  method="post">
        <label>Rating</label>
        <input name="rating" type="number" min="1" max="100" />
        <textarea name="postComment"></textarea>
        <input type="submit" value="Post" />
    </form> 

Comment edit form

Send workflow once a comment is edited (if comment settings for the module contain workflows)
If comment settings (moderation of the edited comments) for the module required moderation - set the status to Pending

Use Comment body saving rules once saving the ite

[Edit Comment] Form Example

<form action="/public/api/comment/edit/{{commentId}}?layout={{Layout}}" method="post">
    <label>Rating</label>
    <input name="rating" type="number" min="1" max="100" />
    <textarea name="postComment"></textarea>
    <input type="submit" value="Post" />
</form>

Comment delete form

Allow deleting comments that belong to the logged-in user only.

  • Error message
    • You can't delete comment that doesn't belong to you

[Delete Comment] Form Example

<form action="/public/api/comment/delete/{{commentId}}" method="post">
    <input type="submit" value="Delete"/>
</form>

Comment Workflow liquid this object

{
    // default params
    ...
    "FormSubmissionData": {
        "fields": {
            "system": {
                "Id": {
                    "name": "Id",
                    "value": 1
                },
                "Body": {
                    "name": "Body",
                    "value": "body text"
                },
                "Rating": {
                    "name": "Rating",
                    "value": 5
                },
                "Author": {
                    "name": "Author",
                    "value": "author@email.com"
                },
                "DateAdded": {
                    "name": "DateAdded",
                    "value": "2021-01-01T10:15:18"
                }
            },
            "custom": {},
            "all": [
                {
                    "name": "Id",
                    "value": 1
                },
                {
                    "name": "Body",
                    "value": "body text"
                },
                {
                    "name": "Rating",
                    "value": 5
                },
                {
                    "name": "Author",
                    "value": "author@email.com"
                },
                {
                    "name": "DateAdded",
                    "value": "2021-01-01T10:15:18"
                }
            ]
        }
        "error": 0,
        "errormessages": []
    },
    "CommentData": {
        "Id": 1,
        "ModuleItemId": 213,
        "ParentId": null,
        "ThreadId": null,
        "Author": {
            "Id": 1,
            "FirstName": "author",
            "LastName": "lname",
            "Email": "author@email.com",
            "IsAdmin": false
        },
        "Rating": 5,
        "Body": "body text",
        "DateAdded": "2021-01-01T10:15:18"
    }
}

Comments pagination

Implement pagination to comments
Take layout from the URL.

  • If empty - use the default comment layout.

Component type: "commentThreads"

{% component type:"commentThreads", moduleItemId:"123", limit:"10", commentLimit:"5", layout:"", commentLayout:"", threadLayout:"", collectionVariable:"" %}

this object (get ONLY items with Status == Approved):

{
    "Items": [
        {
            "Id": 1,
            "ParentId": null,
            "ThreadId": null,
            "Author": {
                "Id": 1,
                "FirstName": "",
                "LastName": "",
                "Email": ""
            },
            "Rating": 5,
            "Body": "",
            "DateAdded": "2021-01-01T10:15:18",
            "Items": [
                {
                    "Id": 2,
                    "ParentId": 1,
                    "ThreadId": 1
                    "Author": {
                        "Id": 1,
                        "FirstName": "",
                        "LastName": "",
                        "Email": ""
                    },
                    "Rating": 3,
                    "Body": "",
                    "DateAdded": "2021-01-01T10:15:18"
                }
            ]
        }
    ],
    "ModuleItemId": 111,
    "Layout": "",
    "CommentLayout": "",
    "Pagination": {
        "CurrentPage": 1,
        "ItemsPerPage": 10,
        "NumberOfPages": 1,
        "TotalItemsCount": 4
    }
}  

General component Default Layout (/cms-assets/layouts/comment_threads/template.layout):
<div class="comment-threads">
    {% include "{{this.threadLayout}}" %}
</div>
    <a href="/public/api/comment/load-more/{{this.moduleItemId}}?page=2&limit={{this.params.limit}}&layout={{this.ThreadLayout}}&commentlimit={{this.params.commentlimit}}">Load more thread</a>
    <form action="/public/api/comment/{{this.moduleItemId}}}?layout={{this.ThreadLayout}}" method="post">
        <label>Rating</label>
        <input name="rating" type="number" min="1" max="100" />
        <textarea name="postComment"></textarea>
        <input type="submit" value="Post" />
    </form>
    Thread layout (/cms-assets/layouts/comment_threads/thread_default.layout):
    {% for thread in this.items %}
        <div class="comment-thread">
            {{thread.body}}
           
            <div class="subcomment-thread">
    
                {% assign realthis = this %}
                {% assign this = thread %}
                   {% include "/{{realthis.CommentLayout}}", layout: realthis.commentlayout %}
                {% assign this = realthis %}
    
                <a href="/public/api/comment/thread/load-more/{{this.moduleItemId}}/{{thread.id}}?page=2&limit={{this.params.commentlimit}}&layout={{this.commentlayout}}">Load more comments</a>
                <form action="/public/api/comment/{{this.moduleItemId}}/{{thread.id}}?layout={{this.commentlayout | default: this.layout}}"  method="post">
                    <label>Rating</label>
                    <input name="rating" type="number" min="1" max="100" />
                    <textarea name="postComment"></textarea>
                    <input type="submit" value="Post" />
                </form>
                <form action="/public/api/comment/delete/{{thread.id}}"  method="post">
                    <input type="submit" value="Delete" />
                </form>
            </div>
        </div>
    {% endfor %}
    
    Comment layout (/cms-assets/layouts/comment_threads/comment_default.layout):
    {% for comment in this.items %}
        <div class="sub-comment">
            <div class="sub-comment-body">
                {{comment.body}}
            </div>
            <form action="/public/api/comment/{{comment.moduleItemId}}/{{comment.id}}?layout={{this.layout | default: layout}}"  method="post">
                <label>Rating</label>
                <input name="rating" type="number" min="1" max="100" />
                <textarea name="postComment"></textarea>
                <input type="submit" value="Post" />
            </form>
            <form action="/public/api/comment/delete/{{comment.id}}"  method="post">
                <input type="submit" value="Delete" />
            </form>
        </div>
    {% endfor %}
    

DESIGN:

Component type: "comments"

{% component type:"comments", moduleItemId:"123", limit:"10",  layout:"", commentLayout:"", collectionVariable:"" %}
General component Default Layout (/cms-assets/layouts/comments/template.layout):
<div> class="comment-list">
    {% include "/{{this.CommentLayout}}" %}
</div>
<a> href="/public/api/comments/load-more/{{this.moduleItemId}}?page=2&limit={{this.limit}}&layout={{this.CommentLayout}}">load more</a>
<form action="/public/api/comment/{{this.moduleItemId}}?layout={{this.CommentLayout}}">
    <label>Rating</label>
    <input name="rating" type="number" min="1" max="100" />
    <textarea> name="postComment"></textarea>
    <input type="submit" value="Post" />
</form>
Comment layout (/cms-assets/layouts/comments/comment_default.layout):
{% for comment in this.items %}
    <div class="sub-comment">
        <div> class="sub-comment-body">
            {{ comment.body }}
        </div>

        <form> action="/public/api/comment/delete/{{comment.id}}" method="post">
            <input type="submit" value="Delete"/>
        </form>
    </div>
{% endfor %}

Component Toolbox

Add both components to

  • Comments
    • Thread List
    • Flat List
Ecommerce: Ability To Print And Re-send An Invoice From The Order (CRM) (Print Invoice + shipping layouts)

1) Packing Slip and Package Label layouts

Add system Print Layouts for

  • Packing Slip
  • Package Label

Store them on FTP in the following paths:

  • /Content/ShippingLayouts/PackingSlip.html
  • /Content/ShippingLayouts/PackageLabel.html

Implement the following admin layouts and functionality:

  • Apply FTP sync functionality.
  • Create Shop settings -> Shipping Layouts tab (similar to Module Layouts tab http://prntscr.com/tj2psa )
    Add layouts to the Shop settings -> Shipping Layouts tab.
  • On edit layout - allow editing content only (name should not be editable).
    Once edited - apply sync to FTP.

2) Print Buttons

Add print icon ( https://invis.io/YAX7PB2EC3Q ) that would allow you to choose one of the following actions

  • Invoice
  • Packing Slip
  • Package Label

Clicking on any of those should trigger print action of the corresponded layout (Invoice layout is an Invoice system email content).

Bug Fixes

An issue with grouped items import After the products import, the grouped items were broken if the shipping was enabled for products.
Shipping Option - Radio button can't be enabled with the "Handling Charge" setting
  1. Go to Shipping Options -> edit -> settings
  2. Change the fee for "handling charge"
  3. Go to shopping cart
  4. The switch can't be enabled with the "Handling Charge" setting
Bambora - order is created in Bambora, but not created in the admin
  1. Try to buy a product and on the last step -
  2. Close the window
  3. In Bambora the payment is created, but not in admin
Custom report - Advanced CRM group does not display in reports
  1. Create an Advanced CRM group and assigned it to Contact
  2. Create custom report -> Contact and Secure Zone - no info from CRM group
Copying a site without custom properties After copying a site in Custom Module item for a CRM data source field was empty
Orders - does not send an email when the status changes. When I change the status CRM>Orders, the system updates the status but doesn't send the email.
The detail layout is being returned instead of the list layout layout When the grouped product was selected from the dropdown, the detail layout was displayed instead of the list layout was displayed instead of the list layout.
Email - incorrect tags display These tags aren't displayed correctly {{this.FormSubmissionData.Fields.Custom}} and {{this.FormSubmissionData.Fields.System}}
Catalogs - deleted catalogs
  1. Components->Ecommerce-> List of Catalogs -> Filter values - deleted catalog are displayed
Discount codes - stopped working Some discount codes are not applied correctly on the front-end
Events - double import doesn't work
  1. Go to Events
  2. Create an Event group and import files from attachments twice
  3. The error gets displayed after the second import
Email - Workflow Notification The form name is displayed incorrectly in the Workflow Notification email
Tree view on items
  1. Create more than 10 folders
  2. Go to the second page and open one folder
  3. Inside the folder create more than 10 folders
  4. Go to a subfolder on the second page - incorrect URL display
Default shopping_cart - doesn't work The default shopping_cart summary layout does not seem to be rendering anything.
Custom Module - random view works incorrectly Initial randomized order of items won’t remain when navigating the pagination
Checkout form - incorrect info in admin On checkout, when the user puts in shipping address, shipping city and shipping zipcode, that data overwrites the data the user has populated address, city and zipcode with. Does the user leave the shipping address blank on checkout, data the user has given as address for the crm gets deleted.
Bambora, PayPal - an email with “_”
  1. Go to buy a product and put email test_@test.co
  2. Pay with Bambora or PayPal - returns error
  3. If user submitted checkout form with testt3606_@ - ORDER page stops working in the admin
Customize table - error on list when createing same name in columns
  1. Create Property with name Description
  2. Try to display this column on a table - error returned (validation required)
Event - not rendering {{this.parent.id}}
  1. Go to form for the event and add this tag into layout: {{this.parent.id}} https://prnt.sc/1r4k2dx
  2. Open an event on the front-end - no parent ID is displayed
Customized column - "Supplier" column missing
  1. Go to any custom module->table and set up Supplier column
  2. Go to list of custom modules items - no Supplier is displayed
Custom Report - no filtering by "form fields" Custom reports couldn’t be generated by the form custom fields.
Show more less
New Feature

Native Comments

Ability to add comments to modules of the site.

Comments Zapier integration:
Triggers:

  • New Comment
  • Updated Comment
    Actions:
  • Create new comment
  • Update comment
    Searches:
  • Find Comment

Some features for comments:

  • Comments may be threaded (i.e. commenters have the ability to respond to existing comments) or flat (a chronological listing of comments).
  • We should have the ability natively to emphasize the module item’s author comments.
  • Ability to paginate comments
  • Ability to link...
  • BC Equivalent
  • Blogs
  • Custom Modules
  • General
Improvement

Ecommerce: Ability To Print And Re-send An Invoice From The Order (CRM)

Like in BC it would be nice if one could print (style would be taken from Invoice email content) the invoice for the customer that you would included with the product when sending it to the customer.
Ability to print would also include shipping layouts (Packing Slip, Package Label layouts)

At the moment we would need to do all...
  • BC Equivalent
  • Ecommerce
v 6.1.4 - 6.1.8 Release date: 06 Sep, 2021

Full Release Notes

6.1.4 Blog search Search within blog doesn’t work.
6.1.4 Time zone Time zone bug: the Release date and Expiry dates are displayed incorrectly.
6.1.4 Custom module

Search in custom module: the search doesn't work by min-max number and min-max date time.

searchScope is only searching on the last property in the search string. eg: only items with FieldTwo == Test Two are displayed:

searchScope: "{'prop_FieldOne':'Test One','prop_FieldTwo':'Test Two'}"

If the property order around is switched, only items with FieldOne == Test One are displayed: searchScope: "{'prop_FieldTwo':'Test Two','prop_FieldOne':'Test One'}" All queries other than the last one are ignored.
6.1.4 Events The following error is displayed: "Liquid Error: Field not found in row: CustomerTypeName" instead of the event payment form for the logged in user. If the user is not logged in, the form displays fine.
6.1.4 Setup Analytics Google script is being inserted even if no analytics is set up (https://prnt.sc/1e1b4lx - there is no account ID in this script).
6.1.4 Liquid CRM Filtration by customer ID for the cases, orders, bookings lists and custom CRM group output.
6.1.4 Liquid Roll back the output of arrays in liquid with wrapping in [] .
6.1.4 Products and Events Optimize products, events, related items, grouped items, and favorites functions
6.1.4 Custom modules If you render {{this}}, "Parent": null, ParentName and ParentUrl are missing on the page in the page folder.
6.1.4 SEO This condition doesn't work: https://prnt.sc/1d358hv, when rendering {{this.SEOTitle}} on the system pages, nothing is rendered.
6.1.4 Liquid The Id isn't rendered in the "orders" FormatSetting component: https://prnt.sc/1dzy1h8, therefore currency custom settings do not apply.
6.1.4 Admin Simplified view doesn't work when using drag and drop: https://www.dropbox.com/s/0qb9s0hyao24xuw/Screen%20Recording%202021-07-12%20at%2009.47.32.mov?dl=0
6.1.4 Admin Ecommerce -> Catalogs -> Tree view -> Open a folder - products containing in this folder do not display: https://www.dropbox.com/s/66mdut9q90iamlj/Screen%20Recording%202021-07-12%20at%2010.37.39.mov?dl=0
6.1.4 Admin Custom module -> Settings -> Table-> add "Meta title" -> the content isn't displayed: https://prnt.sc/1b0pnk6
6.1.4 Admin Customize table in Custom Module -> set up Added by - > the information isn't displayed on the list: https://prnt.sc/1bppzw6
6.1.4 Admin Empty snippet -> create empty snippet -> add this snippet to the page -> there's a liquid error on the front end
6.1.4 CRM When an admin user outputs information about contacts on the page {% component type: "CRMContacts", collectionVariable: "crm" %}, there is an extra token field that the admin user should not see. And an admin user who has different tokens is rendered multiple times: https://prnt.sc/1gnkgv4
6.1.4 ID Keep old ids (one-digit) mapping to the new ones (four-digit) for the following
- Workflow
- Mailing list
- Secure Zone"
6.1.4 Export Custom module export bug: the custom properties were missing in the Excel file.
6.1.4 Export If there were more than 2 products in the order, the products were displayed incorrectly in the Excel file (https://prnt.sc/1gmcjwz).
6.1.4 Export Custom modules incorrect custom fields order output to the Excel doc.
6.1.4 Import After catalog import, only the root folder was applied to products.
6.1.4 Import Bug: Internal error when importing the custom module.
6.1.4 Shipping Options The test shipping option couldn't be deleted from the admin if it was selected in the order.
6.1.4 Blog "Internal error" after selecting the author for the blog.
6.1.4 Event Even if the "Enable Bookings" checkbox was disabled, the events weren't displayed on the frontend.
6.1.4 Orders/cases With 6.1.4 if the payment is canceled by the payment provider, there will be an error message after the form submission attempt, the case and order won't be created and therefore the workflow and autoresponder won't be sent.
6.1.4 Sitemap The sitemap was generated incorrectly if the expiry date and release date were disabled in the custom module.
6.1.4 FormSubmissionData {{FormSubmission.Order.ShippingAddress}} tag wasn't working correctly for the autoresponder, workflow and invoice.
6.1.4 Setup Analytics The Tracking ID and View ID couldn't be saved in the "Setup Analytics" tab.
6.1.4 "Allow listing CRM contacts data" checkbox Saving bug: the value of the "Allow listing CRM contacts data" checkbox wasn't saved properly (https://prnt.sc/1gmrhhs).
6.1.4 ID Bug: incorrect user and form submission ID in the autoresponder.
6.1.4 ID Note: If during the implementation you've hardcoded the IDs (e.g. secure zone or customer IDs), you'll need to change these IDs to the new ones.
6.1.4 Custom Module Custom module create/edit functions:

1) The code (create/edit) is generated in the incorrect order: http://joxi.ru/v29Y8y7CR8ddK2
2) The categories are not saved: http://joxi.ru/nAy1g6eTa7yaYA
3) The tags from the form are not rendered to the front end: http://joxi.ru/E2pZxnMT4lOvbr
4) There's an error "access forbidden" after creating though an item is being created.
5) After editing the custom module the layout is changed to the default one: http://joxi.ru/n2YJo0YU73Gk3A
6) The redirect doesn't work when creating/editing (for instance, <input type="hidden" name="redirectURL" value="/my-new-confirmation-page">) a custom module: http://joxi.ru/gmvXNVjCdkyvdA
6.1.4 Secure Zone Create a form with a paid (daily) secure zone -> set up a form autoresponder {{this}} -> incorrect info about secure zone is rendered: https://prnt.sc/1ginqhf
6.1.4 Liquid (concurrent processes error) Intermittent liquid error when rendering menus: "Liquid Error: The process cannot access the file 'D:\iis\websites\4085\25585\ftp\Content\MenuLayouts\new_main_menu\Main Menu\menu.layout' because it is being used by another process.
6.1.4 Liquid (concurrent processes error) Intermittent liquid error when viewing catalogs: "Liquid Error: Exception while reading from stream"
6.1.4 Event Orders-> internal error when viewing Event Boooking: https://prnt.sc/1g2al3l
6.1.4 Products (favorites) Liquid error when rendering favorites with includeItemData: "true". The error disappears after changing it to "false".
6.1.4 Admin "Added to shoping cart" functionality doesn't work: product -> inventory tab -> "added to shoping cart" parameters do not display: https://www.dropbox.com/s/1az3wm0ig089ypn/inventory.webm?dl=0
6.1.4 Advanced CRM Groups Advanced CRM Groups fields are missing in the workflows (with form submissions enabled)
6.1.4 Advanced CRM Groups The fields from the custom CRM groups aren't rendered to the "Thank you" page: https://prnt.sc/1ga33rm
6.1.4 Product The link from a product to an author doesn't work correctly: product -> select Author and click Preview -> 404 error in console: https://www.dropbox.com/s/eja63dh6kksz8en/authors.webm?dl=0
6.1.4 Currency 1) Default currency format isn't displayed correctly: https://prnt.sc/1bsbyjo;
2) Set up custom symbol for currency https://prnt.sc/1bscao9 after the change to default, it doesn't display correctly on the product detail: https://prnt.sc/1bsdhex
6.1.4 Payment Payments -> delete Paypal Flow: http://joxi.ru/1A5YkJRCzeG0wA
6.1.5 Calendar Today button has disappeared: http://joxi.ru/brRxondHLKYGP2.
6.1.5 Custom modules Select "Use default template" in the custom module settings - create an item and select "Use default template" - incorrect template is being displayed: https://prnt.sc/1be0xnr.
6.1.5 Custom modules One custom module can be parent and child at the same time: https://www.dropbox.com/s/dqzw6cxkzz15mgc/bug%20parent-child.webm?dl=0.
6.1.5 Products, Custom modules "Disable all items from Site Search" checkbox doesn't work in the custom module and products settings for the new items, same with the expiry date: http://joxi.ru/Q2KZoqjTyDG7Rm http://joxi.ru/DmBYjR7Cge1oxr.
6.1.5 Form The items order on the "thank you" page does not match the order in the form builder:http://joxi.ru/GrqakBVtRZpp3r.
The Main CSS https://prnt.sc/19hh8o2 (and other head elements) are added irrespective of the settings here: https://prnt.sc/19hhanz. Same issue is with the reCAPTCHA: https://prnt.sc/19hhd48.
6.1.5 CRM/Custom report Timeout error when exporting multiple contacts.
6.1.5 Create Advanced CRM Group with some fields -> add another field after saving and click on "save" https://prnt.sc/1h02s0g -> previous fields will disappear: https://prnt.sc/1h02w8x.
6.1.5 System Page Add ability to update "deferred-order-payment" system page template. Add currentMemberOnly: "false" to the component type:"orders".
6.1.5 Shopping cart Incorrect display of the title in the shopping cart: shopping_cart.
6.1.5 Custom reports Pagination from the second page doesn't work: https://prnt.sc/1hj8clg.
6.1.5 WYSIWYG Add styles to the text and click on "save": https://prnt.sc/1gna5l4 - code view - the styles are displayed correctly: https://prnt.sc/1gnalqy - go back to WYSIWYG, remove styles and click on "save": https://prnt.sc/1gnawij - code view - the styles are still there: https://prnt.sc/1gnb80r.
6.1.5 Events

When you uncheck "Enable Bookings", the homepage layout completely breaks and for some reason ecommerce fields are shown in the backend and the event date fields are removed.

6.1.5 URL Redirect 1) URLs are trimmed: http://joxi.ru/L21BOJ3tzP8YxA
2) The redirect to the external site looks like this: http://joxi.ru/vAW8oeVTBJgk1r
6.1.5 Optimization All pages connected with eCommerce are working slowly.
6.1.5 Category module_category_list is not rendering the category IDs. The IDs are visible in the JSON collection output but do not render when looping {% component type: "module_category_list", module: "Blog Post", collectionVariable: "test" %} <pre>{{test}}</pre> <pre>{{test.Items[0].Id}}</pre>
6.1.5

Custom module

If "Enable bookings" checkbox is enabled https://prnt.sc/1ibjad4, the items aren't displayed on the front end.
6.1.5

Custom module

If "Enable bookings" checkbox is enabled https://prnt.sc/1ibjad4 and {{this}} is rendered on the item detail, the information on "hide when full", etc. related to the event will be missing.
6.1.5 Secure zone Internal error when removing subscriptions: https://prnt.sc/1irc8u7
6.1.5

Custom module

Selected and saved categoiries can't be rolled back, they are coming back after clicking on "save": https://www.dropbox.com/s/cr3sy9zbrd1b1ey/categories.webm?dl=0
6.1.5 Media Downloads DWG and DXF file formats weren't supported for media downloads.
6.1.5 Email Marketing The API Key value wasn't saved in the "API Provider" tab.
6.1.5 Custom modules, Update Form Custom module Update Form bug: the update form wasn't adding the "/" before the image URL. Also, the custom properties were deleted after the custom module was updated.
6.1.5 Custom module The field information and custom properties were displayed incorrectly in the workflow.
6.1.5 Pages Only folders were shown and the pages were missing in the "pages" tab on the tree view after the page folder was edited and the "back" button was clicked.
6.1.5 Form / form submission The form submissions had the incorrect time. The same issue was with event bookings.
6.1.5 Recaptcha "Create Login", "Reset password" and "Update Account" form bug: if the Recaptcha v2 or v3 was set up, the error was displayed after the form submission.
6.1.5 Recaptcha Bug: the user could submit a form without passing the Recaptcha verification. This affected the "Login", "Reset password" and "Update" forms.
6.1.5 Form / form submission The autoresponder and workflow weren't sent after the form submission.
6.1.5 Emails The system emails weren't sent.
6.1.5 Form The redirect wasn't working for the "secure zone login" functionality and the user was redirected to the error page after logging into the secure zone.
6.1.5 Pages The "Make item secure" functionality wasn't working correctly for pages and folders, the checkbox with the secure zone name couldn't be disabled.
6.1.5 Email Templates The changes weren't displayed in the invoice even though the system template was edited.
6.1.6 Shipping Shipping providers integration optimization.
6.1.6 Delete selected All the snippets/Content templates/Workflows/Workflow Emails/Email Templates/Mailing Lists are highlighted and deleted when selecting "delete selected":https://www.dropbox.com/s/1pm1ldstpjtsb6v/SNIPPETS%20DELETE.webm?dl=0
6.1.6 FTP Pages -> duplicate a page -> wait for 2 minutes -> root -> a duplicate folder is being displayed: https://prnt.sc/1ib3wpu
6.1.6 Workflow Create a workflow https://prnt.sc/1j0d0cf -> assign it to the form -> submit a form -> an error is being displayed: https://prnt.sc/1j0d5bh
6.1.6 Contacts Update account settings -> "Allow listing my contact data in the CMS" isn't displayed from the front-end
6.1.6 Import Import file in custom module (file will send in telegram) -> display 500 error https://prnt.sc/1ibfppj
6.1.6 Optimization The page form-submission-results keeps loading for a long time.
6.1.6 Stripe Portal The plan names do not match the secure zone name in Treepl after secure zone name update.
6.1.6 Mailing Lists Internal error when trying to subscribe a contact manually to the mailing lists in the contact detail [in 6.1.5]
6.1.6 Stripe one-time payment One-time payment form doesn't work: https://prnt.sc/1jbfi3k
6.1.6 Import in Contacts Contacts -> export -> import -> a 400 error is being displayed: https://prnt.sc/1imn9am
6.1.6 Admin The first country is "Mali" http://joxi.ru/Vm6Y13kCRgDQYr by default in the email marketing settings.
6.1.6 Authorize net Create a weekly paid secure zone -> pay for secure zone access -> an order is neither created nor secure zone is assigned to the user https://prnt.sc/1jflseu/, the form submissions are created
6.1.6 Site notifications The issue with the email delivery is now fixed (this applies to workflows, autoresponders, "reset password" and "Invite admin user" emails, etc.)
6.1.6 Shopping cart Bug: if two products were added to the shopping cart and one product was deleted, the error was displayed.
6.1.6 Stripe The shipping address was displayed incorrectly in Stripe (only the country information was passed to Stripe after the payment).
6.1.6 Pages BUG: the content was deleted in the parent folder when there was a URL conflict within the folder (identical URLs conflict).
6.1.6 FTP The pages weren't shown in the "Pages" tab after they were uploaded via FTP. The pages weren't visible in FTP either.
6.1.6 Bambora There was an issue with products purchase with the following settings for Bambora: https://prnt.sc/1mv8g20
6.1.6 Stripe / Bambora 3D secure / Pay with Pay Pal If two-step card payment was selected for one of the following gateways: Stripe, Bambora, "Pay with Paypal", the internal error was displayed after the payment.
6.1.6 Authorize net BUG: Even though the "Give one-day access before payment received" option was selected: http://joxi.net/DmBYjR7Cg9DaMr, the access wasn't granted to the user after payment.
6.1.6 Email domains If the domain wasn't verified (the "Failed" status was shown in the admin) and the "Retry" button was clicked, the "internal error" was shown: https://prnt.sc/1mv4jvd
6.1.6 Taxes Multiple identical tax codes were displayed in the dropdown on the shopping cart page if the user constantly logged in and logged out from the secure zone.
6.1.6 Cases BUG: this.case couldn't be displayed on the page, the "Liquid error" was shown instead.
6.1.7 Payment settings

After removing the payment gateway settings and refreshing the page, they are coming back: http://joxi.ru/BA0YlbaCvgLaqr

6.1.7 Event booking

Go to Event Booking -> Edit -> Save -> an error is being displayed: https://prnt.sc/1mo6w3z

6.1.7 Email Marketing Set an API Provider -> then go to Mailing Lists and create new -> an error is being displayed: https://prnt.sc/1indmrm
6.1.7 Liquid

{{request.request_data.referrer}} changed from displaying relative URLs to absolute URLs.

6.1.7 Liquid The following tags do not work: {{this.formSubmissionData.fields.custom.Payment_ShippingAddress.value}} {{this.formSubmissionData.Fields.Custom.Payment_ShippingCity.value}} {{this.formSubmissionData.Fields.Custom.Payment_ShippingState.value}} {{this.formSubmissionData.Fields.Custom.Zip_Code.value}}
6.1.7 Event booking BUG: The event bookings were displayed without an event name after the event was purchased and then deleted.
6.1.7 Time zone The time was displayed incorrectly in admin in such cases: - for orders; - incorrect time for the {{this.order.invoiceDate}} tag;
6.1.7 Currency After adding a new currentcy, add a product with the price and configure payment settings, then delete a product and payment settings and try to delete the currency -> an error is being displayed: http://joxi.ru/n2YJo0YU7LYB5A
6.1.7 WYSIWYG BUG: If the image was inserted via WYSIWYG, the long image code was displayed in the code view instead of the short one.
6.1.8 Catalogs You can't assign parents to catalogs after "drag and drop", they are duplicated on clicking "save": https://www.dropbox.com/s/pk573kas4hatm6a/catalogs%20bug.webm?dl=0 Same issue with custom modules.
6.1.8 Checkout/forms with system fields If you go to the checkout forms and fill in all the fields (incl. zip, state, city or system city and address), everything works fine. If you don't fill all these fields on the checkout, the data the user has indicated as an address will be deleted in the site admin: https://prnt.sc/1qhjkbf
6.1.8 Import When importing products with grouped products, one of them is named as the default product name, the rest - the way they were named in the grouped products tab: http://joxi.ru/GrqakBVtRpDPbr http://joxi.ru/E2pZxnMT4Kqa1r
6.1.8 Custom Modules Parent categories disappeared after 6.1.7 release.
6.1.8 Liquid Attributes output on the products detail in stock:
v6 - http://joxi.ru/YmE5opqTGZw6gm without "S" in the end.
v5 - http://joxi.ru/vAW8oeVT3kgDDr with "S" in the end. This has been changed to match v5
6.1.8 SEO Select primary language in the SEO section http://joxi.ru/4Ak6Nxbc00WGP2 , it will be added to the page without a closing quotation mark: http://joxi.ru/EA4YD5MTvvLyQr <html lang="en> if the lang hasn't been added to the code. If you add it to the code, the result will be as follows: http://joxi.ru/4Ak6Nxbc00W882
6.1.8 Liquid 5.9.5 - {{this.InventoryProductVariations}} tag displayed such a data array: http://joxi.ru/4Ak6REZHjNy4V2With v6 you need to add specific tags to display elements of that data array:{{this.SKUCode}}, {{this.InStock}}, there's no access to PreOrder:http://joxi.ru/YmE5opqTGbDzRm http://joxi.ru/a2XNoY7TQ0aWWr
6.1.8 Email Domains Email domains shouldn't be case-sensitive: http://joxi.ru/xAeoWX8Ub0pwPm
6.1.8 Catalogs Incorrect display of the parents in the catalogs ("Simplified Tree View/ Tree View"): http://joxi.ru/Y2LaoD8tMk4bGA http://joxi.ru/BA0YlbaCvykXnr http://joxi.ru/8AnlnN3toZdkVm
6.1.8 Liquid Add this code to the detail/list layout: {% component itemId: "{{this.id}}", type: "ecommerce_buy_now", buttonName: "Order Now" %} {% component itemId: "{{this.id}}", type: "ecommerce_add_to_cart", buttonName: "Order Now" %} -> custom name won't be applied to buttons
6.1.8 Release/expiration date Release/expiration dates do not work in custom modules/events/blogs/faqs/products though inactive image is being displayed: http://joxi.ru/zAN3oBQI8EoR7r http://joxi.ru/4Ak6REZH0Q7ZV2 http://joxi.ru/Vm6Y13kCRy5aNr
6.1.8 Sitemap SEO -> select Enable Automation of sitemap https://prnt.sc/1qd0l8n -> go to Sitemap -> the automation doesn't work
6.1.8 Import with empty lines If you go to an Event and make an export (there should be several lines empty in the file) https://prnt.sc/1q2tqgj -> and then import the same file -> it results in an error in the site admin, however, the import will be completed with empty items: https://prnt.sc/1q2u0g0
6.1.8 Weighting If in addition to weighting in module items you'll add sorting by name to module output,the sorting by weighting will be ignored if filtering is in use. Without filtering weighting works correctly.
6.1.8 Custom module When you create/update an item from the front-end, the info from the FormSubmissionData won't be displayed in the workflow.
6.1.8 Create items from the front-end When you create/update an item from the front-end, incorrect time is displayed in the site admin: https://prnt.sc/1qhk320
6.1.8 Sitemap 1) Sitemap is generated with incorrect dates: https://prnt.sc/1r3wn51 2) Sitemap is generated with double URLS: http://joxi.net/82QXl4WC8Dzp6m
6.1.8 Large file export/import Temporary restriction: currently, you can import up to 600 products. This restriction will be lifted in the upcoming releases.
6.1.8 Pages (UI) After opening the pages in the list view and editing the page from the folder, this folder was added to the breadcrumbs. After clicking on this page from breadcrumbs, the "Analytics" page was opened in the admin.
6.1.8 Domain request The following tag wasn't working correctly: {% component type: "domain_settings", collectionVariable:"domain" %} <pre> {{domain}} </pre>
6.1.8 URL redirect The redirects with the .htm page suffix weren't working correctly (e.g. the redirect from contact.htm to contact)
6.1.8 Shipping Options When the new catalog was created, it wasn't displayed in the "Shipping options settings" tab. The similar issue was for discounts ("apply discount to selected catalog" checkbox).
6.1.8 Liquid The blog archives weren't displayed on the site when using this tag: {% component type:"module_archive", module:"Blog Post", parentItemId:"{{parentItemId}}", numberOfMonths: 2, layout:"/includes/archive.layout", sortBy:"date", sortOrder:"DESC" %}
6.1.8 Edit item from the front-end If the created select element is not "multiple" for the "custom module update form" and the "---" is selected on the front-end, the changes were not saved in the admin.
6.1.8 Search by custom module The search by the author wasn't working correctly in custom modules. The similar issue was for the "data source" drop down.
6.1.8 Custom Reports The custom reports weren't running if the following items were selected for "Contacts and Orders" report type: Contact ID, First Name, Email, Order ID, Date submission. Also, the custom reports weren't created with the form custom fields.
6.1.8 Order of attributes BUG: when the product was created, the attribute output was incorrect on the front-end.
6.1.8 Liquid BUG: {{this['SiteSearchKeywords']}} wasn't rendered on the page.
6.1.8 WWW domain The payment fields weren't displayed on the forms for the www domain, they worked correctly for the non-www version of the site.
6.1.8 Case sensitivity BUG: the email fields were case sensitive
6.1.8 Import of items with identical names If the items with identical names were added to the events export file, the incorrect URLs were displayed in the admin after the import of this file.
6.1.8 Liquid - The following tags weren't working without "this":
{{FormSubmissionData}}
{{Order}}
- These tags weren't displayed in the invoice: https://prnt.sc/1r1yn06 ;
- when {{this.order}} was added to the invoice, the CaseID wasn't displayed;
- when <pre>{{FormSubmission.Order.ShippingAddress}}</pre> was pasted to the order page, the required info wasn't displayed;
- when <pre>{{FormSubmissionData}}</pre> was pasted to the order page, the required info wasn't displayed.
6.1.8 Products import BUG: after deleting the IDs in the product export file and then importing this file, the following issues occurred: - the "prices" tab was blank; - the "internal error" was displayed in attributes, inventory, related items, grouped items.
6.1.8 Shopping cart The setting "Lifetime for shopping cart" was working incorrectly.
6.1.8 Time in event booking/one time payment form The incorrect payment time was displayed in the Orders -> "Payments" tab after purchasing the event or submitting a payment form (one-time payment).
Show more less
v 6.1.0-3 Release date: 21 Jul, 2021

Full Release Notes

6.1.0 Export Orders export doesn't work if large amounts are separated by commas and dots.
6.1.0 Site Search Site search returns 'site is being indexed'.
6.1.0 CRM Internal errror when registering to a Secure Zone.
6.1.0 Catalog 404 error when viewing catalogs on the site. It works correctly only when adding catalogs to the URL.
6.1.0 Secure Zone Logout from the Secure Zone doesn't work.
6.1.0 Archive Archives do not work correctly.
6.1.2.8 Form Autoresponder is missing content.
6.1.2.8 Secure Zone A second Secure Zone can't be assigned to a contact - the page keeps loading. If you assign 1 Secure Zone only - it works correctly.
6.1.2.8 Custom modules import/export Custom modules import/export issues:
1) There's an error if importing right after the export: https://prnt.sc/1dypkvi.
2) Incorrect property date is exported.
3) Templates aren't imported/exported correctly.
4) Modules categories aren't updated.
6.1.2.8 Custom modules Custom modules items preview doesn't work (404) if "еnable bookings" has been selected: http://prntscr.com/190pi2x.
6.1.2.8 JS is broken because of the ItemCategorieList.
6.1.2.8 Orders export Orders export works incosistently.
6.1.2.8 Titles There's an issue with titles output: a duplicate is rendered (both titles are rendered for the page and the folder.
6.1.2.8 Shopping cart Liquid error on the shopping cart even after resetting it to the default layout.
6.1.2.8 Secure Zone You can access a Secure Zone after the subscription has expired.
6.1.2.8 Products 500 error when creating a product.
6.1.2.8 It's impossible to render name and URL when adding data source to the custom properties. When rendering {{this}}, these fields are empty: http://prntscr.com/198uy0g.
6.1.2.8 Catalogs Internal error when viewing catalogs list. "An error occurred. (Exception while reading from stream)" on the product detail.
6.1.2.8 Site search Products aren't shown in the site search results.
6.1.2.8 Workflows and autoresponders aren't sent.
6.1.2.9 CRM Liquid error when rendering a contact and filtering by ID.
6.1.2.9 Product, relaited items Liquid error instead of related items: https://prnt.sc/1b43164.
6.1.2.9 Product, relaited items Liquid error wnen rendering related products: {% component source: "Products", itemId: "{{this.id}}", collectionVariable: "relatedProducts", type: "related_items" %} https://prnt.sc/1b44ccq.
6.1.2.9 Products export Issues when exporting products with SKU code: a new tab "Variation SKU Code" is added to the excel which doesn't exist in the properties.
Custom reports Custom reports -> select a report -> click on tab RESULTS -> endless loading.
6.1.2.9 Shopping cart CLEAR CART issue - > go to shopping cart and click on Clear Cart - it keeps redirecting.
6.1.2.9 Faqs Go to FAQS -> create a new item -> detail layout сan't be displayed.
6.1.2.9 Products attributes Products attributes issue: attributes order in the dropdown should match the backend: https://prnt.sc/1dzi7pl.
6.1.2.9 Sitemap After excluding some modules from the Sitemap they keep appearing in the Sitemap.
6.1.2.9 SEO SEO -> Primary Country and Primary Language settings are not displayed after clicking on the "save changes": https://prnt.sc/1dzsdzl, https://prnt.sc/1dzsjlp.
6.1.2.9 Admin user Internal error after trying to delete a contact or duplicating an admin user.
6.1.2.9 Products grouping "Group Items -> set up one product group https://prnt.sc/1dzv53y -> add this code to the page: {% component source: ""Products"", layout: ""List"", limit: ""100"", type: ""module"" %} only main group product should be displayed on the page: https://prnt.sc/1dzx1g2.
6.1.2.9 Admin Incorrect order deletion. When the order was deleted in the "Orders" tab, it wasn't deleted in the "Contatcs" -> particular contact -> "Orders" tab.
6.1.2.9 The order was showing in the export file even though it was deleted.
6.1.2.9 The "Email invoice" and "Send test email" functionality wasn't working (https://prnt.sc/1dzppf9).
6.1.2.9 Admin The search field wasn't working for dropdowns in the admin (e.g. https://prnt.sc/1dzs7kf).
6.1.2.9 System Email Issue with system email tags output. Now these tags are not case sensitive:
{{this.order}}
{{this.Order.Items[0]}}
{{this.customer}}
{{this.member}}
{{this.member}}
{{this.Member.SecureZone[0].Name}}
6.1.2.9 SKU code SKU code issue: when the product had been created using the generated SKU code and then this code was changed to the custom one, there was a synchronization issue.
Products and categories Error when creating the products and saving the categories: https://prnt.sc/1b3urrg.
6.1.2.9 Bambora Payment Gateway 1) The payment process wasn’t working with the two-step card payments and the “Redirect” checkout integration type (https://prnt.sc/1dzx3yt). 2) After the form submission, the list of the purchased products wasn’t displayed on the frontend with the “Inline” and “Modal” integration types.
6.1.2.9 Event Calendar Issue with the calendar output on the frontend.
6.1.2.9 Events When a paid event form was created, the event price wasn't displayed on the frontend. The total amount wasn't calculated correctly after changing the quantity. Also, the order was generated incorrectly.
Liquid tags The {{liquidContext}} tag wasn't working correctly for the invoice, workflow and autoresponder.
6.1.2.9 Liquid tags When the currency on the domain was being changed (custom symbol), the ToDomainMoneyFormat liquid filter wasn't changed: https://prnt.sc/1dxqfr5.
Export The custom properties and "parent" were displayed incorrectly in the products export spreadsheet.
Custom modules The "create/update custom module items from the frontend" functionality has been fixed.
6.1.2.9 Product Group "Liquid Error: Field not found in row: CategoryIdList" error was displayed on the frontend instead of "select" (e.g. product size options).
6.1.2.9 Case sensitivity Case sensativity of the alias name: {% component type: "snippet", alias: "menu_Desktop"%} and {% component type: "snippet", alias: "menu_desktop"%} - both options are working fine now. The same applies to SortBy: "weighting".
6.1.2.9 Form submissions output The form submissions of the particular logged-in user weren't displaying on the frontend.
6.1.2.9 Admin The "Enabled" checkbox wasn't working correctly. Even though the item was disabled, it was displaying on the frontend.
6.1.2.9 Products In the "attribute" dropdown the values were displayed twice.
6.1.3 Forms Even if the URL redirect was set up for the form, the redirect wasn't working.
6.1.3 Liquid tags The info about pagination wasn't displayed in the {{this}} tag for modules (custom modules, blog, etc.): https://skr.sh/s8oOfcT43ae
6.1.3 Blog Issue with the incorrect author ID in Blog.
6.1.3 Advance CRM group When rendering a CRM group field, all values are displayed instead of logged-in user ones.
Show more less
v 6.1 Release date: 30 Jun, 2021

Full Release Notes

BACKLOG

Gift Cards + Discount Codes on form payments and secure zone subscriptions

Gift Vouchers and Discount Codes can now be used with all form payments (general payment, paid Events, paid Secure Zone subscriptions).

For Secure Zone Recurring Discount Settings:

Add new settings to ‘eCommerce’ > ‘Settings’ > ‘Settings tab’:

“Recurring Settings”

  • Discount applies to
    • First Payment Only (default)
    • All Payments

Discount Code and Gift Voucher to forms:

Ability to add ’Discount Code’ and ’Gift Voucher’ fields to the form builder.

Generate following HTML on default form html:

Discount Code:

<label for="Payment_DiscountCode">Discount Code</label>
<input type="text" id="Payment_DiscountCode" name="Payment_DiscountCode">

Gift Voucher:

<label for="Payment_GiftVoucher">Gift Voucher</label>
<input type="text" id="Payment_GiftVoucher" name="Payment_GiftVoucher">

Do not allow to add Discount Code or Gift Voucher field to the form type="checkout". 

If attempted, show error: “<fieldName> doesn't allowed on this type of the form”

Do not allow to change the type of the form to type="checkout" if it contains Discount Code or Gift Voucher field.

If attempted, show same error as above.


When payment proceeds - apply following Discount and Gift Voucher like it works on shopping cart.

  • SKIP applying on from type="checkout"
  • APPLY on
    • Generic form
      • General payment
      • Secure zone recurring payment
    • SingleItem form

Default html code rework:

Replace: 

<input type="text" disabled="disabled" id="Payment_Amount" name="Payment_Amount" value="{{this.paymentAmount}}"/>

to:

<input type="text" disabled="disabled" id="PaymentTotalCost" value="{{this.paymentAmount}}"/>

JS implementation:

  • Add ’priceCalculation.js’ to the head section of the page if form contains Discount Code or Gift Voucher field.
  • Implement algorithm in JS that decreases price when Discount and/or Gift Voucher applies (trigger it on ’Payment_DiscountCode’, ’Payment_GiftVoucher’ or ’Payment_Amount’ field change event):
    • Take ’PaymentAmount’ form ’name="Payment_Amount"’.
    • Take value of ’GiftVoucherValue’ based on ’Payment_GiftVoucher’
    • Take value of ’DiscountCodeValue’ based on ’Payment_DiscountCode’
      • DiscountCodeValue = PaymentAmount * DiscountCodePercentageValue
        or
      • DiscountCodeValue = DiscountCodeAmountValue implement and use frontend API request to determine values of a discount code and a gift voucher.
        • Return validation errors for DiscountCode AND GiftVoucher (see shopping cart errors)                               
    • Calculate ’TotalCost’
      • TotalCost = PaymentAmount - DiscountCodeValue - GiftVoucherValue
      • if TotalCost < 0 
        • TotalCost = 0
    • Set ’TotalCost’ to <input id="PaymentTotalCost"/> of the current form


Discount payment flow:

  • If PaymentAmount matches the required payment amount for the current form (for Generic form with recurring secure zones - sum of all recurring subscription prices. For SingleItem - priceOfEvent*allocation)
    • If DiscountCode is applied AND (DiscountCode IS expired OR RedemptionQuantity == Expire After x Redemption OR DiscountCode IS disabled)
      • Show appropriate validation error (see shopping cart errors)
    • Else
      • Begin
        • Create Order. 
        • Set OrderLine price to PaymentAmount 
        • Apply Discount and/or Gift Voucher
        • DO Increase RedemptionQuantity for the Discount 
      • Then
        • Get TotalCost by the logic described above.
      • Then
        • If Discount applies to == First Payment Only
          • Create Recurring Payment
            • Set first payment Price to TotalCost  and recurring Price to PaymentAmount
        • elseif Discount applies to == All Payments
          • If DiscountCodePercentageValue == 100
            • Create secure zone subscriptions with expiration date 31-Dec-9999
            • Do NOT Create Recurring Payment
          • else
            • Create Recurring Payment
              Set first payment Price to TotalCostand recurring Price to
              PaymentAmount * (1-DiscountCodePercentageValue/100)
              • if TotalCost == PaymentAmount * (1-DiscountCodePercentageValue/100)
                • set general recurring payment with price == TotalCost
    • Then
      • if GiftVoucherValue > 0 and (PaymentAmount - DiscountCodeValue) > 0
        • GiftVoucherBalance = GiftVoucherValue - (PaymentAmount - DiscountCodeValue)
        • Apply GiftVoucherBalance to the GiftVoucher
  • else 
    • show current validation error message
  • Then
    • When recurring payment triggers webhook
      • Get Parent Order's DiscountCode
      • Get Parent Order's OrderLine
      • Create order using OrderLine and DiscountCode
      • DO NOT increase RedemptionQuantity for the DiscountCode

For Stripe:

For recurring payment if payment gateway is STRIPE

If Discount applies to == All Payments AND applied DiscountCode and GiftVoucher - show validation message:

“Current site settings doesn't allow applying Discount Code and Gift Voucher at the same time for recurring payments”

Examples:

Examples of secure zone subscription purchase (Discount applies to == First Payment Only):

1. For % off discount, it should be a one-time discount. So that the renewal is at the normal rate for that subscription.

For instance:

  • subscription cost $100
  • 50% discount

Result

  • first payment: 100*0.5 = $50
  • recurring payments: $100

2. For dollar amount discount, it would work the same way - on the initial purchase only. All recurring invoices would not use the discount.

For instance:

  • $100 subscription
  • $50 discount
  • $30 gift voucher

Result

  • first payment 100-50-30 = $20
  • all recurring payments: $100

BACKLOG

Stripe Customer Portal

Implement Stripe Customer Portal Page
(What is this? https://stripe.com/docs/billing/subscriptions/customer-portal)

Liquid:

Add link for the Stripe Customer Portal into the request member object:

‘request.currentmember.StripeCustomerPortalLink’

When clicking on the link:

  • if current logged in user == null
    • Render content of 401 System Page
  • Else, verify if current logged in user equals to order's CRM contact
    • If true:
      Open Stripe Customer Portal page
    • Else:
      Render content of 403 System Page

Implement Flows triggered by the Stripe Customer Portal 

Cancel Recurring Flow:

  • If subscription canceled from Stripe Customer Portal - cancel subscription in the CMS

Change Subscription (that contains only one Plan):

  • If subscription plan was changed from Stripe Customer Portal - sync plan on the subscription in CMS

Change Email Address:

  • If email address changed from Stripe Customer Portal - begin change of  CRM Contact -> Email property:
    • Create request to change email
    • send confirmation email to new email address
    • if confirmed - change email
    • else - do nothing

Change Billing Address:

  • If Billing Address changed from Stripe Customer Portal - change CRM Contact -> Billing Address accordingly

Change Phone Number:

  • If Phone changed from Stripe Customer Portal - change CRM Contact -> Phone property

BACKLOG

Custom Reports: Customer And Order logic extending

Add following ”view” and ”filter” options to ”Customer And Order” report type allowing further order and individual product reporting/filtering:

  • Product Name
    - Show dropdown of ALL product names on filter
  • Product Attributes
    - General string field on filter
  • SKU Code
    - General string field on filter
  • Product Quantity
    - Number field on filter
  • Product Price
    - Number field on filter
  • Product Total Price
    - Number field on filter
  • Order Discount Price
    - Number field on filter
  • Order Discount Code
    - General string field on filter
  • Order Gift Voucher Price
    - Number field on filter
  • Order Gift Voucher 
    - General string field on filter
  • Order Shipping Price
    - Number field on filter

BC example: http://prntscr.com/15dpmrd

When the following fields are selected for viewing - show each product data on a separate row.

Order and Customer data should be repeated in each row where product data listed.

Example: https://www.screencast.com/t/aX5hWFlz

BACKLOG

“| truncate” filter fix

Fix for the Liquid ‘| truncate’ filter

If string length bigger than (limitValue - ellipsis length) - do not show ellipsis at the end of the string

Before: http://prntscr.com/16bd9c7

After: http://prntscr.com/16bdidy

BACKLOG

Add form alias to system page redirect URL

Change default system page URL for form submissions to include the form alias as URL parameter (for GA tracking purposes):

/form-submission-results?form=[form.Alias]

So it will be similar to previous implementation:

/forms/cases.ashx?form=[form.Alias]

Feature Flags

Feature flags changes (v6.1)

Move flags to ”internal” and set to true:

  • Anti-spam protection
Show more less
New Feature

Gift Cards And Discount Codes On Any Payment Forms

Ability to apply Discount Code and/or Gift Voucher on:
- General payment form
- Secure zone subscription form
- Event payment form
  • Ecommerce
  • Forms
  • Secure Zones
New Feature

Stripe Customer Portal

Add the ability for logged in users to get the Stripe Customer Portal page that belongs to the particular recurring order.
List of functionality available through the Stripe Customer Portal:
- Update credit card for the subscription
- Get billing history for the subscription
- Change subscription plan
- Cancel subscription
- Change user data (Email Address, Phone Number, etc.)
...
  • Ecommerce
Improvement

Account Created In Portal

In the Partner Portal in both the Live Site and Trial site settings, can we get a “Account Created” text field, which generates the exact date that the site was created? To go one step further, possibly if we can get the date the website went live?

So, Trial site settings would show: Date Trial Site was Created; and,
...
  • Admin Panel
Improvement

Custom Reports: Customer And Order logic extending

Add the following view and filter options to the "Customer And Order" report: - Product Name
- Product Attributes
- SKU Code
- Product Quantity
- Product Price
- Product Total Price
- Order Discount Price
- Order Discount Code
- Order Gift Voucher Price
- Order Gift Voucher
- Order Shipping Price
  • BC Equivalent
  • CRM
v 6.0 Release date: 04 Jun, 2021

Full Release Notes

Portal

Rename Site

Ability to rename site name in Treepl Portal (under site settings)

Portal

Export site details

Export data for Trial and Live sites
Show button that performs export all sites details [in excel format]

For Live sites:

File Name: “Live_Sites_Export_${dateStr}.xlsx”

Export Data:

  • Site Name
  • Live Site URL (Primary domain)
  • Trial Site URL
  • Plan
  • Plan Fee
  • Date Created
  • Expiry Date


For Trial sites:
File Name: “Trial_Sites_Export_${dateStr}.xlsx”

Export Data:

  • Site Name
  • Trial Site URL
  • Plan
  • Date Created

DESIGN (for button placement): https://invis.io/KS111912R74U

​Restrictions:

  • Allowed for portal owner role (‘Partner’, ’Agency’ and ’Treepl User’ (added to the ’Agency’ portal))
  • Not available for ’Free user’ and ’Associate’ levels

Portal

Renewal notifications

Renewal checker will ping sites for renewal info.

If site found that matches condition - send email notification.

Conditions:

If current date is:

  • for site with monthly subscription
    • 3 days priorthe date of subscription
  • for site with annually subscription
    • 1 month (30 days) prior the date of subscription
    • 3 days prior the date of subscription

Email sending conditions:

  • Send email only to account owner
    • if account owner is agency - DO NOT send email to there Treepl user/s
  • If subscription created via direct billing flow
    • send email to payer 
    • send email to account owner

Email notifications:

Create emails templates for monthly and annual subscription 

DESIGN: https://invis.io/H6111B3M9PYQ

BACKLOG

New Architecture

Database and CMS Core

New Architecture as presented on Treehouse #22:

https://forum.treepl.co/t/treehouse-meeting-22/1658/4

LIQUID 3.0

New liquid engine provides much faster data retrieval than the previous version.

However there are also some differences in liquid work between versions.

Mostly they are the fixes of previous functionality that was semi-broken but still could be used by some partners as it was.

In that case such use of the buggy implementation required it to be fixed.

See this documentation article for changes and required actions.

BACKLOG

File Manager - Editing in tabs

Provide ability to open several files in tabs in the file manager

DESIGN: https://invis.io/ZA10840NYPRV

Editing supported for text-based files only of the following extension types:

  • .txt
  • .inc
  • .layout
  • .csv
  • .log
  • .sql
  • .html
  • .htm
  • .xml
  • .css
  • .scss
  • .sass
  • .less
  • .js
  • .xhtml
  • .rss
  • .json
  • .tpl

BACKLOG

Show Discount Codes In Backend

The ability to see which discount code is used for a specific order in the backend.

Order details:
http://prntscr.com/17aeox4

Order Products list:
http://prntscr.com/17aeavx

BACKLOG

Allow module item search from Tree View (same as List View)

The ability to search in nested module items and in Tree View (like you can in List View) for Pages, Snippets, Custom Modules, etc.
This brings list search to all modules now, including Blogs, Banners, Galleries, etc.

BACKLOG

Pagination on tree view module items

1) Add pagination for tree view in admin panel (UI is the same as for list view).

Pagination is now applied to both ’Parent’ items (viewed as folder icons) and ’Child’ items (viewed as file icons) and acts upon the whole list.

2) Apply Sorting via backend. Default sorting is not set (sort "folders" (parent module items) first then "files" (child module items)). 

Remember latest applied sorting (like it's done for list view).

Store sorting field/sort direction separately from list view so they are remembered independently.

3) Add searching by name for the current level

BACKLOG

Show/Hide Inactive/Disabled Items

The ability to show/hide inactive/disabled items across all modules.

  • showing all enabled and disabled
  • showing just enabled
  • showing just disabled

DESIGN: https://invis.io/8B10ETTMSHCU

BACKLOG

Module Introductory Note

Allow adding an introductory paragraph to the module list view to give editors some guidance.


Sometimes we want to give users some general directions for a module or some context on how a module is being used and what part of the website it populates.

Proposed solution:
Allow the addition of notes to a module that would be displayed inline above a module’s list view. Suggest that they are in a collapsible accordion that would be open by default, but after being closed by the user it would remember its state and stay closed on future visits.

DESIGN: https://invis.io/6U10E76B32XQ

BACKLOG

Bulk Assign Templates

Ability to assign several items (Pages, System Module items, Custom Module items) to a template via admin interface.

DESIGN: https://projects.invisionapp.com/share/PQ10EEP7NKZA#/screens/446376158

BACKLOG

Implement reCaptcha v3 For System Forms/login

Add ability to select the version of reCaptcha used for system forms

Add section to ‘Settings’ > ‘Misc’ with the ability to choose reCaptcha v2 or reCaptcha v3 to use on all system forms, which include:

  • login form
  • restore password request form
  • reset password form (on ’reset-password’ system page)
  • Update account form

Selected reCaptcha will affect both, the way the form's html is generated from the toolbox/component manager, and the reCaptcha validation for the submit action.

BACKLOG

Add “Format” To Code Editor

Add Button for code formatting purposes.

http://prntscr.com/nu1954

DESIGN: https://invis.io/NT10EEPX3GSY

BACKLOG

Customer Bookings and orders tabs

Add Event Bookings tab to CRM Contact:

http://prntscr.com/15hkhrp

Content should be the same table as on Event Bookings page http://prntscr.com/15hktfh

Add Orders tab to CRM Contact:

http://prntscr.com/15hkhrp

Content should be the same table as on Orders page http://prntscr.com/15hkv9f

Show more less
New Feature

Bulk Assignment Of Pages To A Template

Ability to assign several pages to a template via admin interface.

  • Pages and Templates
  • UI/UX
Improvement

Allow module child item search from Tree View (same as List View)

The ability to search in Blog posts just like in pages, snippets, Custom Modules etc.

  • Blogs
  • UI/UX
Improvement

BONUS: Add “Format” To Code Editor

Button for formating code correctly. code-editor-formating.png
  • BC Equivalent
  • UI/UX
Improvement

Implement reCaptcha v3 For System Forms/login

DESCRIPTION:
Depreciate the need to use recaptcha v2 on login forms and any other system form (I can only think of the account password update form, but there may be others).

BENEFIT:
Logins are always a barrier for end-users and bring along a whole set of additional user issues.
Implementing recaptcha v3 just helps make this process more user-friendly and...

  • General
  • Secure Zones
Improvement

Module Introductory Note: allow adding an introductory paragraph to the module list view

Allow adding an introductory paragraph to the module list view to give editors some guidance

Sometimes we want to give users some general directions for a module or some context on how a module is being used and what part of the website it populates.

Proposed solution:
Allow the addition of notes to a module that would be...
  • Admin Panel
  • Custom Modules
Improvement

New Architecture

This is the biggest update to Treepl CMS ever. We will be organizing a separate meeting to present all the changes and opportunities that the new architecture brings to the platform. Stay tuned.
  • General
  • Infrastructure
  • Liquid
Improvement

Show Discount Codes In Backend

The ability to see which discount code is used for a specific order in the backend.

discountCode.png

  • Ecommerce
Improvement

Show/Hide Inactive/Disabled Items

The ability to show/hide inactive/disabled items across the modules of the admin panel.

· showing all enabled and disabled
· showing just enabled
· showing just disabled
  • Admin Panel
  • Custom Modules