v6.11 Release date: 07 Feb, 2024

Full Release Notes

BACKLOG

Zapier - trigger recurring subscription change

Create a new trigger for the subscription change event

Name: Updated Recurring Subscription
Logic: Trigger event each time subscription status is changed

`RecurringSubscription` response object:

    {
        "Code": "Sub_123",
        "Status": "Canceled",
        "MemberId": 11111,
        "RecurringProducts": [
            {
                "EntityType": "SecureZoneSubscription",
                "Id": 1,
                "Name": "SZ"
            }
        ]
    }

Status values:

  • Incomplete
  • IncompleteExpired
  • Trialing
  • Active
  • PastDue
  • Canceled
  • Unpaid

EntityType values:

  • Form
  • ModuleItem
  • SecureZoneSubscription

Extension: Meta Conversion API Integration

1) Add extension Meta Conversion API Integration

Name: Meta Conversion API Integration (beta)
Short Description: Utilizes Meta Events via the Conversion API.
Price: Free during the beta period
Design: https://invis.io/E813E62LNS7H 

Supported the following events:

  • Add to cart
  • Initiate checkout
  • Complete registration
  • Lead
  • Purchase

More info can be found here:

- https://www.facebookblueprint.com/student/activity/212738-connect-your-data-with-pixel-and-conversions-api

- https://developers.facebook.com/docs/marketing-api/conversions-api/get-started

2) Extension page in Admin

Add page to extension menu item

Name: Meta Conversion API Integration

Design: https://invis.io/TB13E62NWP3D

Content:

Form with the following fields

  • Pixel ID [string] (required)
  • Access Token [string] (required)

3) Events to be implemented

  • Add to cart
    • Triggering logic:
      Trigger event once the addToCart API is calling (once clicking Add to cart) with a successful response (if an error occurred or not enough inventory - it would not be triggered)
  • Start placing an order
    • Triggering logic:
      Trigger event once any form with type checkout is loading on the page
  • Purchase
    • Triggering logic:
      Trigger event once form with payment is successfully submitted (event would be sent regardless of the payment result. The only blocking condition would be if a payment request would not be created successfully.
  • Lead
    • Triggering logic:
      Trigger event once any form without password field is sent
  • Completed registration
    • Triggering logic:
      Trigger event once any form with password field is sent

Google analytics events output via component and API

1) Event analytics retrieving logic

This logic is accessible only if GA4 analytics is set up in the admin panel.

Retrieve data using the following GA4 API:
https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport

Request JSON example:

    {
        "dimensions": [
            {
                "name": "date"
            },
            {
                "name": "eventName"
            },
            {
                "name": "customEvent:coupon_code"
            },
            {
                "name": "customEvent:user"
            }
        ],
        "metrics": [
            {
                "name": "eventCount"
            }
        ],
        "dateRanges": [
            {
                "startDate": "2023-07-03",
                "endDate": "2023-07-05"
            }
        ],
        "dimensionFilter": {
            "andGroup": {
                "expressions": [
                    {
                        "filter": {
                            "stringFilter": {
                                "matchType": "EXACT",
                                "value": "coupon_code_clicked"
                            },
                            "fieldName": "eventName"
                        }
                    },
                    {
                        "filter": {
                            "stringFilter": {
                                "matchType": "EXACT",
                                "value": "My CUSTOm CODE"
                            },
                            "fieldName": "customEvent:coupon_code"
                        }
                    }
                ]
            }
        },
        "limit": "100",
        "orderBys": [
            {
                "dimension": {
                    "orderType": "ALPHANUMERIC",
                    "dimensionName": "date"
                },
                "desc": false
            }
        ],
        "keepEmptyRows": true
    }

2) Liquid component

Component pattern:

{% component type:"frontend_API", endpoint:"/api/frontend/ga4_run_report",  request: "[[request]]", layout:"", collectionVariable:"" %}

Params description:

  • request
  • layout
    • Default component logic should be applied here.
    • Success response JSON object should be attached to liquid this.response variable
    • Error response JSON object should be attached to liquid this.errorMessages param.
      Example: "errorMessages": []
    • Number of errors should be attached to liquid this.error param.
      Example: "error": 0
    • Default layout is empty
  • Response {{this.response}} object:
        {
            "dimensionHeaders": [
                {
                    "name": "date"
                },
                {
                    "name": "eventName"
                },
                {
                    "name": "customEvent:coupon_code"
                },
                {
                    "name": "customEvent:user"
                }
            ],
            "metricHeaders": [
                {
                    "name": "eventCount",
                    "type": "TYPE_INTEGER"
                }
            ],
            "rows": [
                {
                    "dimensionValues": [
                        {
                            "value": "20230705"
                        },
                        {
                            "value": "coupon_code_clicked"
                        },
                        {
                            "value": "My CUSTOm CODE"
                        },
                        {
                            "value": "33"
                        }
                    ],
                    "metricValues": [
                        {
                            "value": "4"
                        }
                    ]
                },
                {
                    "dimensionValues": [
                        {
                            "value": "20230705"
                        },
                        {
                            "value": "coupon_code_clicked"
                        },
                        {
                            "value": "My CUSTOm CODE"
                        },
                        {
                            "value": "22"
                        }
                    ],
                    "metricValues": [
                        {
                            "value": "3"
                        }
                    ]
                },
                {
                    "dimensionValues": [
                        {
                            "value": "20230705"
                        },
                        {
                            "value": "coupon_code_clicked"
                        },
                        {
                            "value": "My CUSTOm CODE"
                        },
                        {
                            "value": "11"
                        }
                    ],
                    "metricValues": [
                        {
                            "value": "1"
                        }
                    ]
                },
                {
                    "dimensionValues": [
                        {
                            "value": "20230704"
                        },
                        {
                            "value": "coupon_code_clicked"
                        },
                        {
                            "value": "My CUSTOm CODE"
                        },
                        {
                            "value": "22"
                        }
                    ],
                    "metricValues": [
                        {
                            "value": "4"
                        }
                    ]
                },
                {
                    "dimensionValues": [
                        {
                            "value": "20230704"
                        },
                        {
                            "value": "coupon_code_clicked"
                        },
                        {
                            "value": "My CUSTOm CODE"
                        },
                        {
                            "value": "11"
                        }
                    ],
                    "metricValues": [
                        {
                            "value": "3"
                        }
                    ]
                },
                {
                    "dimensionValues": [
                        {
                            "value": "20230704"
                        },
                        {
                            "value": "coupon_code_clicked"
                        },
                        {
                            "value": "My CUSTOm CODE"
                        },
                        {
                            "value": "(not set)"
                        }
                    ],
                    "metricValues": [
                        {
                            "value": "2"
                        }
                    ]
                },
                {
                    "dimensionValues": [
                        {
                            "value": "20230704"
                        },
                        {
                            "value": "coupon_code_clicked"
                        },
                        {
                            "value": "My CUSTOm CODE"
                        },
                        {
                            "value": "33"
                        }
                    ],
                    "metricValues": [
                        {
                            "value": "1"
                        }
                    ]
                }
            ],
            "totals": [
                {
                    "dimensionValues": [
                        {
                            "value": "RESERVED_TOTAL"
                        },
                        {
                            "value": "RESERVED_TOTAL"
                        },
                        {
                            "value": "RESERVED_TOTAL"
                        },
                        {
                            "value": "RESERVED_TOTAL"
                        }
                    ],
                    "metricValues": [
                        {
                            "value": "18"
                        }
                    ]
                }
            ],
            "rowCount": 7,
            "metadata": {
                "currencyCode": "USD",
                "timeZone": "America/Los_Angeles"
            },
            "kind": "analyticsData#runReport"
        }
    

3) API Endpoint via frontend API

Create a new frontend API endpoint

Endpoint: /api/frontend/ga4_run_report

Type: GET

Params: request value is URL encoded JSON string as per the following documentation:
https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport#request-body

Example:

/api/frontend/ga4_run_report?request=%7B%22dimensions%22%3A%5B%7B%22name%22%3A%22date%22%7D%2C%7B%22name%22%3A%22eventName%22%7D%2C%7B%22name%22%3A%22customEvent%3Acoupon_code%22%7D%2C%7B%22name%22%3A%22customEvent%3Auser%22%7D%5D%2C%22metrics%22%3A%5B%7B%22name%22%3A%22eventCount%22%7D%5D%2C%22dateRanges%22%3A%5B%7B%22startDate%22%3A%222023-07-03%22%2C%22endDate%22%3A%222023-07-05%22%7D%5D%2C%22dimensionFilter%22%3A%7B%22andGroup%22%3A%7B%22expressions%22%3A%5B%7B%22filter%22%3A%7B%22stringFilter%22%3A%7B%22matchType%22%3A%22EXACT%22%2C%22value%22%3A%22coupon_code_clicked%22%7D%2C%22fieldName%22%3A%22eventName%22%7D%7D%2C%7B%22filter%22%3A%7B%22stringFilter%22%3A%7B%22matchType%22%3A%22EXACT%22%2C%22value%22%3A%22My%20CUSTOm%20CODE%22%7D%2C%22fieldName%22%3A%22customEvent%3Acoupon_code%22%7D%7D%5D%7D%7D%2C%22limit%22%3A%22100%22%2C%22orderBys%22%3A%5B%7B%22dimension%22%3A%7B%22orderType%22%3A%22ALPHANUMERIC%22%2C%22dimensionName%22%3A%22date%22%7D%2C%22desc%22%3Atrue%7D%5D%2C%22keepEmptyRows%22%3Atrue%7D

4) API Endpoint restrictions

Add API Endpoint restrictions:

see 2) “API Endpoint restrictions logic” (ie: Disallow processing API if the current logged-in user is mismatched with the restrictions)

5) Default include file for chart

Create default chart inside include file: /cms-assets/includes/ga4-report-chart.inc

Add ability to redraw chart on selecting different:

  • Start Date
  • End Date

Use API calls in order to retrieve new values

6) Add component to toolbox

Add to toolbox: “Frontend API” > “GA4 Report Chart”

Params:

  • startDate (default: {{"now" | date_add: -1, "month" | date: "%Y-%m-%d" }})
  • endDate (default: {{"now" | date: "%Y-%m-%d" }})
  • eventName (default: page_view)
  • requestJSON (default: see "Content" from section (5))
    • if provided - ignore all params above.

Output Value

{% include "/cms-assets/includes/ga4-report-chart.inc", startDate: "", endDate: "", eventName: "", requestJSON: "" %}

Secure Zone Subscribers analytics

1) Liquid component

Component pattern:

{% component type:"frontend_API", endpoint:"/api/frontend/secure_zone_subscribers_analytics", request:"[[request]]",  layout:"", collectionVariable:"" %}

Request expression pattern:

    {
        "startDate": "[[startDate]]",
        "endDate": "[[endDate]]",
        "filterExpression": [[filterJSONExpression]],
        "sortExpression": [[sortJSONExpression]],
        "groupType": "[[groupType]]"
    }

Description of the expression params:

[[startDate]]

  • allowed format: yyyy-mm-dd (if format not matched - use default: NOW date)

[[endDate]]

  • allowed format: yyyy-mm-dd (if format not matched - use default: startDate + one day)

[[filterJSONExpression]]

  • Expression pattern:
    [
        {
            "secureZones": [
                [[secureZoneId1]],
                [[secureZoneId2]],
                [[secureZoneIdN]]
            ]
        }
    ]
    
  • If supplied string could not be parsed as JSON - use default expression of empty array:
    [
        {
            "secureZones": []
        }
    ]
    

    Logic:
    IF secureZones is an empty array, retrieve stats for all secure zones.
    ELSE retrieve stats only for selected secure zones.

[[sortJSONExpression]]

  • Expression pattern (default):
    [
        {
            "sortBy": "date",
            "sortOrder": "ASC"
        }
    ]
    

    Allowed `sortBy` values: date
    If supplied string could not be parsed as JSON - use default expression

[[groupType]]

  • Possible values
    • Day (default)
    • Week
    • Month
    • Year

    If param is not specified - use default value

Full example of the request expresion:

{
    "startDate": "2023-10-01",
    "endDate": "2023-11-10",
    "filterExpression": [
        {
            "secureZones": [
                111,
                222,
                333
            ]
        }
    ],
    "sortExpression": [
        {
            "sortBy": "date",
            "sortOrder": "ASC"
        }
    ],
    "groupType": "Day"
}

Layout:

  • Default component logic should be applied here.
  • Response JSON object should be attached to liquid this.response variable
  • Default layout is empty

Response {{this.response}} object example:

    {
        "rows": [
            {
                "dimensionValues": [
                    {
                        "value": "Date"
                    },
                    {
                        "value": "Total"
                    },
                    {
                        "value": "secure zone 1"
                    },
                    {
                        "value": "secure zone 2"
                    },
                    {
                        "value": "secure zone 3"
                    }
                ],
                "metricValues": [
                    {
                        "value": "20230705"
                    },
                    {
                        "value": 39 //total number of subscribers to all selected secure zones
                    },
                    {
                        "value": 4 //number of subscribers to secure zone 1
                    },
                    {
                        "value": 2 //number of subscribers to secure zone 2
                    },
                    {
                        "value": 33 //number of subscribers to secure zone 3
                    }
                ]
            }
        ],
        "rowCount": 1
    }

2) API Endpoint via frontend API

Create a new frontend API endpoint

Endpoint: /api/frontend/secure_zone_subscribers_analytics

Type: GET

Params: `request` (URL encoded JSON string like in request for liquid object):
{"startDate":"2023-10-01","endDate":"2023-11-10","filterExpression":[{"secureZones":[111,222,333]}],"sortExpression":[{"sortBy":"date","sortOrder":"ASC"}],"groupType":"Day"}

Example:

/frontend_api/secure_zone_subscribers_analytics?request=%7B%22startDate%22%3A%222023-10-01%22%2C%22endDate%22%3A%222023-11-10%22%2C%22filterExpression%22%3A%5B%7B%22secureZones%22%3A%5B111%2C222%2C333%5D%7D%5D%2C%22sortExpression%22%3A%5B%7B%22sortBy%22%3A%22date%22%2C%22sortOrder%22%3A%22DESC%22%7D%5D%2C%22groupType%22%3A%22Day%22%7D

3) API Endpoint restrictions

Add API Endpoint restrictions:

see 2) “API Endpoint restrictions logic” (ie: Disallow processing API if the current logged-in user is mismatched with the restrictions)

4) Default include file for chart

Create default chart inside include file:
/cms-assets/includes/secure-zone-analytics-chart.inc

Add ability to redraw chart on selecting different:

  • Group Type
    • Day
    • Week
    • Month
    • Year
  • Start Date
  • End Date

Use API calls in order to retrieve new values

Content:

{% capture requestJSON %}
{
    "startDate": "{{startDate}}",
    "endDate": "{{endDate}}",
    "filterExpression": [
        {
            "secureZones": [{{secureZonesList}}]
        }
    ],
    "sortExpression": [
        {
            "sortBy": "date",
            "sortOrder": "ASC"
        }
    ],
    "groupType": "{{groupType | default : "Day"}}"
}
{% endcapture %}
{% component type:"frontend_API", endpoint:"/api/frontend/secure_zone_subscribers_analytics",  request: "{{requestJSON}}", layout:"", collectionVariable:"frontendAPIResponse" %}

Use frontendAPIResponse for the first draw and pass it to JS in order to determine request structure for the change startDate, endDate and groupType.

5) Add component to toolbox

Add to toolbox: ‘Frontend API’ > ‘Secure Zones Analytics Chart’

Params:

  • startDate (default: {{"now" | date_add: -1, "month" | date: "%Y-%m-%d" }})
  • endDate (default: {{"now" | date: "%Y-%m-%d" }})
  • secureZonesList (default: "")
    • if passed, should be a CSV string of secure zones ids (example "111,222,333")
  • groupType (default: "")
  • requestJSON (default: see "Content" from section (4))
    • if provided - ignore all params above.

Output Value

{% include "/cms-assets/includes/secure-zone-analytics-chart.inc", startDate: "", endDate: "", secureZonesList: "", groupType: "", requestJSON: "" %}

Module Item frontend API forms extending

1) Add permissions to Module -> `Site User permission`

Add following permission to the settings:

  • Allow Save Draft
  • Allow Publish Draft

Add workflow selector for each new permission

2) Rework Module -> `Site User permission` and Module -> `Autoresponder` tabs

  • Site User permission
    • Add API Endpoint restrictions (ability to set API Endpoint restrictions for each permission of the particular module):
      • see 2) “API Endpoint restrictions logic” (ie: Disallow processing API if the current logged-in user is mismatched with the restrictions)
  • Autoresponder updates:
    • Provide ability to configure all autoresponer settings for each action from permission list instead of "one single autoresponder for all actions":
      • Create module item
      • Update module item
      • Delete module item
      • Update draft module item
      • Publish draft module item
    • Migrate autoresponder settings from "one single autoresponder for all actions" to the following permission-specific autoresponders:
      • Create module item
      • Update module item
      • Delete module item
    • Set empty autoresponder settings for the new permission-specific autoresponders:
      • Update draft module item
      • Publish draft module item
    • Extend autoresponder settings
      • Setting: Receiver (Select element)
        • Form sender (default)
        • Item owner
        • Sender and owner
      • Logic:
        Receiver setting will determine what email to use as email receiver - current logged in user or actual item owner.
        Notes: on create item action there will be no difference between both options because item will be created by curren logged in user

Design: https://invis.io/NE13B20N72DB

3) Add Public API for Save Draft and Publish Draft

Add 2 new public APIs (similar to edit module item from frontend froms https://prnt.sc/OYeHVehTlJJI):

  • /public/api/module-items/update-draft
  • /public/api/module-items/publish-draft

Actions:

  • Send workflow if selected in Module -> Site User permission
  • Send API specific autoresponder if enabled and configured for certain API in Module -> Site User permission
  • Disallow to perform action if Module -> Site User permission ->  API Endpoint restrictions disallows current user to perform it

4) Update the toolbox with the new forms

Add forms to the toolbox (https://prnt.sc/pCCWR5PwOdny)

  • Update Item's Draft Form
  • Publish Item's Draft Form

5) Add param to the `module` and `module_of_member` components to receive draft versions of the items

Add param:

  • getDraft
    • true
    • false (default)

Logic:
if true; returns draft version of the item data insted of the public one.

6) Add URL param for the draft version of the item displaying

If url contains following get param - return draft version of the item taken by the URL instead of the public one:

  • ?DraftPreview=true

Frontend API access restrictions

1) Add API Endpoint restrictions setup page

Add new page: ‘Settings’ -> ‘Frontend API restrictions’

Design: https://invis.io/TY13B20D96NJ

2) API Endpoint restrictions logic

Restriction settings:

  • Enable/disable endpoint
  • API allowed to the following type of users:
    • Logged in users (default)
    • User from the following secure zones:
      • if this option selected - show list of the secure zones.
        Only users with access to ANY of the selected secure zones would be allowed to use API.
    • Admin Users
  • Ownership restriction (where API relates to entities having ownership):
    • Only Owner allowed (default) (only owner can perform an action or any user that belongs to the type determined above)
    • Anyone allowed

Restrictions can be applied to the following frontend APIs:

  • Create Module Item
  • Update Module Item
  • Delete Module Item
  • Update Draft Module Item
  • Publish Draft Module Item
  • Google analytics report
  • Secure zone subscribers analytics

3) Admin restrictions

Add to restrictions

  • Frontend API restrictions
    • Can View
    • Can Edit

4) Plan restriction

Min plan available: Essential

Category in module item view improvement

Example category structure

The module has selected 1-st level  category named AD-1 parent category as the parent category

Improvements:

1) Search by values

Add ability to search by values

2) Increase the number of shown items

Increase the number of show items to 12 https://prnt.sc/gYrGU-kV1IGl (currently shown 6 https://prnt.sc/glmHDzSt0dG8)

3) Category level output improvement

3.1) Feature flag

Add feature flag

Name: "Improved level displaying on category dropdown"

Description:
Removes redundant level 4-dashes ("----") on output if parent category is not root (on component category and add/edit module item forms)

3.2) On module item add/edit form

Show dashes based on displayed level of categories instead of actual

Current: https://prnt.sc/glmHDzSt0dG8

Improved: https://prnt.sc/FqEKrW2X3dum

Add change under feature flag

3.3) On component category

Show dashes based on displayed level of categories instead of actual level:

{% component type:"categories",  parentCategory:"[[parentCategoryId]]" %}

Subscriptions list to contact liquid object

1) Extend CRM contact liquid object with the recurring subscriptions list

Add property with a list of recurring subscriptions to the {{request.currentmember}} liquid object and {% component type: "CRMContacts" %}

Property Name: recurringsubscriptions

Value (list of recurring subscriptions objects):

[
    {
        "Code": "I-XXXXXXXXX",
        "Status": "Active",
        "MemberId": 1000,
        "RecurringProducts": [
            {
                "Id": 1002,
                "Name": "Some Membership",
                "EntityType": "ModuleItem"
            }
        ]
    }
]

2) Add a checkbox includeSecureZonesInfo to liquid component List of CRM Contacts in toolbox

If includeRecurringSubscriptions is true add recurringsubscriptions to member object.

If includeRecurringSubscriptions is false add emptylist recurringsubscriptions to member object

If param is not set to the component - apply false by default

WYSISYG: custom widgets

1) Add a page to create/update/delete and see a list of custom widgets for WYSIWYG

Add a new tab to ‘Settings’ -> ‘Misc’

Tab Name: WYSIWYG: CUSTOM WIDGETS

Content:
List of custom widgets with ability to create, update and delete them (https://prnt.sc/325Q0XSoM0yn)

2) Add the ability to insert a custom widget via WYSIWYG

Add button to the WYSIWYG that will allow admin user to select widget and add it to the content (https://prnt.sc/UrvFuHc3Gdhx)

Add nonce attribute support for CSP

1) Add nonce hash variable to the liquid context

Add liquid Property "cspNonceHash" which will contain a unique generated hash for the unique HTTP request.

In order to allow scripts to be loaded on the site add nonce attribute to each of them

  • <script nonce="{{cspNonceHash}}">alert(9);</script>
  • <script nonce="{{cspNonceHash}}" src="/js/my-main.js">alert(9);</script>

2) Add dynamic 'nonce' support in header settings

In order to tell the system to generate random hash on each request to the site for the nonce header param - add following string to the header field

  • 'nonce-cspNonceHash'

Once page would be rendered - header would output nonce param with random hash and the same hash would be available via liquid {{cspNonceHash}} variable.

Example:

  • HTTP Header Settings for: Content-Security-Policy:
  • Field: script-src
  • Value: 'self' 'nonce-cspNonceHash'
  • Page content:
                            <html>
    <head>
     <script nonce="{{cspNonceHash}}" src="/js/my-main.js">alert(9);</script>
       </head>
    <body>
     <script nonce="{{cspNonceHash}}">alert(9);</script>
    </body>
    </html>

Would be rendered:

  • HTTP Header Settings for: Content-Security-Policy:
  • Field: script-src
  • Value: 'self' 'nonce-9a9946d409f83d6e3e2ce883ef16a08f '
  • Page content:
                            <html>
    <head>
     <script nonce="9a9946d409f83d6e3e2ce883ef16a08f " src="/js/my-main.js">alert(9);</script>
       </head>
    <body>
     <script nonce="9a9946d409f83d6e3e2ce883ef16a08f ">alert(9);</script>
       </body>
    </html>

Reference link:
https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/nonce

Site search keywords case insensitive search

Improve site search to find items by keywords in case insensitive manner

Example:

  • Module item:
    • Name: “Test”
    • Keywords: “SomeKeyword,Someword”
    • Description: “Some text”
  • Expected behavior
    • when searching via site search using the search string "somekeyword"
    • should find module item with the name “Test”
  • Current behavior
    • when searching via site search using the search string "somekeyword"
    • module item with the name "Test" would not be found due to mismatched letter case in “somekeyword”

Unique, hash and random value liquid filters

1) Add a "Unique" liquid filter

Add new string filter:

Name: unique_value

Syntax: {{ "anystring" | unique_value : "[[format]]"}}

Params [[format]]:

  • N or n
  • D or d
  • B or b
  • P or p
  • X or x

Output format:

  • Liquid String

Examples with output:

{{ "" | unique_value : "n"}}
234fa26ee4c14ea8b3b916d15982d410


{{ "" | unique_value : "d"}}
234fa26e-e4c1-4ea8-b3b9-16d15982d410


{{ "" | unique_value : "b"}}
{234fa26e-e4c1-4ea8-b3b9-16d15982d410}


{{ "" | unique_value : "p"}}
(234fa26e-e4c1-4ea8-b3b9-16d15982d410)


{{ "" | unique_value : "x"}}
{0x234fa26e,0xe4c1,0x4ea8,{0xb3,0xb9,0x16,0xd1,0x59,0x82,0xd4,0x10}}

2) Add a "Random" liquid filter

Add new number filter:

Name: random

Syntax: {{ "anystring" | random: "[[min_value]]","[[max_value]]"}}

Params:

  • [[min_value]] (number)
  • [[max_value]] (number)

Output format:

  • Liquid Number

Example with output:

{{ "" | random: "0","100"}}
46

{{ "" | random: "0","100"}}
18

3) Add "Hash" liquid filter

Add new string filter:

Name: hash

Syntax: {{ "anystring" | hash : "[[hash_algorithm]]"}}

Params:

  • [[hash_algorithm]]
    Values:
    • md5
    • hmacmd5
    • sha1
    • hmacsha1
    • sha256
    • hmacsha256
    • sha512
    • hmacsha512
    • base64  

Output format:

  • Liquid String

Examples with output:

{{ "test1" | hash : "md5"}}
5a105e8b9d40e1329780d62ea2265d8a

{{ "test1" | hash : "hmacmd5"}}
1F5DDC06F9A25B02F58EF47E0A223288

{{ "test1" | hash : "sha1"}}
B444AC06613FC8D63795BE9AD0BEAF55011936AC

{{ "test1" | hash : "hmacsha1"}}
7C9CDF43AD36F6A35053CD9676733D40CC5DDCFF

{{ "test1" | hash : "sha256"}}
1B4F0E9851971998E732078544C96B36C3D01CEDF7CAA332359D6F1D83567014

{{ "test1" | hash : "hmacsha256"}}
DE7762D598CB0B6A8B354BF11C90A313E2888545CFC1B84CE24A191DD8E6D631

{{ "test1" | hash : "sha512"}}
B16ED7D24B3ECBD4164DCDAD374E08C0AB7518AA07F9D3683F34C2B3C67A15830268CB4A56C1FF6F54C8E54A795F5B87C08668B51F82D0093F7BAEE7D2981181

{{ "test1" | hash : "hmacsha512"}}
C2E390DEE58F2DFF074A38E60E40353795DD7EF0514A57C9DE366E179DEF57F5C4133A2BE1E83AA625D2ACB4C47EFC1B7F92214016E71A54D2B2587FBB110382

{{ "test1" | hash : "base64"}}
dGVzdDE=​

Show more less
New Feature

Frontend API access restrictions

Provide the ability to restrict access to the following frontend API's:
- Create module item
- Update module item
- Delete module item
- Update draft module item
- Publish draft module item
- Google analytics report
- Secure zone subscribers analytics

Restriction criteria include:
1) User type restrictions setting
- Logged-in users
- User from one...
New Feature

Google Analytics events output via component and API

Ability to retrieve Google Analytics Events via liquid component and frontend API using reporting GA4 API: Method: properties.runReport
New Feature

Module Item frontend API forms extending

Provide ability to perform "save draft" and "publish draft" module item functionality via frontend forms similar to Create/Update module item forms.
Add getDraft parameter to the {% component type:"module" %}
Provide ability to configure unique autoresponders for each module item form:
- Create module item
- Update module item
- Delete module item
- Update draft module item
- Publish...
New Feature

Secure Zone Subscribers Analytics

Add secure zone subscribers analytics via liquid component and API (shows number of subscribers to the provided secure zones per each Day/Week/Month/Year in the provided date range).
New Feature

Unique, hash and random value liquid filters

Add "Unique", "Hash" and "Random" liquid filters
"Unique" liquid filter should return uniquid guid value
"Random" liquid filter should return random number between min and max value
"Hash" liquid filter should return a hash of the string the filter is applied to.
  • Liquid
New Feature

WYSIWYG: custom widgets

Provide the ability to create/update and delete custom HTML widgets for WYSIWYG and the ability to insert them using WYSIWYG.
Improvement

Added "nonce" attribute support for CSP

Extend "HTTP Header Settings" -> Content Security Policy header functionality to natively support "nonce" param.
Improvement

Category in the module item view improvement

Remove redundant level 4-dashes ("----") in the output if parent category is not root:
- in the {% component type:"categories", parentCategory:"[[parentCategoryId]]" %}
- in the add/edit module item forms of admin UI
Improvement

Extended request.currentmember liquid object

Add a list of payment subscriptions to the request.currentmember liquid object.
It allows to determine if the current member has active recurring subscriptions and what products or secure zones they are assigned to.
Improvement

Site search case insensitivity improvement

Improve site search to use case insensitive search by module item keywords
v6.10 Release date: 15 Nov, 2023

Full Release Notes

BACKLOG

Apply detail layout on item create form

Provide ability to set which detail layout to apply on module item create/edit forms

  • hidden field with `DetailLayoutID` name.

  • Value equals the Detail Layout ID

    • <input type="hidden" name="DetailLayoutID" value="12345">

Logic

  • when submitting the form

    • if such field is provided

      • try to find detail layout using provided id

    • if field is not provided OR detail layout wasn't found

      • apply current logic of selecting a detail layout

Secure to CartID and crm member cookies

Set Secure attribute on the following cookies

  • CardId

  • treepl.member.auth

Site Information (Site Globals) Enhancements/Fixes

https://treepl.co/public-backlog-state/in-process/site-information-enhancements-fixes

A few minor adjustment requests for Site Information module:

dateTime field is still just a Date field. Is it possible to update this to select Time as well (as per dateTime field update throughout the rest of the admin)

When setting an Alias (particularly a ‘Short Alias’) there is a validation that runs to check for conflicting names. However, this seems to look at ALL properties in ALL groups, not just the group you are in, which starts to make it harder to set up short aliases. For example: In a group called ‘Company Info’ with a property of ‘Licence’ you might have Short Alias of {{si.ci.l}} Then in another group called ‘Company Branding’ with a property of ‘Logo’ you might want Short Alias of {{si.cb.l}} . But the validation only checks against the last Liquid reference of l (which conflicts) rather than the whole path (which is unique).

The textarea field type is labeled as Text (Multiple), but I think it should be Text (Multiline).

Liquid:

It would be great to recursively nest site information items. To do so they would need to render liquid, which they currently don’t.

For example if I have a site information company name and I want to nest that in a copyright notice so the client can just embed the copyright notice at the end of their blog posts.

Please make liquid work inside site information fields.

Other:

1. Ability to shuffle items once added.

2. Add a checkbox in the Group level determining whether that group’s properties are added to the Component toolbox or not.

  • Checkbox title:

    • Add to the toolbox

3. HTML Layouts for formatted output.

Analytics Dashboard - Google Data Studio (now Looker Studio) Option

https://treepl.co/public-backlog-state/in-process/analytics-dashboard-google-data-studio-option

Added Looker Studio Embeded

Create Default JS Validation

https://treepl.co/public-backlog-state/in-process/create-default-js-validation

Default validation for mandatory fields

Add the option on the Settings tab "Enable Default JS Validation". If this option is enabled, `data-cms_validation` will be added on the form tag and add a validation js script in the head. If a form element is not valid it will add class "validation-error" on the element and if valid "validation-success" will be added.

File Manager: Show Date + List View in "Slide-In"

https://treepl.co/public-backlog-state/in-process/file-manager-show-date-list-view-in-slide-in

The list view in file manager should include the date of the upload like in BC to make it easier to handle e.g. media files, which are updated on a regular basis.

The slide-in file manager (when selecting media or other files from within module item) should have an option for list view. It makes it hard to select files with similar long file names in thumbnail view.

Custom Reports (further refinement)

https://treepl.co/public-backlog-state/in-process/custom-reports-further-refinement

"Select/Deselect All" option for these areas to expand our custom report filtering results

https://prnt.sc/9UHS5GSlxeyG

File Upload On Mobile Devices

https://treepl.co/public-backlog-state/in-process/file-upload-on-mobile-devices

The ability to upload files to the file manager from mobile devices.

Custom Module: Remove Downloadable Media Checkbox

https://treepl.co/public-backlog-state/in-process/custom-module-remove-downloadable-media-checkbox

When adding a ‘Media’ field type in a Custom Module the “Downloadable file” option is automatically added under the field.

I like to see this removed as it would surely not be used all that often and creates confusion and clutter in the interface.

Instead, could it be added as an option when setting up the Media property? So we can control whether or not it’s displayed:

UX/UI Request: List Template Used Against System Pages + enable/disable system pages

https://treepl.co/public-backlog-state/in-process/ux-ui-request-list-template-used-against-system-pages

Would be nice to see at a glance the template that is applied to system page. I’d image this would be a simple fix too.

System pages can now be disabled via an 'Enable' checkbox. Disabled pages will resolve to the 404 page. If the 404 page is disabled, a blank page will resolve (with a 404 document status)

Google Analytics Global Time Selector

https://treepl.co/public-backlog-state/in-process/google-analytics-global-time-selector

The ability to change all time periods at once in the analytics overview

UX Improvement - “Global Component Builder” and “Global File Manager”

1)

https://treepl.co/public-backlog-state/in-process/ux-improvement-global-component-builder

Anywhere in the admin console I press something like ‘Shift + Control + C’ on Windows (Shift + Command + C on Mac).

A modal appears with the same functionality as the component draw you get it various modules.

I always find myself needing to build a component in my IDE, but I have to go to the admin console, then to something like pages to be able to pull to create a component.

Would be nice if we could just access a builder anywhere in the admin console.

2)

Likewise, also add ‘Shift + Control + F’ on Windows (Shift + Command + F on Mac) to open the File Manager anywhere in the admin.

Fields/columns Added To The E-commerce/Gift Vouchers Module

https://treepl.co/public-backlog-state/in-process/fields-columns-added-to-the-e-commerce-gift-vouchers-module

Please add the following fields/columns to the gift voucher module:

  • Date Purchased/Created Date

  • Purchasers Name

  • Order Number

  • Link to order on list view

Add “Delete All Items” toggle for Admin User Roles

https://treepl.co/public-backlog-state/in-process/add-delete-all-items-toggle-for-admin-user-roles

Case: To stop the ability for Admin Users to be able to accidently delete all module items. Can we get an extra flag added in the Admin User Roles that gets generated for each custom module or anywhere this appears

Have it unchecked by default. Else, everyone will forget to configure it until it’s too late. So, essentially, ‘Delete All’ function is for Partner/Reseller admins only, unless configured otherwise.

Custom Modules Properties: Making Mandatory Items More Visible

https://treepl.co/public-backlog-state/in-process/custom-modules-properties-making-mandatory-items-more-visible

When you check the custom properties of any custom module and want to know which ones are defined as mandatory, you need to click each one into edit mode.

It would be nice if we could see which ones are mandatory right in the properties list.

Module Item Notes: Option To Display Notes More Prominently

https://treepl.co/public-backlog-state/in-process/module-item-notes-option-to-display-notes-more-prominently

Module item notes are great! But they are a bit small and users can miss them. Sometimes I want to add big bold notes that will give users instructions that they can’t miss.

Issues: Currently module field notes are displayed in a small icon that needs to be hovered to see them. Clients may miss this subtle icon.

Solution: Add a check box that will allow notes for a module field to be displayed inline:

Add Release And Expiry Dates/Time To Menu Items

https://treepl.co/public-backlog-state/in-process/add-release-and-expiry-dates-time-to-menu-items

When sites are being updated, it is common to have a release time for updates. This release time may be at an inconvenient time for the developer. Frequently site updates will mean new sections of the site are being added or removed. To add and remove sections of the website it would be great to have the ability for new sections of the menu to be automatically released, and old sections of the menu to expire and be hidden.

I propose adding the ability to enable release and expirty date/times to menu items.

Similar to custom modules, we would have the ability to enable release and expiry under settings for the menu.

Admin UI/UX Adjustments

https://treepl.co/public-backlog-state/in-process/admin-ui-ux-adjustments

1) Add the item preview icon at the top of item edit pages so it’s readily accessible (the current Preview link is often out of reach when you want it).

2) Add a new sticky box with the Components and File Manager buttons on the create/edit module item page and also to places where it’s not currently available, such as; ‘System Pages’, ‘System Emails’ and anywhere an editor region is present like; Form layouts, email/autoresponder/workflow contents.

3) This new sticky box will also include the ‘Properties’ icon along with the ‘File Manager’ and ‘Component Manager’ icons in the editor pages for module Layouts.

Create Folder Within Image/Media Manager

https://treepl.co/public-backlog-state/in-process/create-folder-within-image-media-manager

The ability to add a folder within Media/Image Manager

Custom Module: Custom Properties. Rename "Text (String)" To "Single Line Text" Or "String (Text)".

https://treepl.co/public-backlog-state/in-process/custom-module-custom-properties-rename-text-string-to-single-line-text-or-string-text-

When creating lots of fields it's time consuming to click on the dropdown and scroll to the correct property. It would be nice if you could just push "s" to jump to string. Ideally every type of field would have a name with a unique starting letter so you could use keys to jump to them. Also recommend having string as the default field type when creating a field.

1 hour refresh issue fix

Fix losing updated data on saving operations when the actual token is expired.

1) Presave to session storage flow

  • Once any changes are made on any form in the admin UI

    • save them to session storage

  • on saving operation if the token is expired and reload is performed

    • restore saved to session storage data and perform save operation so data will be saved with the new token

Feature flags changes (v6.10)

Apply the following changes to feature flags:

  • Move to the external section

    • Site load speed improvement

    • Description

      • Improved logic of saving, updating, and deleting module items without a long delay on the page loading.

This feature flag switches the logic of saving module items, pages, etc.

New logic will take less time to load any page after saving if you have many module items.

The opposite part of this logic is the increasing time of any import module item process for sites that have many module items.

It is applicable to the sites with a lot of module items created.
On sites that do not have a lot of module items there is almost no difference between current item saving logic and improved version of it.

Internet connection checker (UI)

Add internet connection monitoring in the admin panel.

If internet connection is lost - show message:

"No Internet Connection"

Liquid Date Formatting Issue fix

Liquid Date Formatting Issue

An issue with the Liquid date formatting filter (`| date`) has been identified. Below is a description of the issue, possible conflicts with existing implementations, and our proposed fix.

ISSUE:

When using the date filter syntax of `%I` for outputting the hour in 12-hour time with a leading zero (eg: `{{ "now" | date: "%I" }}`) the output will be incorrect for the hour of 12 (am or pm), in that it will output `00` instead of `12`.

This is purely a formatting issue for this particular filter syntax and does not affect Liquid date calculations.

CONFLICTS:

We don't anticipate this fix will negatively impact any current implementations of this feature - on the contrary, any date-related Liquid implementations using the 12-hour filter output would currently be breaking under the conditions described in this issue and therefore, the fix will correct those implementations.

In the rare case that you have an implementation relying on the hour of 12, in 12-hour time, with leading zero output, being "00" (which is incorrect), you will need to adjust your code to allow for this correction.

PROPOSED FIX:

As there is a small chance of this change affecting existing implementations and due to the issue's low criticality, we will add the feature flag "Apply fix to liquid date filter".

The fix itself will then be rolled out as a hotfix to all sites during their data center non-business hours.

No downtime is expected for the admin or site front-ends during this hotfix and a notification will be posted once it has been fully completed across all data centers.

FEEDBACK:

If you have any questions, feedback, or concerns regarding this fix, please reach out to support via a support ticket before the proposed fix date is reached.

NOTES:

The similar `| format_date` Liquid filter does not suffer from the described issue and is therefore unaffected by this fix and continues working normally.

Improve workflow sending logic based on plan restrictions

1) Fix the ability to send custom workflows if the site plan is lower than Pro.

When the site plan is Business or Essential (lower then Pro):

  • Logic in table representation

    Plan/Type System WF + defaul email System WF + custom email Costom WF + defaul email Custom WF + custom email
    Essential send replace to default email skip skip
    Business send replace to default email send replace to default email
    Pro send send send send
    eCommerce send send send send
  • OR logic in description representation

    • If the workflow has a custom email assigned

      • Allow sending workflow BUT with system email instead of the assigned custom email

    • Continue validation if the workflow has a system email assigned:

  • When the site plan is Essential:

    • Disallow sending workflow if it has IsDefault = false

    • Allow sending workflow if it has IsDefault = true

  • When the site plan is Business:

    • Allow sending workflow

https://prnt.sc/bh8RQGPoHV_c

2) Improve displaying of the workflows with forbidden emails applied on workflow listing

Show label for workflows with custom email applied

Pattern

  • <WorkflowName> (<label>)

Label

  • forbidden email applied available starting Pro plan

Color

  • red

Example

  • My custom workflow (forbidden email applied available starting Pro plan)

​3) Show inactive email field on workflows on plans lower than pro

  • On edit workflow form

Empty tables UI improvements - Admin

Empty tables logic/UI

Show message "Nothing here yet" instead of empty table if no searching-filtering is applied

Show empty table if any search or filtering is applied to the list view

Case sensitivity FTP improvement

1) Pages and folders case change on migration

Description:

On migration we would collect all url slugs of "Page" and "Folders" module items that has at least one uppercase letter and convert them to lowercase.

Then we will rename the files and folders for the following items accordingly in the "/Content/Pages" folder

2) Liquid incorrect paths change on migration

Places to be operated:

  • Item description

  • Snippet

  • Content Template

  • Email Template

  • Email content

  • Module Layouts

  • Form content

  • Includes (that are included in any of the places above and inside includes as well)

Liquid tags to be fixed (example regexp: https://dotnetfiddle.net/t8939t ):

  • {% include "[[path]]" %}

  • {% component ... layout:"[[path]]" %}

  • {% component source_type: "path", source: "[[path]]", type: "json" ... %}

  • {% component folder: "[[path]]", type: "api" ... %}

Description:

On migration we would scan page content, templates, snippets, module layouts, etc for using liquid include and component with custom layout path tags and replace paths to match case-sensitive actual path (for example if we found {% include "/Content/Pages/testfolder/TestIncludeFile.inc" %} we will fix it to match actual path - /Content/Pages/TestFolder/TestIncludeFile.inc and it will become {% include "/Content/Pages/TestFolder/TestIncludeFile.inc" %})

3) JS, CSS, and image URLs change on migration

Places to be operated:

  • Same as above

HTML tags to be worked with (example regexp: https://dotnetfiddle.net/t8939t ):

  • <script ... src="[[path]]"...>

  • <link... href="[[path]]"...>

  • <img ... src="[[path]]"...>

Description:

Same as in previous but working with html tags insted of liquid

4) Improve the logic of operation files and folders in the "/Content/Pages" folder

Description:

Any files that would be created in the "/Content/Pages" folder should be lowercase from now on.

If they would be created not fully lowercased - they would be ignored.

So if you create a file Test.html in the folder /Content/Pages/ - it WOULD NOT create a page with slug Test.

But if you create a file test.html in the folder /Content/Pages/ - it WOULD create a page with slug test.

Also renaming test.html to Test.html would unlink the Test.html file from the "/test" page. If you save the "/test" page from the admin UI it will create a test.html file and it will be linked with the page (the main rule is that the page slug is fully equal to the file name (case sensitive)).

Any operations with the Test.html would not be reflected in any way on the pages at all.

However, if you rename it back to the test.html - it will be linked back to the page "/test" but without content sync (it means that if you rename test.html to Test.html, change content in Test.html and rename it back to test.html - the content of the page "/test" would not be the same as in the test.html file. The first save of the file or page would determine - what content would be saved to opposite entity in that case - if the save file - page content would be updated. If the save page - the file content would be updated).

5) System and custom email file name fix

Description:

On migration we would change all file names that reflect all system and custom (workflow, followup, abandoned cart) emails so it is the same as the email Name (right now if you have a workflow email with the name "My Custom Email" - it has a file on FTP with the name "my-custom-email.html". This step will rename the file to become "My Custom Email.html").

NOTE:

So if you already have the backup version of the site you are working with then just make a fresh copy right after your site would be updated to the v6.10

More documentation on this change can be found here.

Angular 15 refactoring

  • new datetimepicker

  • migration from moment to luxon

  • Clear styles when pasting

    • Clear all styles when pasting content into wysiwyg. If you try to paste some content from MS Word should be shown a modal to choose to keep or not styles pasted from Word.

Event calendar month by URL accessibility

Add month-year accessibility via URL to the event calendar

URL parameters names:

  • CMSEventCalendarMonth

  • CMSEventCalendarYear

If page requested via URL like

  • /page?CMSEventCalendarYear=2021&CMSEventCalendarMonth=09

Calendar should open the appropriate year and month view

File Manager - move file

Ability to move files in file manager via context menu and drag and drop.

DESIGN:

https://invis.io/XH107NKQ9UZF

File Manager - move folder

Ability to move folders in file manager via context menu and drag and drop.

DESIGN:

https://invis.io/XH107NKQ9UZF

Pagination refactoring

Rework all paginations on all admin UI layouts to work through server side.

This would allow optimizing a list load speed on all layouts that previously used client-side pagination.


Also this update would standardize pagination UI on all layouts

Added pagination to the following list layouts:

  • templates

  • mailing lists

  • email campaigns

  • admin users

System emails

a-z sorting by name

All system emails now sorted alphabetically
Plus a "Template" column was added to the system emails table list.

"New Item" button name standardization

"New Item" button text was changed from ADD to CREATE throughout the admin.

Case insensitive search in admin UI

Search in admin UI now works in case insensitive manner

Email data widget improvement

Now Email data widget would show only data that corresponds to current type of email (workflow email, follow-up email or abandoned cart notification email)

BUGFIX

Custom module - filter by Author

SLACK:
https://treepl.slack.com/archives/C023SU50YQP/p1673542315877379

Go to Components -> Choose custom module with Author -> Filter by Author -> ONLY In code should be display ID, not name https://prnt.sc/fShwUL0TmW8a

Should be
{% component source: "create item from front ", layout: "List", filterBy: "Author", filterValue: "8406", type: "module" %}

Secured Content - twice click on one page

Go to some Secure Zone -> Secure Content -> click on several page and use ctr/command and click twice on one page -> after that move pages from left window in right window - not all pages moved https://drive.google.com/file/d/17O5OyXaUY9yQTp-k1BBBi-mQ293lYaoa/view?usp=sharing

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

Categories - Missing parent Category names

BUG: Missing parent Category names https://the-second-site-owner.trialsite.co/admin/module/1827/item/2053/settings?view=list-view&pageIndex=0&moduleId=1827&parentId=1827

JSON output is different to Liquid output: https://prnt.sc/qiM8nHB-GvGo

SLACK:
https://treepl.slack.com/archives/C023SU50YQP/p1676598883293619

custom module - delete item with custom redirect

SLACK:
https://treepl.slack.com/archives/C023SU50YQP/p1673548831805979

  • Go to Custom module which you can create item from front
  • Add in List layout possibility to delete item from front
  • In ?redirect put custom page like in screenshoot https://prnt.sc/iDKkb8JWesld
  • Go to front and try to delete item -> custom redirect doesn't work

Custom module - broken list

Products - InStock value doesn't show in frontend after import

  • create a new product by import (file attached) with "Enable Inventory Control" - true, and In Stock - 1000 https://prnt.sc/mlPYOEGCiEuK
  • add <pre>{{this}}</pre> in product detail layout
  • go to frontend this product
  • value "InStock" : 0 , but must be equal to the value in the import file = 1000
  • after this go to product detail in admin and click save https://prnt.sc/fBjMhWORc89h and go to the frontend value "InStock" = 1000 https://prnt.sc/Afg55sGjcQZv

Custom module - import with invalid parent URL

Custom reports - results don't show the CMR group values

System email - Restore Admin User Password

When resetting the user admin password, the {{this.User}} model from which the “FIrst Name” is taken in the letter is not available https://prnt.sc/L0ELMfsrWu21 https://prnt.sc/iLDD43t9vqu7

Using Cases component you can not filter "equally" by form name

  • If in component use "equally" condition - should display only the same name
  • {% component viewType: "list", currentMemberOnly: "false", filterBy: "FormName", filterValue: "Registration", filterCondition: "contains", limit:"100", type: "cases" %}

    ----

    {% component viewType: "list", currentMemberOnly: "false", filterBy: "FormName", filterValue: "Registration", filterCondition: "equally", limit:"100", type: "cases" %}
  • On page display not correct tag with "equally" https://prnt.sc/iSQPxriPa3Qk

Orders - discount prices

Show more less
Improvement

Internal infrastructure overhaul

Internal infrastructure overhaul which presumes servers, storage, FTP upgrade and source code transition from .NET 5 to .NET 6.
Overall CMS performance and secuirty enhancements are expected with this release.
New Feature

Analytics Dashboard - Google Data Studio Option

DESCRIPTION:
Ability to replace the current analytics dashboard with a client’s own Google Data Studio embed. Allowing vastly customisable analytics and other reporting views directly in the Treepl website admin.

What is Google Data Studio:
Transform your raw data into the metrics and dimensions needed to create easy-to-follow reports and dashboards. You can create meaningful, shareable charts and graphs with...

  • Admin Panel
  • Analytics
New Feature

Create Default JS Validation

Default validation for mandatory fields

  • Forms
  • General
New Feature

Google Analytics Global Time Selector

The ability to change all time periods at once in the analytics overview
  • Analytics
  • Treepl Portal
New Feature

UX Improvement - “Global Component Builder”

Anywhere in the admin console I press something like Shift + alt + c .

A modal appears with the same functionality as the component draw you get it various modules.

Why???

I always find myself needing to build a component in my IDE, but I have to go to the admin console, then to something like...
  • Admin Panel
  • UI/UX
Improvement

Add “Delete All Items” toggle for Admin User Roles

Case: To stop the ability for Admin Users to be able to accidently delete all module items. Can we get an extra flag added in the Admin User Roles that gets generated for each custom module or anywhere this appears

Have it unchecked by default. Else, everyone will forget to configure it until it’s too late. So, essentially, ‘Delete...
  • Admin Panel
  • UI/UX
Improvement

Add Release And Expiry Dates/Time To Menu Items

When sites are being updated, it is common to have a release time for updates. This release time may be at an inconvenient time for the developer. Frequently site updates will mean new sections of the site are being added or removed. To add and remove sections of the website it would be great to have the ability for new...
  • Admin Panel
  • Menus
Improvement

Admin UI/UX Adjustments

For most modules when adding an item there is a “Save” or “Save and New” button. I would like the “Save and New” button to be there even when editing an item not just when creating a new item.

In regards to the “Save” or “Save and New” buttons I’ve been wondering if it might also be...

  • UI/UX
Improvement

Create Folder Within Image/Media Manager

The ability to add a folder within Media/Image Manager

create-folder.png
  • File Manager
Improvement

Custom Module: Custom Properties. Rename "Text (String)" To "Single Line Text" Or "String (Text)".

When creating lots of fields it's time consuming to click on the dropdown and scroll to the correct property. It would be nice if you could just push "s" to jump to string. Ideally every type of field would have a name with a unique starting letter so you could use keys to jump to them. Also recommend having string...
  • Custom Modules
Improvement

Custom Module: Remove Downloadable Media Checkbox

When adding a ‘Media’ field type in a Custom Module the “Downloadable file” option is automatically added under the field.
downloadable-checkbox1.png
I like to see this removed as it would surely not be used all that often and creates confusion and clutter in the interface.
Instead, could it be added as an option when...

  • Custom Modules
Improvement

Custom Modules Properties: Making Mandatory Items More Visible

When you check the custom properties of any custom module and want to know which ones are defined as mandatory, you need to click each one into edit mode:

CM-mandatory_items.png

It would be nice if we could see which ones are mandatory right in the properties list.

  • Custom Modules
Improvement

Custom Reports (further refinement)

Select/Deselect All option for these areas to expand our custom report filtering results

custom-reports-refinement.png custom-reports-refinement.png custom-reports-refinement.png

  • UI/UX
Improvement

Fields/columns Added To The E-commerce/Gift Vouchers Module

Please add the following fields/columns to the gift voucher module:

  • Date Purchased
  • Purchasers Name
  • Order Number
  • Link to order on list view


  • Ecommerce
Improvement

File Manager: Show Date + List View in "Slide-In"

The list view in file manager should include the date of the upload like in BC to make it easier to handle e.g. media files, which are updated on a regular basis.



The slide-in file manager (when selecting media or other files from within module item) should have an option for list view. It makes...
  • File Manager
Improvement

File Manager to better display images with transparent backgrounds

DESCRIPTION:
Enhancement for the File Manager (and Media fields) to better cater for, and display, transparency in image files (such as PNGs and SVGs) so that the thumbnails of transparent images with white areas don’t become invisible.

DETAIL:
I’ve often come across the issue of not being able to properly see some images files in the File Manager when they...

  • File Manager
Improvement

File Upload On Mobile Devices

The ability to upload files to the file manager from mobile devices.

  • Admin Panel
  • File Manager
  • UI/UX
Improvement

Module Item Notes: Option To Display Notes More Prominently

Module item notes are great! But they are a bit small and users can miss them. Sometimes I want to add big bold notes that will give users instructions that they can’t miss.

Issues: Currently module field notes are displayed in a small icon that needs to be hovered to see them. Clients may miss this subtle icon.

...
  • Admin Panel
  • Custom Modules
Improvement

Site Information Enhancements/Fixes

A few minor adjustment requests for Site Information module:

dateTime field is still just a Date field. Is it possible to update this to select Time as well (as per dateTime field update throughout the rest of the admin)

When setting an Alias (particularly a ‘Short Alias’) there is a validation that runs to check for conflicting names....
  • Admin Panel
Improvement

UX/UI Request: List Template Used Against System Pages

Would be nice to see at a glance the template that is applied to system page. I’d image this would be a simple fix too.

system-pages-template.png

  • Pages and Templates
  • UI/UX
v 6.9.1 Release date: 21 Jun, 2023

Full Release Notes

BACKLOG

Google Analytics GA4 integration
Show more less
Improvement

Google Analytics GA4 integration

New Google Analytics (GA4) integration is now available on Treepl. Now you have the ability to switch between UA and GA4 by selecting which analytics should be applied on the Setup Analytics page (https://prnt.sc/n1_vt1LC7yuR).
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
v 5.9.5 Release date: 22 Apr, 2021

Full Release Notes

v5.9.5

BACKLOG

Default list layout for favorites list

Added default list layout for favorites (list of all items added to favorites).

Default layout will render: Name, description and URL to item.

New layout file created `list.layout` at `/cms-assets/layouts/favorites/` (https://prnt.sc/10v7n7j)

Admin Component Manager:

  • Rename `CRM > Favorites` to `CRM > Add to Favorites Button`
  • Add `itemId` param. Add item search to this field if `source` selected (preset with `{{this.id}}`)
  • Remove limit param from this area (it only makes sense for favorites list)
  • Add CRM > Favorites list
  • Preset list layout with path to new layout file `/cms-assets/layouts/favorites/list.layout` (https://prnt.sc/10vbu8z).

BACKLOG

Shopping cart Javascript events and triggers

Added the ability to customise the ecommerce javascript functionality.
A set of Javascript events for various eCommerce functions have been added for “Before”, “After” and “Trigger” events.

These events have now been documented here:

https://docs.treepl.co/ecommerce/shopping-cart-javascript#secShopEvents

------------------------------------------------

Added ability to rewrite ecommerce alert messages.

This has now been documented here:

https://docs.treepl.co/ecommerce/shopping-cart-javascript#secOverrideAlerts

BACKLOG

Improve Stripe payment error messages and payment form `onsubmit`

Submit flow for payment forms and/or recaptcha v3 forms has been reworked.

Backend:


`formSubmissionData
` object (for both JSON response and Liquid) now will always have `FormRedirectLink` property.

Value will be either:

  • system thank you page for the form
  • custom redirect link (from redirectURL hidden field for that the form)
  • or redirect URL for Payment_Method==Paypal or bamboraEU (redirect) payment gateway

NOTE: `FormRedirectLink` will be set even if there are errors in the `ErrorMessages` property. If you go to the link without checking for errors – they will be set to `formSubmissionData` Liquid object on that page as well, but only for the first page load.

Frontend:

Improve reCaptcha v3 and payment JS.

Added new custom event that will be triggered after all reCaptcha v3 validations (instead of the regular `submit` event)

These events allows you to:
-
Add any additional validation actions and stop the form submit via `event.preventDefault();` function.
-
Perform AJAX submit of the form (with already validated recaptcha token and payment data)

See documentation for these events and example here:
https://docs.treepl.co/ecommerce/shopping-cart-javascript#secPaymentFormEvents

BACKLOG

Add Release date to Add/edit item forms

Add `prop_ReleaseDate` to the add and edit module item HTML forms, retrieved via the Component Manager/Toolbox.

Add ability to use `prop_Enable` to add/edit module item controllers.
On ADD form
; if `prop_Enable` is specified in form submission - apply its value only if there is no admin approval required rules in place for the module.

BACKLOG

Liquid improvement: Ability to use variables in {% for %} tag

Ability to use `limit` and `offset` param value via variables (not just via pure numbers).

Example:

{% assign array = "1,2,3,4,5,6,7,8,9" | split: "," %}

{% assign lim = 3 %}

{% assign off  = 3 %}

{% for item in array limit: lim offset: off reversed %}

{{item}}<br>

{% endfor %}

Ability to use
from and to param value via variables (not just via pure numbers).

Example:

{% assign from = 1 %}

{% assign to = 5 %}

{% for item in (from..to) %}

{{item}}<br>

{% endfor %}

Before update, such code caused:
Liquid Error: Object reference not set to an instance of an object.

BUG

Fix secure zone assignment via forms with  Payment Method == Cash

Now, secure zone should be assigned once payment is added to the order and its status changed to paid.

BUG

Volume Discount applying fix

Now, volume discount applies based on SUM of quantities of all product variations instead of applying per variation only.

Show more less
New Feature

Shopping cart JS events and triggers

"Before" Callbacks

"Before" callbacks could be used for additional custom js logic and could interrupt event process.
Process could be interupted via event.preventDefault(); function.

Syntax

document.addEventListener("CMS_BeforeExample", function(event)
{
var data = event.data;
//custom code here
});

List of callbacks (see release notes)

"After" Callbacks

"After" callbacks could be used in order to retrieve data that...

  • Ecommerce
New Feature

Template MAX

One big universal template with all the features and functionalities that Treepl offers: TEMPLATE MAX
  • Templates
Improvement

Ability to use variables in for tag

Ability to use limit and offset param value via variables.
Not only via pure numbers.
Example:

{% assign array = "1,2,3,4,5,6,7,8,9" | split: "," %}
{% assign lim = 3 %}
{% assign offset  = 3 %}

{% for item in array limit:lim offset: offset  reversed %}
    //{{item}}
{% endfor %}
Ability to use from and...
  • Liquid
Improvement

Add ReleaseDate and Enabled properties to add/edit module item form for logged in users

Add prop_ReleaseDate to add and edit module item HTML forms, retrieved via toolbox.
Add ability to use prop_Enable in add and edit module item HTML forms.
- On ADD form - if prop_Enable specified in form submission - apply it's value only if there is no admin verification required for the module
  • Custom Modules
Improvement

Default list layout for favorites list

Add default list layout for favorites (list of all items added to favorites) and insert in to blank.
Use output of Name, description and url only

Rename CRM > Favorites to CRM > Add to Favorites Button
- Add itemId param. Add item search to the field if source selected.
-- preset by {{this.id}} (similar to how it works on...
  • General
Improvement

Improve Stripe payment error messages and payment form onsubmit

Add CMS_CustomSubmit event that will be triggered for all payment forms including forms with reCaptcha v3
Add CMS_triggerHandlePayment trigger that will allow to finalize payment process if form will be sent via ajax inside CMS_CustomSubmit event handler.
Add CMS_AfterFormPaymentHandled event that will be triggered once all payment processes are made.
See release notes for more details.
  • Ecommerce
v 5.9.2 Release date: 28 Jan, 2021

Full Release Notes

v5.9.1

BACKLOG

Favorites

1) Add/remove from favorites actions

Add two GET URLS (public api), one for “add” and one for “remove”, for logged in users with `itemId` as parameter (id of module item that should be added to favorites)

2) Add component type:"favorites":

{% component type:"favorites", source:"[[moduleIdentifier]]", itemId:"[[itemId]]", includeItemData:"[[includeItemData]]", limit:"[[limit]]", collectionVariable:"", layout:"" %}

  • `moduleIdentifier` (required) - moduleName or moduleId.
  • `itemId` (not required) - id of the module item
  • `limit` (not required) Default=ALL - number of items to be rendered
  • `collectionVariable` (not required) - works the same way as other modules.
  • `layout` (not required) - path to FTP file that will contain layout content to be parsed.
    - If specified empty string - do not render anything.
    - If not specified at all - render default virtual layout (see design link below).
  • `includeItemData` (not required)- true/false boolean. Default=false

Default sorting by `CreatedDateTime` DESC.

Single item context is:

  • Id
  • FavoritesInfo
    • IsFavorite
    • CreatedDateTime
    • AddToFavoritesURL
    • RemoveFromFavoritesURL

(If `includeItemData` == true, the modules typical data will be included along with the above “Favorites” data.

3) Add component to toolbox, under: “CRM” > “Favorites”

4) Add default JS and styles for favorites:

Once added to favorites - change favorite icon appearance and switch URL from ’add to favorites’ to ’remove from favorites’.

Once removed from favorites - change favorite icon appearance and switch URL from ’remove from favorites’ to ’add to favorites’.

If user is not logged in and clicks Add or Remove from favorites - redirect them to system error page with the following data:

  • {{this.ErrorType}}
    • FavoritesRequiresLogin
  • {{this.ErrorMessage}}
    • You need to be logged in to the site in order to add this item to your favorites list.

Apply ability to request add and remove from favorites API urls with GET param `jsonResponse=true`.

If `true` - return JSON response with error details (status code 401).

Otherwise - redirect to error page with the above described type and message.

DESIGN: https://invis.io/VEZ0HS6A8YF

BACKLOG

eWAY and Stripe improvements

1) Add to data passed to eWay:

  • First Name
  • Last Name
  • Address
  • Postcode

2) Change ”Invoice Description” to <form name>

3) Add data passed to Stripe (only for one-time payment):

  • First Name
  • Last Name
  • Address
  • Postcode

4) Change ”Description” to <form name>

BACKLOG

Show Product URL based on current catalog

On product detail show URL based on catalog that it’s contained in.

Modify component type module logic:

If filtered by `parentId` add `this.url` value based on the parent determined by `parentId`, eg:

  • Item has 3 parents:
    • Parent_1 (ID 11) (shown by default)
    • Parent_2 (ID 22)
    • Parent_3 (ID 33)
  • When {% component type:"module" %} for the example item this object should have
    • {{this.Url}} == "/parent1"
  • When {% component type:"module", filterBy:"parentId", filterValue:"22" %} for the example item this object should have
    • {{this.Url}} == "/parent2"
  • When {% component type:"module", searchScope:'{"parentId": "33"}' %} for the example item this object should have
    • {{this.Url}} == "/parent3"
v5.9.2

BACKLOG

Customize Analytics

1) Analytics Customization

2) Single Chart customization

  • https://prnt.sc/x8c3hy
  • change width via col size dropdown
  • show/hide tabs buttons (for tabbed charts)
  • default period of days selector
  • Chart title customization

3) Add Chart to analytics

4) Restrictions

Feature available on PRO Plan and higher.

BACKLOG

Copy File URL to clipboard

Add ability to get file’s URL in file manager and file manager toolbox.

  • Сopy File URL (relative URL)
  • Preview In New Tab

DESIGN: https://invis.io/VTYEHO7Z6NJ

From Forum

BACKLOG

Wording change on event bookings

Rename following wording in the CMS:

  • Module -> Settings -> Advanced Settings
  • Event -> Details:
    • “SUBSCRIPTIONS” tab renamed to ”BOOKINGS” (http://prntscr.com/vxmw13)
      • Table column ”Subscribed Date” to ”Booking Date”
      • Excel export table column (on import - react on both new and old name)
        - “Subscribed Date” to ”Booking Date”
        - “Allow Multiple Subscription Per Email” to ”Allow Multiple Bookings Per Email”
  • Toolbox -> Events
    • Toolbox item name ”Event Subscription Form” to ”Event Booking Form”
    • Field Name ”Event Subscription Form” to ”Event Booking Form” (http://prntscr.com/vxn1ru)
  • Form
  • CRM -> Event bookings

BACKLOG

Drop shipping feature improvement

Feedback description:

When a visitor makes an order for several different items on one and the same order the system will create one purchase-order for each item even if they all are supplied by one and the same supplier. This obviously causes a lot of extra work for the suppliers. BC consolidated several items to one and the same purchase-order and only split the order if there were multiple suppliers to supply the items on the order.

Solution:

Consolidate several items to one supplier email for the same order instead of sending supplier email for each product.

Show more less
New Feature

Hair Salon Template

New template: Hair Salon
  • Templates
Improvement

Bonus: Add Ability To Get File’s URL In File Manager

Problem:
It’s hard for users to get file URLs from the file manager.
Proposed solution:
Add a new menu item, “Copy URL”, under file actions dropdown that allows a user to copy the file’s url.
Here:
URL-file-manager1.png
It would also be nice if the file name was linked to the file location in list (non-tree)...
  • File Manager
Improvement

Customize Analytics

Ability to edit admin's "Analytics" page:.
- Rename page and blocks
- Rearrange and resize blocks
- Change or hide data inside blocks
- Set data range
- Add extra analytics
Available starting "Pro" plan.
  • Analytics
v 5.9 Release date: 16 Dec, 2020

Full Release Notes

Bambora Payment Gateway

Bambora Improvements (patch v5.8.1)

Design: http://prntscr.com/vljvo7

1) Implement Payment window modes (payment gateway settings page):

  • redirect (already implemented only method)
  • modal
  • inline

Bambora Documentation:

https://developer.bambora.com/europe/...

2) Implement "immediateredirecttoaccept" setting:

When the payment has gone through you end up on a "success" page on the bambora site and you can then click to go back to the Treepl site with the receipt.
This can be passed so you don't see that page but go directly to the Treepl receipt page via the "immediateredirecttoaccept" parameter.


Bambora Documentation:

https://developer.bambora.com/europe/...

3) Language control settings

Provide possibility to select the language for the payment window.

Bambora Documentation:

https://developer.bambora.com/europe/...

4) Add transaction ID to the list view of the order (and allow search).

eg: http://prntscr.com/vikmzm

Misc

Admin UI: Orders pagination (patch v5.8.1)

Improve Pagination speed (CRM -> Orders)

Direct Billing

Invoices for portal payments (patch v5.8.2)

For direct billing with commissions:

  • Add billing address and personal details fields to the CMS billing page in order to add them to the invoice.
  • Make them required.
  • Send Invoice to the payer instead of the Agency user.

Feedback Task

Set 404, 403 and 401 status codes when showing appropriate system pages

Implement server responses for 404, 403 and 401 statuses to set appropriate status codes and at the same time still display appropriate System Pages content.

Feedback Task

Admin Proof Read/Suggestions (Part 2)

Original Source: https://docs.google.com/document/...

12. [ ✔] In the “Form Builder” options, perhaps adjust the form ‘Type’ display names an provide a short explainer, eg
14. [✔ ] In Secure Zones, when setting “Membership Renewal Rate”, perhaps change the values from “Day, Week, Month, Year” to “Daily, Weekly, Monthly, Yearly”
23. [ ✔] On the Product settings tab, suggest changing “Max Downloads Allowed” to “Maximum Downloads Allowed” (for consistency)
30. [ ✔] For ALL module ‘Layouts’ tab, perhaps remove the redundant “Create New...” from the “CREATE NEW” dropdown option. Two example
31. [ ✔] For the Products/Catalogs “Layouts” tab, consider removing the ‘s’ from headings “Catalogs Layouts” and “Products Layouts” to just “Catalog Layouts” and “Product Layouts”
33. [ ✔] Consider adjusting “Discount Codes” menu item and headers to title-case
34. [ ✔] Consider adjusting “Gift vouchers” and “Shipping options” to title-case in the main admin menu
36. [ ✔] Under “eCommerce” > “Settings”, consider adjusting headings and labels to title-case. Also, ‘lifetime’ is one word so change “Shopping cart life time in hours” to “Shopping Cart Lifetime in Hours”
38. [✔ ] Under “Reports” > “Custom Reports”, could the list display more human readable ‘Type’ values? Ie: “Contacts and Event Bookings” instead of “ContactAndEventBookings”
40. [✔ ] Under “Reports” > “Custom Reports”, when editing a Report, under the ‘Fields’ tab consider adjusting some letter cases (“Id” should be “ID” if possible) and perhaps change “E-mail” to “Email” for consistency.
Assuming these changes will then flow through to the report column headers.

Public Request

Custom Client Notes For Custom Fields

Source:

https://treepl.co/...

Description:

New 'Notes' field against any custom field created in the admin. It would display next to the field when clients are creating Custom Module items and could provide additional info to help them when entering content.

For example: with an image field, the note might read "This image is displayed as the thumbnail on your Team Members page and ideally should be portrait orientation and at least 500px wide".

The note could perhaps be hidden under a help/info icon to keep the layout clean.


On property add/edit form:

Allow add notes (https://projects.invisionapp.com/...)

On module item add/edit form:

Display notes when hover tooltip icons (https://projects.invisionapp.com/...)

Note:

Add notes to `module` export/import flow.

Public Request

Set Custom Icons For Nested Module Items In Tree View

Source:

https://treepl.co/...

Source Description:

Provide ability to change icon of the item in tree view (http://prntscr.com/vu9h50)

  • Add icon field to the `module` > `settings` page http://prntscr.com/vuhivv.
    Provide ability to choose icon from the system or custom library.
  • Store icons in /admin-assets system folder. Store folder outside FTP folders.
  • Provide ability to add icon to the icons custom library (on Admin menu configurator page). Design: https://invis.io/S6ZFRJWRNJG
    Suggested icon dimensions and extension: 24x24px, SVG
  • Change icons display logic on module items tree view
    • if module has custom icon - show it instead of "File" or "Folder" icon
    • else - show icon as previously:
      - if module is Parent module - "Folder" icon
      - if module is Child module - "File" icon

Feedback Task

Improve GDPR control, Contacts and advanced CRM groups

1) Add new Group to `Settings` -> `Misc`

  • GDPR (“Allow listing CRM contacts data” True/false boolean)

2) Logic

If ”Allow listing crm contacts data” == true - discard "Allow listing my contact data in the CMS" checkbox behavior and always allow use all contact data:

  • via components
    • {% component type: "CRMContacts" %}
    • {% component type: "CRMCustomGroup" %}
    • {% component type: "CRMContactCustomGroup" %}
  • in the admin CRM data pickers

3) Components logic extending

Add includeSecureZonesInfo: "true" param to {% component type: "CRMContacts" %}

If not set - default value is false

Also add it to the toolbox.


If true - add following object to item context (similar to what we have in {{request.currentmember}}):

securezones": [

    {

        "id": 1,

        "name": "Member Only Area",

        "landingpageid": null,

        "createddatetime": "2020-10-20T14:59:54.347",

        "updateddatetime": "2020-11-12T16:07:27.113",

        "expirydatetime": "9999-12-31T06:00:00",

        "ExpiryOption": null,

        "ExpiryAfter": null,

        "AccessType": 0,

        "Plans": null,

        "CountPaidSubscribers": 0

    },

Feedback Task

Admin UI changes

Task list:

Public Request

"Already Taken" URL Validation

Source:

https://treepl.co/...

Description:

Validation warning for general URL conflicts before saving item. ie: for Pages and other items not influenced by the Advanced URL Manager.

1) Update `Settings` -> `Misc` in group “Admin Panel Settings” with new setting “Disable autocomplete for already taken URL slugs” (default is ‘false’)

2) Logic

If `true` - do not add `-1` to the slug on save.

Throw validation error message "Warning: Duplicate URL"

If false - logic should be as it was earlier.

Public Request

Add Default Styling For Pagination

Source:

https://treepl.co/...

Description:

Currently pagination outputs raw unordered list.

Apply some default formatting to remove the bullets from the list and make it horizontal. Also by default it would be nice to truncate the pagination with “…” and show the last page if there are over 5 pages.

If we really want to get fancy we could make the default styling along these lines.
https://prnt.sc/vv8ivx

1) Component param

Add param to component type `module` and `module_of_member`

  • styledPagination : "true"
  • default value is false
  • if true - show new pagination structure instead of old one

2) Toolbox

  • Show under ”Display Pagination”
  • if checked - show new pagination structure instead of old one
  • Hide if ”Display pagination” is false
  • Set default value to true.
    But reflect in component string only if display pagination is true

Applies to the following modules:

  • Custom module (Groups and Item lists)
  • Blogs (Groups and Item lists)
  • Gallery/Slider (Groups and Item lists)
  • FAQ's (Groups and Item lists)
  • Banners (Groups and Item lists)
  • Authors
  • Events (Groups and Item lists)
  • eCommerce (Catalogs and Product lists)

Public Request

Small UI tweak: Add Icons To Items Under "Content" Section

Source:

https://treepl.co/...

Description:

Implement the icons in “Content” section that are already under the components insertion list.
https://prnt.sc/vtq0wq

All other icons on the 2nd level should remain the same.

Apply it to all default menus. Leave custom menus as is.

Design:

https://invis.io/P2ZFPCZZGAX

Public Request

Pages/Template/General Editing Window

Source:

https://treepl.co/...

Description:

Make the editing area fill the vertical space in the browser window.
https://prnt.sc/vv8k25

Public Request

Recent Item Section

Source:

https://treepl.co/...

Description:

A ‘Recent Items’ section to quickly go back into last page/module you were in, without having to navigate back to that page.

Functionality

  • Store history in session storage.
  • Add to visited pages recent item history. If the page is already in the history - move it up in the history list (instead of adding duplicate history item).
  • Remember 10 last visited pages.

DESIGN

https://projects.invisionapp.com/share/...

Feedback Task

Grouping product in toolbox improvement

Show `this.id` as first option of ”Filter Value” field for following components in toolbox (show it before datasource loading process occurs)

Ecommerce:

  • Related Products
  • Grouped Products
  • Product Attributes
  • Item Quantity Field
  • Add to Cart Button
  • Buy Now Button

IF it's selected or NO item selected - show "{{this.id}}" as value

http://prntscr.com/vpx6xu

http://prntscr.com/vpx8no

Feedback Task

Forms email aggregator

Add new setting to `Form` -> `Settings`:

  • Send Secure Zone Login Details Email (default: true)
  • If enabled - don't send ”Secure Zone Login Details” system email on secure zone subscription form submit

Add new setting to `Form` -> `Settings`

  • Send Confirm Email Notification (default: true)

Add liquid variables of ”Confirm Email Notification” to the scope of the following system emails:

  • Invoice
    • this.EmailConfirmationUrl
    • + Secure Zone Login Details variables
  • Secure Zone Login Details
    • this.EmailConfirmationUrl
      (set empty string as value if no confirmation required [ie: if user is already confirmed])

Feedback Task

CRM -> Bookings: Export to Excel to be filtered by form name?

Source

https://forum.treepl.co/...

Improve Bookings export (https://prnt.sc/vv97ic)

  • Improve ”Form Name” selector (multiselect)
    • all forms (default)
    • manually subscribed
    • form list...
  • Add ”Event” selector (multiselect)
    • all events (default)
    • event list...

Update exporting logic so it will retrieve bookings based on selected forms and events

BUG

Infinity redirect on login to Portal

Fix infinity redirect on SSO login to Portal

BUG

Toolbox bug in event group Component

https://forum.treepl.co/...

Show more less
New Feature

Custom Client Notes For Custom Fields

New 'Notes' field against any custom field created in the admin. It would display next to the field when clients are creating Custom Module items and could provide additional info to help them when entering content.
For example: with a image field, the note might read "This image is displayed as the thumbnail on your Team Members page and idealy...
  • Custom Modules
New Feature

Save to Favorites

Add ‘Save to Favourites’ functionality to eCommerce.
  • BC Equivalent
  • Ecommerce
New Feature

Set Custom Icons For Nested Module Items In Tree View

The ability to change the icon

nested-custom-icon.png

  • Custom Modules
Improvement

Add Default Styling For Pagination

Currently pagination outputs raw unordered list.

Apply some default formatting to remove the bullets from the list and make it horizontal. Also by default it would be nice to truncate the pagination with “…” and show the last page if there are over 5 pages.

If we really want to get fancy we could make the default styling...

  • Blogs
  • Custom Modules
Improvement

Admin UI changes (v5.9)

- Admin Proof Read/Suggestions: Admin Proof Read.docx
- Add info with site name and username to the header: See design
- Fix search in the data source. Currently, the search is working just from the start of the line.
- Alphabetic sorting of data sources.
- Alphabetic sorting of tags + button to sort from A to Z.
...
  • Admin Panel
  • UI/UX
Improvement

"Already Taken" URL Validation

Validation warning for general URL conflicts before saving item. ie: for Pages and other items not influenced by the Advanced URL Manager.
  • General
Improvement

Misc Improvements (v5.9)

- Set 404, 403 and 401 status codes when showing appropriate system pages
- Improve GDPR control, Contacts and advanced CRM groups
- Ability to "Favorite" a module item
- CRM -> Bookings: Export to Excel to be filtered by form name?
  • Admin Panel
  • General
  • UI/UX
Improvement

Pages/Template/General Editing Window

Make the editing area fill the vertical space in the browser window.

editing-window.png
  • Admin Panel
  • Pages and Templates
Improvement

Recent Item Section

A ‘Recent Items’ section to quickly go back into last page/module you were in, without having to navigate back to that page.

  • UI/UX
Improvement

Small UI tweak: Add Icons To Items Under "Content" Section

Implement the icons in “Content” section that are already under the components insertion list.

icons-content-section.png
  • Admin Panel
v 5.8 Release date: 18 Nov, 2020

Full Release Notes

BACKLOG

PORTAL:

Portal restructure

1) Rename Menu items

Change following:

  • ‘My Details’ to ’My Settings’
  • ‘Backlog’ to ’Public Backlog’

Split Menu in two parts. Set to bottom menu following items:

  • Public Backlog
  • Documentation
  • Pricing For Resellers

Change Icons for

  • My Settings
  • Pricing For Resellers
  • Projects / Services
  • Support

2) Restrictions

Restrict commissions for Agency role only

Show prices that include commissions on the Treepl CMS sites in direct billing page

DO NOT include commissions if clicking pay from the portal.

3) FTP credentials tab

Create FTP under trialsite.co subdomain

Show host and username under ’FTP credentials’ tab

https://prnt.sc/vk4elt

BACKLOG

PORTAL:

Direct Billing (commissions)

1) Add “Commissions” tab to ’My Settings’

Design: https://invis.io/SDZC33JMHBA

Settings:

  • Default Commission Value (validate numbers only, range: 0 - 900)
  • My PayPal Email
  • Resend Verification button
    • show only if current paypal email is not verified.
    • clicking on the button should resend ’paypal email verification’ email

Once form is saved - send ’paypal email verification’ email with the confirm button.

Once confirm button is clicked - mark paypal email as verified.

  • If error occured while confirmation - show system page with error text
  • else if OK - show success page and link to trial sites list page.

DO NOT SEND commissions to paypal emails until they are verified (trigger Payment error)

2) Add commission tab to site edit page

Add tab that will allow to setup commission for the site for monthly and annually subscriptions.

Settings:

  • Commission Type (dropdown)
    • Percentage (default)
    • Value
  • Commission Value (validate numbers only)
    • ranges for ‘Value’ type:
      0 - [value that gives 5000 in Your client Pays]
    • ranges for ‘Percent’ type:
      0 - [percent value that gives 5000 in Your client Pays]
    • default value from the ’MySettings’ -> ‘Commissions’ -> ’Default Commission Value’

Calculated summary should follow logic as described in this spreadsheet (for display purposes use 4.4% fee per transaction since it is the biggest one that may be charged):

Spreadsheet

Algorithm

  • When receiving payment - determine the [transaction fee percent].
  • Calculate [treepl part] as:
    [Original treepl price] * (1-[transaction fee percent]) - 0.30 (per transaction value part of the fee)
  • Calculate [reseller's part] as:
    [received amount] - [treepl part] - 0.25 (standard fee for sending money from one paypal account to another)
  • Send [reseller's part] to the PayPal Email:
  • if ’Payment Error’ occurs:
    send system email to support@treepl.co:
    Subject: “Commission sending error”
    Content: Should contain [reseller's part] price, PayPal email, error info, date, site id and url
  • else:
    Send an Invoice to the payer

Design:

Design

BACKLOG

PORTAL:

Branded subdomains

1) ‘My Settings’ -> ‘Domains’ tab

Add Domains tab to My Settings page

Design: http://prntscr.com/vlj9g3

Provide ability to:

  • add domain:
    Create hosted zone in this step.
    Once created successfully - show ’Success’ state.
    Otherwise ‘Pending’ state.
  • delete domain

2) ’My Settings’ -> ‘Domains’ tab -> ‘domain details’ page

Show 3 tabs:

  • Custom records
  • Here you can add/edit/delete any A, CNAME, MX, TXT records that you want
  • NS and SOA records
  • Read-only tab for display purposes only.
  • Treepl Sites records
  • Read-only tab for display purposes only.
  • Shows all records that Treepl Portal creates for all Treepl sites under this branded domain.


3) Restrictions

Restrict access to ’Partners’ and ’Agencies’ only.

Allow ’Partners’ and ’Agencies’ to have:

  • 1 branded subdomain for ’Partner’
  • up to 3 branded subdomains for ’Agency’

Disallow ’My Settings’ -> ‘Domains’ tab for portal users


4) Add user role indication

Provide role indication icon and tooltip near user email.

Design: http://prntscr.com/vlj6j8

BACKLOG

Bambora Improvements

1) Implement Payment window modes

Design: http://prntscr.com/vljvo7

Implement Payment window as:

  • redirect (already implemented only method)
  • modal
  • inline

Bambora Documentation:

checkout-integration

2) Implement "immediateredirecttoaccept" setting

When the payment has gone through you end up on a "success" page on the bambora site and you can then click to go back to the Treepl site with the receipt.
This can be passed so you don't see that page but go directly to the Treepl receipt page via the "immediateredirecttoaccept" parameter.

Provide ability to choose this flow in bambora payment gateway settings and implement the appropriate logic.


Bambora Documentation:

checkout#operation-sessions

3) Language control settings

Provide possibility to select the language for the payment window.

Bambora Documentation:

checkout-settings

4) Add transaction ID to the list view of the order.

Provide ability to search by it http://prntscr.com/vikmzm

BACKLOG

Admin UI: CRM -> Orders pagination improvement

Admin UI speed improvement on CRM -> Orders page.

Improve pagination in order to return order list faster.

BUG

{% component type: "shopping_cart" %}
Layout and collectionVariable params behavior fix

If you add `collectionVariable` param to the component the layout doesn’t render in the following cases:

  • When Layout param is missing (should render default layout)
  • When layout param is present but value refers to the layout file

NOTE:

You may have such kind of components in you code ({% component type:"shopping_cart", collectionVariable:"shoppingCartData" %}) that by mistake may miss the layout:"" param that stops component from rendering the default layout but still show no default layout (because of the current bug) .
You need to add missed layout:"" param to such components in order to fix incorrect implementation of the component.

Show more less
New Feature

Customizable Commissions

[Agency feature]
Ability to add commission on top of the CMS plan for sites customer chose to pay directly.
Instant distributed payments (PayPal).
  • Admin Panel
Improvement

Branded Subdomain

Ability to create trial sites Partner's or Agency's primary domain.
Domain management section available from the Treepl Portal.
  • BC Equivalent
  • Treepl Portal
v 5.7 Release date: 28 Oct, 2020

Full Release Notes

BACKLOG

Agency Plan:
Payment + Site activation steps on site

1) Portal settings - ability to allow direct billing and site activation

In Treepl Portal on ‘Edit Site’ page add new setting: “Allow Activation on the site”

2) Billing from the admin

Add Billing button to the "gear" menu

Design

Show it only if ”Allow Activation on the site” is TRUE and the site is not paid yet


Once clicked show Billing page

Design

Link to terms and conditions:

https://treepl.co/terms-of-service

Allow user to pay for the site activation (validate the terms and conditions checkbox is checked).

Once paid - set return URL to lead to the ’Settings’ -> ‘Domains’ (1st step of the activation).

3) Domain Activation Steps

Add domain activation steps to the ’Settings’ -> ‘Domains’ page

Design:

https://invis.io/QSYWMTYD4W6

Add ability to:

  • Go through all activation steps (similar to how it's already done in the portal)
  • add new domain (replicate same steps as on the portal)
  • change primary domain (add indicator on the domains list)
    • When clicking change domain show confirm popup ”Current domain settings will be reset. Are you sure you want to continue?”
  • change domain name (Design)
  • delete domain (add this function to the portal as well) [deleted domain should be able to be added back]

BACKLOG

Agency Plan:
Custom logo for individual site

1) Add Custom branding menu

Add menu item to the "Gear" menu (if current admin has role lower then agency - display menu item as disabled)

Design:

Design

2) Add Custom Branding Page

  • allow to change all branding options that Partner can do in the portal
  • allow to reset custom site assets (show warning popup: “Are you sure you want to reset custom branding?”
  • if current admin has role lower then Agency - do not allow to open this page

Design:

Design

3) Custom Branding functionality

Change branding assets displaying logic (on login, reset password screens etc) as follows:

  • try show custom logo or background image that was set for the current site
  • if not found - try show custom logo or background image that was set in the portal for all sites of the current Reseller (Partner or Agency)
  • if not found - show default Treepl assets

BACKLOG

Agency Plan:
Portal users

1) Add ability to invite staff to Agency user portal (portal users)

DESIGN

https://invis.io/N3YUAKE28BK

Invited user should be able to perform any action that the agency user can except for:

  • Delete sites
  • See ’Portal Users’ tab and invite other Portal users

Invite process should be similar to admin users invite in the CMS (create user if not exist or just invite already existed)

  • if user is already invited to any agency user portal then show error message: “This user is already invited as Portal users to another Agency.”
  • if user is already exist in the identity server and has role:
    • Admin user
      • force rewrite there role to Portal user
      • once they will try to login to any site where they are already marked as admin - remove that mark and release admin slot for that site
    • Any other role
      show error message: “This user couldn't be invited as Portal user.”
  • send Invite email

Text for ? icon near INVITE NEW USER button: “Portal users would have same privileges that your account has except of ability to delete sites and invite new Portal users”

2) Add lazy create process on CMS sites

When Portal user passes login/verification process (via SSO) to the site that belongs to the Agency of the Portal user - add this Portal user to the DB if it's not exited there yet.

3) Portal user influence to admin users UI and restrictions

Portal user should:

  • not be visible in admin users
  • not take slot of admin users
  • have same permissions as their Agency

BACKLOG

Agency Plan:
Functionality to store and share Modules (for Agency)

1) Implement new share module functionality

DESIGN:

https://invis.io/RAYV4SIEFGP

Show ‘Export’ button on edit module -> Settings page (see design).

Show ‘Import’ button on create new module page (in the same place as ‘Export’ button on design).

When clicking ’Export’:

  • Download json file with module settings (described in Import/Export logic part of the task)

When clicking ’Import’:

  • Upload file and verify that module (or each module of parent-child module linkage) doesn't have conflicts between already existed module aliases
  • If conflicts found show popup:
    • When only one conflict found: “Module with name "[ModuleName]" is already exists on the site.
      Paste new name for module or click cancel.
      "[ModuleName]": [input for name]
      OK | Cancel
    • When conflicts found in both parent and child module names: “Modules with names "[ParentModuleName]" and "[ChildModuleName]" are already exist on the site.
      Paste new names for modules or click cancel.
      "[ParentModuleName]": [input for name]
      "[ChildModuleName]": [input for name]
      OK | Cancel
    • Validate that new names do not conflict with any already existed modules in the CMS via JS (OK button is disabled until there will be no conflicts) as well as via backend (show same popup once again if JS passed the validation but module was created between the time popup displaying and new names confirmation submit).
  • If no conflicts found - perform Import logic
  • Show loader while module is creating

2) Implement Import/Export logic

Export:

  • Extract all module settings
    • Settings tab (with assigned workflow Names)
    • Properties tab
    • Layouts tab
    • Table tab
  • If module has parent-child linkage
    • extract both module settings (extract child module first)
  • If module has Datasource fields
    • save datasource module alias as reference in the property settings
    • Extract datasource module settings as well
    • if any property module also has datasource:
      • if datasource module is not added to the export repeat current step for it as well
      • else - skip datasource
    • if datasource module also has parent-child linkage
      • extract that linkage also

Import:

If file could not be parsed show error: “File is not valid for import process”.

Else:

  • Go for each module that is stored in the file
    • Try create module (by ’Settings’ tab data)
      • if site already have module with the same alias as module from export skip module creation
        • mark module as ’skipped’ in import settings
        • if module has parent-child linkage in the import settings - mark both (parent and child) as ’linkageRejected’
      • DO NOT try to set parent-child linkage on this step (even if they should be added based on module settings)
    • Try find workflows by names:
      • if found apply workflow
      • else - skip workflow setting
  • Go for each module marked as parent and has ’linkageRejected == false’
    • link child module by alias based on settings from the import file
  • Go for each module that is stored in the file AND is not marked as ’skipped’:
    • update module (by Properties tab data)
    • update module (by Layouts tab data)
    • update module (by Table tab data)

BACKLOG

Default setting for availability for search engines

1) Add default configuration setting

Add setting to ’Module’ -> ‘Properties’ -> ‘Default Properties’ -> “Show new items for search engines”:

  • Defines if module items should be automatically visible for search engines after create item action (default value for ”Show this page for search engines” checkbox in ’item’ -> ‘SEO’ tab).
    • Via Admin UI
    • Via Import process
    • Via Create item form from the site front-end

Location:

https://prnt.sc/ua8j6a

2) Setup default state of the new setting for system properties

Preselect ”Show new items for search engines checkbox” for the following system modules:

  • Blog Post
  • Page
  • Page Folder
  • Blog
  • Event Groups
  • Events

3) Add two buttons that ‘enable’ and ’disable’ all existing module items of the particular module for search engines

DESIGN:

https://invis.io/3WYTDG1PKEQ

BACKLOG

Custom Reports needing export of Secure Zone members

1) Add new type of custom report called “Contacts and Secure Zones”

SETTINGS:

- hide Form Filter when this type is selected

FIELDS:

- Contact Fields (Same as for all other report types)

- Secure Zone Membership Fields:

  • Secure Zone Name
  • Secure Zone Membership Status
    • Active
    • Expired
    • logic:
      if 'nowDate' < 'secureZoneMembershipExpiryDate' then ’Active’ else ’Expired’
  • Secure Zone Membership Cost
    • Secure zone price taken from secure zone settings
      • country/currency setting for price should be taken from the latest order that was made via form with secure zone subscription
      • if ’Renewal Rate’ is ’Once’ - take cost from the order (order line price)
      • if no such order - display empty value
  • Secure Zone Membership Currency
    • currency should be taken from the latest order that was made via form with secure zone subscription
    • if ’Renewal Rate’ is ’Once’ - take cost from the order (order line price)
    • if no such order - display empty value
  • Secure Zone Membership Expiry Date
  • Secure Zone Membership Renewal Rate (taken from secure zone settings):
    • Once
    • Day
    • Week
    • Month
    • Year

- Advanced CRM groups (same as on ‘Contacts only’ report type)

FILTERS:

- Add Secure Zone Membership Fields to the filters:

  • Secure Zone Name (dropdown)
    • -- all secure zone names --
  • Secure Zone Membership Status (dropdown)
    • Active
    • Expired
  • Secure Zone Membership Cost (string)
  • Secure Zone Membership Currency (dropdown)
    • -- list of all currencies allowed for the site (based on domain settings) --
  • Secure Zone Membership Expiry Date (date string)
  • Secure Zone Membership Renewal Rate (dropdown)
    • Once
    • Day
    • Week
    • Month
    • Year


2) Add human-friendly labels for all other types

Display these labels instead of ENUM values on reports list layout http://prntscr.com/uz6w0f

  • Contacts Only
  • Contacts and Cases
  • Contacts and Orders
  • Contacts and Event Bookings

References:

Backlog Source

Fields (BC example): https://prnt.sc/ulsji4

Results (BC example): https://prnt.sc/ulsj1l

BACKLOG

Shipping option price limitation config

Add to ’eCommerce’ -> ‘Settings’ -> ‘tax and shipping’ new setting called “Shipping option order price limitations applied to”
Location: http://prntscr.com/v0oq2r

Options (dropdown):

  • subtotal with tax (default)
  • subtotal without tax

Logic:

Based on the selected value - apply ”Shipping option order price limitations” accordingly:

  • in JS logic in order to display shipping option or not
  • in backend if shipping option set request was pushed to the server but shipping option doesn't allowed by price limitation

BACKLOG

Setup primary domain to be first in SEO canonical link helper

Improve canonical link helper:

Domain selector should show Primary domain by default (first option in dropdown)

http://prntscr.com/v9z3i7

Primary domain can be setup on domain setting page: http://prntscr.com/v9z2zx

BUG

Secure/Non Secure form submission folder form setting

Fixed ability to download secured file only in you are logged in to the admin dashboard

Show more less
New Feature

Bill Clients Directly

The ability to bill clients directly. Enabled via Treepl Portal, paid via site admin.
  • Admin Panel
New Feature

Default setting for availability for search engines

View design

Properties -> Default Properties:
Add ability to enable item for search engines once created.

Preselect it for following system modules
- Blog Post
- Page
- Page Folder
- Blog
- Event Groups
- Events

When new module created - preselect that setting by default
  • SEO
New Feature

New account level: AGENCY

All new features and capabilities are listed on our updated Reseller Program page.
  • Treepl Portal
Improvement

Custom Reports needing export of Secure Zone members

Ability to export Secure Zone members from CRM.
  • Secure Zones
v 5.6 Release date: 08 Oct, 2020

Full Release Notes

BACKLOG

Sitemap.xml Exclude Module List

Add multiselect dropdown field to the ’SEO’ page called “Exclude Module List”

Includes all system and custom module names to select.

Remove existing hardcoded exclusion of the ‘Page Folder’ module and preselect All following modules for this dropdown by default:

  • "ItemAuthor",
  • "BannerGroup",
  • "Banner",
  • "FAQGroup",
  • "FAQQuestion",
  • "GallerySlider",
  • "Slide",
  • "PageFolder"

Apply logic:

Do not include items of modules selected in the ’Exclude Module List’ to the sitemap.xml

Note:

The “Global ‘Show for Search Engines’” buttons will not modify those items selected in the exclusion list.

Source:

https://forum.treepl.co/t/sitemap-xml-not-adding-page-folders/1107

BACKLOG

Email Verification flow improvement

When Email Domain verification process fails - show ’Retry’ button when statuses set to failed http://prntscr.com/udjtv0.

Clicking on the button should retry the verification process on the Amazon side. States should be reset to pending.

BACKLOG

Add reply-to sender for workflows

Modify workflow emails by adding reply-to header and copy email of the CMR user that originally triggered this workflow.

BACKLOG

Secure/Unsecure form submission folder

1) Add new settings to the ‘Form’ -> ‘Settings’ page:

  • Secure Uploads (default: False)
  • Uploads Folder (default: /_form_submissions/)
    • Folder picker to select path to ftp folder (do not allow a paste of folder path manually)
    • Do not allow ftp root (/).

2) When form is submitted, store uploaded files (from custom fields and advanced CRM group fields) in the folder selected in the ’Uploads Folder’ setting.

Create folder if it does not exist when submitting the form.

When accessing any file - check if it's folder contains any folders set in any form’s secured folder setting:

  • requested file path contains (starts with) any form's ’Uploads Folder’ setting and the form has ’Secure Uploads’ set to “true”
  • if folder is secured - verify that current site visitor is a logged in admin user
  • if so - allow access to the file
  • otherwise - show 403 page

Source:

https://treepl.co/public-backlog-state/in-process/user-submitted-file-upload-to-specific-folder

BACKLOG

Update CRM Contact Group on ‘Update Account’ form

1) ‘Update Account’ system form improvement:

On submission of the ‘Update Account’ form - update CRM group fields that are already attached to the current contact CRM (either globally attached to contacts or custom attached to individual contact).

Form field names would be the same as they are on web forms (‘groupAlias_fieldAlias’ pattern)

2) ’Update Account’ Form in toolbox update:

In the component toolbox, under ‘Secure Zones’ > ‘Update Account Form’, in addition to the current fields, generate all advanced CRM group fields that are assigned to Contacts globally.

NOTE: All custom attached CRM groups can still be updated via the ‘Update Account’ form but all fields for that custom group should be manually added to the update account form's HTML code by the developer based on ’groupAlias_fieldAlias’ pattern for form fields names.

3) Provide ability to store files submitted via edit account form in certain folder

Add section to ’Settings’ -> ‘Misc’ -> “CRM settings”:

  • Uploads Folder (default: ‘/_customer_data/’)
    • Folder picker to select path to ftp folder (do not allow a paste of folder path manually)
    • Do not allow ftp root (/)
  • Secure Uploads (default ‘false’)

When user uploads file on edit account form submission:

  • add folder with member id (if not existed yet)
  • place uploaded file in that folder

If ’Secure Uploads’ == true then allow download files from ’/_customer_data/’ folder for the logged in admin user only.

BACKLOG

Advanced CRM groups on custom reports (+export)

1) Integrate 'Advanced CRM Groups' to the custom reports:

  • Add ability to choose fields from Advanced CRM Groups attached to selected primary CRM type (entity that is chosen in 'Type' in settings tab http://prntscr.com/ugy9qk). Selected fields will then be shown on the ‘Fields’ tab.
  • Provide ability to apply filter to any Advanced CRM Group's field that was shown on the ’Fields’ tab (regardless if it was chosen or not)
  • Show Advanced CRM Group fields selected in the ‘Fields’ tab on the Results table. Add those fields to the export file as well.

Design: https://projects.invisionapp.com/share/9QYC4SUDCJP#/screens/427731175

2) ‘Select all’ UI improvement for groups of fields

Add ability to select all fields via one checkbox in title section as shown in design: http://prntscr.com/ugyf7c

Provide such ability to all groups (system groups and Advanced CRM Groups)

3) Improve sorting on results tab

Provide ability to sort results by any field shown on the results tab (any contact, case,advanced CRM group field).

Check that sorting and pagination are performed via server side, not via UI capabilities


4) Fix report results headers

BACKLOG

CRM import/export + advanced CRM groups

1) Include Advanced CRM Groups into the Import/Export functionality

Export:

  • When Exporting any CRM entity (Contact, Form Submission, Order or Booking subscription) - collect all advanced CRM groups that are attached to the selected set of items (for example if you choose form for case export - grab only advanced CRM groups attached to items that were retrieved by the query) and extend Excel table by them
  • use groupAlias_fieldAlias format for column titles

Import:

  • provide the ability to import Form Submission and Booking subscription.
  • use groupAlias_fieldAlias format for column titles as markers for fields that need to be updated
  • when importing data:
    • if there will be no field with some fieldAlias in group with groupAlias - skip content of this column
    • if create or update operation is impossible for any entity (due to lack of required columns or empty/incorrect cell value) - skip processing this particular item and continue to the next item.

2) Implement "Get Import Template" button

  • Add "Get Import Template" button.
    When clicked show popup with advanced CRM groups represented as checkbox list.
  • Allow user to choose what groups should be included in the template besides native entity data.
  • Add this button to Contact, Form Submission and Booking subscription
  • use groupAlias_fieldAlias format for column titles

DESIGN:

https://invis.io/VMYECYV6ZGQ

BACKLOG

module_tag_list and module_category_list improvement

1) Improve performance of 'module_tag_list' and 'module_category_list' components

Use search by a separate table in order to retrieve data faster.

Add additional table that will hold the following data:

  • release date
  • expiry date
  • active (boolean - ‘true’ if ’enabled’ AND product inventory visible etc)
  • moduleId
  • itemId
  • tagname or categoryId

Update this table on:

  • module item add
  • module item edit
  • module item delete
  • reindex module
  • reindex site

Redo 'module_tag_list' and 'module_category_list' logic so it should search its data based on the table above instead of searching by regular site search.

Sorting and indexing should be performed via SQL instead of via the C#

BACKLOG

Export of orders

Add ability to call export for Orders

- Green for order data. Data goes on the 1st row.

- Red for order lines data. Product data goes starting on the 2nd row (1st row is empty for them) and goes down until all order lines will be output

Column Headers:

  • Order ID
  • Order Name
  • Currency/Country
  • Status
  • Member Email
  • Invoice Number
  • Invoice Date
  • Weight Measurement
  • Dimension Measurement
  • Shipping Address
  • Total Cost
  • Amount Paid
  • Pending Collection
  • Shipping Cost
  • Discount
  • Gift Voucher
  • Created Date Time
  • Product
  • Attributes (use pattern: http://prntscr.com/uizc1s)
  • Weight
  • Width
  • Height
  • Depth
  • Units
  • Unit Price
  • Tax Rate
  • Total Price

BACKLOG

Exporting Subscribers from Events

Add export Event Subscribers functionality on 'Events' -> ‘Edit Event’ -> 'Subscriptions' tab (https://prnt.sc/sbawkq)

Resulting excel should have the same columns as the table has on that page.

BACKLOG

Rounding Formula for Taxation Engine

Implement rounding algorithm that will be based on:

1) Bankers Rounding: when rounding applied to a number that has 0.5 in the decimal component of the price (represented in cents)

2) Error Compensation Algorithm: for all other roundings (similar to the one that BC had: https://docs.worldsecuresystems.com/user-manual/e-Commerce/Taxes/working-with-the-improved-taxation-engine)

Represented algorithm should be applied to the following prices separately: (names are taken from this table https://docs.google.com/spreadsheets/d/1mUVUDVayY8lj2LhzrUQTIOQ_G660Vbcj5PyiOMG4wpg/edit?usp=sharing)

  • Product item in cart 'item.unitTotalPrice' and 'item.unitTaxPrice'
  • Product item in cart 'item.totalPriceExcludingTax' and 'item.totalPrice'

Following data should be calculated as SUM of already rounded 'item' data (so additional or separate rounding should not be performed)

  • subTotalPrice
  • grandTotalPrice
  • totalPrice
  • totalPriceExcludingTaxAndGiftVoucherAmount
  • totalPriceExcludingTax

Example of algorithm:

BACKLOG

"Tax Never Applies" option for price

Add checkbox to the price instances near tax dropdown, called: “Tax Never Applies: (default= false)

Logic:

When checked - tax should not be added to the order line that represents this product (or shipping option) when tax selected on the shopping cart.

Add this checkbox for:


Also add it to Products import/export data

BACKLOG

Shipping and tax improvements

Add new tab to the 'Ecommerce' -> 'Settings’, called “Tax and Shipping”

Add following settings (DESIGN https://invis.io/JGYORI2PC2A):

“Country/Currency select”
(Choosing value from this select to load settings specific for that particular country/currency pair)

  • Tax applies to (multiselect dropdown list)
    Determines if taxes should be applied to selected entities or not
    - shipping options (selected by default)
    - gift vouchers (selected by default)
  • Auto-select tax if only one option available (boolean - default value ’true’)
    Determines if the single tax in the tax dropdown be automatically selected when a user comes to the shopping cart and/or changing country.
  • Hide tax selector if only one option available (boolean - default value ’false’)
    Determines if the tax dropdown be hidden by JS if there is only one tax option available.
  • Enable tax dropdown (boolean - default value ’true’)
    Determines if {% component type: "tax_codes" %} component renders the tax dropdown or not.
    Also determines if server-side validation should require it or not.
  • Shipping Countries (multiselect dropdown list - default empty list)
    • -- list of all countries --
      Also provides the ability to select all options. So the user can easily select all and then deselect the few not needed.
    • Logic:
      determines what country list will be shown when rendering the component {% component type: "countries" %}
      - if value is empty - show all countries. Otherwise show only selected countries
      - if {% component type:"countries", allowedCountries:"US,AU" %} has ’allowedCountries’ param - use its list of countries instead of shop setting (component param overrides shop settings).
  • Choose Default Country (dropdown - default = null)
    • -- list of all countries selected in Shipping Countries dropdown --
    • Logic:
      Determines what country should be automatically selected when a user comes to the shopping cart.
  • Make shipping country required (boolean - default ’false’)
    Determines if country dropdown can be deselected or not

BACKLOG

Do not skip selected shipping options

When shopping cart updated after changing quantity - if shipping options that was selected previously are still available - leave it selected.

When any of the following processes occured:

  • add product to cart
  • change product quantity
  • remove product from cart
  • add/remove discount code
  • add/remove gift voucher

DO NOT reset selected shipping option if after shopping cart update that shipping option is still available.

BACKLOG

When Sorting items via ‘sortBy’/‘sortOrder’ - skip weighting

Improve sorting of module items functionality on {% component type: "module" %} and {% component type: "module_of_member" %} via a new parameter for the component:

  • ignoreWeighting: "true" (default value ‘false’)
    • if value true:
      skip sorting by weight before sorting by 'sortBy' (if 'sortBy' is empty then alphabetical sort should be applied - remove "sorting by weight first" logic also)
    • if false:
      apply current sorting algorithm (first by weight then by name ASC).

Add this new parameter to the toolbox for:

  • Custom modules
    • List of items
    • List of member's items
  • Gallery/Slider
  • FAQ`s
  • Banners
  • Authors
  • Events
  • eCommerce
    • Catalogs list
    • Products list

BACKLOG

‘CRMCustomGroup’ component type alias to ‘CRMContactCustomGroup’

Create an alias of 'CRMCustomGroup' that will trigger the same functionality that 'CRMContactCustomGroup' (including all component properties).

So {% component type: "CRMCustomGroup" %} will do the same as {% component type: "CRMContactCustomGroup" %}

BACKLOG

Group products JS and liquid logic

Product Grouping on Detail Layout improvements:

1) Add to all product detail layout custom forced wrapper (only if product has any grouped products):

<div class="cms-product-wrapper" data-cms_product_wrapper="{{{{this.Id}}}}" data-cms_layout_name="{model.Layout}"></div>

2) Add JS that will request, via AJAX, the selected sub-product or main product once the appropriate option has been selected in the dropdown rendered via the component.

Render layout based on the 'layoutName' and 'productID' sent in the request and with the following liquid variables:

  • this
  • si
  • siteinformation
  • request

3) Add ‘this.URL’ to the liquid context of each item in {% component type: "grouped_items" %}.

Add ‘this.URL’ to the <option> element as 'data-product_url' attribute.

4) Provide custom event ’onProductLayoutChanged’ that could be used by any site owner's JS once layout will be changed via AJAX.

Product Grouping on List Layout improvements:

1) Fix component type module so it returns only main Product (if it is part of the Grouped products list) and don't return Grouped sub-products.

Only MAIN product should be listed via {% component type=module %} (and type=module_of_member).
Sub-products should not impact the pagination and should not be listed except if those components have ‘isSearchResult: "true"’ or ’searchScope’ param in which case include subproducts in the search results.


2) Add custom wrapper to list layout if it contains any grouped products (if layout contains {% component type: "grouped_items" %}) and if the 'object' param is set to 'item' http://prntscr.com/tzf1n2 (wrap same as in detail layout above)

NOTE:

If you are using component type module with 'object: "collection"' then you should add wrapper from point 1 inside your for loop manually in order to allow product grouping logic to work.

3) Provide custom JS event 'onProductLayoutChanged' and JS for layout reload (similar as described for the detail layout above).

4) Fix group order

Order of items that are listed via component should be the same as sorted in the admin.

Example of BC product groups:

Catalog where all products stored:
https://zaycev.worldsecuresystems.com/books/fiction

Main product:
https://zaycev.worldsecuresystems.com/books/fiction/main-prod

Sub products:
https://zaycev.worldsecuresystems.com/books/fiction/sub-prod-1
https://zaycev.worldsecuresystems.com/books/fiction/sub-prod-2

jQuery example of event handler:

$('body').on('onProductLayoutChanged', function(){
<!-- some code -->
});

BACKLOG

Feature flags changes (v5.6)

Apply following changes to feature flags:

Remove flag from the system:

  • Advanced URL manager

Move to internal flags AND set enabled

  • New liquid engine & nICE 2.0
  • Advanced payment flow

BACKLOG

BONUS: Customer Submitted Content - Add workflow for when items are edited

Provide ability to setup workflows in ’Module’ -> ‘Settings’ -> ‘Site User Permission’ (http://prntscr.com/rl85f0) for the following actions:

  • Add item by site user:
    Current workflow list should be transformed into this setting. Move multi-select under ’Allow add new items’ option.
  • Edit item by site user:
    New multi-select of workflows.
  • Delete item by site user:
    New multi-select of workflows.

Provide ’customWorkflows’ field to be processed on module item create/update/delete site user forms.

Logic of this field should be exactly the same as for customising workflows for web forms - where by it overrides workflow/s selected in form settings

Source:

MISC

Admin Proof Read/Suggestions (Part 1)

Here is a Google Doc with all admin wording suggestions.

Minor text changes in most cases.

https://docs.google.com/document/d/1qg5mZaZl0h7AFb8YFyGsjKMAsEDysBjGTQzhxqyHSUY/edit?usp=sharing


1. [ ✔] When editing a Menu item, the ‘ID Name’ field should perhaps be just ‘ID’

2. [ ✔] In the Component toolbox, perhaps remove the words ‘Get’ from the beginning of the Item Form options

3. [ ✔] In the Component toolbox, when getting a search form, there is the FORM CODE and the COMPONENT CODE, but it’s not particularly clear these are two links, or the Form code link might be missed. Suggest separating these 2 links a bit more or perhaps even having 2 headings, eg

4. [ ✔] In the Component toolbox, perhaps use correct apostrophes in the FAQ section

5. [ ✔] In the Component toolbox, use lowercase ‘o’ in ‘of’ under the “Banners” and “Authors” sections for consistency with all other options

6. [ ✔] In the Component toolbox, under “Events”, use capital letter for ‘Event Groups’, ‘Event’ and ‘Form’.

Perhaps rename “List of event’s groups” to “List of Event Groups”

7. [✔ ] In the Component toolbox, under “eCommerce”, suggest using title-case throughout for consistency

8. [✔ ] In the Component toolbox, under “CRM”, suggest rewording options for consistency

9. [✔ ] In the File Manager, when clicking the “Add New” button, it could probably just say “Folder” and “File” instead of repeating “Add new folder/file”

10. [✔ ] In the File Manager, the upload file drop zone could be made a little clearer by adding “to upload” after “click here” link

11. [✔ ] In the File Manager, in the context menu of a folder/file, perhaps the “Secure Zone” option should just read “Secure”

13. [✔ ] In the Form “Settings”, perhaps add an ‘s’ to “Workflow” and “Secure Zone” labels (since multiple items can be selected).

And, below this, the term “Autoresponder” is probably more widely used instead of “Auto-response” (not a big deal though)

15. [✔ ] In Secure Zone “Members” tab, the “Emails” column header should probably just be “Email” (without the ‘s’)

16. [✔ ] As above, the same change for “CRM” > “Contacts” list

17. [✔ ] In “CRM” > “Contacts”, when adding a new contact, perhaps change “E-mail” field label to “Email” for consistency

18. [✔ ] In “Form Submissions”, perhaps change the column heading of “Date Submission” to “Submission Date” or “Date Submitted”

19. [ ✔] In “CRM” > “Orders”, when viewing the “Payments” tab, perhaps use a capital ‘C’ in “Amount Captured” column heading (for consistent title-case use)

20. [✔ ] In “Email Marketing” > “Email Campaigns” in the ‘Settings’ tab, for the “Schedule Delivery” option, perhaps change to just “Delivery”.

21. [✔ ] In “Email Marketing” > “Mailing Lists”, under ‘Subscribers’ tab, perhaps adjust “Emails” column heading to just “Email”

22. [ ✔] In “Email Marketing” > “API Provider”, adjust page heading to use a capital ‘P’ for “provider”

24. [✔] On the ‘Catalogs’ tab when editing a Product, perhaps add heading above the selection boxes to make it a little clearer what’s what

25. [ ✔] On the ‘Inventory’ tab when editing a Product, perhaps use title-case for the ‘Added to shopping cart’ label making it ‘Added to Shopping Cart’ (for consistency)

26. [ ✔] Similar to point 24) above, perhaps add headings to the selection boxes

27. [ ✔] Under ‘Grouped Items’ tab when editing a Product, perhaps use title-case for the “Main product” checkbox label (for consistency)

28. [ ✔] Under the ‘SEO’ tab for ALL module types, perhaps reword and title-case the “<head> section extra” label, possibly: “<head> Section Additions” or “Additional <head> Code”

29. [ ✔] In ALL module ‘Settings’ page, use title-case for the ‘Site User Permissions’ checkbox labels. And perhaps change “Auto-response” heading to the more widely used “Autoresponder”

32. [ ✔] For ALL module “Table” tab, consider using title-case for the ‘Add new column’ heading so it reads “Add New Column” (in the side panel when adding a column)

35. [✔ ] Under a Shipping Options “Settings” tab, consider adjusting the “Show Shipping option to” label to title-case so it reads: “Show Shipping Option to”

37. [ ✔] Under “eCommerce” > “Settings” → ‘Manage Status’ tab, consider adjusting for title-case

39. [ ✔] Under “Reports” > “Custom Reports”, when editing a Report, the help bubble for “Settings” and “Form Filter” need adjusting.

For “Settings”, it still refers to the previous naming of “Make Public” but should now be “Make Sharable”

41. [ ✔] Under “Settings” > “Domains” and ‘Site Domains’ tab, consider adjusting for title-case in the sidebar for editing ‘Currency and Format’ and ‘Country’

42. [ ✔] ...as above, also in the ‘Email Domains’ tab when adding a new domain, adjust for title-case

44. [ ✔] Under “Settings” > “Admin Users”, column header and edit field label say “E-mail” consider changing to “Email”.

Also note edit panel heading to title-case

45. [✔ ] Under “Settings” > “Admin Menu Configurator”, consider adjusting headings and buttons for title-case

46. [ ✔] Under “Settings” > “Setup Analytics”, consider correcting “Id” to “ID”

48. [ ✔] Under “SEO” rename the “Pages search engine settings:” label to be more clear (since this option enables/disables ALL module item content, not just Pages).

Something like “Global ‘Show for Search Engines’” with maybe even a paragraph under this heading, or a help bubble, describing what it does exactly,

BACKLOG

Fix truncate liquid string filter

Fix liquid ‘truncate’ filter so if second param is NULL (http://prntscr.com/ui7qip) then apply "..." string as suffix.

And if second param is an empty string "" (http://prntscr.com/ui7r3k) then apply an empty string "" as suffix.

Source:

https://forum.treepl.co/t/request-withdrawn-implement-truncate-words-liquid-string-filter/491

BACKLOG

Improve pay by cash and offline payment namings

1) Rename 'offline-credit-card-payment' system page (https://prnt.sc/spcfi5)

- Change name and URL to 'deferred-order-payment'.

2) Rename Offline Credit Card Payment system email (https://prnt.sc/spcg1w)

- Change name to 'Deferred Order Payment'.

- Change value of the 'this.offlinePaymentPageURL' according to the new URL of 'deferred-order-payment' system page.

- Change Subject to ’Pay Order #{{this.order.id}}’.

3) Change offline credit card payment namings (https://prnt.sc/spcer0)

- Change 'Offline Credit Card Payment' to 'Deferred Order Payment'.

- Change 'Send Offline Credit Card Payment' to 'Send Deferred Order Payment Email'.

- Change 'Pay By Credit Card' to 'Pay Order'.

BACKLOG

Add ability to track offline payment

1) Provide ability to track offline payment for the order

- Rename 'Paid By Cash' (http://prntscr.com/ui8sv8) to 'Add Offline Payment'.

- When clicking on it the sidebar panel appears http://prntscr.com/ui8u0m.

- Make 'Payment Type' a dropdown to be active and provide the following options (instead of 'Offline'):

  • Cash (default)
  • Cheque
  • EFT
  • Money Order
  • Other
  • Credit Card

Add additional fields to the payment form:

Once payment added - it's type should be shown in the table http://prntscr.com/ui8x7v

Rename all existing ’Offline Payment’ types to 'Cash'

BACKLOG

Add "ID" to customizable columns

Add ability to choose 'ID' property for the custom columns http://prntscr.com/tjg8az.

If selected - show item ID in the list view table according to the custom columns display rules.

BACKLOG

Override quantity field with Product Minimum Units

1) Add validation for shopping cart ’change quantity’ and product ’add to cart’ actions:

  • validate that total quantity after add or change action is between Minimum Units and Maximum Units http://prntscr.com/tjp1fc
  • if Minimum Units is empty - default value is 1
  • if Maximum Units is empty - default value is infinity

2) Show error messages once validation is not passed:

  • quantity > Maximum Units:
    ERROR: Quantity entered is too large, please enter a smaller quantity.
  • quantity < Minimum Units:
    ERROR: Quantity entered is too small, please enter a larger quantity.

3) Change default layout (/cms-assets/layouts/ecommerce_item_quantity/default.layout)

From:

<input type="number" data-ecommerce_product_quantity_field="{{this.id}}" value="1"/>

To:

<input type="number" data-ecommerce_product_quantity_field="{{this.id}}" {% if this.minimumUnits > 0 %}min="{{this.minimumUnits}}"{% endif %} {% if this.maximumUnits > 0 %}max="{{this.maximumUnits}}"{% endif %} value="{% if this.minimumUnits > 0 and this.params.quantity == null %}{{this.minimumUnits}}{% else %}{{this.params.quantity | default: 1}}{% endif %}"/>

4) Fix bug: ’this.params’ object is not filled by custom params.
As a result such record {% component itemId: "{{this.Id}}", type: "ecommerce_item_quantity", quantity:"10" %} isn't rendered with quantity = 10 when it should.

Source:

https://forum.treepl.co/t/over-ride-quantity-field-with-product-minimum-units/1104

BACKLOG

Add SKU code as default column for the product

Example: https://prnt.sc/slw24j

Update defaults only. If custom columns have been implemented do not update.

BACKLOG

‘Products’, ‘Shopping_Cart’, ‘Order’ object extending

Add following properties to the 'Product' (order line), 'Shopping_Cart' and 'Order' objects:

  • taxCode
  • taxCodeHtml
    • Product (order line)
    • Shopping_Cart
    • Order objects
  • unitRecommendedPrice
  • unitRecommendedPriceHtml
  • unitRecommendedTaxPrice
  • unitRecommendedTaxPriceHtml
  • unitRecommendedTotalPrice
  • unitRecommendedTotalPriceHtml
  • onSale
    • Product (order line) object

BACKLOG

Property (type media) - apply URL partial encode for liquid

Improve module item liquid object for ‘Media’ type properties in {% component type: "module" %} and {% component type: "module_of_member" %}:

If property type is 'Media' - launch the following algorithm to its value:

  • extract file name from file path (file name is between last "/" and "end of string" OR "?")
  • apply URL encode to the name
  • join path and name back together
  • place the value back to the property

The value of the 'Media' property still should be un-encoded on edit item form in the admin.

Also update "copy to clipboard" links so they return encoded filename https://prnt.sc/uu6ljx

Eg: So if an item would have a value like "/pdf/myPdf#2.pdf?downloadable=1" it will be encoded like "/pdf/myPdf%232.pdf?downloadable=1" and placing {{this.myPdf}} into the href attribute of the link will not break the file accessibility. For example: <a href="{{this.myPdf}}">Download PDF<a>

BACKLOG

Add module ID/alias to the item object (LIQUID)

Extend module item object by adding following properties

  • Module_ID
  • Module_Alias

BACKLOG

Add {{this[‘LastUpdatedDate’]}} to properties list (toolbox)

Add {{this[‘LastUpdatedDate’]}} to properties list in ’Module’ -> ‘Layout’ -> ’Properties’ toolbox.
It exists, just not listed.

https://prnt.sc/mm2pop

BACKLOG

Duplicate Workflows functionality

Provide ability to duplicate Workflows to copy workflow instance:

  • with the same list of ’Recipients’
  • linked to the same ’Workflow Email’

BACKLOG

Add browser Cache control headers

Add this header to all file requests (max age of 7 days):

“Cache-Control: private, max-age=604800”

BUG

date liquid filter fixes

Fix/implement following patterns for date filter (that is based on http://strftime.net/):

1) Implement %w pattern:

  • Weekday as a decimal number, where 0 is Sunday and 6 is Saturday.
    Example: {{ "now" | date: "%w" }}

2) Fix %v pattern for VMS date format: http://prntscr.com/ttaz4n

3) Implement %Z pattern:

  • should show name of the timezone set for the site (use same values as for liquid's {{request.timezone}} object)

4) Fix %z pattern:

  • shows +00:00 but should be -05:00 (if the site timezone is set to -5) (use same values as for liquid's {{request.timezone}} object)
Show more less
New Feature

BONUS: US-2 Data Center (Virginia)

New data center: US (Virginia)
  • Infrastructure
Improvement

BONUS: Customer Submitted Content - Add workflow for when items are edited

The ability to have notifications on both creating and editing items.

Would we be able to allow the programatic triggering of Workflows for Custom Module create/edit forms, like we have for general forms: https://docs.treepl.co/documentation_group/content-modules/forms#secTriggerWorkflows and this will allows us to configure Workflow/s for whatever condition we need.

  • Custom Modules
  • Workflow
Improvement

Feature Flags Changes (v5.6)

IMPORTANT!
Enable and hide following feature flags for
all (!) live sites:
- Advanced payment flow (Read article: MIGRATING TO ADVANCED PAYMENT FLOW)
- New liquid engine & nICE 2.0 (Read article: MIGRATING FROM LIQUID 1.0 TO 2.0)
  • Ecommerce
  • General
  • Liquid
  • On-Site Editor
Improvement

Misc Improvements (v5.6)

- Sitemap.xml Exclude Module List
- Update CRM Contact Group on edit account form
- Advanced CRM groups on custom reports (+export)
- CRM import/export + advanced CRM groups
- Group products JS and Liquid logic
- Rounding Formula for Taxation Engine
- Shipping and tax improvements
- module_tag_list and module_category_list improvement
- Export of orders
- Exporting Subscribers from...
  • CRM
  • Ecommerce
  • SEO
Improvement

User Submitted File Upload To Specific Folder (+ secure/unsecure submitted files)

The ability to assign a custom folder path for user-submitted media objects.
This should also apply in the admin - so when selecting a file the file manager opens to the defined folder.
The ability to setup custom folder path to be secured (only admin have access) or unsecured (anyone with the link have access).
  • Custom Modules
v 5.5 Release date: 20 Aug, 2020

Full Release Notes

BACKLOG

File Manager:
Files/folder lazy loading

Improve file manager to use lazy loading functionality (to show only those elements that are visible on screen) in order to prevent long loading of the files and folders when there are a lot of files and/or sub-folders.

Once user scrolls the active area, show following elements and hide previous so browser would not be overloaded.

BACKLOG

Custom Shipping Layouts Bug

eCommerce JS should not overwrite the <options> layout entirely.
Option layout should be taken from the ’data-cms_cart_shipping_option_name_layout’ attribute that is located on the <select> tag.

If no data attribute would be found - js will use default option name layout.

Back-end:

Default layout should be improved by adding ’data-cms_cart_shipping_option_name_layout="{itemName} ({itemPrice})"’ to the select tag http://prntscr.com/tcue19

BACKLOG

3rd Party Shipping Integration:
Order States and Tracking Info Management

1) Add two system fields to the ’Order’ item in the admin (after Invoice Date http://prntscr.com/tb49jp):

  • AWB Number
  • Tracking URL (as an active link)

Also added to the ‘Order’ liquid object.

2) Provide ability to edit some Order details: http://prntscr.com/tb48qa

  • Status Type (rename label to Status)
  • Invoice Date

3) Add new admin panel page: ‘Ecommerce’ > ‘Settings’:

Move here Shopping cart life time setting from Misc settings (https://prnt.sc/sw1toc)

4) Order Statuses should be reworked:

DESIGN http://prntscr.com/u6s8kg.

Add ’Manage Statuses’ Tab to ’eCommerce’ -> ‘Shop Settings’ page


Provide Ability to Create, Update, Delete Status and change their order in the dropdown on the ’eCommerce’ -> ‘Shop Settings’ -> ’Manage Statuses Page’ (http://prntscr.com/u6s8s9)

Add/Edit contains following fields:

  • Status Name (required)
  • Type (not editable. For display purposes only)
    • Custom (default)
    • New
    • AwaitingPayment
    • PendingCharge
    • PaymentCanceled
    • Paid
  • Workflow (multi-select)
    • Not Set (default)
    • --- list of workflows ---
  • Notify Customer
    • boolean (default false)

Provide following delete logic:

  • Only Statuses with Type=’Custom’ could be deleted.
  • Don't show delete button and don't execute delete operation on statuses that has type other than ’Custom’

Pre-create following statuses (set all to: Workflow=Not Set, Notify Customer=False)

  • New (selected when order is created)
  • Awaiting Payment (selected when create order via checkout form)
  • Pending Charge (selected when two step card payment successfully placed funds for the order on hold)
  • Payment Canceled (selected when: admin canceled the pending charge payment, or, pending charge payment was expired and as a result was canceled)
  • Success (selected when CMS retrieves a message from payment provider that payment was successfully processed)
  • Payment Failed (selected when CMS retrieves a message from payment provider that payment failed)

Remap all orders with current enum statuses as follows:

  • AwaitingPayment => Awaiting Payment (Type=AwaitingPayment)
  • Succeed => Success (Type=Paid)
  • Failed => Payment Failed (Type=PaymentFailed)
  • New => New (Type=New)

5) Add new system email (‘Email Notifications’ > ‘System Emails’):

  • ‘Order Status Changed’
  • Order Status
    • dropdown of all order statuses.
    • based on the selected status, show associated ’System Email Details’ and ’Content’ fields.
    • store ’System Email Details’ and ’Content’ fields data for each Order Status separately.
    • store this set of system emails on FTP in separate folder:
      • /Content/SystemEmails/OrderStatusChanged/[[order-status-name]].html
      • each time when new custom order status will be created - create [[order-status-name]].html file
      • each time when custom order status name will be changed- changed [[order-status-name]].html file
      • apply FTP synchronization to these files (update file content will update Content field of the email)

Liquid scope for "this":

  • order
  • oldOrderStatus
  • customer
  • siteUrl

eg:
Dear {{this.customer.firstname}},
The status of your order (#{{this.order.invoiceNumber}}) has been changed from {{this.oldOrderStatus}} to {{this.order.status}}.

6) Add functionality to the order status change event:

When changed (manually or via backend flow logic) - get new status settings and

  • send ’Order Status Changed’ system email if ’Notify Customer’ setting is True
  • send all selected workflows that are selected in the ’Workflow’ setting (if there is a workflow selected)

BACKLOG

3rd Party Shipping Integration:
(BASE LOGIC)

1) Shop Measurements Setup

Add the following settings to the ’eCommerce’ -> Settings’.

Determines the unit of measure to be applied to the Shipping options and Products Width, Height, Depth and Weight for the calculation of shipping price.

Preset kg and cm for all sites in Database by default.

Options:

  • dimension:
    • cm (default)
    • in
    • mm
    • m
    • ft
    • yd
  • weight:
    • kg (default)
    • lb
    • oz
    • g

2) Shipping Option Integration Setup

Modify the shipping option Details form according to the following fields order:

  • Name
  • Currency / Country
  • Type (new extended list)
    • User Defined
    • FedEx
    • UPS
    • USPS
    • Canada Post
    • Australia Post
    • New Zealand Post
  • Tax Code
  • Price

Once any type with Shipping Integration selected- hide ’Price’ fields and show additional fields specific to the selected shipping provider:

  • Origin Zip/Postcode (string)
  • Shipping Provider Services (dropdown)

unique fields for the particular shipping provider including api access params.
BC Example for each shipping provides:

3) Shipping option integration on front-end UI

Design: http://prntscr.com/u6s6cf

When shipping option that has shipping provider integration is selected, show additional input field: “Destination Zip/PostCode”

  • If shipping provider accepts any other additional fields that affects the cost - show them (For example: “Address is residential” field for UPS Air https://prnt.sc/talnkb, https://prnt.sc/talo94)
  • Once zip is entered - request available shipping Options from the shipping provider via API and show them under ’Destination Zip/PostCode’
    (here is an example of shipping options retrieving for FedEx https://www.fedex.com/lite/lite-ship.html?locale=en_us&cntry_code=us#address)
  • If there are several options available for the destination - provide the ability to choose one.
  • If there are only one option available - preselect it.
  • if no options available - show message "No shipping options available for this destination".
  • if any error occured - show error message.

4) Shipping option display based on order rules

Shipping options that have shipping provider integration should follow the same rules as currently works for ’User Defined’ shipping options (Shipping Option -> Settings tab).

This includes:

  • measurement constraints
  • price constraints
  • limit delivery to country
  • exclude if purchase from catalogs

5) Shipping Price Calculation Rules

Once shipping provider returns the options and their prices - extract ’shippingTaxRate’, ‘shippingPrice’ based on the response data (if no tax set in the CMS the tax info will be taken from the shipping integrator if provided).

Then recalculate base shipping price by adding any ’Handling Charge’ and ’Additional Per item Handling Charge’.

And then recalculate ’shippingTaxPrice’, ‘shippingTotal’ and all other related prices like it works for ’user defined’ shipping options.

Set resulting values to the liquid object of the shopping cart.

Return to UI prices that already includes ’Handling Charge’, ’Additional Per item Handling Charge’ and ’taxPrice’. Basically the ’shippingTotal’ (https://prnt.sc/talnkb)

6) Checkout form improvement based on the shipping providers integration

Set zip code field to disabled (it is not allowed to be changed) and pre-filled by the value chosen on the shopping cart step (similar to how country is pre-selected based on the country selected on the shopping cart and not allowed to be changed).

BACKLOG

3rd Party Shipping Integration:
Liquid component tag for shipping providers additional fields

Add new component tag for "shippingProvidesFields":

{% component type:"shippingProvidesFields", collectionVariable:"", layout:"" %}

  • collectionVariable (not required) - works the same way as in other modules.
  • layout (not required) - path to FTP file that will contain layout content to be parsed.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.

Item context: empty

Default virtual layout:
<div data-cms_cart_shipping_provider_fields_holder></div>

BACKLOG

3rd Party Shipping Integration:
(FedEx)

Implement Shipping provider API according to BASE LOGIC API: https://www.fedex.com/en-us/developer.html

BACKLOG

3rd Party Shipping Integration:
(UPS)

Implement Shipping provider API according to BASE LOGIC API: https://www.ups.com/upsdeveloperkit?loc=en_US

BACKLOG

3rd Party Shipping Integration:
(USPS)

Implement Shipping provider API according to BASE LOGIC API: https://www.usps.com/business/web-tools-apis/documentation-updates.htm
and
https://www.usps.com/business/web-tools-apis/rate-calculator-api.pdf

BACKLOG

3rd Party Shipping Integration:
(Canada Post)

Implement Shipping provider API according to BASE LOGIC API: https://www.canadapost.ca/cpo/mc/business/productsservices/developers/services/rating/getrates/default.jsf

BACKLOG

3rd Party Shipping Integration:
(Australia Post)

Implement Shipping provider API according to BASE LOGIC API: https://developers.auspost.com.au/

BACKLOG

3rd Party Shipping Integration:
(New Zealand Post)

Implement Shipping provider API according to BASE LOGIC API:
https://www.nzpost.co.nz/business/developer-resource-centre

BACKLOG

2 Factor Auth for admin portal

1) Implement 2FA for the Treepl SSO service (Use google authenticator)

2) enable 2FA on edit account (partner portal): http://prntscr.com/u6s3zj

3) each time on login to portal or any site

  • show QR code and code field on separate page after successful login (if 2FA not set up for the current user)
    http://prntscr.com/u6s4y8
  • show code field on separate page after successful login (if 2FA is set up for the current user) (without QR code)

4) add ability to enable 2FA for the site on site details and show indicator on sites list

  • similar checkbox setting as on edit profile
  • show if 2FA is enabled for the site

5) for site admin users (if 2FA for the site is enabled) each time on login:

  • show QR code and code field on separate page after successful login (if 2FA not set up for the current user)
    http://prntscr.com/u6s4y8
  • show code field on separate page after successful login (if 2FA is set up for the current user) (without QR code)

BACKLOG

Replace old order.totalHtmlPrice and remove property

Replace all occurrences of ’totalHtmlPrice’ to ’totalPriceHtml’ within order or shopping cart objects in following places:

  • System emails:
    • Supplier Notification
    • Invoice
    • OfflineCreditCardPayment
  • Forms:
    • Checkout
  • System Pages:
    • offline-credit-card-payment
    • order-receipt
    • shopping_cart

ATTENTION:

Custom includes, layouts or snippets where totalHtmlPrice has been used as part of any custom logic will not be replaced. It needs to be replaced to totalPriceHtml by the partner manually.

BACKLOG

Payment gateways:
Paypal

1) Create support for Paypal Payment gateway.

2) Gateway logic should support following flows of capturing price:

  • ‘Instant payment’ (charge money right away)


Places for logic to be implemented in:

  • ‘Settings’ -> ’Payment’:
    Provide ability to setup API credentials for Paypal
  • Page rendering function:
    Setup auto-add Paypal payment scripts in <head> section (similar to how it's done for eway and stripe)
  • Payment form submit processor:
    Setup charging process via Paypal API using token retrieved from formData

Forum Backlog: https://treepl.co/public-backlog-state/coming-next/paypal-payment-gateway

BACKLOG

Payment gateways:
Authorize.net

1) Create support for Authorize.net Payment gateway.

2) Gateway logic should support following flows of capturing price:

  • ‘Instant payment’ (charge money right away)

Places for logic to be implemented in:

  • ‘Settings’ -> ’Payment’:
    Provide ability to setup API credentials for Authorize.net
  • Page rendering function:
    Setup auto-add authorize payment scripts in <head> section similar to how it's done for eway and stripe
  • Payment form submit processor:
    Setup charging process via Authorize.net API using token retrieved from formData

BACKLOG

{% break %} and {% continue %} not working in liquid 2.0

Example:

{% for item in (1..10) %}
{{item}}<br>

{% if item == 6 %} THIS SHOULD BREAK HERE! <br>{% break %} {% endif %}

{% endfor %}

<br>

<hr>

<br>

{% for item in (1..10) %}

{% if item >= 6 %} THIS SHOULD CONTINUE HERE! <br>{% continue %} {% endif %}

{{item}}<br>

{% endfor %}

Expected: https://prnt.sc/s7gxh0

Actual: https://prnt.sc/s7gyj1

Source:

https://forum.treepl.co/t/bug-break-not-working-within-if-statement-in-forloop/963

BACKLOG

Add module ID/alias to the Liquid item object

Extend module item object by adding following properties:

  • Module_ID
  • Module_Alias

BACKLOG

Increase File Manager Upload limit

Set the maximum length of content in a request to be 300MB in the File Manager.

Update the validation message when trying to upload more than 300MB.

BACKLOG

Banner system module release and expiry date

Upgrade module settings for ’Banner’ system module so it will have ’release’ and ’expiry’ date enabled by default.

BACKLOG

Show 404 Page when file is not found

Modify CMS error handler so if URL that leads to a file (.pdf, .doc, etc.) is not found - display 404 System Page.

BACKLOG

Add invoice number column to CRM -> Order list

Add new column on the CRM > Orders page: “Invoice number”

Example: https://prnt.sc/s7h68k

BACKLOG

Download from media type

Add Download button alongside media type fields and in the File Manager:

https://drive.google.com/file/d/1GFcEG2gjC5tNrcM8F_YX3N8EbebbSQXS/view?usp=sharing

BACKLOG

Data Source for system modules extending

Allow to select module for Data Source property from the FULL list of modules (system and custom modules)

Bug

Module archive fix

Fixed ‘module_archive’ component for items that belong to the current month (previously they were skipped).

Bug

Bug from forum - not correct code for Event Group

https://forum.treepl.co/t/possible-bug-in-event-group-component/1205

Toolbox generates incorrect code for event groups. Should be like this:

{% component source: "Event group", layout: "Detail", type: "module" %}

Show more less
New Feature

Authorize.net Payment Gateway

Auhtorize.net payment gateway for ecommerce and payable forms / events / subscriptions.

  • BC Equivalent
  • Ecommerce
New Feature

BONUS: 2FA (two-factor authentication)

The ability to enable 2FA (two-factor authentication) for site admin acccess and Treepl Portal access.
  • Admin Panel
  • General
New Feature

Ecommerce: 3rd Party Shipping Integration

Add 3rd party shipping APIs to eCommerce.

Integrations that partners have "voted" for:

· FedEx
· UPS
· USPS
· Canada Post
· Australia Post
· New Zealand Post

  • Ecommerce
New Feature

PayPal Payment Gateway

Paypal Standard (non seamless) and PayPal PayFlow (seamless) for ecommerce and payable forms / events / subscriptions.
  • BC Equivalent
  • Ecommerce
v 5.4 Release date: 13 Jul, 2020

Full Release Notes

BACKLOG

Payment Flow For Europe:
Two-step card payments

1) Add new setting to the form settings (show only if at least one of the selected payment gateways support Two-step card payments)

  • Payment Flow
    • Instant payment (default)
    • Two-step card payments

2) Payment gateways with Two-step card payments support:

  • Stripe
  • Bambora

3) Current payment flow logic is Instant payment.
Once
Two-step card payments selected and if payment gateway supports Two-step card payments - setup and apply following payment flow logic:

  • documentation (from Stripe)
    -
    https://stripe.com/docs/charges/placing-a-hold
    or
    -
    https://stripe.com/docs/payments/capture-later
  • Once user submitted a payment form - place required funds on hold.
  • Creating order, email notifications etc should be created/sent similar as for Instant payment flow but set cost to pending amount value. Set payment state to pending. Set Order state to pending charge.
  • Add ability on order -> payments to proceed hold payment https://prnt.sc/ruktxm
    • If clicked and payment proceed successfully - set payment state to Success
    • otherwise - set payment state to canceled and Order state to Payment Canceled.
  • If hold is expired (7 days period of hold) - then force change payment state to canceled. Order to Payment Canceled.
  • Add cancel button. Release the hold funds and payment state to canceled. Order state to Payment Canceled.
  • Failed order could be fixed via adding cash payment record or via deferred payment flow.
  • If order consists of downloadable products only - force process Instant payment flow

4) Add Amount captured column on the Order -> Payments table http://prntscr.com/tfci79

BACKLOG

Payment Flow For Europe:

Stripe for EU (SCA via 3D Secure)

1) Implement Strong Customer Authentication (SCA):

(SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments.
It requires customers to use two-factor authentication like 3D Secure to verify their purchase.

2) Add setting to stripe Payment Gateway (Enable 3D Secure)

Enabling this setting will force payment form to trigger Payment Intents flow with support of 3D Secure rather then Charges

3) Create new system page: Checkout payment (/checkout-payment)

4) Payment Intents flow will not ask you for card details on the form but once the form is sent - it should redirect you to Checkout payment system page.

In case you are paying for Event, secure zone subscription or general payment:

  • order should be created after payment is confirmed
  • secure zone subscription should be applied after payment is confirmed
  • event subscription should be added after payment is confirmed

5) If shopping cart total price was changed after user comes to Checkout payment system page - show validation error on submit:

“Price of the shopping cart was changed.
Please go back to the <a href="/shopping_cart">Shopping Cart</a> page, verify the data and re-submit the form.”

BACKLOG

Payment gateways:

Bambora Payment gateway

1) Create support for Bambora Payment gateway.

Use Norway and Switzerland logic version:

https://developer.bambora.com/europe/checkout/getting-started/create-payment

2) Gateway logic should support following flows of capturing price that should be configured via gateway settings (similar as for stripe):

  • Instant payment: charge money right away
  • Two-step card payments: place money on hold allowing to charge manually via order

3) Show error message if domain is not verified (endpoint is not valid error from bambora) on charging:

“The payment can't be processed. This domain is not verified by Bambora. Please contact their support in order to get the domain verified.”

BACKLOG

Custom Reports:

Builder

DESIGN http://prntscr.com/thh497

1) Add page and menu item: ‘Reports’ > ‘Custom Reports’

Provide ability to:

  • Add new report
  • list reports (with pagination 20 per page)
  • Show only reports marked as public or that were created by the current logged in Admin User


2) All functionality with Custom Reports is available starting from Pro plan.

3) Reports Builder:

SETTINGS

Save the report by name and set as public option that allows you to share the report with other admin users. If Make public set to false - you are the only one who will see this report.

TYPE

The type determines what fields should be collected for Fields and Filters steps and what entities should be collected for the final report.

- Contacts (default)

- Contacts and Cases

- Contacts and Orders

- Contacts and Event Bookings

FORM FILTER

Select a form (from all available web forms) to filter only those cases,orders or event bookings that belong to this form.

Show section only if type is one of:

- Contacts and Cases

- Contacts and Orders

- Contacts and Event Bookings

---------

FIELDS

Select Fields to be seen on report as column headers

  • Fields For Cases:
    • Case Id
    • Form name
    • Date Submission
  • Fields For Orders
    • Order Id
    • Form name
    • Date Submission
    • Currency
    • Country
    • Total Cost
    • Amount Paid
    • Pending Collection
    • Shipping Address
    • Shipping City
    • Shipping State
    • Shipping Zip Code
    • Shipping Country
    • Invoice Number
    • Invoice Date
    • Status
  • Fields For Booking Subscriptions
    • Booking Subscription Id
    • Form name
    • Booking Date
    • Allocation
    • Price
    • Event Id
    • Event Name
  • Contact fields
    • Contact
    • First name
    • Last Name
    • E-mail
    • Address
    • City
    • State
    • Zip Code
    • Country
    • Site
    • Phone
    • Status
    • Notes
    • Type
  • Form fields (show only if certain form was included for report)
    • <list of all selected form's custom fields>

---------

FILTERS

  • Field (to filter by)
    • <all fields available from the report type>
  • Condition options (depending on Field value type)
    • Equals
    • NotEqualTo
    • LessThan
    • GreaterThan
    • LessOrEqual
    • GreaterOrEqual
    • Contains
    • DoesNotContain
    • StartsWith
  • Value (depending on Field type)
    • if the field is general string or number type - show text field
    • if it's a dropdown or radiolist - show dropdown

Ability to add additional filtering rules

---------

RESULTS

Generate sortable and paginated results table.

Ability to export to Excel file.

BACKLOG

Custom Reports:

Export

Provide ability to export Custom report to Excel file.

Columns should be the same as the report.

BACKLOG

Import/Export of prices, attributes and inventory

Export format:

Add all system properties of the product after default properties and before custom properties

Product area should be defined as (http://prntscr.com/rhxeho):

  • (1) first line - info of the product and its relations
  • (2) all lines under with the same SKU code before end of file or another SKU code (SKU code should be same and present in all lines of the product data)

Add following fields for specific-serialized relations:

  • Parents [name of the parent module]. eg: `Catalog`
    • Value: [parent item urls separated by `;`].
      eg:
      `/catalog-1/sub-catalog;/catalog-1;/;`
  • Sale Price
    • Value: [country]-[currency]/[sale-price],[quantity for threshold option №1]/[price threshold option №1],[quantity for threshold option №2]/[price threshold option №2];
      eg: AU-AUD/30.00,2/26.00,5/22.00;AU-USD/20.00,10/18.00,100/16.00;

      NOTES:
      If no [currency] specified - use Currency-By-Country-Defaults.json mapper as default currency for country definition
  • Retail Price
    • Value: [country]-[currency]/[sale-price];
      eg:

    AU-AUD/30.00;AU-USD/20.00;

    NOTES:
    If no [currency] specified - use Currency-By-Country-Defaults.json mapper as default currency for country definition

  • Tax Code
    • Value: [country]/[tax_name or "Never"];
      eg:
      AU/Never;US/AZ;

      NOTES:
      If [tax_name] not set to the country or [tax_name] === ”Never”, do not apply tax
  • Grouping Product Codes
    • Value: [product_sku_code][Is_main_product];
      eg:
      sub_prod_1;main_prod*;sub_prod_2;

      NOTES:
      If [Is_main_product] == "*" then this product IS main. Otherwise this product IS NOT main.

      If several products shown to be main - use last one as main and ignore others.
  • Grouping Product Display Name
    • Value: [product_display_name];
      eg:
      Sub product 1;;Sub product 2;

      NOTES:
      Can be empty.
  • Related Products
    • Value: [product_sku_code];
      eg:
      HAYNM5AXVB;sub_prod_1;HMDP9271;
  • Low Stock Notification
    • Value: number
      eg:
      50

      NOTES:
      Greater than or equal to 0
  • Enable Inventory Control
    • Value: (boolean) true or false
      eg:
      Y or TRUE
      N or FALSE or empty
  • Can Pre-Order
    • Value: (boolean) true or false
      eg:
      Y or TRUE
      N or FALSE or empty
  • Hide if Out of Stock
    • Value: (boolean) true or false
      eg:
      Y or TRUE
      N or FALSE or empty
  • Attributes
    (ignore this cell value if product ALREADY EXIST AND has GENERATED VARIATIONS AND "Variations Enabled" cell != FALSE)
    • Value: (complex pattern described below, intended to be on one line)

      [attribute name][is_required]
      |
      [attribute_type]
      |
      [is_inventory_item]
      :
      [option_name]
      |
      [option_image_path]
      |
      [country]-[currency]
      /
      [option_price_1]
      |
      [country]-[currency]
      /
      [option_price_2]
      ,
      [option_name]
      |
      [option_image_path]
      |
      [country]-[currency]
      /
      [option_price_1]
      ,
      [option_name]
      ||
      [country]-[currency]
      /
      [option_price_1]
      ; (repeat)

      NOTES:
      I
      f no [currency] specified - use Currency-By-Country-Defaults.json mapper as default currency for country definition

      [option_name] CAN'T contain following symbols
      - |
      - ,
      - '
      - *

      If [is_required] == * then this product IS required. Otherwise it’s not.

      [attribute_type] is one of the following:
      - 5 or DropDownList
      - 6 or CheckBoxList
      - 7 or RadioList

      [is_inventory_item] - determines if current attribute is inventory attribute, one of:
      - Y or True - (boolean) true
      - N or False - (boolean) false

      [option_image_path] and option prices are not required and can be skipped in format string.

      Example string:
      Test attr checklist*|6|N:option checklist 1|/img.jpg|AU/10|US/5,option checklist 2|/img.jpg|AU/20|US/15,option ck 3|;Test attr Dropdown List*|5|Y:option droplist 1|/img.jpg|AU/10|US/5,option droplist 2|/img.jpg|AU/20|US/15;Test attr radiolist*|7|Y:option radiolist 1|/img.jpg|AU/10|US/5,option radiolist 2|/img.jpg|AU/20|US/15;ddfdsd*|5|Y:aasas||AU/20|US/15,xasas||AU/20|US/15

  • Wholesale Sale Price
    • Value: (pattern described below, intended to be on one line)

      [country]-[currency]
      /
      [sale-price]
      ,
      [quantity for threshold option №1]
      /
      [price threshold option №1]
      ,
      [quantity for threshold option №2]
      /
      [price threshold option №2]
      ; (repeat)

      NOTES:
      If no [currency] specified - use Currency-By-Country-Defaults.json mapper as default currency for country definition

      Example String:
      AU-AUD/30.00,2/26.00,5/22.00;AU-USD/20.00,10/18.00,100/16.00;
  • Recurring Type
    • Value: one of (numeric or string value)
      - 1 or Once
      - 2 or Daily
      - 3 or Weekly
      - 4 or Fortnightly
      - 5 or Monthly
      - 6 or Quarterly
      - 7 or Half Yearly
      - 8 or Yearly
  • Hide if Out of Stock
    • Value: (boolean) true or false
      eg:
      Y or TRUE
      N or FALSE or empty

      NOTES:
      If TRUE and no variations was created earlier - generate all variations and edit them by the values within columns
      Variations Code, Enabled, In Stock, Pre-Order determining variation by attribute options combination in the column Variation Options.
      If FALSE - discard variations.
  • Variation SKU Code
    This column and columns below are assigned both to initial (global) product and to it’s variations.
    - Value for the first row assigned to the global product settings.
    - Values in the row/s below (that relate to initial product) are assigned to each variation row.
    • Value: string (unique SKU code, should be empty for product row but required for variation row)
      If not set - ignore entire variation row data.

      Eg:
      HAYNM5AXVB
  • Enabled
    • Value: (boolean) true or false
      eg:
      Y or TRUE
      N or FALSE or empty
  • Variation Options
    • Value:
      [option_of_attribute_1]
      ;
      [option_of_attribute_2]
      ; etc.

      NOTES:
      Determines what variation should be edited by the fields:
      - Variations Code
      - Enabled
      - In Stock
      - Pre-Order

      If such combination not found in the product - ignore changes in this row for the following columns:
      - Variations Code
      - Enabled
      - In Stock
      - Pre-Order

      eg:
      HAYNM5AXVB;sub_prod_1;HMDP9271;
  • In Stock
    • Value: number (greater than or equal to 0)
  • Pre-Order
    • Value: number (greater than or equal to 0)

BACKLOG

Liquid security issue on form submission

Add algorithm that will protect user-submitted content of liquid and JS injection in all form submissions and when user adds or edits a module item, for all text fields.

  • IF Module -> Settings ->Site User Permissions -> Requires Approval == disabled https://prnt.sc/sq0ga9
    AND
  • IF it contains any of the following substring:
    • {%
    • %}
    • {{
    • }}
    • <script
    • <style
    • </script>
    • </style>
  • do the following:
    • if any liquid symbols was found
      • remove tags from the content
      • wrap all content with value here
    • then replace
      • <script to the <script-is-not-allowed
      • <style to the <style-is-not-allowed
      • </script> to the </script-is-not-allowed>
      • </style> to the </style-is-not-allowed>
    • run current item create/edit logic
  • else
    • run current item create/edit logic
  • If user edits the item and Module -> Settings ->Site User Permissions -> Requires Approval == enabled
    • Disable item after performing the changes

IMPORTANT:

Validate text value length AFTER the wrapping if it has occurred. So if original value fits the single line text field but once wrapped it doesn't - the validation error should be shown.

Example:

<div>

<h1>Some title</h1>

{{this}}

<script>location.href = "https://some-fishing.site"</script>

<style>body{display: none !important;}</style>

</div>

Replace with:


<div>

<h1>Some title</h1>

{{this}}

<script-is-not-allowed>location.href = "https://some-fishing.site";</script-is-not-allowed>

<style-is-not-allowed>body{display: none !important;}</style-is-not-allowed>

</div>

BACKLOG

Datasource Field:

When focus a field - get first 50 datasource items

Improve Datasource Form control:

  • perform search by focusing the field (trigger empty search if keyword is not set or empty)
  • Show 50 items of found results
  • Add search icon that will submit search request by entered keyword
  • Add remove icon that will erase entered keyword and will submit empty search request

BACKLOG

Recaptcha v3 validation JS fix

Fix for general form

Fix for payment form

CMS generated javascript changes to avoid conflicts with payment JS. No Partner/front-end changes required.

BACKLOG

Advanced CRM:

Custom Fields Groups CRUD Page

Add page for Custom CRM groups list (http://prntscr.com/thh86e).

Provide ability to add, edit, delete the Custom CRM group.

Provide ability to use pagination for Custom CRM groups.

Add/Edit form should contain following fields:

  • Form name (string)
  • Apply To (dropdown) - list of entries allowed to applied CRM group to:
  • CRM fields (panel with list of custom fields with ability to create/update/delete field. Similar to form fields builder)
    Allowed field types:
    • DateTime
    • CheckboxList
    • DropdownList
    • DropdownList (multiple)
    • ListboxList
    • RadioList
    • Boolean
    • Multiline
    • String
    • Upload
    • DataSource
    • Number

Design: http://prntscr.com/thh7y7

BACKLOG

Advanced CRM:

Custom CRM Field Groups attaching rules and linkage

There should be 2 types of custom crm groups linkage

Global setting:

  • Determines what groups are marked as Attached to ALL CRM contacts.
  • Represented as list of groups.

Individual Contact record Attachment:

  • Determines group to certain contact linkage. 1 to 1.
  • Represented as list of Groups-to-Contact records.

Saved custom crm group values for the contact should be saved as group-field-contact-value records.

group-field-contact-value records should not be deleted on unassigning Global setting or Certain Contact record Attachment from the crm contact.

Description

  • If custom CRM group is attached to Contacts via global setting then each contact should view that group in the bottom of the contact details page
  • If custom CRM group is attached to the certain Contact record via:
    • form submission
    • adding via button on contact detail view http://prntscr.com/orpcbb
      • Then view that groups in the bottom of the contact details page.

Linkage entities (each should have EDIT entity button and "Add Custom Fields" button https://prnt.sc/orpcbb):

  • Contacts
  • Form Submissions
  • Orders
  • Booking Subscriptions

Group Displaying Rules:

  • Display custom group for the entity IF
    • Current entity type was added in the "Apply to" property of the CRM group settings.
    • OR
    • Custom group was checked in the "Add Custom Fields" setting of the current entity https://prnt.sc/orpcbb
  • "Add Custom Fields" settings https://prnt.sc/orpcbb should be all unchecked by default.
    Admin user is the only one person that could check any of those custom groups.

BACKLOG

Advanced CRM:

Attach Custom field groups to web forms

Provide ability to choose Custom CRM Groups and attach them to the form.

http://prntscr.com/thh94m

Default layout builder should build all fields of each group similar to the form's custom fields.

Name should be:

[[GroupAlias]]_[[FieldAlias]]

Example:
Group alias: AccountInfo
Field alias: Position
Field:
<input type="text" name="AccountInfo_Position">

BACKLOG

Advanced CRM:

Add custom CRM field groups to CRM record

CRM contact detail page should contain new button:

Add Custom Fields

Clicking on that button should show panel that allows to select existing custom CRM forms.
When selecting a form and click save - that custom CRM group should be attached to the Contact (Certain Contact record Attachment).

http://prntscr.com/thhakq

BACKLOG

Advanced CRM:

Liquid component tag for custom CRM fields

Add new component tag component type:"CRMContactCustomGroup":

Pattern:

{% component type:"CRMContactCustomGroup", groupAlias:"[[groupAlias]]", fieldAlias:"[[fieldAlias]]", entityType:"[[entityType]]", entityId:"[[contactId]]", collectionVariable:"", layout:"" %}

  • groupAlias (required) - alias of the custom CRM group.
    • All group fields with their values should be set to the {{this.fields}} array of objects if fieldAlias is not set. Otherwise {{this.fields}} should contain only one element, being the object for the specified field set via fieldAlias.
  • entityType (not required) - determines the CRM entity type to retrieve custom group for. Values can be:
    • form_submission
    • event_booking
    • order
    • contact (default, if no type set for the component)
  • entityId (not required) - determines the CRM entity to retrieve custom group for
    • if entityType is contact
      • If field is empty - try use current logged in CRM contact id. - If no logged in users found return empty context item
      • If CRM contact has isDataUsingAllowed not equal to true than return empty context item
    • else
      • If field is empty - return empty context item
  • fieldAlias (not required) - alias of the CRM group field. Should be used to find a particular group field value for the CRM contact (determined by entityId and the group determined by groupAlias).
  • collectionVariable (not required) - works the same way as other modules.
  • layout (not required) - path to FTP file that will contain layout content for the data.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.

Item context:

{
"Alias": "",
"Fields" :
[
{
"Name" : "",
"Alias": "",
"Value" : ""
},
...
]
}

Default virtual layout:

{{this.fields[0].value}}

BACKLOG

Advanced CRM:

Toolbox - Liquid component tag for custom CRM fields

Add new item to toolbox:

  • CRM
    • CRM Contact Custom Group

BACKLOG

Advanced CRM:

Plan restrictions

All functionality with advanced CRM custom groups should be available starting from Pro plan.

Add to menu:

  • CRM
    • Advanced CRM Groups

BACKLOG

CRM Records as Datasource:

System property for allowing using crm contact records

Add new system property to CRM Contact record:

isDataUsingAllowed (bool)

  • label: Allow listing my contact data in the CMS
  • default value: false
  • can be set to true via edit account form
    (Add this field to the edit account form html that generates by toolbox)
  • can NOT be set to true via admin panel

CRM records that has this checkbox ticked ON will be allowed to:

  • be assigned to module items (should help with the GDPR since this checkbox allows user to disallow using his record just by unchecking the checkbox on the profile page).
  • be used by liquid component for retrieving and listing contacts.

BACKLOG

CRM Records as Datasource:

Module item custom property - CRMRecord

Add new Module item property type:

CRM record

  • property allows to assign any CRM record that has "isDataUsingAllowed=true"
  • holds id of crm contact record (similar to datasource).
  • switching "isDataUsingAllowed" to false should trigger removing that crm record id from all module items that have properties of CRM record type with that saved id.

BACKLOG

CRM Records as Datasource:

Liquid output of CRM records

Add new component tag component type:"CRMContacts":

Pattern:

{% component type:"CRMContacts", filterBy:"", filterValue:"", limit:"", offset:"", sortBy:"", sortOrder:"", collectionVariable:"", layout:"" %}

Component should filter, sort and return list of CRM contacts that has isDataUsingAllowed equal to true ONLY

  • filterBy (not required) - CRM Contact property name to perform filtering by.
  • filterValue (not required) - value to perform filtering by param set in filterBy. Similar to module component filtering.
  • limit (not required) - number of tags to be rendered (Default value is 10)
  • offset (not required) - number of contacts in the result list to skip retrieving start from (Default value is 0)
  • sortBy (not required) - any contact system properties (Default value is FirstName)
  • sortOrder (not required) - ASC or DESC (Default value is ASC)
  • collectionVariable (not required) - works the same way as other modules.
  • layout (not required) - path to FTP file that will contain layout content for the data.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.

Default virtual layout:

<ul>

{% for contact in this.items %}

<li>{{contact.FirstName}} {{contact.LastName}} - {{contact.Email}}</li>

{% endfor %}

</ul>

Item context:

{

"items" :

[

{

"id": 0,

"email": "",

"firstname": "",

"lastname": "",

"address": "",

"city": "",

"state": "",

"zipcode": "",

"country": "",

"site": "",

"phone": "",

"status": "",

"notes": "",

"createddatetime": "",

"updateddatetime": "",

},

...

]

}

BACKLOG

CRM Records as Datasource:

Toolbox - Liquid output of crm records

Add new item to toolbox

  • CRM
    • CRM Contact List

BACKLOG

Ability To Parse JSON With Liquid

1) Add new component tag: component type:"json":

Pattern:

{% component type: "json", source_type:"[[source_type]]", source:"[[source]]", layout:"[[layout]]", collectionVariable:"[[collectionVariable]]" %}

  • source_type (required param):
    • path
    • url
    • string
  • source (required param):
    • path - any path to FTP file that contains JSON as content. Example: '/some/path/filename.json'
    • url - any internal or external URL that returns JSON response. Example: 'https://some.domain/some_api/'
    • string - JSON string. Example: '{"some" : "value"}'
  • collectionVariable (not required) - works the same way as in other components.
  • layout (not required) - path to FTP file that will contain layout content for the data.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.

Default virtual layout:

{{this}}

{{this}} variable contains the parsed json object.

If parse error occurred {{this}} will be NULL

2) Component added to Toolbox (https://prnt.sc/s2pmv2):

  • Liquid Data
    • JSON Data

=================

Public Backlog item:

BACKLOG

Extend URL slug max length

Allow slug max length to be 254 symbols instead of current 200

BACKLOG

Add shipping address to order (system fields)

1) Add shipping address as system fields to the order in the admin

Extend order model by adding shipping address as system fields http://prntscr.com/tet3te

Separate address to the following fields and allow editing via order edit operation:

  • Shipping Address
  • Shipping City
  • Shipping State
  • Shipping ZipCode
  • Shipping country

2) Extend Order liquid object

Extend Order liquid object by adding following fields:

  • shippingAddress
    • addressLine
    • city
    • state
    • zipCode
    • country

So they could be listed like

  • {{this.order.shippingAddress.addressLine}}
  • {{this.order.shippingAddress.zipCode}}
  • etc

BACKLOG

Last sorting state saving for the module list view

Remember the latest sorting field and sorting direction for each module on list view http://prntscr.com/t97vsn

Once admin user comes back to the module items list view in the admin - the sorting should be the exact same as it was saved earlier.

BACKLOG

Re-send Invoice

1) Provide ability to re-send invoice email from the admin dashboard (on edit order page) to:
- Order creator/customer (‘Email Invoice’ button)

- Custom email (‘Send Test Email’ button): once clicked - shows text field to enter email address (pre-filled by current admin email)

BETA

Feature flags updates for v5.4

For Trial Sites:

Flags moved to internal section AND set to enabled:

  • Advanced payment flow
  • Advanced URL manager
  • New liquid engine & nICE 2.0

For Live sites:

Flags move to internal section AND set to enabled:

  • Advanced URL manager

BETA

Make reCaptcha to be required for users not logged in

1) Feature flag: Anti-spam protection

Enables logic restriction that doesn't allow to submit any web form for not logged in users if the form doesn't include reCAPTCHA (v2 or v3)

Apply restriction as part of validation if

  • form has no payment fields (if has - no need for forced reCAPTCHA)
  • user is not logged in (if user is logged in - no need for forced reCAPTCHA)

2) WARNING:

The flag will be force enabled in 5.5 release (but it still could be temporarily disabled for certain sites on demand).

So change your forms accordingly for 5.5 release.

And in 5.6 this logic will be applied permanently.

Bug

Url (and all other system properties) names should be restricted for custom properties of the module

When creating custom properties, for any module, using a name of any system property the property should not be created since such alias in use.

System should say “Property with specified name already exists”

THIS FLOW SHOULD WORK FOR ALL SYSTEM PROPERTIES

Bug

Verified domains to be case insensitive

Validate email domains using case insensitive comparison:

https://prnt.sc/t6vj5q

Bug

{{this}} in Snippet is incorrect

Snippet should contain the same object within this variable that is accessible outside snippet.

1. Create snippet and write {{this}} http://prntscr.com/sos6mn

2. Create a Page and output that snippet http://prntscr.com/sos7qe

3. Create another page and write {{this}}

Expected:

The only difference between those 2 pages should be only in additional “params” property available in snippet this output http://prntscr.com/sos9nf

Actual:

Properties of this object shown incorrectly http://prntscr.com/thgqkk

Bug

Treepl main CSS link position

Fixed to be prepended to the head section instead of append.

https://forum.treepl.co/t/treepl-ecommerce-css-link/1063

Show more less
New Feature

Advanced CRM

Customization of forms, form submissions and contacts by a set of predefined groups of fields.
  • BC Equivalent
  • CRM
New Feature

Assign CRM Records To Module Items As Datasource

1) "isDataUsingAllowed" - system property type checkbox added to CRM record (only crm records that has this checkbox ticked on will be allowed to be assigned to module items (should help with the GDPR since this checkbox allows user to disallow using his record just by uncheckin the checkbox on the profile page).

2) CRM record - type property...
  • CRM
  • Custom Modules
New Feature

Custom Reports

Ability to create custom records based form submissions, booking records, contacts etc.
  • CRM
v 5.3 Release date: 06 May, 2020

Full Release Notes

BACKLOG

Module Duplication

Function restriction upgrade: Allow copying module starting from Pro plan

BACKLOG

`ProductDataJsonHTML` to product detail layout

Exclusively for Product Module:

Automatically add {{this.ProductDataJsonHTML}} to the product detail if there is no manual output inside the layout

BACKLOG

Parent Child module links in module settings

Add ability to switch between parent and child module via links.
Made them in the way that clearly shows what module is parent and what is child.

Useful if you want to go to Blog post settings from blog settings.

Design - https://prnt.sc/skhen8

BACKLOG

Search keywords field

Added search keywords field to import/export

BACKLOG

Downloadable products: System Properties

Add following fields to the system properties for Products module:

  • Enable Shipping

    • (boolean)

    • default `true` (preset `true` to all products that was created before this update)

  • Is Downloadable Product

    • (boolean)

    • default `false`

    • once `true` - show Product File

  • Product File

    • (file)

    • Store file in a folder not accessible via ftp (as a result - not accessible by direct URL)

    • Show new control "Product File" with:

      • download (once clicked – allow user to download the file if an admin)

      • upload (once clicked raise file uploader window)

    • show non-editable file name

    • on upload remove old file, add new file

    • on upload new file show popup: “Are you sure you want to replace already uploaded file?”

    • if `Is Downloadable Product == false`

      • remove access to the file.

      • If `true` restore access

Design https://prnt.sc/skhijv

BACKLOG

Downloadable products: Processing Logic

1) Add api to retrieve downloadable file

  • URL: `/api/get_order_file/[order_line_id]`

  • If order is successfully paid (order pending price == 0) AND product has `Is Downloadable Product == true`

    • Download file

    • else; Show 404 page

2) If product has been deleted - delete file as well.

On delete - show popup:

“You have downloadable file attached to the item and it will be deleted with the item. Are you sure you want to delete this item?”

BACKLOG

Downloadable products: Shipping Options logic upgrade

HIDE shipping options only if ALL products in shopping cart has:

  • `Enable Shipping == false`

Return an undefined `Enable Shipping` value as `true` if:

  • `Is Downloadable Product == true`

OR

  • `Is Gift Voucher == true`

Otherwise it's `false`

BACKLOG

Downloadable products: Downloadable link for the order line liquid scope

Add property `downloadableFileURL` to `order` line liquid object.
Accessible everywhere that `order` liquid object is added to the liquid scope (thankyou page, invoice, workflow, supplier emails, etc).

  • Value is a downloadable link.
  • if product is not downloadable - value is `null`

Modify thank you page and invoice email (default layouts) to show download link if order line is downloadable product

Design https://prnt.sc/skhlt9

BACKLOG

Downloadable products: Count downloads logic

Add `Max Downloads Allowed` system field to product module:

  • type: `int`
  • default: `0`

If value is > 0

  • Allow verified downloading process not more times than `Max Downloads Allowed` for the order line (product['MaxDownloadsAllowed'] * orderlineQuantity)
  • If someone tries download file but gets 404 - DO NOT COUNT it as download attempt
  • Else; If admin downloads the file - allow them to download the file BUT DO NOT COUNT it as download attempt
  • Else; download the file and COUNT it as download attempt for the order line

Else (value is 0 or empty)

  • Allow unlimited file downloading
  • COUNT it as download attempt for the order line

BACKLOG

Downloadable products: Downloadable link in admin

Wrap the product name in `order -> products` tab with a link to downloadable file if it is a downloadable product.

BACKLOG

Stripe customers in advanced payment logic

Modify payment via stripe logic.

  • Add customer based on the `formData.Email` field to stripe if they don't exist.
  • Check if current card's fingerprint (taken from the token) is already added to this stripe's customer
    • If added - use this added card to process payment
    • else; add card source (token) to this customer and process payment

As a result if same customer submits several payments - it will always be as one single record in vendor's stripe account.

And they will have attached list of non-repeated credit cards that is based on tokens provided while payment.

BACKLOG

Attribute and attribute options ordering

Provide ability to change order of the attributes and options for products via drag-and-drop functionality, which applies the ordering to:

  • Admin UI interface
  • liquid object for attributes and options via `{% component type: "item_attributes" %}`
  • object returned for `productDataJSON` property
  • order line attributes object


Hide drag-and-drop functionality on mobile devices.

BACKLOG

Show number of products in all shopping carts

Ecommerce -> Product -> inventory:

Show number of items added to all shopping cart sessions under the label of: `Added to shopping cart`

Add to general product and product with variations screens:

http://prntscr.com/riwxwb

http://prntscr.com/rix0au

BACKLOG

Link to order on gift voucher

Ecommerce -> Gift voucher edit page:

BACKLOG

Add link to order from Case, booking

Add link to order from:

BACKLOG

Daily recurring subscriptions

Add daily recurring subscriptions option to the secure zone.


Modify subscription expiration extending logic:
Add +5 hrs to secure zone expiration date (but not to the payment subscription) in order to avoid temporary loosing of the access while waiting for the IPN notification regarding successful payment

BACKLOG

Order Management Upgrade

Split form submissions and booking subscriptions in orders detail page

BACKLOG

Grouped products form improvement

Remove description field from the grouped product object.

Leave display name only

BACKLOG

Add tax in product order line + extended tags

Details here:
Calculation Spreadsheet

Equivalents:

1) Add following properties to the order line liquid object:

  • taxRate

    • Shows decimal value of the tax rate

  • unitTaxPrice

    • Shows (unitprice*taxRate) numeric value

  • unitTaxPriceHtml

    • Shows (unitprice*taxRate) numeric value wrapped with holder compatible with ecomerce.js

    • Add js calculation for this property

  • totalPriceExcludingTax

    • Shows (unitprice*quantity) numeric value

  • totalPriceExcludingTaxHtml

    • Shows (unitprice*quantity) numeric value wrapped with holder compatible with ecommerce.js

    • Add js calculation for this property

  • taxPercentHtml

    • Shows percent value of the order line tax with % sign wrapped with holder compatible with ecommerce.js

    • Add js calculation for this property once tax for order line is changed

  • totalHtmlPrice rename property to totalPriceHtml

    • On appstart - edit shopping cart, invoice, checkout thankyou pages fixing old property usage to the new one

  • totalHtmlPriceExcludingTax rename property to totalPriceExcludingTaxHtml

Example of missing properties and its values: https://prnt.sc/rwvj2f


These properties should be accessible wherever order line object occurs in liquid; ie: on orders and shopping cart, in invoice, workflow, supplier emails and on checkout thank you page.


2) Add following properties to order (see above Example Spreadsheet for calculation definition)

  • shippingPrice

  • shippingPriceHtml

    • price of shipping option without tax

    • Add js calculation for ...Html property

  • shippingTaxRate

    • tax rate applied to the shipping option

    • Add js calculation for ...Html property

  • shippingTaxPercentHtml

    • tax percent applied to the shipping option

    • Add js calculation for ...Html property

  • shippingTaxPrice

  • shippingTaxPriceHtml

    • tax price applied to the shipping option

    • Add js calculation for ...Html property

  • shippingTotalPrice

    • shipping price with tax

  • subTotalPrice

  • subTotalPriceHtml

    • fix property calculation - should be

      • sum of item.totalPriceExcludingTax

      • instead of current

      • sum of item.totalPrice

  • subTotalTaxPrice

  • subTotalTaxPriceHtml

    • sum of item.taxPrice

    • Add js calculation for ...Html property

  • discountedSubTotalTaxPrice

  • discountedSubTotalTaxPriceHtml

    • subTotalTaxPrice - productTaxDiscount

    • Add js calculation for ...Html property

  • taxPrice

  • taxPriceHtml

    • fix property calculation - should be

      • discountedSubTotalTaxPrice + shippingTaxPrice

      • instead of current

      • sum of item.taxPrice

    • Add js calculation for ...Html property

  • grandTotalPrice

  • grandTotalPriceHtml

    • subTotalPrice + subTotalTaxPrice

    • Add js calculation for ...Html property

  • totalPriceExcludingTaxAndGiftVoucherAmount

  • totalPriceExcludingTaxAndGiftVoucherAmountHtml

    • subTotalPrice + shippingPrice - discountPriceExcludingTax

      • discountPriceExcludingTax is (based on discount type)

        • subTotalPrice*discountRate

        • or

        • discountAmount

    • Add js calculation for ...Html property

  • totalPriceExcludingTax

  • totalPriceExcludingTaxHtml

    • subTotalPrice + shippingPrice - discountPriceExcludingTax - giftVoucherPrice

    • Add js calculation for ...Html property

BACKLOG

Out of stock - hide product

If product in inventory tab has Out of stock property value equals to `hide product` (https://prnt.sc/rseiyi)

Add rule to remove such items from filtering and searching logic of the site.

When accessing by direct link - show 404

BACKLOG

Instock logic review

Change the logic to NOT storing reserved for shopping cart items in In Stock property:

  • In Stock

    • Always positive value or 0

  • Pre-order

    • Always positive or 0

    • shows number of items that was bought after in stock value becomes 0

  • Added to shopping cart

    • add this property as display field to the inventory tab (https://prnt.sc/rq90pu) for both global inventory settings and each variation line and the total below.

    • Always positive or 0

    • shows number of items stored in all existed shopping cart sessions

    • Return quantity when canceling order or destroying shopping cart:

      • if pre-order > 0

        • if return quantity > pre-order

          • instock = instock + (return quantity - pre-order)

          • pre-order = 0

        • else

          • pre-order = (pre-order - return quantity)

      • else

        • instock = instock + return quantity

BACKLOG

Orders submission flow rework

Save form submission data to stripe metadata when performing a payment.

Once stripe sends success callback - create form submission record based on data in metadata field

BACKLOG

Add Shop settings page and Format settings update

1) Create groups on the `Settings -> Misc` page

Admin Panel Settings

  • Enable text wrapping on a new line in the ace editor.
  • Enable 24 Hours Format in the Date Picker

Recaptcha settings

  • Recaptcha V3 Score

Shop settings

  • Shopping Cart Life Time (Default 24 hrs)
    Use this value to determine how long shopping cart could exist (use shoppingCart['lastUpdateDate'] property).
    Once time is exceeded - delete shopping cart.

2) Extend `Currency and Format` settings panel (Settings > Domains > Currency and Formatting)

Add `Use Custom Number/Currency Format` checkbox (https://prnt.sc/rrnzsp)

  • If enabled - show customization layout with examples similar to this one (https://prnt.sc/re4w3m)

    Apply using these settings in all places where format settings are used in the system (ie: All ...Html properties of the product, orderline, order, etc. and liquid filters that are relying on format settings

Params to be listed in user friendly way:

  • CurrencyGroupSeparator (string) = ","
  • CurrencyGroupSizes (string) = new[] {2, 1, 2}
    CSV string of numbers. Determines pattern for Group sizes (from right to left. Last digit would be repeated)

    Moreinfo: patterns

    Examples:
    • 0 or empty (eg: 123456789)
    • 3 (eg: 123,456,789)
    • 3,0 (eg: 123456,789)
    • 3,2 (eg: 12,34,56,789)
  • CurrencyDecimalSeparator (string) = "."
  • CurrencySymbol (string) = $"GRN"
    (Preset with the symbol of the selected currency)
  • CurrencyNegativePattern = 8
    dropdown with UI friendly labels.
    As per these patterns: patterns
  • CurrencyPositivePattern = 2
    dropdown with UI friendly labels.
    As per these patterns: patterns

BACKLOG

Country list management for shopping cart

1) Add ability to choose what countries to show on the shopping cart.

Add `allowedCountries` option to the {% component type:"countries" %}

Value:

  • Comma separated list of country codes (eg: US,AU)
  • default value is empty string
  • if empty - show ALL countries
  • else; show only those countries that determined in the comma separated list

Example:

{% component type:"countries", collectionVariable:"", allowedCountries:"US,AU" %}

2) Add ability to select countries via multiselect dropdown in the component toolbox

BACKLOG

nICE color picker z index issue

Would it be possible for the algorithm to have a minimum z index of at least 100.

It seems like it's calculating it at 5 on any complex website, there are going to be items that are over that z-index.

BACKLOG

Offline Credit Card Payment System page

NOTE: To be renamed “Deferred Order Payment”

Create new system page

  • Offline Credit Card Payment

Liquid scope of the page should include the `order` object (same as is accessible on checkout thank you page)

Page should contain a new system form with:

  • payment fields for the current domains' payment gateway
  • hidden input for order id with preset orderId value via {{this.order.id}}

Add to component toolbox ability to retrieve offline payment HTML form code

  • Ecommerce > Offline Payment Form

BACKLOG

Offline Credit Card Payment Email

NOTE: To be renamed “Deferred Order Payment”


Add new System email

  • Offline Credit Card Payment

  • Subject: Pay an Order #{{this.order.id}}

Liquid scope

  • siteURL

  • order

  • customer

    • The CRM record that is attached to the order. Same as added in {{request.member}}

  • offlinePaymentPageURL

    • Required to be in the email content. Should contain domain that was saved within the order.
      Provide validation and do not allow to save content if email content does not contain {{this.offlinePaymentPageURL}} string

BACKLOG

Offline Payments flow

NOTE: To be renamed “Deferred Order Payment”

Provide ability to send Offline Credit Card Payment Email from the `Order -> Payments` tab (https://prnt.sc/rvjj8g)

  • Send Offline Credit Card Payment button

  • Email should be triggered for the domain that is attached to the current order

Alternatively, provide ability to go directly to `Offline Credit Card Payment` system page URL (front-end) from this tab

  • Pay By Credit Card button

  • link to system page should contain orderId

When submitting a form from the Offline Credit Card Payment system page

  • Validate payment data

  • if error - show same error message as for the web forms

  • else - proceed payment and

    • if success attach it to the order that is referenced via hidden input

      • Set order status to success

      • add success payment line to `Order -> Payment` tab

    • else - show error payment message.

Provide ability to set `redirectURL` param. Same as for general forms (form input field)

Provide ability to use `jsonResponse=1` param. Same as for general forms

BACKLOG

Password change in CRM

1) Add ability to change password for the CRM contact record.

When admin changing password - send `Password Changed` system email


2) Add new system email `Password Changed`

  • When saving email perform validation

    • {{this.adminEmail}} liquid output is required

  • Liquid scope of this:

    • siteUrl

    • adminEmail

    • newPassword

    • member (object - all data of crm contact like it outputs in {{request.currentmember}})

  • Subject

    • “Your password has been changed on {{this.siteUrl}} by the admin”

  • Content

    • “Hello {{this.member.firstname}},

      Your password on ({{this.siteUrl}}) website has been changed to <strong>{{this.newPassword}}</strong> by the admin ({{this.adminEmail}}).

      If you did not request this change, please contact your website administrator.”

BACKLOG

Bulk delete booking subscriptions

On `Event -> subscription` tab (https://prnt.sc/rq7cff) provide ability to

  • delete all button
  • select several items and click delete selected items

BACKLOG

"Today" Button For Release/Expiry Date Functionality

Add a "Today" button on Release/Expiry Date fields for making inputting date easier, as in BC.

https://prnt.sc/rvix5f

BACKLOG

Payment Fields Appearance Management

1) Add ability to manage layout that is generated by payment systems (https://prnt.sc/rsfhq7):

Added two tabs:

  • Settings (Current content)
  • Appearance (List of setting for the current payment gateway)

Create list of fields based on the documentation below:

2) Apply chosen appearance settings to the payment fields within all payment forms' layouts

Modify {% component type:"payment_form_fields", formAlias:"{{this.alias}}" %} layout or payment script JS GET params for this task.

BACKLOG

Case Insensitive URL redirect param

1) Add additional checkbox field to specify if url redirect is case sensitive or not.

  • Is Case Insensitive

    • default value is true

    • by default set once on app-start values of existed redirects to true


logic:

  • If value is true

    • compare requested URL with saved redirect URL and ignore the letters case

      • Request URL /content will trigger URL redirect /Content => /new-content

      • Request URL /Content will trigger URL redirect /Content => /new-content

      • Request URL /Content will trigger URL redirect /content => /new-content

  • else

    • compare requested URL with saved redirect URL including comparing the letters case

      • Request URL /content will NOT trigger URL redirect /Content => /new-content

      • Request URL /Content will trigger URL redirect /Content => /new-content

      • Request URL /Content will NOT trigger URL redirect /content => /new-content

2) Add column to list layout for Is Case Insensitive property


3) Add column to import/export URL redirects flow.

BACKLOG

Control default styles and scripts

Provide ability to disable auto-added default CMS assets to the head section of pages. Under `Settings -> Misc => CMS Assets Management`

1) Global Settings

Fields (and show which resources not to add to the head):

  • Main CSS
  • Ecommerce JS
  • Recaptcha JS
  • Payment JS

2) For the Content Template

Provide same list of fields on the `Content Template` add/edit layout to override global defaults (ie: use global setting by default)

3) Implement logic to check CMS Assets Management settings in the Content Template (or in the Global Settings if Use global setting option is selected for the template).
Based on the retrieved value either append appropriate styles and scripts html tags to the head or not.

BACKLOG

Re-apply folder detail instead of page detail layout for folders

Check if there are Page Folder items that have applied detail layout with ID 1525 (Page Detail)

If found - attach to them Folder Detail layout (ID 1519 ) and save item.

BACKLOG

| set_money_format And | set_number_format upgrade

Modify liquid filters

  • set_money_format

  • set_number_format

Parse argument the following way

  • If can be converted to long int

    • determine argument as ID

    • find format setting by ID

  • Else

    • determine argument as Name

    • find format setting by Name

BACKLOG

Add URL to order line

Add URL to order line liquid object.

Redo `shopping cart` system page and `invoice` layouts to wrap product name with the link to the product.

BACKLOG

Add .dwg format to the staticContent section

Add “.dwg” extension to the list of allowed to be accessed via URL (Static content list)

Misc

Order migration (old data to new)

Migrate order that was created not by Advanced Payment Flow to the latest version of the orders logic.

Apply main order param for the orders that was created for recurring payments (secure zone subscriptions) according to the latest version of the orders logic .

BACKLOG

this.order in workflow emails scope

Add this.order object (same as added in invoice email) to the workflow email liquid context if form has "Accept Payment" option enabled.

If no order was created during form submission - set this.order to null

BACKLOG

Add to cart - param for button text

Add buttonName param to:

{% component type: "ecommerce_add_to_cart" %}

{% component type: "ecommerce_buy_now" %}

Example:

{% component type: "ecommerce_add_to_cart", buttonName: "Add Me!!!" %}

Default value is empty

Replace in default layout:

`Add to cart` text to `{{this.buttonName | default:"Add to cart"}}`

Replace in default layout:

`Buy now` text to `{{this.buttonName | default:"Buy now "}}`

BACKLOG

Type Media module item property UX upgrade

Change the algorithm of opening file manager when clicking icon for Type Media module item property https://prnt.sc/sjsoxe:

  • if the property contains any file path - try to open file manager to that folder location
  • otherwise open root folder as it worked currently

BACKLOG

Modify shopping cart object

https://prnt.sc/sapq1j

1) Add `eCommerceItemId` to the shopping_cart order-line object

2) Add attribute images to the order `options` object

SOURCE:

Use-case for having access to this data:

I had the requirement to display the chosen attribute option image in the cart, but had to do several more look ups and collection loops to retrieve it.

Not directly having the product ID meant I had to look up the product via SKUCode instead which isn't as stable.
But the item ID should always be available IMO.

BACKLOG

Remove Product from cart data attribute selector instead of <tr> (ecommerce.js)

Modify the functionality, when removing product from cart, so it will try to find parent HTML element by data attribute `data-cms_cart_order_line_holder`.

Add autoFix of the shopping cart layout on our template and sites created based on ecommerce template (for the backward compatibility.)

BACKLOG

Rebuild module after import module items

Set to queue entire module rebuild when import module items process is finished

BACKLOG

Priced ...HTML properties decimals after dot fix

PriceHTML and other ...HTML properties render to 4 decimals.

Should render such number of decimals as configured in Format Settings attached to the current domain

BACKLOG

Add Paginate items parameter for component type module, module_of_member

Add new parameter to the {% component type:"module" %} and {% component type:"module_of_member" %}

  • Parameter name

    • enablePagination

  • Default value

    • true

  • Not required (not show this param in toolbox if param is checked)

  • Logic

    • if false - do not apply pagination logic via get params. Return same items as it shown when no pagination params occured in URL

BACKLOG

Order -> Payment tab UX improvement

View Total cost and pending cost on the page.

When click pay by cash - automatically preset amount equal to pending cost

Design: https://prnt.sc/skioca

BACKLOG

12-24 hrs format switcher for admin datepickers

Add switcher between 12 and 24 hrs formats on datepickers on `Settings -> Misc` page.

Datepickers hrs time format (select) (options):

- 12

- 24

Applied to datepickers throughout admin.

Bug

Duplicating Event

When duplicating an event item

Expected:
It should not contain any subscriber.
All already duplicated items' counters should be fixed on app start

Actual:

Duplicated item has same subscribers counter as original item has https://prnt.sc/rv91k4.

SOURCE https://forum.treepl.co/t/duplicating-event-bug/1026

Bug

Parent Child module links in module settings - disappear icon "Folder"

Go to Settings Blog and select Items List View http://prntscr.com/sbq62x

After saving Folders icons are disappear as well as path to Blog Post settings http://prntscr.com/sbq6ms

When showing settings tab CMS should return system modules parent-child linkage in order to not override it when saving other settings of the blog http://prntscr.com/sbqbz1

Bug

Bug from forum - not correct import URLs

https://forum.treepl.co/t/url-slug-changes-not-updated-on-item-import-bug/1002

Bug

Tax deleting error

When deleting a tax sometimes we get Internal error:

The primary key value cannot be deleted because references to this key still exist. [ Foreign key constraint name = ForeignKey.ShippingOptionBase.TaxCode ]

Bug

Inventory - When Out of Stock hide button

  • Setup inventory
  • Select “Show product but don't accept orders “ in “When Out of Stock”
  • This two buttons should be disabled http://prntscr.com/rh8o7n

Bug

Bugs from forum - Secure Zone Question

  • Create custom module with the properties Multiple and String
  • Create 2 items and fill those fields with any text
  • Get export of those items
  • Change text in the cells to any numbers
  • Make import of the result file - error https://prnt.sc/ra8k6j

Bug

Bugs from slack - disappear product on Thank you page

Products on the Thank you page are disappeared http://prntscr.com/r7ukr9

Bug

Bugs from slack - error when related item disable

Bug

Bugs from slack - import/export

A product export file re-imported presents ‘Internal Error’.

Bug

Bugs from slack - error when apply discount with currency DKK

Bug

Choose different shipping info

  • Create shipping option
  • Go to product and add it to cart
  • Go to the shopping cart and select United State and the sipping option
  • Go to checkout
  • In another window open shopping cart and change country
  • Go to checkout – price should be recalculated

Bug

Bug from forum - Liquid code to list files from a particular directory

https://forum.treepl.co/t/liquid-code-to-list-files-from-a-particular-directory/928/2

Bug

Products - add check on Minimum Units and Maximum

Add validation of these fields: Minimum Units and Maximum Units https://prnt.sc/riulyw when adding products to cart

Bug

Bug from client - import/export CRM

Add ability to edit Type

SOURCE:

I am seeing an "Excel row number: 2. Detail: Invalid member type." on all 20 lines I try to import to the CRM, but there is no "type" in the file? The only row that works is the first and they all look similar?

I guess it is something REALLY simple, but not sure? Normally I don't have any problems importing.

The first line is exported from the CRM to have something to work from.

https://prnt.sc/skj0vv

Bug

[UI] Unruly link manager in WYSIWYG editor

https://forum.treepl.co/t/unruly-link-manager-in-wysiwyg-editor/1003

Bug

Bugs from slack - payment unsuccessful

Fix the workflow sending when eWAY payment is unsuccessful http://prntscr.com/rre3lp

Bug

Bug from client - change logic Exclude from Catalogs

  • Go to Shipping Option
  • Create new shipping option and set Exclude from Catalogs
  • Exclude from Catalogs should exclude this shipping option if shopping cart has at least one product that attached to any of the selected catalogs within this field http://prntscr.com/rwk7el

Bug

Bug from forum - Mandatory Custom Module Fields Reflect in User form

https://forum.treepl.co/t/mandatory-custom-module-fields-reflect-in-user-form/1054

Bug

Bug from client - not correct time in invoice

Bug

Portal Bug from slack - doesn't duplicate Feature flag

Bug

Popup with shopping cart - doesn't display total price

Bug

Workflow - doesn't changes name of workflow

Bug

Search forms - doesn't display SKU Code, Seo title and Meta description

Bug

Bug from Adam - not correct show price when set up 2 prices

Bug

URL output {{request.request_url.href}} is fixed (was broken and accessible via incorrect alias: {{request.request_url.ref}})

“href” param is broken and outputs via “ref” instead.
Output on the page {{request.request_url}} and here should be “href” http://prntscr.com/sgmgsj

Bug

Bug from Peter - edit name Catalogs

Change catalog name and click save

Go to the list of the catalogs

Catalog name is not changed http://prntscr.com/sh8xf5

Show more less
Improvement

Misc Improvements (5.3)

This list of improvements is gathered from Treepl users' feedback from forum and support:
  • Ability to copy existing custom module "Pro" plan
  • Parent child module links in module settings
  • search keywords field to import/export
  • nICE color picker z index issue
  • Case Insensitive URL redirect param
  • Add option to disable default styles and scripts in Misc settings
  • Re-apply folder detail...
  • Ecommerce
Improvement

Ecommerce Improvements (5.3)

This list of improvements is gathered from Treepl users' feedback:
  • Auto add this.ProductDataJsonHTML to product detail layout
  • Stripe customers in advanced payment logic
  • Attribute and attribute options ordering
  • Show number of products in shopping cart in the product
  • Link to order on gift voucher
  • Add link to order from Case, booking
  • Daily recurring subscriptions
  • Order Management Upgrade - final...
  • Ecommerce
New Feature

Deferred Order Payment

Ability to manually pay for order through a dedicated system page (link is available through admin).

  • Ecommerce
New Feature

Downloadable Products

Ability to create downloadable products (files).
It will operate similar way it did in BC.
  • Ecommerce
Improvement

Manually Add Password To A CRM Record

The ability to add a password manually in the CRM.

  • CRM
Improvement

"Today" Button For Release/Expiry Date Functionality

Add a "Today" button on Release/Expiry Date fields for making inputting date easier, as in BC.
today-button.png
  • Custom Modules
  • UI/UX
v 5.2 Release date: 15 Apr, 2020

Full Release Notes

Version 5.2 is being deployed to trial sites in a period between April 20 and 24.
Live sites will get this update starting April 27th.
Follow our System Status page for announcements.
Show more less
Improvement

Performance Update and General Overhaul

Liquid 2.0 + nICE 2.0 polishing and finalization
Overall system performance upgrade (up to 80% on pages with multitude of module items and components)
  • General
Improvement

Treepl Portal: Upgrade Website

Ability to upgrade a paid website, with difference in cost applied billed through PayPal or Stripe
  • Treepl Portal
v 5.1 Release date: 18 Mar, 2020

Full Release Notes

Beta

Email Domain Verification

Email Domain Verification released from beta flag into production

Backlog

eWay Payment Gateway:
Update Payment Gateway Settings Page in the admin

1) Add ability to select eWAY as a payment gateway in Settings > Payment > Gateway tab.

If eWAY selected - show fields that are required for eWAY. If stripe selected - show stripe fields. http://prntscr.com/r5p0os 

2) REMOVE IMAGE FIELD FROM THE STRIPE FIELDS
3) Required fields
- Key
- Secret
- Password
- Endpoint: Production, Sandbox

eWay API key reference: http://prntscr.com/rcm99b

Backlog

eWay Payment Gateway:
Integrate eWay API to Payment Flows

Add eWAY payment API library to the system.

Implement following payment flows:

- single item payment (for "Advanced Payment" flag on and off)
- item/event payment (for "Advanced Payment" flag on and off)
- checkout payment

For secure zone recurring subscriptions and eWAY payment gateway enabled for the country/currency:

- Show validation message and stop processing form submit immediately:
"Recurring payments are not allowed for eWAY payment Gateway yet."

Backlog

eWay Payment Gateway:
Integrate eWAY API for payment forms frontend JS

Apply eWAY apis to provide credit card fields via JS for payable forms in order to tokenize the card and pass token to the backend for charging process.

Apply backend auto-add js file script tag to the page similar to the stripe js (provide all required payment settings via get params to eway.js file)

Backlog

eWay Payment Gateway:
New component for payment fields

Add new component tag of type "payment_form_fields":
{% component type:"payment_form_fields", formAlias:"[[formAlias]]" %}

- formAlias (required) - alias of the form

Single tag item context is described below:

{
    "formAlias": 0,    
}

Default virtual layout:

<div id="paymentFields_{{this.formAlias}}"></div>
<input type="hidden" name="Payment_Data"/>
<div id="paymentErrors_{{this.formAlias}}" role="alert"></div>

Add this component to the default form layout that system generates for forms with payments instead of static html.

Backlog

Ecommerce Improvements:
Product Detail layout improvement

1) Tax price on product detail (+ in product attributes)

Add additional properties to products object

- taxRate
- priceWithTax
- priceWithTaxHtml

Upgrade ’item_attributes’ liquid component with ‘includeTax’ parameter:
{% component source: "Products", itemId: "5651", type: "item_attributes", includeTax: true %}

- includeTax (not required). By default use false.
- if true:
attrOption.formattedPrice - set price with tax

2) Ability to see stock quantity for product variations + disabling variation

Add this.productDataJSON property. Value is an object. Example:

{
    "itemId": 5651,
    "attributes": {
      "12462596046050033665": {
        "id": "12462596046050033665",
        "isInventory": true,
        "name": "sdvsd",
        "type": 2,
        "required": true,
        "optionIds": [
          "16234894512508370945",
          "16234894512508370946"
        ]
      }
    },
    "variations": {
      "8200195854968029199": {
        "id": "8200195854968029199",
        "enabled": true,
        "inStock": 3,
        "optionIds": [
          "16234894512508370945"
        ]
      },
      "8200195854968029200": {
        "id": "8200195854968029200",
        "enabled": true,
        "inStock": 0,
        "optionIds": [
          "16234894512508370946"
        ]
      }
    },
    "options": {
      "16234894512508370945": {
        "id": "16234894512508370945",
        "attributeId": "12462596046050033665",
        "name": "sdvsdvfgbfg",
        "image": null,
        "price": 0.0000
      },
      "16234894512508370946": {
        "id": "16234894512508370946",
        "attributeId": "12462596046050033665",
        "name": "sdvsdv",
        "image": null,
        "price": 0.0000
      }
    },
    "inStockTotal": 3,
    "recommendedPrice": 0.0000,
    "prices": {
      "0": 33.7700
    },
    "taxInPercent": 0.0,
    "taxRate": 0.0,
    "enablePreOrder": true,
    "QuantityThreshold": [
      {
        "Quantity": 0,
        "Price": 33.7700
      }
    ]
  }

Add this.productDataJsonHTML property.

ATTENTION: this property required to be rendered on Detail or list layout, because treepl cms ecommerce js works based on it’s data.
Otherwise add to cart, buy now buttons and in-stock calculations wouldn’t work.

Value is:
<script>             
initEcommerceProductPriceVariations({{this.Id}}, {{this.ProductDataJson}});
</script>

Modify JS to:

- calculate inStockHtml value based on selected attribute options and this.productDataJsonHTML Data (inventoryVariations)

- disable attribute options according to disabled variations in inventory  and this.productDataJsonHTML Data (inventoryVariations)

- calculate priceHTML and priceWithTaxHtml based on this.productDataJsonHTML Data (quantityThreshold)

Backlog

Ecommerce Improvements:
Admin panel speed improvement

Unite custom menu API and default menu API in to the one API request

Add properties to each menu item object:
- type

- id of the item

- default view (for module)

Remove UI bug when items list requested several times in a row if fast clicking between different module list pages

Desired result is speed improvement in the admin when:
- initial admin panel load

- module item list/tree view load

Backlog

Ecommerce Improvements:
Volume discount info to liquid

Add volume discount collection to this object of a module item that "is product" ONLY (module setting EnablePricing == true).


Property:

- volumeDiscount

Collection structure:

[
    {
        "quantity" : 10.
        "price"      : 200
    },
    ...
]

Backlog

Ecommerce Improvements:
Hide ecommerce items on lower site plans

1) If site plan is lower than ecommerce hide following items:

  • workflows:
    • Low stock notification Workflow
  • system pages:
    • checkout
    • order-receipt
    • shopping_cart
  • system emails:
    • Low Stock Notification
    • Supplier Notification
    • GiftVoucher
  • Setup logic on form submit if form.type == checkout
    • Show validation message and stop processing form submit immediately:
      "Checkout forms can not be processed on the current site plan."


2) If site plan is lower than pro hide following items:

  • system emails:
    • Invoice
  • File Manager:
    • ability to secure folders
  • Settings -> Payment:
    • menu item and pages
  • Settings -> Domains:
    • CURRENCY AND FORMAT tab
  • Events:
    • pricing tab
  • FORM builder:
    • Hide ability to change form types (for new select generic, For existed non generic - not change) http://prntscr.com/rh6dxz 

Backlog

Ecommerce Improvements:
Restore system pages and system email to default button

Add ”Restore to default” buttons to:
- system pages 

- system emails

Backlog

Ecommerce Improvements:
Move Currency and Format tab to Domain settings

Move Currency and Format tab from 

Settings->Payment

to

Settings->Domains

Backlog

Ecommerce Improvements:
Disable Secure form submission folder feature

Disable Secure form submission folder feature.
In one of the upcoming releases it will returned back with ability to configure what form should secure uploads and what should not.

Backlog

Ecommerce Improvements:
New component added for Cases

Add new component tag of type:"cases":

{% component type:"cases", viewType:"[[viewType]]", object:"[[object]]", currentMemberOnly: [[currentMemberOnly]], filterBy:"[[filterBy]]", filterValue:"[[filterValue]]", filterCondition:"[[filterCondition]]",  collectionVariable:"", layout:"", sortBy:"", sortOrder:"", limit:"[[limit]]", offset:"[[offset]]" %}

  • viewType
    • list (default)
    • detail
  • currentMemberOnly (not required)
    • if false get all cases of all users
    • otherwise get cases of current logged in crm member only (default true)
  • object (not required)
    • item
    • collection (default)
  • collectionVariable (not required) - works the same way as other modules.
  • layout (not required) - path to FTP file that will contain layout content to be parsed.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.
  • sortBy (not required)
    • Id (default)
    • FormId
    • MemberId
    • FormName
    • CreatedDateTime
  • sortOrder (not required)
    • ASC
    • DESC (default).
  • filterBy (not required) - default value is empty
    • Id
    • FormId
    • MemberId
    • FormName
    • CreatedDateTime
  • filterValue (not required)
    • value to use in filtering condition
  • filterCondition (not required)
    • equally (default)
    • less
    • more
    • lessEqually
    • moreEqualy
    • contains
  • limit  (not required) - number of items to get (default value is 10)
  • offset (not required) - number of items to skip before get (default value is 0)

Single tag item context is described below. If object = collection than this contains attributes property that holds the list of attributes ({{this.items}}) :


List View:

{
    "formId": 0,
    "memberId": 0,
    "id": 0,
    "formName": "",
    "dateSubmission": ""
}

Detail View:

{
    "formId": 0,
    "memberId": 0,
    "fields":
    [
        {
            "name": "",
            "alias": "",
            "value": "",
            "type": ""
        }
    ],
    "id": 0,
    "formName": "",
    "dateSubmission": ""
}

Default virtual layout:

<ul>
    {% for item in this.items %}
        <li> 
            <strong>{{item.formName}}</strong>        
            <span>Date Submission: {{item.dateSubmission | format_date: "dddd, MMMM dd, yyyy"}}</span>
        </li>
    {% endfor %}
</ul>

Toolbox:
CRM > Cases

Backlog

Ecommerce Improvements:
New component added for Orders

Add new component tag of type:"orders":

{% component type:"orders", viewType:"[[viewType]]", object:"[[object]]", currentMemberOnly: [[currentMemberOnly]], filterBy:"[[filterBy]]", filterValue:"[[filterValue]]", filterCondition:"[[filterCondition]]",  collectionVariable:"", layout:"", sortBy:"", sortOrder:"", limit:"[[limit]]" %}

  • viewType
    • list (default)
    • detail
  • currentMemberOnly (not required) - default true
    • if false get all orders of all users
    • otherwise get orders of current logged in crm member only (default is true)
  • object (not required)
    • item
    • collection (default)
  • collectionVariable (not required) - works the same way as in type: module.
  • layout (not required) - path to FTP file that will contain layout content that need to be parsed.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.
  • sortBy (not required)
    • id (default)
    • formId
    • memberId
    • caseId
    • name 
    • invoiceNumber
    • invoiceDate
    • paymentType
    • AmountPending
    • AmountPaid
    • subTotalPrice
    • taxPercent
    • taxPrice
    • totalPrice
  • sortOrder (not required)
    • ASC
    • DESC (default)
  • filterBy (not required) - Default value is empty
    • id
    • formId
    • memberId
    • caseId
    • name   
    • invoiceNumber
    • invoiceDate
    • paymentType
    • AmountPending
    • AmountPaid
    • subTotalPrice
    • taxPercent
    • taxPrice
    • totalPrice
  • filterValue (not required)
    • value to use in filtering condition
  • filterCondition (not required)
    • equally (default)
    • less
    • more
    • lessEqually
    • moreEqualy
    • contains
  • limit  (not required) - number of items to get (default value is 10)
  • offset (not required) - number of items to skip before get (default value is 0)

Single tag item context is described below. If object = collection than this contains attributes property that holds the list of attributes ({{this.items}}) :

List View:

{
    "id": 0,
    "formId": 0,
    "memberId": 0,
    "caseId": 0,
    "name": "",    
    "invoiceNumber": "",
    "invoiceDate": "",  
    "domainCountryCode,
    "formatSettingId,
    "paymentType" : "",
    "AmountPending" : 0,
    "AmountPaid" : 0,
    "subTotalPrice" : 0,
    "taxPercent" : 0,
    "taxPrice" : 0,
    "totalPrice" : 0
}

Detail View:

{
    "id": 0,
    "formId": 0,
    "memberId": 0,
    "caseId": 0,
    "name": "",    
    "invoiceNumber": "",
    "invoiceDate": "",
    "items" : [see Data Structure for this component (see v5.0 release notes)],
    "formatSetting" : [see Data Structure for this component (see v5.0 release notes)],
    "domainCountry" : [see Data Structure for this component (see v5.0 release notes)],
    "destinationCountry" : [see Data Structure for this component (see v5.0 release notes)],
    "shippingOption" : [see Data Structure for this component (see v5.0 release notes)],
    "discount" : [see Data Structure for this component (see v5.0 release notes)],
    "giftVoucher" : [see Data Structure for this component (see v5.0 release notes)],
    "paymentType" : "",
   "AmountPending" : 0
    "AmountPaid" : 0 
    "subTotalPrice" : 0
    "taxPercent" : 0,
    "taxPrice" : 0,
    "totalPrice" : 0
}

Default virtual layout:

<ul>
    {% for order in this.items %}
        <li> 
            <strong>{{order .name}}</strong>    
            <span>Invoice Date: {{order.invoiceDate | format_date: "dddd, MMMM dd, yyyy"}}</span>  
            <span>Total Cost: {{order.totalPrice | set_money_format : order.domainCountryCode,  order.formatSettingId}}</span>
        </li>
    {% endfor %}
</ul>

Toolbox:
CRM > Orders

HOTPATCH

Ecommerce Improvements:
Auto add this.ProductDataJsonHTML to product detail layout
(will be released via hotpatch v5.1.1 on March 23)

Exclusively for Product Module:

Automatically add {{this.ProductDataJsonHTML}} to the product detail if there is no manual output inside the layout

HOTPATCH

Module copy function restriction upgrade
(will be released via hotpatch v5.1.1 on March 23)

Allow module copying starting Pro plan

Bug

List of bug fixes

eCommerce related:

  • Disable Checkout button when applied price changes
  • add TaxPriceHtml to shoppingcartdata object
  • Fixed displaying of Recommended Retail Price https://prnt.sc/r7u7yq 
  • Gift Voucher shows incorrect Currency in giftvoucher email
  • liquid error Component RelatedItem and Component GroupedItems
  • {{this.order}} is now accessible in workflow email content.
  • Product Detail layout improvement - removed price rounding when selecting attributes
  • Fixed incorrect calculating In Stock quantity when add product with attributes
  • Fixed incorrect priceHtml value displaying on product detail (previously shows 4 decimals) http://prntscr.com/rjpuq9 
  • form submissiondataobject doesn’t accessible in invoice email
  • Product Detail layout improvement - Inventory control (In Stock)
  • Fixed incorrect order prices displayed on thank you page

Show more less
New Feature

Ecommerce Template: "Furniture"

New ecommerce/Foundation/WCAG 2.1 compliant template:"Furniture"
  • Templates
New Feature

eWAY Payment Gateway

eWAY payment gateway for ecommerce and payable forms/events/subscriptions.
  • Ecommerce
Improvement

Ecommerce Additions

  • Tax price on product detail and in attribute component
  • Ability to see stock quantity for product variations with disabling of variations
  • Volume discount info available via Liquid
  • A button to restore all system pages and system emails to default
  • Ecommerce
Bugfix

BUG: Item Duplication of an already Duplicated Item

If you duplicate an item (from within the edit page), save it as a new item, then duplicate that item (still within the edit page), it actually duplicates the original/first item instead of the new one.

  • Admin Panel
  • Bugs
  • Pages and Templates
v 5.0 Release date: 19 Feb, 2020

Full Release Notes

Misc

Events:
Merge event module to configuration of custom module with system properties

  • Create System properties holder to the proto-module
  • Add event specific properties to the system module properties
    • Redo admin UI to use capacity, start end time and prices from system module properties
    • Restrict using names of system properties in any module custom properties section.
    • Already existed properties with the same name should be deleted and it’s values should be saved to the corresponded system properties
  • Payment flow should use system module properties price instead of old event specific properties.
  • Liquid output should remain the same
  • Search indexes should save data from system properties instead of old event specific properties
  • JS calendar should work the same way as was before this change
  • Redo toolboxes

Misc

Events:
Upgrade for Global Payments Flow

Set Allow pricing to Events module by default
Transfer Event Price from system properties to Pricing table.
Override system price property

‘Advanced Settings’ -> ’Enable Subscription’ checkbox added.

When enabled (which is default):

  • show capacity field in module item page
  • allows event subscription logic to work for item

Misc

recaptcha v3 execution default JS improvement

Change default recaptcha V3 js code to the one specified in the file recaptcha v3 execution on form submit-min.js

New code will execute recaptcha V3 validation once user triggers submit form event Submission will be longer, but this solution removes validation issues with the old code that gives you 2 minutes starting from the page loaded state to submit the form (validated token expired after 2 minutes). Old code launched validation on page load event.

Example:

http://prntscr.com/q62rvs

Misc

Rename Categories, Tags and Authors tab name

On item add/Edit view - rename tab name for categories, tags and Authors

  • From ”System Properties”
  • to “Default Properties”

Misc

‘Added by’ field refactoring #1

Hide field "Added by" and do not request CRM contact records on item Add/Edit form if ALL settings below are set to false:

  • Allow Add New Items
  • Allow Edit Items
  • Allow Delete Items

Attention: Even if field is hidden if it has a value previously - it will not be erased on clicking save item

Misc

Recaptcha v3 validation score management

In Settings -> Misc
Add ability to set Minimum validation score:

  • value should be between 0 and 1.0
  • default value is 0.5

On webform validation if success check if validation score is greater or equals to the one set here.

Misc

Add keywords field for site search

Add default field to all modules:

  • Site Search Keywords
  • type: text

Should contain CSV list of keywords.

When user will perform site search - apply searching by this new field as well as it currently does for name and description

Misc

Index writing/reading flow upgrade

Change the way reindex works:

  • launch reindex check each 2 seconds instead of 5
  • stabilize index read/write operations so they will no longer conflict with each other (causing incorrect output via component when filtering by tags or categories)
  • Apply “reindex item” flow in site search similar to “reindex module item” instead of the WHOLE SITE SEARCH reindex (causing delays in component output when filtering by tags or categories)
  • When changing module settings - launch module reindex ONLY if module url was changed.
  • Optimize reindexing process to significantly reduce time for reindex module or reindex site search
    • Causing reduced speed of whole site (frontend and admin) since site is sharing same processor resources with the reindex process.
    • causing incorrect output via component when filtering by tags or categories

BUG fix: Check that reindex module flow takes ACTUAL documents. Not the cached ones.

Beta

Feature flags updates for 5.0-5.1

Remove from internal section flags listed below:

  • Advanced search
  • Date Time Management
  • Rebuild queue
  • Advanced multi-level categories
  • Customizable columns for module items view

Move ’Email domain verification’ flag to Internal flags.

Beta

ps1
Advanced Payment Flow:
Advanced Payment feature flag

Feature flag: Advanced payment flow

Improves payment flow using defined by the customer price formats and currencies attached to domain payment was made from.

Beta

ps2
Advanced Payment Flow:
Modify "payment gateway" setting page to "payment settings" page

New Payment Setting Page should contain tabs:

Gateway:

design: http://prntscr.com/rbhtr9

  • Move old "payment gateway" page content to gateway tab
  • Remove Currency selector from gateway section.
  • show list of gateway settings assigned to country-currency allowed by site domains

Currency and Format:

design: http://prntscr.com/rbhtz4

Default setting will be pre-configured (which can not be edited or deleted). This format setting will be used as default if no format setting specified for the domain.

Default settings:

  • Name: Default
  • Culture: English (United States)
  • Currency: USD
  • Number of digits after coma: 2

Beta

ps3
Advanced Payment Flow:
Extend Domains settings with "Currency and Price format" and "Country"

Entity relation Diagram:

https://prnt.sc/oz7a11

Beta

ps4
Advanced Payment Flow: Domain Settings component

Add new component tag "domain_settings":

{% component type:"domain_settings", domain:"", collectionVariable:"" %}

  • domain (not required param) - domain to retrieve settings for (current domain is default if param is empty)
  • collectionVariable (required param) - works the same way as other components.

collectionVariable context is an OBJECT described below:

  • Domain (string)
  • LandingPage (object)
    • Id (int)
    • Url (string)
    • Name (string)
  • Country (object)
    • Name (string) - country code
    • Code (string) - country code
  • FormatSetting (object)
    • Name (string)
    • Culture (string)
    • Currency (object)
      • Code (string)
      • Symbol (string)
      • DigitalCode (string)
      • Name (string)
    • DecimalsQuantity (int)

Beta

ps5
Advanced Payment Flow:
Admin UI dates format improvement

Display dates in the admin using Default domain Format setting

Beta

ps6
Advanced Payment Flow:
Domain currency and format settings to the order

When creating an order, save currency and price format settings chosen for the domain the order was purchased from, to the order at the moment of purchase.

So that if admin changes the currency and price format settings for the domain - the order will still keep those settings that were at the moment of purchase.

Display prices in order list and detail view based on these saved currency settings:

Beta

ps7
Advanced Payment Flow:
Invoice System Email modification

Use currency and format settings saved in orders to display prices in invoice email.

Liquid {{this.order}} example:

{

 "id": "12877807959236673593",

 "State": "AwaitingPayment",

 "formId": 0,

 "memberId": 7,

 "caseId": 0,

 "name": "Checkout 04 Mar 2020 09:06 AM",

 "invoiceNumber": 6,

 "invoiceDate": "2020-03-04T15:06:40.145232Z",

 "formatSetting": {

"name": "Default",

"culture": "en-US",

"decimalsQuantity": "2",

"currency": {

"name": "US Dollar"

"code": "USD"

"symbol": "$"

"digitalCode": "840"

},

 },

 "domainCountry": {

"name": "UNITED STATES",

"code": "US"

 },

 "destinationCountry": {

"name": "UNITED STATES",

"code": "US"

 },

 "shippingOption": {

"id": "12252410371037462536",

"shippingOptionId": "7361027874612051972",

"name": "Free",

"price": 0.0000,

"taxPercent": 0.0,

"taxPrice": 0.0,

"totalPrice": 0.0000,

"subTotalPrice": 0.0000

 },

 "discount": {

"id": "16801218532107878402",

"code": "test",

"type": "FixedAmount",

"amount": 5.0000

 },

 "discountPrice": 5.0000,

 "giftVoucher": {

"id": "7532467322502512642",

"code": "test",

"amount": 20.0000,

"balance": 20.0000

 },

 "paymentType": "Offline",

 "amountPending": 8.7700,

 "amountPaid": 0.0,

 "subTotalPrice": 33.7700,

 "taxPercent": 0.0,

 "taxPrice": 0.0,

 "totalPrice": 8.7700,

 "items": [

{

"id": "15049017874163171346",

"smallImage": null,

"name": "test prod",

"type": "ModuleItem",

"moduleId": 0,

"SKUCode": "eb8da3f4-2037-42c8-ab84-20d7c85ea224",

"quantity": 1,

"Url": "/catalogs/test-prod",

"price": 33.7700,

"taxPercent": 0.0000,

"unitPrice": 33.7700,

"taxPrice": 0.00000000,

"unitTotalPrice": 33.77000000,

"totalPrice": 33.77000000,

"unitTotalPriceHtml": "$33.77",

"priceHtml": "$33.77",

"unitPriceHtml": "$33.77",

"taxPriceHtml": "$0.00",

"totalHtmlPrice": "$33.77",

"quantityHtml": "",

"removeHtml": "",

"attributes": []

}

 ],

 "giftVoucherPrice": 20.0000,

 "discountPriceHtml": "$5.00",

 "taxPriceHtml": "$0.00",

 "shippingTotalPriceHtml": "$0.00",

 "giftVoucherPriceHtml": "$20.00",

 "totalPriceHtml": "$8.77",

 "amountPaidHtml": "$0.00",

 "amountPendingHtml": "$8.77"

}

Beta

Advanced Payment Flow:
Form Builder (Form logic modified)

Add system field

  • FormType
  • Values:
    • Generic (default)
    • SingleItem
    • Checkout

Add formType property to the following liquid objects:

  • form context (applied in {% component type:"form" %})
  • form submission data object {{ formSubmissionData }}

If Advanced Payment Feature flag is enabled – all payment forms (with selected Accept Payment property) start working via the new flow:

For any form type:

IMPORTANT: Default html form template generates completely differently from the old one. Payment forms created earlier WILL NOT BE COMPATIBLE with the new flow since JS and backend logic was completely reworked for multiple payment methods and payment gateways.

If form type is ‘Generic’:

http://prntscr.com/rbyrbh (old html template on the left side and new one on the right)

  • (1) Removed data attributes for order name and description. They will be set on the backend by the internal rules.
  • (2) PaymentType field was reworked to accept payment types not payment gateway as it wrongly did before. Renamed to Payment_Type and accept following options
    • CreditCard:
      Replacement of the old Stripe code. Gateway will be determined by the current domain.
      Stripe key, currency and other gateway details now passed via get params of the payment gateway js that is automatically attached to the head of the page if page contains at least one component type form with selected accept payment field
    • Free:
      Option that is accepted only if submitted amount is equal to 0. Submitting such form still creates order-form_submission pair.
    • Offline:
      Option that allows creating order in Awaiting Payment state. So you will be able to add offline payment on order in Payments tab that will change order state to Success
  • (3) Payment fields that collect tokenized credit card data was reworked. In upcoming update (18 March) static html will be replaced by {% component type:"payment_form_fields", formAlias:"[[formAlias]]" %} that will have virtual layout that is same as on the right side in the screenshot above. This section will be used to output validation errors, set tokenized card data from payment provider and to display payment fields using capabilities that selected payment gateway give.
  • (4) Amount field was transformed to Payment_Amount field.
    Value of the this.paymentAmount will be set based on price param if form does not contain any secure zone with paid recurring subscriptions.
    If form contain such secure zone then price value will be overridden by sum of all paid subscriptions.
  • Examples of the form component:
    {% component type: "form", alias: "payment_form", price: "20.10" %}

If form type is ‘SingleItem’:

http://prntscr.com/rbz6gd (compared to the generic type)

  • Form template generates an additional field Payment_ModuleItemId
    This field will be prefilled by the id of the item specified in form component moduleItemID or eventId param (value of this.moduleItemId will be set based on moduleItemID or eventId param)
  • Examples of the form component:
    {% component type: "form", alias: "payment_form", moduleItemID: "3065" %}
    or
    {% component type: "form", alias: "payment_form", eventId: "3065" %}

If form type is ‘Checkout’:

http://prntscr.com/rbzkcs (compared to the generic type)

  • Form template includes fields for giftvoucher and shipping address details
  • Value of the this.paymentAmount will be set based on the checkout totalPrice value.
  • Examples of the form component:
    (no difference between checkout and simple form component. But form template will not be rendered if the site plan is lower than eCommerce)
    {% component type: "form", alias: "payment_form" %}

Guide to convert Event Payment forms html layout from

old payment flow to new one:

1. Choose SingleItem form type.

2. Do manipulations described below referencing this screenshot:

http://prntscr.com/rcjv8o (OLD on left | NEW on right)

(1) This part is unnecessary. Remove it.

(2) These attributes are unnecessary. Remove it.

(3)

paymentType Select form field should be renamed to Payment_Type.

Value should be CreditCard.

Example: <option value="CreditCard">Credit Card</option>

(4)

paymentData field should be replaced with:

<div id="paymentFields_{{this.alias}}"></div>

<input type="hidden" name="Payment_Data" />

<div id="paymentErrors_{{this.alias}}" role="alert"></div>

(5)

Amount field name should be renamed to Payment_Amount.

Value should be changed from {{paymentAmount}} to

{{this.paymentAmount}}.

"If" liquid code is unnecessary.

(6)

"If" liquid code is unnecessary.

eventId field should be renamed to Payment_ModuleItemId.

Value should be changed to {{this.moduleItemId}}.

allocations field should be renamed to Payment_ItemQuantity

Add data-event_one_item_price="{{this.paymentAmount}}" data

attribute to the field so it will be calculated by CMS payment js.

Beta

Advanced Payment Flow:
Event payment logic redo

Redo event payment logic to ecommerce payment - single item flow

  • on form
  • in toolbox

Beta

ps8
Advanced Payment Flow:
Add liquid filter | domain_number_format

Add new liquid filter:

{{ numberVar | domain_number_format }}

  • Convert number to formatted string based on current domain Currency and format setting. Without currency related settings
    If liquid parsing is outside of domain scope - use default domain and it's settings.
    • else - do not change the variable

Beta

ps9
Advanced Payment Flow:
Add liquid filter | domain_money_format

Add new liquid filter:

{{ numberVar | domain_money_format }}

  • Convert number to formatted string based on current domain Currency and format setting. Including all currency related settings
    If liquid parsing works outside of domain scope - use default domain and it's settings.
    • else - do not change the variable

Beta

Advanced Payment Flow:
Add liquid filter | set_money_format

Add new liquid filter:

  • Pattern:
    • {{ numberVar | set_money_format : "[[formatSettingId]]"}}
  • When applied -
    • if variable is number - should convert number to money-formatted string based on country and format setting
    • else - do not change the variable

Note: The ID value to use for “formatSettingId” is currently not readily available and will be a fix for this soon.

Beta

Advanced Payment Flow:
Add liquid filter | set_number_format

Add new liquid filter:

  • Pattern:
    • {{ numberVar | set_number_format : "[[formatSettingId]]" }}
  • When applied -
    • if variable is number - should convert number to number-formatted string based on country and format setting
    • else - do not change the variable

Backlog

Secure Zones:
Subscription/Membership pricing

Add Price section for secure zone subscription.
http://prntscr.com/rbkz2c

Backlog

Secure Zones:
Files and Folders tab in secure zone

Add new step to secure zones "Files and Folders"
Provide ability to assign/unassign separate files or folders to/from secure zone.
DESIGN: http://prntscr.com/r7d8m1

Backlog

Secure Zones:
Secured files and folders in file manager

Provide ability to see and assign/unassign files and folders to/from secure zone(s)
DESIGN:
http://prntscr.com/r7d9w9
http://prntscr.com/r7da2c

Backlog

Secure Zones:
Secured files and folders logic

On each request to file after checking redirects, follow steps:

  1. If current use is ADMIN user go to step 4
  2. Compare current request path (case insensitive) to ANY path of secured file.
    1. If found - go to step 3
    2. If not found - check if current request path (case insensitive) contains ANY path of secured folder.
      1. If found - go to step 3
      2. If not found - go to step 4
  3. Validate if ANY user's secure zone subscriptions contains AT LEAST ONE of the found entry secure zones.
    1. If not contains redirect to 403 system page
  4. Allow file to be requested

Backlog

Make form submission files secure

On each request to file after checking redirects:

  1. If request link pattern is like "/_form-submissions/*"
    1. If current user is ADMIN user go to step 2
    2. redirect to 403 system page
  2. Allow file to be requested

Backlog

c1
Ecommerce:
Catalogs

Create new System module under eCommerce menu called "Catalogs"

- allow creating Catalogs and Products on root level and inner level

- has new ‘Simplified Tree View’

- has system field for a Thumbnail Image (media)

Design:

http://prntscr.com/r7gnqx

Backlog

c2
Ecommerce:
Catalogs
New item view type

Add new view of items:

  • Simplified Tree View

Extend Module -> Advanced Settings:

  • View Settings (add new checkbox) “Allow Items Simplified Tree View”
  • Default view (Add new option) “Simplified Tree View”

Simplified Tree View page for catalog view provides ability to:

  • Create new catalog on the root level
  • Edit existing catalog
  • Delete catalog
  • Move catalog under another catalog
  • Reorder catalog on the particular level
  • Create catalog under another catalog


Design:

http://prntscr.com/r7gotn

Backlog

c4
Ecommerce:
Catalogs
Advanced Module Settings -> Allow multiple parent items

Add new module setting under Advanced Settings -> Allow multiple parent items

If this option of the child module is enabled - display Tab with the name of the Parent module (for child module item view) or the name of the Child module (for parent module item view).

Example:

Module Catalogs is parent to Products.
If Products module has Allow multiple parent items=true than product item page will contain Catalogs tab, and catalog item page will contain Products tab

The tab content has a multiple item selector:

http://prntscr.com/r7gmkh

https://prnt.sc/r7gmps

Selecting multiple parents saves a list of the parent module items.

List of parent module items determines the list of urls of which each will lead to the detail page of the item.

Backlog

p1
Ecommerce:
Products

New System module under eCommerce menu called "Products"

System properties:

  • Small Image (media)
  • Large Image (media)
  • On Sale (boolean)
  • Is Gift Voucher (boolean)
  • Product Weight (number)
  • Product Width (number)
  • Product Height (number)
  • Product Depth (number)
  • Enable Drop Shipping (boolean)
  • Supplier (CRM contact picker)
  • Unit Type (string)
  • Minimum Units (number)
  • Maximum Units (number)
  • Product Keywords (string)
  • Recurring Type (dropdown)
    • None
    • Daily
    • Weekly
    • Fortnightly
    • Monthly
    • Quarterly
    • Half Yearly
    • Yearly

Backlog

p2
Ecommerce:
Products
Add/Edit Product Page

Since product allows multiple parents - provide ability to see multiple urls for the module item.

Design:

http://prntscr.com/r7gqcj

Backlog

p3
Ecommerce:
Products
Default module property - SKU Code

Add new default property ’SKUCode’ (string) to all modules.

Add to liquid scope property ’SKUCode’

Show system property SKUCode on Add/Edit module item page -> settings page if

  • Advanced Settings -> Enable Inventory = true
    or
  • Advanced Settings -> Enable Price = true

(Advanced settings hidden and restricted to change for now. Enabled for Event and Product modules only)

Backlog

p4
Ecommerce:
Products > Prices

Price entity list:

Design: http://prntscr.com/rb0z9b

Display list of prices (price entities) based on Currency/country pairs.

(Currency/country pairs can be achieved from list of domains and cultures and countries attached to them)

List shows only price entities that are attached to active Currency/country pairs.

If admin changes Currency/country pair for some domain but some module item already has attached price entity based on that Currency/country pair that was previously attached to the domain, than this price entity should not be visible but still saved in the db. So if admin sets back that currency/country pair to any domain, that module item will restore visibility of that price entity in the price list.

Price entity properties:

  • Currency (one of currency list)
  • Country (one of country list)
  • PriceList (list)
    • RetailPrice
    • SellPrice
    • Tax (one of tax codes filtered by PriceEntity Country setting)
    • priceForUserType (one of:)
      • Consumer
      • Wholesaler
      • may be more in the future
  • VolumeDiscountPriceList (list) may be zero or many
    • Quantity
    • SellPrice

Liquid Scope Extending

Module item liquid scope should be extended by property Price {{this.price}} that should return price based on the current domain.

Searching and filtering impact

Price property should be searched or filtered based on the current domain’s country/currency settings.

Backlog

p5
Ecommerce:
Products > Attributes

Add new module setting

  • Advanced Settings -> Enable Attributes (hidden and restricted to change for now. Available for Products module only)

If option enabled - show ’Attributes’ tab in the Add/Edit module item page

Attributes list:

Attributes provide ability to add/edit/delete product attributes and attribute options.

Design: http://prntscr.com/rb16h8

Attribute entity:

Attribute entity holds list of attribute options with their prices based on currency/country list from site domains.

Properties:

  • Name (string)
  • Attribute Type (one of)
    • dropdown
    • checklist
    • radiolist
    • numeric
  • Value Type (one of)
    • fixed price
  • Required (boolean)
  • AddToInventory (boolean)
  • Options (list)
    • Name
    • Image
    • PriceList (list)
      • Price
      • Currency (one of currency list)
      • Country (one of country list)

Searching and filtering impact

Attributes and their options can not be searched or filtered via module component.

Backlog

p6
Ecommerce:
Products > Inventory

Design: http://prntscr.com/rb12ji

Inventory entity

Clicking on Generate Variations (setting it to true) should hide InStock and PreOrder options and create variant products as per any attribute options that have AddToInventory = true.


Set initial InStock value of the first variant product to the products stock level, where all others are 0.

Sum of all insock values of all variant products should be set to Inventory.InStock property.

Clicking on Disable Variations (setting it to false) should show InStock and PreOrder options and remove variant products entirely.

Both changes should be applied if user clicks save button ONLY. If user set Generate Variations = false than show confirmation window before saving:

Are you sure you want to remove all product variations?

OK CANCEL

Inventory entity properties and relations

  • Enabled (boolean)
  • Generate Variations (boolean)
  • WhenOutOfStock (one of)
    • Show [module alt name] but don't accept orders
    • Hide [module alt name]
    • Enable pre-ordering
  • LowStockNotification (number)
  • InStock (number)
  • PreOrder (number)
  • Variations (list)
    • Title (string)
    • SKUCode (string) - UNIQUE between all variation Codes and all module item SKUCodes
    • InStock (number)
    • Enable (boolean)
    • AttributeOptionsVariation (one of variant products made by attribute options of attributes that have AddToInventory = true)

Searching and filtering impact

Inventory data can't be searched or filtered for now.

Backlog

p7
Ecommerce:
Products
{% component type:"item_attributes" %}

New component tag "item_attributes":

{% component type:"item_attributes", object:"[[object]]", module:"[[moduleIdentifier]]", itemId:"[[itemId]]", collectionVariable:"", layout:"", sortBy:"", sortOrder:"" %}

  • moduleIdentifier (required param) - moduleName or moduleId.
  • itemId (required param) - id of the module item to get attributes from
  • object (not required param) - item or collection (Default).
  • collectionVariable (not required param) - works the same way as in other modules.
  • layout (not required param) - path to FTP file that will contain layout content to be parsed.
    • If specified empty string - do not render anything (suppress layout).
    • If not specified at all - render default virtual layout.
  • sortBy (not required param) - any module item properties - Default is Id.
  • sortOrder (not required param) - ASC (Default) or DESC.

item context is described below. If object = collection (which is default) than this contains attributes property that holds the list of attributes ({{this.attributes}}):

  • ecommerceItemId (number) - itemId that was set in the component params
  • attributes (list)
    • Id (number)
    • Name (string)
    • AttributeType (string)
    • ValueType (string)
    • Required (boolean)
    • AddToInventory (boolean)
    • Options (list)
      • Id (number)
      • Name (string)
      • Image (string)
      • PriceValue (number)
      • FormattedPrice (string)
      • Currency (object)
        • Code (string)
        • Symbol (string)
        • DigitalCode (string)
        • Name (string)
      • Country (string) - country code

Default virtual layout can be seen/copied via FTP in ‘cms_assets’ folder.

Backlog

p8
Ecommerce:
Module toolbox

Add new toolbox items

  • eCommerce:
    • Catalogs list (default module items list toolbox for catalogs)
    • Products list (default module items list toolbox for products)
    • Related products {% component type:"related_items" %}
    • Grouped products {% component type:"grouped_items" %}
    • Product Attributes {% component type:"attributes" %}
  • Liquid Data
    • {% component type:"domain_settings" %}

Backlog

CRM:
Contact type field

New entity of ‘Contact Type’ with options:

  • Consumer
  • Wholesaler

Extend CRM Contact entity by Type field. Set ’Consumer’ value to all CRM contact records by default:

  • on create contact
  • preset for all existed contacts

Backlog

Ecommerce:
Taxes

Ability to view list of taxes and perform create/edit and delete tax operations.

Design: http://prntscr.com/rbjty8

Columns of the list view:

  • Name
  • Tax Percentage Amount
  • Country
  • Actions

Provide ability to pre-create taxes for countries (http://prntscr.com/rbjts6):

  • USA (see taxes on Acceptance criteria)

http://prntscr.com/ovgi09 - clicking on the button should create set of tax codes for selected country if system has preset of taxes for that country.

Create/edit form:

  • Country (select). Options:
    • use the same list of countries that used for Domains settings ->"Country"
    • On add new tax - preselect the country that is attached to the main domain by default
  • Tax Code (string) (required)
  • Tax Rate (number) - (type float) number of percent. Value should be between 0 and 100 including edges.

Backlog

Ecommerce:
Discount codes

Ability to view list of discount codes and perform create/edit and delete discount code operations.

Design: http://prntscr.com/rbjuge

Columns of the list view:

  • Code
  • Type
  • Amount
  • Release Date
  • Expiry Date
  • Enabled
  • Actions

Create/edit form:

  • Code (string) (required)
  • Description (string).
  • Type (select). options:
    • Fixed Amount (used by default)
    • Percentage of Order
    • Free Shipping
  • Amount (number) - (type float) discount amount. Value may represent an actual amount or percent of order.
  • Currency (select). options
    • use list of currencies that are applied to all domains of the site
  • Min Order Cost Limitation (number) - (type float).
  • Expire after x redemptions (number) - (type int). Validate values to be integer and greater or equal to 0.
  • Catalogs (multi-select). Options:
    • list of ecommerce catalogs module items.
  • Release Date (datetime)
  • Expiry Date (datetime)
  • Enabled (bool) - checked by default

Backlog

Ecommerce:
Gift Vouchers

Ability to view list of Gift Vouchers and perform create/edit and delete Gift Voucher operations.

Design: http://prntscr.com/rbjuz8

Columns of the list view:

  • Name
  • Amount (show values with 3 letter currency code)
  • Balance (show values with 3 letter currency code)
  • Recipient
  • Enabled
  • Actions

Create/edit form:

Details tab:

  • Currency (select) - options:
    • use the same list of countries that used for Domains settings ->"Country"
  • Name (string) (required) - unique value
  • Amount (number) - (type float). (required)
  • Balance (number) - (type float).
  • Type (select). Not selectable. Preselect value by default or based on initial value. Options:
    • Manual (default)
    • Via Shop
  • Enabled (bool) - checked by default

Recipient tab:

  • Name (string) (required)
  • Email (string) (required)
  • Message (string) (required)

Buttons:

  • Email me - sends gift voucher system email to current logged in admin user.
  • Email Recipient - sends gift voucher system email to recipient in the form above.

Backlog

Ecommerce:
Gift Vouchers System Email

Add new system email
Design: http://prntscr.com/rbjvhn

  • Name: Gift Voucher
  • Content: see screenshot

Liquid scope (this):

  • RecipientName - use the data from gift voucher -> recipient record
  • RecipientAddress - use the data from gift voucher -> recipient record (Email)
  • PurchaserName - TBD - this will be the full name from the CRM record that is assigned to the order that contains gift voucher product that creates this gift voucher and triggers the system email. Leave empty if gift voucher was created manually.
  • GiftVoucherCode - use the data from gift voucher -> Details record
  • GiftVoucherAmount - use the data from gift voucher -> Details record
  • GiftVoucherCurrency - object - use currency that is related with the gift voucher country
    • code
    • symbol
    • digitalCode
    • name
  • Message - use the data from gift voucher -> recipient record
  • SiteUrl - protocol and site domain. Use the same logic as in "Secure Zone Login Details"

EXAMPLE:
{

"Message": "test test test",

"SiteUrl": "https://vlad.z.treepl.co",

"GiftVoucher":

{

"Name": "GV431795",

"Amount": 100.00000000,

"Balance": 100.00000000,

"Type": "ViaShop",

"Currency": "$",

"Enabled": true,

"RecipientName": "test@gmail.com",

"RecipientEmail": "test@gmail.com",

"RecipientMessage": "test test",

"CreatedDateTime": "0001-01-01T00:00:00",

"UpdatedDateTime": "0001-01-01T00:00:00"

},

"RecipientName": "test@gmail.com",

"PurchaserName": "test2 test2",

"PurchaserEmail": "test2@gmail.com",

"GiftVoucherAmount": 1100.00000000,

"GiftVoucherCode": "GV431795",

"GiftVoucherCurrency":

{

"Code": "USD",

"Symbol": "$",

"DigitalCode": "840",

"Name": "US Dollar"

}

}

Backlog

Ecommerce:
Shipping options

Ability to view list of Shipping options and perform create/edit and delete Shipping option operations.

Design: http://prntscr.com/rbjxt3

Columns of the list view:

  • Name
  • Price (show values with 3 letter currency code)
  • Currency/Country
  • Actions

Create/edit form:

Details tab:

  • Name (string) (required)
  • Price (number) - (type float). (required)
  • Currency/Country (select) - options:
    • use pairs of country and currency that are retrieved from
      • list of currencies that are applied to all domains of the site
      • list of countries that are applied to all domains of the site
  • Type (select). Options: (required)
    • User Defined (default)
  • Tax Code (select). Options:
    • None (default)
    • list of discount codes for the selected country

Settings tab:

  • Handling Charge (number) - (type float).
  • Additional Per Item Handling Charge (number) - (type float).
  • Weight Limitations
    • Min (number) - (type float).
    • Max (number) - (type float).
  • Width Limitations
    • Min (number) - (type float).
    • Max (number) - (type float).
  • Height Limitations
    • Min (number) - (type float).
    • Max (number) - (type float).
  • Depth Limitations
    • Min (number) - (type float).
    • Max (number) - (type float).
  • Order Price Limitations
    • Min (number) - (type float).
    • Max (number) - (type float).
  • Show Shipping option to (select) - options:
    • All (default)
    • Consumer
    • Wholesaler
  • Limit Delivery to Following Countries (multi-select)
    • use the same list of all countries
  • Exclude Shipping if Purchasing from these Catalogs (multi-select)
    • future list of catalogs. Leave empty for now.

Backlog

eCommerce:
JS oriented properties

Liquid properties created for all price related objects to correctly output HTML markup to work with JS functionality.

For example, where you might have an output for a products price value such as:
{{this.price}}

Output is just a value:
5.00

But for the shop JS functionality data attributes are required for correct updating of prices, etc. So formatted objects are available, eg:
{{this.priceHtml}}

Output is HTML:

<span data-cms_product_data_price="[[itemId]]">[[ItemPrice]]</span>

Backlog

eCommerce:
JS and functionality

Create js function for ecommerce.js that will

  • collect item quantity
  • collect item attributes selected
  • trigger add to cart flow based on info collected above

Backlog

Shopping cart:
JS and functionality

Create js function for ecommerce.js that will

  • Enter Discount Code
  • Enter Gift Voucher
  • Clear Cart Flow
  • Change shoppingCart Item quantity
  • Choose shipping
  • Change Destination Country
  • Change Tax Code

Backlog

Shopping cart:
System page and default structure

Create new system page

  • Shopping Cart
  • URL: “/shopping_cart”

Default layout - inserts all JS and html code that will provide shopping cart functions

http://prntscr.com/rbk9w0

Backlog

Shopping Cart:
ShippingOptions, TaxCodes and Country/Currency lists

Add new component tags:

{% component type:"countries", collectionVariable:"", layout:"" %}

{% component type:"currencies", collectionVariable:"", layout:"" %}

{% component type:"shipping_options", collectionVariable:"", layout:"" %}

{% component type:"tax_codes", collectionVariable:"", layout:"" %}

  • collectionVariable (not required) - works the same way as other modules.
  • layout (not required) - path to FTP file that will contain layout content to be parsed.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.

collectionVariable context is an OBJECT described below:

countries:

{

"items":

[

{

"Code": "string",

"DisplayName": "string"

}

]

}

currencies:

{

"items":

[

{

"Code": "string",

"Symbol": "string",

"DigitalCode": "string",

"Name": "string",

}

]

}

shipping_options:

{

"items":

[

{

"Id": "string",

"Name": "string",

"Price": 0,

"TaxPercent": "0",

"TaxPrice": "0",

"TotalPrice": 0,

"CountryCurrency": {

"CurrencyCode": "string",

"CurrencyName": "string",

"CountryDisplayName": "string",

"CountryCode": "string"

}

}

]

}

tax_codes:

{

"items":

[

{

"Id": "string",

"TaxCode": "string",

"CountryCode": "string",

"Amount": 0

}

]

}

Default virtual layout:

countries:

<select>

{% for item in this.items %}

<option value="{{item.Code}}" >{{item.displayName}}</option>

{% endfor %}

</select>

currencies:

<select>

{% for item in this.items %}

<option value="{{item.Code}}" >{{item.Name}} ({{item.Symbol}})</option>

{% endfor %}

</select>

shipping_options:

<select>

{% for item in this.items %}

<option value="{{item.Id}}" >{{item.Name}} ({{item.TotalPrice | domain_money_format }})</option>

{% endfor %}

</select>

tax_codes:

<select>

{% for item in this.items %}

<option value="{{item.Id}}" >{{item.TaxCode}} ({{item.Amount}}%)</option>

{% endfor %}

</select>

Toolbox:

  • eCommerce
    > Checkout Countries Select
    > Checkout Currencies Select
    > Checkout Shipping Options Select
    > Checkout Taxes Select

Backlog

Shopping cart summary widget
Component tag

Add new component tag component type:"shopping_cart":

{% component type:"shopping_cart", collectionVariable:"", layout:"" %}

  • collectionVariable (not required) - works the same way as in other modules.
  • layout (not required) - path to FTP file that will contain layout content to be parsed.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.

‘collectionVariable’ context is an OBJECT described below:

{

"Id": "1907185188476026940",

"totalItemsCount": 1,

"unitsCountHtml": "<span data-cms_cart_units_count=\"1907185188476026940\">1</span>",

"paymentType": null,

"hasGiftVoucherProducts": false,

"formatSetting": {

"name": "En-US USD my",

"culture": "en-US",

"decimalsQuantity": "2",

"currency": {

"code": "USD",

"symbol": "$",

"digitalCode": "840",

"name": "US Dollar"

}

},

"domainCountry": {

"name": "UNITED STATES",

"code": "US"

},

"destinationCountry": {

"name": "UNITED STATES",

"code": "US"

},

"shippingOption": {

"id": "12252410371037462538",

"shippingOptionId": "7361027874612051972",

"name": "Free",

"price": 0.0000,

"taxPercent": 0.0,

"taxPrice": 0.0,

"totalPrice": 0.0000,

"subTotalPrice": 0.0000

},

"discount": {

"id": "16801218532107878403",

"code": "test",

"type": "FixedAmount",

"amount": 5.0000

},

"giftVoucher": {

"id": "7532467322502512643",

"code": "test",

"amount": 20.0000,

"balance": 0.0000

},

"discountPrice": 5.0000,

"subTotalPrice": 33.7700,

"subTotalPriceHtml": "<span data-cms_cart_subtotal=\"1907185188476026940\">$33.77</span>",

"taxCodeId": null,

"taxPercent": 0.0,

"taxPrice": 0.0000,

"taxPriceHtml": "<span data-cms_cart_tax_price=\"1907185188476026940\">$0.00</span>",

"totalPrice": 28.7700,

"totalPriceHtml": "<span data-cms_cart_total=\"1907185188476026940\">$28.77</span>",

"discountPriceHtml": "<span data-cms_cart_discount_price=\"1907185188476026940\">$5.00</span>",

"giftVoucherPriceHtml": "<span data-cms_cart_gift_voucher_price=\"1907185188476026940\">$0.00</span>",

"giftVoucherPrice": 0.0000,

"shippingTotalPriceHtml": "<span data-cms_cart_shipping_price=\"1907185188476026940\">$0.00</span>",

"checkoutButtonHtml": "<button class=\"system_button\" data-cms_cart_checkout=\"\">checkout</button>",

"clearCartHtml": "<button class=\"system_button\" data-cms_cart_clear_card=\"\">Clear cart</button>",

"giftVoucherHtml": "<input type=\"text\" data-cms_cart_gift_voucher=\"\" value=\"test\" />",

"discountCodeHtml": "<input type=\"text\" data-cms_cart_discount_code=\"\" value=\"test\" />",

"items": [

{

"id": "15049017874163171349",

"smallImage": null,

"name": "test prod",

"type": "ModuleItem",

"moduleId": 0,

"SKUCode": "eb8da3f4-2037-42c8-ab84-20d7c85ea224",

"quantity": 1,

"Url": "/catalogs/test-prod",

"price": 33.7700,

"taxPercent": 0.0000,

"unitPrice": 33.7700,

"taxPrice": 0.00000000,

"unitTotalPrice": 33.77000000,

"totalPrice": 33.77000000,

"unitTotalPriceHtml": "<span data-cms_cart_item_total_unit_price=\"15049017874163171349\">$33.77</span>",

"priceHtml": "<span data-cms_cart_item_price=\"15049017874163171349\">$33.77</span>",

"unitPriceHtml": "<span data-cms_cart_item_subtotal_price=\"15049017874163171349\">$33.77</span>",

"taxPriceHtml": "<span data-cms_cart_item_tax=\"15049017874163171349\">$0.00</span>",

"totalHtmlPrice": "<span data-cms_cart_item_total_price=\"15049017874163171349\">$33.77</span>",

"quantityHtml": "<input type=\"number\" value=\"1\" data-cms_cart_item_quantity=\"15049017874163171349\" />",

"removeHtml": "<a target="_blank" href=\"javascript:\" data-cms_cart_remove_order_line=\"15049017874163171349\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" /><path d=\"M0 0h24v24H0z\" fill=\"none\" /></svg></a>",

"attributes": []

}

]

}

Default virtual layout:

<div class="shoppingCartWidget" data-ecommerce_shopping_cart_widget>

{% if this.totalItemsCount > 0 %}

{{this.totalItemsCount}} item(s), Total: {{this.totalPrice | domain_money_format }} <a class="shoppingCartLink" href="/shopping_cart">View Cart</a>

{% else %}

Shopping cart is empty.

{% endif %}

</div>

Toolbox:

  • eCommerce > Shopping Cart

Backlog

Add to Cart:
Component tag

Add new component tag component type:"ecommerce_add_to_cart":

{% component type:"ecommerce_add_to_cart", itemId: "", collectionVariable:"", layout:"" %}

  • itemId (not required) - determines what item should be added to the cart once clicked
    • default - {{this.id}}
  • collectionVariable (not required param) - works the same way as other modules.
  • layout (not required) - path to FTP file that will contain layout content to be parsed.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.

collectionVariable context is an OBJECT that is equal to module item selected by itemId param.

Default virtual layout:

<a target="_blank" href="javascript:" data-ecommerce_add_to_cart_Item="{{this.id}}" class="ecommerceAddToCartItem">{{this.name}}</a>

Toolbox:

  • eCommerce > Add to cart button

Backlog

Buy Now:
Component tag

Add new component tag component type:"ecommerce_buy_now":

{% component type:"ecommerce_buy_now", itemId: "", collectionVariable:"", layout:"" %}

  • itemId (not required param) - determines what item should be added to the cart once clicked
    • default - {{this.id}}
  • collectionVariable (not required param) - works the same way as in type: module.
  • layout (not required param) - path to FTP file that will contain layout content to be parsed.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.

collectionVariable context is an OBJECT that is equal to module item selected by itemId param.

Default virtual layout:

<a target="_blank" href="javascript:" data-ecommerce_buy_now_Item="{{this.id}}" class="ecommerceBuyNow_Item">{{this.name}}</a>

Toolbox:

  • eCommerce > Buy now button

Button should add item to cart and then redirect user to shopping cart.

Backlog

Item Quantity:
Component tag

Add new component tag component type:"ecommerce_item_quantity":

{% component type:"ecommerce_item_quantity", itemId: "", collectionVariable:"", layout:"" %}

  • itemId (not required) - determines what item should be added to the cart once clicked
    • default - {{this.id}}
  • collectionVariable (not required) - works the same way other modules.
  • layout (not required) - path to FTP file that will contain layout content to be parsed.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.

collectionVariable context is an OBJECT that is equal to module item selected by itemId param.

Default virtual layout:

<input type="number" data-ecommerce_qunatity_field="{{this.id}}" name="ecommerce_qunatity_field" value="1"/>

Toolbox:

  • eCommerce > Item Quantity Field

Backlog

/cms-assets/payment/ecommerce.js file specification and Linkage rules

File specification:

Create file “/cms-assets/payment/ecommerce.js”

File contains functions that supply:

  • Add to cart flow:
    Update item quantity, attributes, shopping cart widgets after adding to cart successfully
  • Enter Discount Code:
    Update shopping cart view based on applied Discount Code
  • Enter Gift Voucher:
    Update shopping cart view based on applied Gift Voucher
  • Clear Cart Flow:
    Update shopping cart view
  • Change shoppingCart Item quantity:
    Update shopping cart view based on applied item changes
  • Choose shipping:
    Update shopping cart view based on applied shipping option
  • Change Destination Country
  • Change Tax Code:
    Update shopping cart view based on applied tax

Logic should be based on layouts generated by

  • {% component type:"ecommerce_add_to_cart" %}
  • {% component type:"ecommerce_item_quantity" %}
  • {% component type:"item_attributes" %}
  • {% component type:"shopping_cart" %}

Linkage rules:

<script src="/cms-assets/payment/ecommerce.js?v=[[cms_version]]"></script> should be added to head of the page when:

  • shopping cart system page is loaded
  • {% component type:"ecommerce_add_to_cart" %} was parsed at least once

Backlog

Append to ecommerce.js 3 culture params

Pass site culture settings to ecommerce.js for price calculation and JS output.

Pattern:
ecommerce.js?thousands_separator=[[thousands_separator]]&decimals_separator=[[decimals_separator]]&decimals_count=[[decimals_count]]

Fill thousands_separator, decimals_separator and decimals_count based on the culture of the site domain.

Backlog

System page:
Checkout page

Create new system page

  • Checkout
  • URL: “/checkout”


Add Checkout Form to page and apply cms default styles.
Form component:

{% component type:"form", alias:"checkout_form", formType: "checkout" %}

Backlog

Preset Checkout From

Create Checkout From.

Alias checkout_form

Implement base styles for the form in /cms-assets/css/main.css

Backlog

System page:
Checkout thankyou page (Order Receipt)

Add system page

  • Order Receipt
  • URL: “/order-receipt”


Show this page if form with type "checkout" is submitted (instead of form thankyou page).

Provide liquid objects (this.formSubmissionData and this.order) those are required to build the page by design below:
http://prntscr.com/rbkkcf

Backlog

System email:
Supplier Workflow Notification

Add new Supplier Workflow Notification system email

Design - http://prntscr.com/rbkktt

Also add invoice liquid data to the following emails:

  • Any workflow email attached to the form.
    • all order info
  • Form Autoresponder
    • all order info
  • Supplier Workflow Notification
    • only their product info

Backlog

System email & System Workflow:
Low Stock Notification

Add new Low Stock Notification system email
Design - http://prntscr.com/rbkl5i

Add new Low Stock Workflow system workflow (undeletable)

Backlog

System email:
Invoice redo

Redo invoice system email HTML content to match the shopping cart table

http://prntscr.com/rbkojy

Backlog

eCommerce:
Order management

In ‘CRM’ > ‘Orders’ ability to

Backlog

eCommerce:
Search and filtering by price & parent id

Setup Advanced Search and filtering by

  • price
    • Save to index price based on currency/country pair
    • on search or filtering - take currency/country pair by current (or default) domain and combine to search criteria by price
    • Price determined as Numeric field. So in searching you can search price range via use of ‘prop_Price_Min’ and ‘prop_Price_Max’ params.
  • parentId
    • save to index list of parentId's
    • on search - apply search by list of parent id's (similar to search by category when multiple categories applied)

Backlog

Advanced Module Settings:
Related "Module item"

Create setting that will allow module item to have list of related module items

  • Advanced Settings ->Enable related module items (hidden and restricted to change for now. Enabled for Products module only)

If option enabled - view tab on add/edit item page:

http://prntscr.com/rbktkw

Provide ability to

  • choose multiple module items of the same module.

Chosen module items will be determined as RelatedModuleItemsList

Backlog

Advanced Module Settings:
Group "Module item"

Create setting that will allow module item to have list of related module items

  • Advanced Settings ->Enable module items grouping (hidden and restricted to change for now. Enabled for Products module only)

If option enabled - view tab on add/edit item page:

http://prntscr.com/rbkvxk

Provide ability to:

  • choose multiple module items of the same module
  • choose which module item will be the main.
  • reorder module items list

Further details:

Can sort grouped products ordering via drag-and-drop.

Always show main product as first item in list.

On change main product - set it's order position to first.

When trying to add product to group - if it's already added to any other group - show popup:
"This item is already added to another group ("[[name of the main item in the group]]"). Are you sure you want to remove it from that group and add it here?"

When clicking yes:

  • if the product was main in another group - apply main flag to the first ordered item left in the group
  • if the group consist of 2 items - destroy that group since there is no need to exist a group with only one product

Backlog

Module item Pricing tab upgrade

Provide UI upgrade that allows to see what price is edited right now (highlight editing price line).

When choosing another country/currency value - highlight the actual pricing record

Backlog

eCommerce:
{% component type:"related_items" %}

Add new component tag component type:"related_items":

{% component type:"related_items", object:"[[object]]", source:"[[moduleIdentifier]]", itemId:"[[itemId]]", limit:"[[limit]]", collectionVariable:"", layout:"", sortBy:"", sortOrder:"" %}

  • source (required) - moduleName or moduleId.
  • itemId (required) - id of the module item that has relations
  • object (not required) - item|collection
    • Default value is collection.
  • limit (not required) - number of items to be rendered
    • Default is ALL.
  • collectionVariable (not required) - works the same way as other modules.
  • layout (not required) - path to FTP file that will contain layout content to be parsed.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.
  • sortBy (not required):
    • All module item properties
    • Default value is ’Name’.
  • sortOrder (not required):
    • ASC (default)
    • DESC

Single tag item context is the same as for type:"module":

Default virtual layout:

<ul>

{% for item in this.items %}

<li>

<a target="_blank" href="{{item.url}}" title="{{item.name}}">{{item.name}}</a>

</li>

{% endfor %}

</ul>

Backlog

eCommerce:
{% component type:"grouped_items" %}

Add new component tag component type:"grouped_items":

{% component type:"grouped_items", object:"[[object]]", source:"[[moduleIdentifier]]", itemId:"[[itemId]]", collectionVariable:"", layout:"" %}

  • moduleIdentifier (required param) - moduleName or moduleId.
  • itemId (required param) - id of the module item that has relations
  • object (not required param) - item|collection
    • Default value is collection.
  • collectionVariable (not required param) - works the same way as in type: module.
  • layout (not required param) - path to FTP file that will contain layout content that need to be parsed.
    • If specified empty string - do not render anything.
    • If not specified at all - render default virtual layout.

Single tag item context is

  • the same as for type:"module".
  • should have one additional property IsMainGroupItem (boolean) that has value taken from module item grouping tab
  • Module items should be ordered by saved order from product Group Items tab.

Default virtual layout:

<select>
{% for item in this.items %}
<option value="{{item.id}}" {% if this.id = item.id %}selected="selected"{% endif %}>{{item.name}}</option>
{% endfor %}
</select>

Bug

Advanced URL bug fix

I created pages in the root directory but then needed to create 2 sub folders (en-gb & fi). I moved the files into the en-gb folder but they also show in the root directory?

  • Expected
    • Items shown in "moved to" folder only
  • Actual
    • Items shown in "moved to" folder AND in previous folder at the same time

Bug

Edit secure zone

Fixed Internal error bug (http://prntscr.com/r295iq) then changing secure zone type from free to paid and clicking save.

Bug

Delete last product from shopping cart

Now when deleting last product from the shopping cart – the page refresh state to Shopping Cart is empty automatically. No need to manually refresh the page

Bug

Change logic when choose another country on Shopping Cart

When selecting another country the shipping options will no longer disappear (if no country limitation option applied to the particular shipping options).

Bug

Not correct calculated pre-order variations

  1. Create product
  2. Create attributes and generate variations
  3. Set in-stock values (10 for each variation)
  4. Go to product page and buy any product variation
  5. Go back to product variations page

Expected:

  • In-stock 9, Pre-order 0 for bought product variation

Actual

  • In-stock 9, Pre-order 1 for bought product variation

Bug

Secure Zone custom date

Create a Secure Zone with Custom Date http://prntscr.com/r26h9g But applied incorrect date http://prntscr.com/r26hdm

Bug

Add cursor to indicate drag and drop functionality

Add cursor on hover in Catalogs and Products assignment pages. So user can determine that he can drag and drop items http://prntscr.com/qytfem

Bug

Change sorting on Orders list

Change ordering on CRM -> Orders. Last created orders should be shown first (sort by date created DESC).

Bug

Update table in eCommerce

Update Custom Columns so user can select eCommerce related properties
http://prntscr.com/r0keqv

Bug

Change title on Shipping Option

Go to Shipping Option, Click on Add new Shipping Option, Change title http://prntscr.com/qyah0h

Bug

Change shipping option when change quantity

  • Create shipping option
  • Apply min items quantity param (for example 8)
  • Go to Product and add it to the cart
  • Go to shopping cart
  • Change item quantity to be
  • Expected result: shipping option shows right after change quantity event was triggered http://prntscr.com/qyd2qp
    Actual – you need to refresh the page to see that shipping option

Bug

Adding product with different attribute separately to cart

  • Add product with attribute options white, black
  • Go to product and add it to cart with selected white option
  • Click again add to cart but with selected black option
  • Go to cart
  • Expected: two order lines that represent two different variations of the same product http://prntscr.com/qyd4nf
    Actual: one order line that represents the product but with quantity 2

Bug

Tax on shopping cart should change dynamically

Output the tax on the shopping cart http://prntscr.com/qydqbo . It should be changed dynamically when applying new tax (user should not refreshing the page to see the applied taxes) http://prntscr.com/qydqv2

Bug

Generate Inventory

  • Create product
  • Go to the product detail page
  • Add it to cart
  • Go back to admin
  • Create attributes for this product
  • Go to inventory and click generate variations
  • Unexpected error – http://prntscr.com/quzx7q

Bug

In Stock showing when inventory disabled

If Enable inventory checkbox is not checked than In stock:0 should not be shown http://prntscr.com/qvjbxa

Bug

Discount code valued at more than the order total

Order totalPrice should not be less than 0 when applying amount discount that is bigger than totalCost of the order http://prntscr.com/qvjely

Bug

Not saving Catalogs in Discount Code

Catalogs restriction field in discount code not saving. http://prntscr.com/qv4k1k

  • Go to discount code
  • Select catalogs
  • Click save
  • Refresh the page
  • Unexpected result – catalogs not selected for the discount code

Bug

Gift Voucher doesn't work

Bug

Removing Discount codes after applying him

Bug

2 price in product

When product that has several prices is added to the cart – shopping cart shows incorrect price https://prnt.sc/qv4sqs

Bug

CRM Wholesaler

CRM Wholesaler type doesn't change logged in users Liquid 'Type' value, nor does it change product pricing to wholesaler when logged in.

Bug

Canonical links in product

Go to detail Product (product must be in several Catalogs) Open tab SEO and set canonical link http://prntscr.com/quyzkm absent name product AND when you change canonical link - must be preselected information - but now is empty http://prntscr.com/quz19h

Bug

Catalogs Detail Layout

Fix the Catalog detail layout https://prnt.sc/quz56n

Bug

Clear cart

Clearing the cart doesn’t restore instock value of the product.
Expected: once clear cart action triggered – restore in-stock values for all product variations in the cart

Bug

Check 'Price' and 'PriceHtml'

A Product has Liquid values 'Price' and 'PriceHtml', but these appear to be the same (eg: 18.0000). The 'priceHtml' should be the country/currency "formatted price"

Bug

Optimize Speed opening Component Manager

Optimize loading of the Components Manager http://prntscr.com/qs84xx

Bug

Typo in {{this.InStoke}}

It says {{this.InStoke}}. Again a minor thing and {{this.InStockHtml}} will solve this. https://treepl.slack.com/archives/CRUAT8GGZ/p1579791435006900?thread_ts=1579765114.003400&cid=CRUAT8GGZ

Bug

Mistake in spelling

Under Product 'Group Items' there are some typos for the description placeholder: "Description" and "e.q" http://prntscr.com/qs4lr4 and without the dot in the end http://prntscr.com/qs4mgw

Bug

Group Items selection

Go to Product->Group Items You can't choose itself https://prnt.sc/qs4n4f

Bug

UI improvement for Site Information

https://forum.treepl.co/t/ui-improvement-for-site-information/836

Bug

Liquid error

When price is added it breaks the product detail page with this "Liquid Error: Object reference not set to an instance of an object.""

Bug

Error when delete product

It seems that sometimes I am not able to add new products, when I press Save it gives me the classic "You have unsaved changes. Leave the page?" If I press OK I end up on the front page (Analytics)

Bug

Change this.name on detail product

Small thing and since all will change the product detail page it doesn't matter that much. The name of the product is "hardcoded" to be "Product 1". Should be {{this.name}} ?

Bug

Added by member - doesn't show

“Added by” CRM contact not showing on Module Item Detail Page http://prntscr.com/qxdk80

Show more less
New Feature

BONUS: UK Data Center

New data center: UK (London)
More details in our blog post
  • Infrastructure
New Feature

eCommerce

Ecommerce release schedule
  • Products
  • Catalogs
  • Discounts
  • Taxes
  • Shipping
  • Gift vouchers
  • Related products
  • Shopping cart and checkout process

  • Ecommerce
Improvement

Ability To Assign Documents To A Secure Zone

Ability to make documents such as PDFs and Word docs secure by assigning them to a secure zone. And/or the ability to assign a folder and all the documents in it to a secure zone so that no one can access or download the document unless they are logged into the secure zone.

  • Secure Zones
v 4.14 Release date: 29 Jan, 2020
New Feature

eCommerce beta

Ecommerce release schedule
  • Products
  • Catalogs
  • Discounts
  • Taxes
  • Shipping
  • Gift vouchers
  • Related products
  • Shopping cart and checkout process

  • Ecommerce
v 4.12 Release date: 25 Dec, 2019
Improvement

Treepl Portal: Monthly Billing

Ability to bill by the month
  • Treepl Portal
v 4.11 Release date: 27 Nov, 2019

Full Release Notes

Backlog

Secure Zone Subscription:
Settings for recurring subscription

Enable Paid Access control:

  • fields for paid Membership subscription:
    • Membership Fees Amount (Price)
    • Membership Renewal Rate (Recurring period)
      • Monthly
      • Yearly
  • If Paid Access is selected, hide expiration date settings and show fields for Membership subscription and vice versa
  • on saving settings with changed recurring period - validate that there is no secure zone subscriptions in the system that used different, previous subscription period. If found - show error message.

Setting page (http://prntscr.com/q77nx4)

Backlog

Secure Zone Subscription:
CRM Contact update

Subscription page (http://prntscr.com/q77mxb)

  • Add Cancel subscription button near secure zones that have one. Once clicked - trigger Cancel Membership subscription flow
  • On successful canceling - remove all canceling links related to this subscription

Backlog

Secure Zone Subscription:
Recurring Payment flow on form with secure zone submit

Once form is submitted

  • Check if form has event subscriptions
    • if yes continue GENERAL Event payment FLOW
    • if no Check if form has attached secure zones
      • if yes
        • take formData.amount and assert it with SUM(sz.membershipPrice) for each secureZone => sz
        • if equals - proceed subscription
        • if no - show validation error message
      • if no - continue GENERAL FLOW

Backlog

Secure Zone Subscription:
Cancel Membership subscription flow

Once Cancel Membership subscription flow triggered:

  • check if subscription contains several secure zones
    • if found several - show attention popup and ability to continue or cancel
    • if not found - show Are you sure default popup, similar to the one that’s shown on delete flow.
  • if user chooses to proceed further - cancel subscription in stripe and remove cancel subscription link.
  • Show successful canceling message

Backlog

Secure Zone Subscription:
Form saving changes to assigned secure zones

On saving Form settings with changed secure zones list - validate that all secure zones have the same recurring period or have no recurring at all. If found different recurring period - show error message

Backlog

Secure Zone Subscription:
Sell membership form selector in toolbox

Add new toolbox item (http://prntscr.com/pu6m4d)

  • Secure Zone
    • Sell Membership Form

Shows list of forms that have assigned secure zones WITH sell membership option enabled.

On selecting a Form, show form tag with price attribute that corresponds to the SUM of all secure zones prices

Example:

{% component type: "form", alias: "membership_form", price: "25.25" %}

Backlog

Secure Zone Subscription:
Already subscribed membership price change

Behavior for saving secure zone membership settings if there are already existing subscriptions in the system.

1) On disable membership or setting membership price lower than before - show popup:
“You can't set price for membership lower than before since you have active subscriptions”
[Cancel all memberships and save changes] [Cancel]

2) On setting membership price higher than before - show popup:

“You have active subscriptions for this membership in the system.
Should it be canceled?”
[Leave all memberships and save changes] [Cancel all memberships and save changes] [Cancel]

http://prntscr.com/q77owl

Bug

Page URL link broken in Pages Module

Page URL display link in admin not linking correctly.

https://forum.treepl.co/t/bug-page-url-link-broken-in-pages-module/805

Bug

Admin console breadcrumbs with incorrect links

Admin console breadcrumbs for module items incorrectly linking back to parent items.

https://forum.treepl.co/t/bug-admin-console-breadcrumbs-url-incorrect/795

Bug

Rebuild index Fix

After being renamed, Custom Module items would disappear from the list view on the front end. Only after re-indexing the site it displays again.

Bug

Secure Zone - delete contact with secure zone

Attempting to delete a contact assigned to a secure zone results in error “Internal Error”

Bug

Forloop.index is missing in nested loops bug

When using nested for loops then forloop.index and other properties of forloop was working in the deepest loop only. Expected to get it working in each level of nested for loops.
Example: http://prntscr.com/q781gb
Was: http://prntscr.com/q781m4
Now: http://prntscr.com/q781ph

Show more less
New Feature

Sell Secure Zone Memberships

Functionality to sell membership to a secure zone e.g.: on annual, monthly, weekly, daily basis.
Payment gateway: Stripe.
  • Ecommerce
  • Secure Zones
v 4.10 Release date: 15 Nov, 2019

Full Release Notes

Template

“Travel”

https://treepl.co/cms-template/travel

Misc

Performance Optimization

Performed several core improvements that increase

  • module item list and tree view load speed in admin
  • pages load speed

Misc

"module_category_list" component improvements

Modifications:

  • Modify component type:"module_category_list" to set twice URL encoded category fullName to URL
  • this will allow to find categories that contain special characters (comma) in their names
  • On filtering or searching - apply twice URL decode functionality to category fullName in order to correctly split them by comma and not break categories that contain commas in their names.
  • Modify component type:"categories" to set to option values URL encoded category fullNames
  • Add two fields to Single category item context if Advanced multi-level categories flag is enabled:
    • Id
    • FullName

Beta

Advanced multi-level categories update

Force enable flag “Advanced multi-level categories”

NOTE: This feature flag activation may need a manual site index rebuild from the admin. If any module item lists on frontend used filtering by category – they may show nothing until index is rebuilt.

Bug

Advanced URL manager fixes

Core bugs that previously broke saving and duplication of module items when Advanced URL Manager was enabled has been fixed.

Bug

Corrupted images in file manager

When replacing image in file manager, image becomes corrupted

https://www.loom.com/share/7bd0760eaf5e4b07973556abeccc2a6a

Bug

Verified domains in Firefox

Verified email domains could not be added via Firefox

https://forum.treepl.co/t/verified-domains-and-workflows-notification-emails/776

Bug

Email tags for Case and Contact admin links

Case and Contact admin links generated via Liquid tag render old admin links and needed updating

https://forum.treepl.co/t/bug-case-and-contact-admin-links-need-updating/763

v 4.10.1 Patch

Bug

Email domain verification autoresponders

Verifying a domain using the new email domain verification method, autoresponders are not coming through

Bug

Advanced URL Manager

Testing multi slug: Custom Module ‘Items’ fail (404) (https://forum.treepl.co/t/treehouse-meeting-10/767/22)

Bug

Filter by tag

Filter by tag doesn't work - in collection (patch will force rebuild index process)

Bug

Site Search

Site search shows "Liquid Error: Object reference not set to an instance of an object"

Show more less
v 4.9 Release date: 23 Oct, 2019

Full Release Notes

Beta

Advanced URL Manager Part 1

Beta Feature needs turning on to use.

Advanced URL Manager

Allows setting multiple parent items to a single item in order to get several URLs leading to the item's detail page

Beta

Advanced URL Manager Part 1: URL manager reconstruction

Create custom URL manager that will improve Module and Module Items URL management.

  • Allows:
    • To set URL prefix to module that contains several slugs (http://prntscr.com/ov1ezq). Right now only one slug for the module URL is allowed (http://prntscr.com/ov1esj).
      Example:
      /eng/my-custom-module
    • To make module url to NOT HOLD that url to any module item. Right now module url occupies the url that is set on the settings page and no module item allowed to be created under the same url.
      Example:
      Module with url "/my-custom-module" should not occupy "/my-custom-module" URL.
      So user can create module item using slug "my-custom-module".
    • user to choose empty (root) url for module so it's items will have urls that starts from domain without prefix slug (http://prntscr.com/ov1gjq)
    • to set to any custom module a URL that is already used by any other module. But validate module items url to be UNIQUE between ALL global set of URL's of all module items.
  • Item Full URL structure description due to points above:
    • /module/url-part/parent-item-url-slug/sub-parent-item-url-slug/item-url-slug
    • Where:
      Black part is module URL.
      Description:
      Can contain several url slugs.
      Should not actually reserve URL. That's why:
      • Can be the same as in any other module
      • Can be the same as already used full URL of any item
      • Can be empty
    • Blue part is list of parent items slugs. Can contain several slugs. Slugs represent nested parent-child module item structure.

    • Red part is module item slug

Beta

Advanced URL Manager Part 1: Ability to assign multiple URLs for a single content item

Allow to assign multiple parent module items to the single module item in order to get multiple URLs for an item.

Module Settings


Add new module setting

  • Advanced Settings -> Allow multiple parent items

If option of the child module is enabled - display Tab with the value of "name" setting of Parent (for child module item view) or Child (for parent module item view) module.

Example:

  • Module ’Catalogs’ is parent to ’Products’
  • If ’Products’ module has ”Allow multiple parent items” = true than ’product item’ page will contain ’Catalogs’ tab
    And ’catalog item’ page will contain ’Products’ tab

The tab content is multiple item selector

https://prnt.sc/pn2ysg

Selecting multiple parents should save list of the parent module items.

List of parent module items determines the list of urls each of will lead to the detail page of the item.

Beta

Email domains verification: Email Domains Page

Beta Feature turned on by default.

Ability to verify domain with Amazon SES to use in "From" field in your email notifications.

This avoids emails being rejected or delivered as spam.

Add tabs to ‘Settings’ > ‘Domains’

  • “Site Domains” tab
    As per current “Domains” page content.
  • “Email Domains” tab
    New page provide ability to:
    • view list of site domains with states:
      • verified
      • not verified
      • verification failed
    • add new domain verification process
    • apply verification
    • delete domain

Beta

Email domains verification: Email validation on FROM fields

  • For all ’From’ field provide an indicator of the email verification (if using verified domain or not).
    • On changing email - run verification checking (js).
    • Places where From field occurs:
      • Each workflow email (Email notification -> Workflow Emails)
      • Each system email (Email notification -> System Emails)
      • Each module settings -> Autoresponder settings (Any module -> Settings -> Auto-response open-close)
      • Each form autoresponder (Any form-> Settings -> Auto-response)
      • Mailing List
      • Email Campaign
      • Create Email Toolbox
  • When clicking on email verification indicator (unverified state) - show description of unverified domain and link to allowed verified domains
    • Clicking on the link will show all verified domains in toolbox panel.

Beta

Email domains verification: Email sender applying flow

Setup new email sending flow (via amazon account).

On each email sending - check From email

  • If email has verified domain - send via new email sender (amazon account)
  • Otherwise - send via old email sender

Backlog

SSO integration: Authorization Token Renew

Adding background token renew flow to avoid unnecessary re-authentication.

https://forum.treepl.co/t/admin-logged-out-warning-or-keep-alive/717/5

Backlog

WYSIWYG Editor

Remove the default width from the images when placed using the WYSIWYG editor:

https://forum.treepl.co/t/resizing-image-with-editor/738/3

Backlog

Forms list view

‘Workflow’ name column added to Forms list:

https://forum.treepl.co/t/one-more-column-in-forms/731/2

Backlog

Improve custom table columns

Include ‘Meta Description’ in custom table columns:

https://forum.treepl.co/t/request-meta-description-included-in-custom-table-columns/713

Backlog

Liquid filter inconsistency (replace_first, remove_first)

Original filter ‘replacefirst’, now added ‘replace_first’
Original filter ‘removefirst’, now added ‘remove_first’
to match Shopify documented syntax.
Note: Original filters continue to work.

https://forum.treepl.co/t/liquid-filter-inconsistency-replace-first-remove-first/718/2

Show more less
New Feature

Advanced URL Management Part 1

UPDATE TO EXISTING MULTIPLE URL MANAGER
- Ability to assign multiple URL's for a single content item (by attaching mulitple parents items)
- Ability to assign multi-slug for Custom Modules (for example: eng/my-module)
- Ability to assign already taken slug for Custom Module (for example: /inventory - is a page or page folder. Custom Module inventory can also take /inventory...
  • General
  • Pages and Templates
New Feature

Email Domain Verification

Ability to verify domain with Amazon SES to use in "From" field in your email notifications.
This allows avoiding emails to be rejected or delivered as spam.
  • Emails
  • Workflow
Improvement

Authorization Token Renew

Adding background token renew flow to avoid unnecessary re-authentication.
  • Admin Panel
v 4.8.0-2 Release date: 03 Oct, 2019

Full Release Notes

Portal

Primary domain change/secondary domain deletion

Ability to mark a secondary domain as a primary one http://prntscr.com/pb2z50 and delete a secondary domain http://prntscr.com/pb2zf1

Portal

Live/trial sites search option

Ability to search sites by site name and url http://prntscr.com/panppi

Portal

Live/trial sites columns sorting

Ability to sort domains by site name, url, status, expiration date and plan http://prntscr.com/papd0j

Portal

Site activation improvements

1) Ability to activate a domain without www: http://prntscr.com/pans0e

2) "Site type" step removed

3) Automatic nameservers check and ability to skip "checking NS" step and move to the final "Add A record"

Portal

My invoices section

Ability to view invoices for the sites http://prntscr.com/paov9o with an option to send an invoice to your email address http://prntscr.com/paovsf and download it http://prntscr.com/paow9v http://prntscr.com/pasvyo

Portal

Password recovery

Ability to recover your password using recover link here: http://prntscr.com/pde73q

Backlog

Single Sign-On integration with admin:

Login flow

Change the login to Treepl admin flow to use Single Sign-On identity provider:

When a user goes to /admin - check his logged in state on identity provider

  • Check the logged in state on identity provider
  • If logged in, redirect to the dashboard
  • Otherwise, redirect to partner’s branded identity login page. If the login is successful, redirect to the site’s dashboard.

Backlog

Single Sign-On integration with admin:

Reset password flow

Add Restore Password link to the login form http://prntscr.com/pcyqxh

Add Reset Password Page similar to login page (branded page). Fields:

  • Email

Add Restore Password Confirm Page similar to login page (branded page). Fields:

  • Password
  • Confirm Password

On successful restore password confirmation, redirect to the login page.

Backlog

Single Sign-On integration with admin:

Invite user flow (invite/register)

Redesign Add/edit admin user views:

  • remove add/edit user and set password pages
  • Add new user button will call a popup
  • name field
  • email field
  • choose role field
  • role field
  • Edit users also calls a popup:
  • Name and email - displayed as a text.
  • choose role field
  • reset password button
  • For all existing admin users – show re-invite button that needs to be clicked by a partner in order to trigger invite admin flow with password reset email sent to the admin user in order to allow them to set a password.
    All the admin users that have not passed this flow will not be able to login to the cms admin.

Backlog

Single Sign-On integration with admin:

Invite Admin User system email

Create new System email

  • Name
  • Invite Admin User
  • Content
  • See Acceptance Criteria below
  • Email liquid:
  • {{this.siteURL}} should return Primary live domain or Default domain if site is trial
  • {{this.invitePasswordSetUrl}} should be replaced with the invitation link
  • {{this.isNewUser}} - Boolean. True is if an admin user has been created and false if just invited an existing one.

Design - http://prntscr.com/pcyrv1

Backlog

Single Sign-On integration with admin:

Restore Admin User Password system email

Create new System email

  • Name
  • Restore Admin User Password
  • Content
  • See Acceptance Criteria below
  • Email liquid:
  • {{this.restorePasswordUrl}} should be replaced with the link to set password page.

Design - http://prntscr.com/pcysal

Backlog

Single Sign-On integration with admin:

D
elete admin user

Clicking on delete admin user should launch un-invite flow on identity server.

Backlog

Ecommerce New Plan

Plans restrictions changes

Rename Pro+ plan to eCommerce

Restrict for all plans lower than eCommerce and allow on eCommerce CRUD and list operations

  • eCommerce Settings
  • Tax
  • Discount codes
  • Gift vouchers
  • Shipping options

  • Customizable columns are available starting Business plan (Update existing restrictions)
  • API integrations are now available starting Business plan (Add this new restriction for future use)
  • Payable events, items, forms are available starting Pro plan (Add this new restriction and use it for)
  • Payment gateways are available starting Pro plan (Add this new restriction and use it for Settings->payment page)

Beta

Payment Settings: Currency and format settings

Beta Feature:

Title:

  • Currency and price format settings

Description:

  • Improves payment flow using defined by the customer price formats and currencies associated with the domain the payment was made from.

Beta

Payment Settings: Currency and format setting:

Modify "payment gateway" setting page to "payment settings" page

  • New Payment Settings Page should contain the tabs as follows:
  • gateway
  • Move old "payment gateway" page content to gateway tab
  • Remove Currency selector from gateway section.
  • currency and format
  • Display list of added Payment Format settings to the system
  • On clicking add button - display a form with the following fields allowing to add new Payment Format settings
  • Name - (string)
  • Culture - (select) list of cultures
  • use list of cultures
  • Currency - (select) Options:
  • use table of currencies already set into the system in order to show currencies
  • Number of digits after coma - (select) options:
  • 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • Edit button should display the same form with preselected fields
  • On clicking delete, display standard confirmation dialog box

Beta

Payment Settings: Currency and format setting:

Default format setting

  • Pre-create one format setting - Default.
  • Make it undeletable and not editable "default" format (no edit or delete buttons and no possibility to delete it via API).
  • This format setting will be used as default format setting if no format setting specified for the domain.
  • Use
  • Name
  • English (United States)
  • Culture - (select) list of cultures
  • English (United States)
  • Currency
  • USD
  • Number of digits after coma
  • 2

Beta

Payment Settings: Currency and format setting:

Extend Domains settings by "Currency and Price format" and "Country"

  • Show list of created "Currency and Price format" settings
  • Use Default by default
  • Setting "Country"
  • Show list of countries (use list of countries that is used in the forms)
  • Use United States by default

Beta

Payment Settings: Currency and format setting:

Format rules for Format setting

Display dates in the admin using default domain Format setting

Beta

Payment Settings: Currency and format setting:

Save domain currency and number format settings to the order

When creating an order - save currency and price format settings chosen for the domain purchase made from the order at the moment of purchase.

So that if an admin changes the currency and price format settings for the domain, the order will still keep those settings that were at the moment of purchase

Beta

Payment Settings: Currency and format setting:

Orders in admin list and detail view modification

Use saved currency and format settings in orders in order to display prices in order list and detail view:

Beta

Payment Settings: Currency and format setting:

Invoice System Email modification

Use saved currency and format settings in orders in order to display prices in invoice email.

Liquid changes:

  • {{this.order.items}}
  • {{item.price}} - no changes
  • {{item.TotalCost}} - no changes
  • {{item.formattedPrice}} - ADD new property. Apply price format and currency position settings saved in the order in order to retrieve formatted price string
  • {{item.formattedTotalCost}} - ADD new property. Apply price format and currency position settings saved in the order in order to retrieve formatted price string

  • use currency that is saved in the order for the following properties:
  • {{item.currency.code}} - use currency that is saved in the order
  • {{item.currency.symbol}} - use currency that is saved in the order
  • {{item.currency.digitalCode}} - use currency that is saved in the order
  • {{item.currency.name}} - use currency that is saved in the order

  • {{this.order.totalCost}} - no changes
  • {{this.order.formattedTotalCost}} - ADD new property. Apply price format and currency position settings saved in the order in order to retrieve formatted price string
  • use currency that is saved in the order for the following properties:
  • {{this.order.currency.code}}
  • {{this.order.currency.symbol}}
  • {{this.order.currency.digitalCode}}
  • {{this.order.currency.name}}

Beta

Payment Settings: Currency and format setting:

Add liquid filter | domain_number_format

Add new liquid filter:

  • Pattern:
  • {{ numberVar | domain_number_format }}
  • When applied -
  • If variable is a number - should convert number to formatted string based on current domain Currency and format setting without currency related settings
    if liquid parsing works outside of domain scope, use default domain and its settings.
  • otherwise - do not change the variable

Beta

Payment Settings: Currency and format setting:

Add liquid filter | domain_money_format

Add new liquid filter:

  • Pattern:
  • {{ numberVar | domain_money_format }}
  • When applied -
  • If variable is a number - should convert number to formatted string based on current domain Currency and format setting including all currency related settings
    if liquid parsing works outside of domain scope - use default domain and its settings.
  • otherwise- do not change the variable

Beta

Ecommerce Settings: Tax

Ecommerce -> Taxes Page

Ability to view list of taxes and perform create/edit and delete tax operations.


Columns of the list view:

  • Name
  • Tax Percentage Amount
  • Country
  • Actions

Provide ability to pre-create taxes for countries:

  • USA

http://prntscr.com/ovgi09 - clicking on the button should create set of tax codes for selected country if system has preset of taxes for that country.

Create/edit form:

  • Country (select). Options:
  • use the same list of countries that was used for Domains settings ->"Country"
  • On adding new tax - preselect the country that is attached to the main domain by default
  • Tax Code (string) (required)
  • Tax Rate (number) - (type float) number of percent. Value should be between 0 and 100 including edges.

Beta

Ecommerce Settings: Discount codes

Ecommerce -> Discount codes Page

Ability to view list of discount codes and perform create/edit and delete discount code operations.

Columns of the list view:

  • Code
  • Type
  • Amount
  • Release Date
  • Expiry Date
  • Enabled
  • Actions

Create/edit form:

  • Code (string) (required)
  • Description (string).
  • Type (select). options:
  • Fixed Amount (used by default)
  • Percentage of Order
  • Free Shipping
  • Amount (number) - (type float) discount amount. Value may represent an actual amount or percentage of the order.
  • Currency (select). options
  • use list of currencies applied to all domains of the site
  • Min Order Cost Limitation (number) - (type float).
  • Expire after x redemptions (number) - (type int). Validate values to be int and greater or equal to 0.
  • Catalogs (multi-select). Options:
  • list of ecommerce catalogs module items.
  • Release Date (datetime)
  • Expiry Date (datetime)
  • Enabled (bool) - checked by default

Beta

Ecommerce Settings: Gift vouchers

Ecommerce -> Gift Vouchers Page

Ability to view list of Gift Vouchers and perform create/edit and delete Gift Voucher operations.

Columns of the list view:

  • Name
  • Amount (show values with 3 letter currency code)
  • Balance (show values with 3 letter currency code)
  • Recipient
  • Enabled
  • Actions

Create/edit form:

Details tab:

  • Currency (select) - options:
  • use the same list of countries that were used for Domains settings -> Country
  • Name (string) (required) - unique value
  • Amount (number) - (type float). (required)
  • Balance (number) - (type float).
  • Type (select). Not selectable. Preselect value by default or based on initial value. Options:
  • Manual (default)
  • Via Shop
  • Enabled (bool) - checked by default

Recipient tab:

  • Name (string) (required)
  • Email (string) (required)
  • Message (string) (required)

Buttons:

  • Email me - sends gift voucher system email to the current logged in admin user.
  • Email Recipient - sends gift voucher system email to the recipient in the form above.

Beta

Ecommerce Settings: Gift vouchers

Ecommerce -> Gift Vouchers System Email

Add new system email

  • Name
  • Gift Voucher
  • Content
  • see acceptance criteria

Liquid scope (this):

  • RecipientName - use the data from gift voucher -> recipient record
  • RecipientAddress - use the data from gift voucher -> recipient record (Email)
  • PurchaserName - this will be the full name from the CRM record that is assigned to the order that contains gift voucher product that creates this gift voucher and triggers the system email. Leave empty if gift voucher was created manually.
  • GiftVoucherCode - use the data from gift voucher -> Details record
  • GiftVoucherAmount - use the data from gift voucher -> Details record
  • GiftVoucherCurrency - object - use currency that is related with the gift voucher country
  • code
  • symbol
  • digitalCode
  • name
  • Message - use the data from gift voucher -> recipient record
  • SiteUrl - protocol and site domain. Use the same logic as in "Secure Zone Login Details"

Beta

Ecommerce Settings: Shipping options

Ecommerce -> Shipping options Page

Ability to view list of Shipping options and perform create/edit and delete Shipping options operations.

Columns of the list view:

  • Name
  • Price (show values with 3 letter currency code)
  • Currency/Country
  • Actions

Create/edit form:

Details tab:

  • Name (string) (required)
  • Price (number) - (type float). (required)
  • Currency/Country (select) - options:
  • use pairs of country and currency that are retrieved from
  • list of currencies applied to all domains of the site
  • list of countries applied to all domains of the site
  • Type (select). Options: (required)
  • User Defined (default)
  • Tax Code (select). Options:
  • None (default)
  • list of discount codes for the selected country

Settings tab:

  • Handling Charge (number) - (type float).
  • Additional Per Item Handling Charge (number) - (type float).
  • Weight Limitations
  • Min (number) - (type float).
  • Max (number) - (type float).
  • Width Limitations
  • Min (number) - (type float).
  • Max (number) - (type float).
  • Height Limitations
  • Min (number) - (type float).
  • Max (number) - (type float).
  • Depth Limitations
  • Min (number) - (type float).
  • Max (number) - (type float).
  • Order Price Limitations
  • Min (number) - (type float).
  • Max (number) - (type float).
  • Show Shipping option to (select) - options:
  • All (default)
  • Consumer
  • Wholesaler
  • Limit Delivery to Following Countries (multi-select)
  • use the same list of all countries
  • Exclude Shipping if Purchasing from these Catalogs (multi-select)
  • future list of catalogs. Leave empty for now.

Misc

Image processor Fix

Fix imageprocessor

When:

  • upload image under the same name as one of the images in the folder via FTP or File Manager
  • DO: remove all cached versions of the image.
  • delete image from the folder via FTP or File Manager
  • DO: remove all cached versions of the image.
  • Load File Manager tab
  • DO: load cached images instead of forced image resizing via URL random param (task for JS)

Misc

Export functionality redo

Modify export flow not to open in a new tab

Bug

Bug in file manager

Bug in the new file manager when opening longer code by the tree-view in a bigger browser window.

Bug

Workflow doesn't work on Business Plan

  1. Go to client site, e.g. CLIENTSITE.com/admin/custom-workflow
  2. Workflow doesn't work

Bug

BUG: Liquid ‘capitalize’ filter

Treepl’s implementation of the Liquid capitalize filter actually does Title Case instead of the documented Capitalize function:

https://shopify.github.io/liquid/filters/capitalize/ 1

Both case changes are handy though, so since Title Case is obviously possible I’d ask that a new custom Liquid filter be created called “titlecase” which does what the currently implemented capitalize filter does, then fix the current capitalize filter to work as per the Liquid docs.

Show more less
New Feature

Advanced URL Management Part 2

- "/url/path/index.html" page to be always resolved under "/url/path/" URL.
  • General
  • Pages and Templates
New Feature

eCommerce part 1

Payment Settings: Currency and format settings
Taxes
Discount codes
Gift vouchers
Shipping options
  • Ecommerce
New Feature

Single Account Identity Provider (SSO)

Single Account Identity Provider (SSO) via systemaccess.co for:
- FTP + Treepl admin + Treepl portal
- FTP + General Admin user
- Ability to send an invite to an already created admin user
- Ability for an admin user to have access to multiple treepl sites (on multiple DC's) with single credentials
  • General
  • Infrastructure
  • Treepl Portal
Improvement

Changes in Treepl's pricing plans/restrictions

Integration of changes in our pricing plans that were announced several weeks ago
Changes will be applied to all existing and new sites.
Pro+ plan renamed to eCommerce
eCommerce features available in eCommerce plan only
Advanced module settings for system modules available in eCommerce plan only
Payable events, items, forms available starting Pro plan (used to be an extension), together...
  • General
Improvement

Invoices for paid sites

Ability to download a properly formatted invoice receipt
  • Treepl Portal
Improvement

Remove "Title" From Blank Site Content Template

When starting from a Blank site, the default code inserted for the Content Template includes a restrictive <title> element: <!DOCTYPE html> <html> <head> <title>Treepl CMS Features for Treepl Partners & CMS Resellers</title> <title>{ this['name'] }</title> </head> <body> { pageContent } </body> </html> I'd suggest removing the <title> element altogether since the system now handles document titles automatically and in accordance with the Name or Meta Title value.
  • General
  • Pages and Templates
v 4.7 Release date: 21 Aug, 2019

Full Release Notes

Bug

Site Information incorrect “Value” column

The Value column in the Site Information Module, shows the Field Type, instead of the Field Value.

Bug

Boolean value is ON instead of TRUE

A boolean form field now returns string “true” or “false” instead of “on” (changes made in liquid formSubmissionData object and on CRM -> form submission -> submission detail page). http://prntscr.com/ovp5e4 

Bug

{{counter}} tag issue with  ‘New Liquid Engine’

Counter tag in list layouts when ‘New Liquid Engine’ beta feature is enabled now renders as intended.

Beta

Custom Columns In List View

Customizable columns for module items view.

Allows customized columns on custom and system modules list and tree views.

Create new module settings page for editing columns settings. Showing preview of columns and ability to change their order position via drag and drop.

If there are too many columns on the view - show horizontal scroll. When drag column to the right or left edge of the view - trigger auto scroll functionality in order to provide the ability to move that column out of visible columns area.

Ability to go to add, edit and delete columns. Add/Edit view consists of the following settings:

  • Title - input field - name that will be viewed as column title.
  • Property - selector of system and custom properties of the module.
  • Column Width -  input field - number of pixels that determines the column width.
  • Mobile Column Width -  input field - number of pixels the determines the column width in mobile view.
  • Hide on mobile - checkbox 

The ‘Actions’ column will always be present and will be the last column in the view.


Design:

http://prntscr.com/ovpcpq 

New List/Tree view layout for custom columns:

  • All custom columns that reflects module properties should support sorting (ASC, DESC) by clicking column header.
  • When layout contains more columns than allowed by screen width - add horizontal scroll.
  • Move preview link and action icons (duplicate, edit, delete...) to one separate ‘Actions’ column fixed to the right of the table. 
  • Allow columns resizing via dragging the edges of the column title.

Design:

http://prntscr.com/ovpd5m 

Tree View Layout:

Merge columns of two modules by their names. Merging should take equal named columns and all unique child module columns (basically columns of tree view are ALWAYS child module table columns). 
Unique Parent module columns should be skipped. 
For each parent module item on tree view show empty cell is column attached to child module only.

Example:
Module 1 has Property 1Property 2 and Name
Module 2 has Property 1Property 3 and Name

Module 1 is parent module to Module 2

Columns selected for 
Module 1 is Property 1Property 2 and Name
Columns selected for 
Module 2 is Property 1Property 3 and Name

Result view on tree view of both modules: 
Module 1 or Module 2

| Name                 | Property 1      | Property 3    |
|----------------------|-------------------|------------------|
| Module 1 item  | some value 1 |                         |
| Module 2 item  | some value 2 | some value 3 |

Pagination Changes:

1) Display current page number as input with number value between prev and next buttons http://prntscr.com/o70umf.

On change - show page that is entered in the input.

2) Duplicate pagination to the top of the table.

Lowest plan allowed is ”Pro+”

Add feature to the Admin User Roles: “Can Edit Module Items Columns Settings”

Backlog

Module settings UI change

Redesign ‘steps’ into ‘tabs’ on module settings sections.
From this:
http://prntscr.com/osng3p

To this: http://prntscr.com/ovpetu 

Backlog

File System' API Endpoint (Component Tag)

Add new component tag of type:"api", source:"File System"

Pattern:

{% component type:"api", resource:"File System", folder:"[[folderUrl]]", collectionVariable:"[[variableName]]" %}

  • type:"api" system param
  • resource: ”File System”
  • collectionVariable: name of Liquid variable for object data.
  • folder (not required param): folder URL to retrieve files from (default value is "/" for root directory). 

Examples

{% component type:"api", resource:"File System", folder:"/images/galleries/gallery 001", collectionVariable:"myVar" %}

item context contains:

  • url (file URL)

This component does not render any layout. If no collectionVariable specified - just skip the component processing.

Added to Component Toolbox:

1) Add new toolbox group:

"Liquid Data"

  • "File System"

provides ability to build component type:"api", resource:"File System" 

2) For folder selection use folder picker:

  • clicking on folder in picker modifies component code
  • clicking on icon next to folder modifies code and copies it to clipboard

Lowest plan allowed is “Pro”

Add feature to the Admin User Roles:

Liquid Data

  • File System

Backlog

Analytics dashboard settings

Remove condition that requires ’TrackingID’ for displaying analytics dashboard page. 

Only ‘ViewId’ is required
(This change allows you to add Google js snippet yourself using desired custom options but still having an ability to see analytics in the dashboard)

Backlog

Component type module_tag_list

Add new component tag of type:"module_tag_list"

Pattern:

{% component type:"module_tag_list", object:"[[object]]", module:"[[moduleIdentifier]]", parentItemId:"[[parentItemId]]", limit:"[[limit]]", collectionVariable:"", layout:"", sortBy:"", sortOrder:"" %}

  • module (required param) - moduleName or moduleId.
  • parentItemId (not required param) - id of the module parent group to retrieve tagged items from
  • object (not required param) - item|collection (default is collection)
  • limit (not required param) - max number of tags to be rendered (default value is ALL)
  • collectionVariable (not required param) - liquid data variable
  • layout (not required param) - path to FTP file that will contain layout content to be parsed. 
    If empty string - does not render anything.
    If not specified at all - render default virtual layout (see below).
  • sortBy (not required param):
    - Name (default)
    - ItemsCount 
  • sortOrder (not required param):
    - ASC (default)
    - DESC

item context contains:

  • Name
  • Url
    Pattern:
    [[parentItemUrl]]?prop_ModuleId=[[moduleId]]&prop_ParentId=[[parentItemId]]&prop_ItemTags=[[tagName (UrlEncoded) ]]

    Example, using the following component tag with ‘parentItemId’:
    {% component type:"module_tag_list", module:"Blog Post", parentItemId:"1234" %}
    Where 1234 - is ID of the Blog "My Blog"
    URL output is:
    /my-blog?prop_ModuleId=1534&prop_ParentId=1234&prop_ItemTags=My%20Tag

    Example, using the following component tag with no ‘parentItemId’:
    {% component type:"module_tag_list", module:"Blog Post" %}
    URL output is:
    ?prop_ModuleId=1534&prop_ItemTags=My%20Tag
  • ItemsCount - number of module items tagged by this tag

Default virtual layout:

<ul>

    {% for item in this.items %}

        <li> 

            <a href="{{item.url}}" title="{{item.name}}">{{item.name}} <span>({{item.itemsCount}})</span></a>

        </li>

    {% endfor %}

</ul>

VIRTUAL LAYOUT RETURNS ITEMS THAT HAVE itemsCount > 0  ONLY

Backlog

Component type module_category_list

Add new component tag component type:"module_category_list"

Pattern:

{% component type:"module_category_list", object:"[[object]]", module:"[[moduleIdentifier]]", parentItemId:"[[parentItemId]]", limit:"[[limit]]", collectionVariable:"", layout:"", sortBy:"", sortOrder:""  %}

  • module (required param) - moduleName or moduleId.
  • parentItemId (not required param) - id of the module parent group to retrieve categorized items from
  • object (not required param) - item|collection (default is collection)
  • limit (not required param) - max number of tags to be rendered (default value is ALL)
  • collectionVariable (not required param) - liquid data variable
  • layout (not required param) - path to FTP file that will contain layout content to be parsed. 
    If empty string - does not render anything.
    If not specified at all - render default virtual layout (see below).
  • sortBy (not required param):
    - Name (default)
    - ItemsCount 
  • sortOrder (not required param):
    - ASC (default)
    - DESC

item context contains:

  • Name
  • Url
    Pattern:
    [[parentItemUrl]]?prop_ModuleId=[[moduleId]]&prop_ParentId=[[parentItemId]]&prop_ItemCategories=[[categoryName (UrlEncoded) ]]

    Example, using the following component tag with ‘parentItemId’:
    {% component type:"module_category_list", module:"Blog Post", parentItemId:"1234" %}
    Where 1234 - is ID of the Blog "My Blog"
    URL output is:
    /my-blog?prop_ModuleId=1534&prop_ParentId=1234&prop_ItemCategories=My%20Tag

    Example, using the following component tag with no ‘parentItemId’:
    {% component type:"module_category_list", module:"Blog Post" %}
    URL output is:
    ?prop_ModuleId=1534&prop_ItemCategories=My%20Tag
  • ItemsCount - number of module items categorized by this category

Default virtual layout:

<ul>

    {% for item in this.items %}

        <li> 

            <a href="{{item.url}}" title="{{item.name}}">{{item.name}} <span>({{item.itemsCount}})</span></a>

        </li>

    {% endfor %}

</ul>

VIRTUAL LAYOUT RETURNS ITEMS THAT HAVE itemsCount > 0  ONLY

Backlog

Component type module_archive

Add new component tag component type:"module_archive"

Pattern:

{% component type:"module_archive", object:"[[object]]", module:"[[moduleIdentifier]]", parentItemId:"[[parentItemId]]", numberOfMonth:"[[numberOfMonth]]", collectionVariable:"", layout:"", sortBy:"", sortOrder:""  %}

  • module (required param) - moduleName or moduleId.
  • parentItemId (not required param) - id of the module parent group to retrieve categorized items from
  • object (not required param) - item|collection (default is collection)
  • numberOfMonth (not required param) - max number of months into the past to be rendered (default value is Eternity)
  • collectionVariable (not required param) - liquid data variable
  • layout (not required param) - path to FTP file that will contain layout content to be parsed. 
    If empty string - does not render anything.
    If not specified at all - render default virtual layout (see below).
  • sortBy (not required param):
    - Date (default)
  • sortOrder (not required param):
    - ASC (default)
    - DESC

Item context contains:

years (array)

  • Name - year (Example: 2018)
  • Url
    Pattern:
    [[parentItemUrl]]?prop_ModuleId=[[moduleId]]&prop_ParentId=[[parentItemId]]&prop_ReleaseDate_Min=[[periodStartDate]]&prop_ReleaseDate_Max=[[periodEndDate]]

    Example, with parentItemID:
    {% component type:"module_archive", module:"Blog Post", parentItemId:"1234" %}
    Where 1234 - is ID of the Blog "My Blog"
    URL (for period of 2018):
    /my-blog?prop_ModuleId=1534&prop_ParentId=1234&prop_ReleaseDate_Min=2018-01-01&prop_ReleaseDate_Max=2018-12-31

    Example, without parentItemID:
    {% component type:"module_archive", module:"Blog Post" %}
    URL (for period of 2018):
    ?prop_ModuleId=1534&prop_ReleaseDate_Min=2018-01-01&prop_ReleaseDate_Max=2018-12-31
  • ItemsCount - number of module items in the year
  • Months (array)
    - Name - month (Example: August)
    - Url
    Pattern:
    [[parentItemUrl]]?prop_ModuleId=[[moduleId]]&prop_ParentId=[[parentItemId]]&prop_ReleaseDate_Min=[[periodStartDate]]&prop_ReleaseDate_Max=[[periodEndDate]]

    Example, with parentItemId:
    {% component type:"module_archive", module:"Blog Post", parentItemId:"1234" %}
    Where 1234 - is ID of the Blog "My Blog"
    URL (for period of August ):
    /my-blog?prop_ModuleId=1534&prop_ParentId=1234&prop_ReleaseDate_Min=2018-08-01&prop_ReleaseDate_Max=2018-08-31

    Example, without parentItemId:
    {% component type:"module_archive", module:"Blog Post" %}
    URL (for period of August ):
    ?prop_ModuleId=1534&prop_ReleaseDate_Min=2018-08-01&prop_ReleaseDate_Max=2018-08-31

    - ItemsCount - number of module items in the month

Default virtual layout:

<ul>
    {% for yearData in this.years %}

            {% for month in yearData.months %}

                <li> 

                    <a href="{{month.url}}" title="{{yearData.name}}-{{month.name}}">{{month.name}} {{yearData.name}} ({{month.itemsCount}})</a>

                </li>

            {% endfor %}

    {% endfor %}

</ul>

MODULE RETURNS ITEMS THAT HAVE itemsCount > 0  ONLY

Backlog

Component type module searchScope extending

Component type module extended by param that allows using FULL search capabilities WITHOUT actual search via GET params (search form). Realization is described below:

1) Extend component type module with new param:

  • searchScope: ""

2) Parse content of search scope as JSON. If any exception occured while parsing - ignore this param.

3) Use retrieved object just like GET parameters from a search.

Priorities when several params and/or search via GET params occured:

filterBy, FilterValue pair < searchScope < GET params if searching THIS module

Example:

Both options described below should show the same result

  • Option 1:
    URL
    /blog_1?prop_ModuleId=1534&prop_ReleaseDate_Min=2018-07-01&prop_ReleaseDate_Max=2018-07-31&prop_ParentId=1842&prop_ItemTags=tag1&prop_ItemTags=tag2&page=2

    Component  on the /blog_1 page
    {% component type:"module", source: "Blog Post", layout:"List", isSearchResult: "true", filterBy:"id", filterValue:"123" %}

  • Option 2
    URL
    /blog_1

    Component on the /blog_1 page
    {% component type:"module", source: "Blog Post", layout:"List", searchScope: '{"prop_ReleaseDate_Min":"2018-07-01","prop_ReleaseDate_Max":"2018-07-31","prop_ParentId":"1842","prop_ItemTags":["tag1","tag2"],"page":"2"}', filterBy:"id", filterValue:"123" %}

    OR

    {% capture searchScopeVar %}{"prop_ReleaseDate_Min":"2018-07-01","prop_ReleaseDate_Max":"2018-07-31","prop_ParentId":"1842","prop_ItemTags":["tag1","tag2"],"page":"2"}{% endcapture %}

    {% component type:"module", source: "Blog Post", layout:"List", searchScope: "{{searchScopeVar}}", filterBy:"id", filterValue:"123" %}
Show more less
Improvement

Custom Columns In List View

Give the user the ability to setup how list view is shown in the different modules/pages etc. to match the need of the user.

See an example in this video

  • General
  • UI/UX
Improvement

File System' API Endpoint (Component Tag) That Can List Files And Folders From The File Manager

This, for example, could allow us to build gallery apps from a directory of images, list downloadable files from organised in directories, and other file system related functions. Similar to BCs File System API here: https://docs.worldsecuresystems.com/reference/rest-apis/file-system/get-folder-content.html

  • API
  • File Manager
v 4.6 Release date: 31 Jul, 2019

Full Release Notes

Backlog

File Manager Improvements

Design - http://prntscr.com/onhp35

Added and improved functionality:

  1. Upgrade to angular 8
  2. Tooltips with full file names in the left list section http://prntscr.com/onhv20
  3. Separate scroll for main and tree-view section http://prntscr.com/onhyz7
  4. Mouse right click for context menu: http://prntscr.com/oe4vex
  5. Improved and reworked tree view http://prntscr.com/onhwwm
  6. Manage files in the tree view http://prntscr.com/onhu7e
  7. Download for files and folders http://prntscr.com/onhw3p
  8. Duplicate for files and folders http://prntscr.com/onhwhm
  9. Renaming for files and folders http://prntscr.com/onhwot
  10. Quick edit from tree view http://prntscr.com/njyf77
  11. New Mobile layout http://prntscr.com/onhy3y

Bug

Random param not working when filtering by tag/category

Random attribute not working for Custom Modules when filtering by tags/categories. eg:

{% component source: "My Module", layout: "List", filterBy: "ItemTags", filterValue: "Header", limit: "1", random: "true", type: "module" %}

Bug

Incorrect params rendering

Under the new Liquid rendering engine (beta feature), was not able to render custom params passed to a Snippet.

The 'this' object only seems to reference the parent page/item and not the Snippet itself.

Example;

{% component type: "snippet", alias: "testsnippet", foo: "bar" %}

Using {{this.Params.foo}} to render the param did not work.

Show more less
Improvement

Multiple Improvements In File Manager

Design: http://prntscr.com/onhp35
Added and improved functionality:
1. Tooltips with full file names in the sidebar: http://prntscr.com/onhv20
2. Separate scroll for main and tree-view section: http://prntscr.com/onhyz7 3. Edit file (edit and quick edit): http://prntscr.com/njyf77
4. Download of files and folders: http://prntscr.com/onhw3p
5. Right click menu: http://prntscr.com/oe4vex
6. Files in tree view and ability to manage them: http://prntscr.com/onhu7e
7....
  • File Manager
Improvement

Treepl Portal: Data Center Assigned To Website

Ability to see Data Center assigned to website
  • Treepl Portal
v 4.5 Release date: 10 Jul, 2019

Full Release Notes

Beta

Features moved out of Beta

These features work consistently now and have been implemented into the CMS:

  • Advanced Search
  • Date Time Management

NOTE: Any feature flag will go through this flow:

  • Round #1 (sprint release) – released in beta features (disabled by default so it won’t crash anything on the live sites.
    Partners are able to see if it operates properly on those sites and report any issues for us to fix.
    Partner is able to turn off the feature himself instantly.
  • Round #2 (1 or 2 sprints after round #1) – feature flag goes to internal section and set to true (checked).
    Partners are not able to uncheck it but can send a support ticket in case of some issues and we will disable it from our end and fix it
  • Round #3 (1 or 2 sprints after round #2) – feature flag will be deleted.
    Old logic will be removed from the code.
    The result is that feature adopts the new behavior on a permanent basis.

Beta

New Liquid engine &nICE v2.0

New Liquid engine & nICE 2.0


+ nICE v2.0:

The ability to use style options like bold, italic, colors, etc in nICE editor interface.

New styles interface is available for all content except for module item properties that don’t have a field type of ‘multiline’ or ‘WYSIWYG’ (ie: date/time fields, single line string fields, etc).

NOTE: This feature requires valid HTML for proper nICE 2.0 operation in edit mode.


+ New Liquid engine:

IMPORTANT: After enabling this feature, please check all site's custom liquid and JS implementations.
In cases where you might output the collection variables as JSON (like ajax search result) the new Liquid engine renders the JSON object with camelCased property names.
Example:

The output will be different for old and new liquid engine:
http://prntscr.com/oh7ytj

Also, if you are using the {{params}} variable make sure you are using it via {{this.params}}. The names of the custom params will also be in camelCase http://prntscr.com/oh82n5

Forum discussion on the topic of params: https://forum.treepl.co/t/new-liquid-engine-changes-to-referencing-parameters-in-custom-layouts/517

This feature flag will be available in beta for 2 sprints and then also will be auto-enabled for all sites.

Beta

Multi-level Categories

Advanced multi-level categories

The feature allows creating multi-level categories.


+ New ‘ItemCategoryIdList’ property added to Liquid scope:

New property stores comma separated list of category IDs (existing category property stores list of category Names)

Existing: {{this['ItemCategories']}}

New: {{this['ItemCategoryIdList']}}


+ Convert Categories to nested categories

On appstart if categories wasn't previously converted, for each category:

  • Get category name
  • Split it by "/"
  • Create new nested categories from split values


+ New interface when creating categories/subcategories

Design - http://prntscr.com/oh6ht2

Categories now sorted in the tree structure.

By this button: http://prntscr.com/nod8lh the user is able to create a new category.

The user is also able to create/remove/rename the category/subcategory clicking on this button: http://prntscr.com/nodeyz .

User is able to change the name of the category/subcategory: http://prntscr.com/noddvd .

If the user created/changed the name of the category/subcategory and clicks anywhere but not on this button: http://prntscr.com/nodg1b changes should not be saved.


+ Ability to create/edit categories using the new interface when within a module item

Design - http://prntscr.com/oh6i7v

If user wants to create/edit category tree by clicking here: http://prntscr.com/npvq9l the flow is the same as on the settings page.

If user wants to assign the category to the module there should be the dropdown: http://prntscr.com/npvqod where the level number will be indicated with (----).


+ Default Parent category setting

For modules where you have access to its properties ("Edit Module">"Item Properties">"Default Properties") There will be the ability to specify the parent category to be used when creating/editing module items.

The default selection is the Root category level (value -1). if set to any category, than only the subcategories of the set category will be available to the module items (in both the Category field and the pop-out side panel as a tree of categories when clicking ‘Add new category button’.


+ Change import/export format for categories.

Old format example:

  • Cat 1,Cat 2,SubCat 1

New format example:

  • /Cat 1;/Cat 2;/Cat 2/SubCat 1;

Change method type from "Get" to "Post"


+ Change logic for category filtration:

  • if filterBy is ‘itemCategories’
  • Read filterValue as fullName
  • find category by fullName
  • find items by ItemCategoryIdList property of the module using retrieved category id.
  • if searching by ItemCategory - apply same logic as for filterBy


+ Addition of new component tag of type "categories"

Component pattern:

{% component type:"categories", parentCategory:"[[parentCategoryId]]", levelsDeep:"[[numberOfLevelsToRender]]", collectionVariable:"[[variableName]]" %}

  • parentCategory (not required param) - id of the category to start selecting subcategories from.
  • Default value for parentCategory = -1. Means start selecting categories from root.
  • levelsDeep (not required param) - number of levels in-depth starting from parentCategory that need to be retrieved.
  • Default value for levelsDeep = -1. Means render all levels in-depth.

Example:

{% component type:"categories", parentCategory:"111", levelsDeep:"2", collectionVariable:"myVar" %}

Renders virtual layout by pattern below:

<option value="[[itemContext.fullName]]">[["----" x (itemContext.level-1)]][[itemContext.name]]</option>

Liquid output example (of “myvar”):

{

"items": [

{

"NestingLevel": 2,

"FullName": "Cat 2/SubCat 1",

"Id": 112,

"Name": "----SubCat 1"

},{

"NestingLevel": 2,

"FullName": "Cat 2/SubCat 2",

"Id": 113,

"Name": "----SubCat 2"

}

]

}

NOTES: On generation of ‘search module form’ modification shown in ACCEPTANCE CRITERIA - see further below.

Replicate the same to ‘create module form’

Replicate the same to ‘edit module form’


+ Component Toolbox shows category tree

In the toolbox (for custom module, blogs, events, etc) when selecting filterBy ‘itemCategories’ - display options as flat tree in filterValue field in the format described below:

  • <option> label: "Category" or "---- Sub Category" or "-------- Sub Sub Category" depending on the level of the category (the deepest level has the most "----" prefix in front of the category name).
  • <option> value: "/category/sub category"

Backlog

New Email Accounts

Add Email accounts tab on live site edit page (in portal.treepl.co)

Design - http://prntscr.com/oh730f

Flow:

  • Check if live site domain exists in Treepl’s Open SRS account.
  • If exist – show email CRUD layout
  • If not – try create domain in the Open SRC account
  • On success - show email CRUD layout
  • On fail – show error popup message and try again button.

Email CRUD layout provides ability to:

  • Create email
  • Create domain alias
  • Create email alias
  • View list of email accounts and domain aliases
  • Shows storage of the particular email account
  • Delete email accounts
  • Delete domain alias
  • Delete email alias
  • Reset email password

Backlog

Contacts Import/Export flow

Import/Export flow.

Fields:
all contact fields:

  • Id (ignore on import)
  • First Name
  • Last Name
  • Email
  • Address
  • City
  • State
  • ZipCode
  • Country
  • Site
  • Phone
  • Status
  • Notes
  • Date Created
  • Date Updated (ignore on import)
  • Secure Zone
  • Secure Zone Expiration Date
    Example:
    http://prntscr.com/o1wy67
    if there is no date in Secure Zone Expiration Date but there is secure zone name in Secure Zone field:
    - on create CRM contact; set 9999-Dec-31
    - on edit CRM contact; do not edit existing expiration date

Notes:

Only ‘Secure Zone’ and ’Secure Zone Expiration Date’ cells will be imported for those additional secure zone rows added under a contact’s record (with no email address present). All other cells will be ignored in these rows.

Backlog

Admin Roles - Import Contacts

Extend restrictions list for admin roles.
New option under ‘Contacts’:

  • Can Import Contacts

If ’Can Import Contacts’ = false - disallow importing Contacts action for Admins with such roles.

Existing configured roles have this disabled by default.

Backlog

Multiple Workflows enabled on Business plan

Unlock Workflow notification Create / Read / Update / Delete operations for Business plan to enable multiple workflow capability. Now restricted only to having different Workflow Emails for those notification.

(Multiple Workflow Emails remain only on Pro/Pro+ plans)

Backlog

Ecommerce menu items

Set all sub items in Ecommerce menu as inactive:

eCommerce

  • Products
  • Catalogs
  • Discount codes
  • Gift vouchers
  • Taxes
  • Shipping options

Backlog

Data Source Property - Default Empty Option

Original issue:
https://forum.treepl.co/t/data-source-property-default-empty-option/473

For Custom Module Data Source fields, it was not possible to be set back to null/empty after a selection was assigned.

Now an empty ‘Please select’ option is available.

Backlog

Re-index module button

Added ability to re-index only one particular module http://prntscr.com/oh898g

Useful for selectively re-indexing specific modules only or to resolve possible issues with specific module search.

Bug

Force disabling from search engines for all trial sites

Force addition of <meta name="robots" content="noindex, nofollow"> meta tag (regardless of page property "Disable from search engines") for any page request under subdomain of *.treepl.co or *.trialsite.co

Bug

BUG: SEO Priority Default Setting

Original bug summary:

https://treepl.co/public-backlog-state/request/bug-seo-priority-default-setting

Custom Modules default SEO Priority is only visually applied in admin view and does not actually apply until SEO tab is saved.

Solution:

Apply the Default Priority field value to any newly created item (http://prntscr.com/nvztgl ):

- Front-end form

  • always

- Admin add item form

  • always

- Import process

  • if priority column wasn't specified or cell is empty

Bug

BUG: {{this.member}} data does not output to system Invoice email

Original bug summary:

https://treepl.co/public-backlog-state/request/bug-raw-this-member-endraw-data-does-not-output-to-system-invoice-email

{{this.member}} data does not output to the system Invoice email layout.

Bug

Custom module - Content Template changed upon front-end update

Steps to reproduce:

  1. Create form for updating item from front-end
  2. Go to custom module settings and change default content template http://prntscr.com/o4qaoz
  3. Go to item and set any template (not default and not the one that is selected as default in module settings in step 2).
  4. Go to front-end and click button Update

Expected:

  • Template should not be changed

Actual:

Bug

Advanced search - doesn't search in blog

Fixed the issue that reindex process wasn’t indexing the items that where located in “folder/group” items (like posts in blogs or pages under some page folders).

Bug

BUG: Spaces generated in form code

Original bug summary:

https://forum.treepl.co/t/bug-spaces-generated-in-form-code/474

Generated form code for Event and Payment fields had incorrect spaces in the HTML syntax.

Bug

Update item from front-end would clear info when update

Steps to reproduce:

  1. Create module and item
  2. Generate update item form
  3. Remove from the html code any fields except of itemId
  4. Place form to the page
  5. Submit form from front end

Expected

  • All fields sending via the form updates the item properties. All properties that AREN’T added to the form should NOT be updated

Actual

  • All properties that AREN’T added to the form ERASES the content of those item’s properties.
Show more less
New Feature

New Email Accounts

Ability to create new email accounts for every hosted/activated site from Treepl Portal. Currently, you can request email accounts to be created by emailing to support@treepl.co
  • Treepl Portal
Improvement

BONUS: Advanced Multi-level Categories

Ability to create and easilty manage global multi-level categories.
Currently available as one of the "Beta Features" and needs to be enabled manually on every Treepl site.
  • Admin Panel
  • General
Improvement

Contacts Import

The ability to import/export CRM contacts. For example for users of secure zones that should be imported from BC

  • CRM
  • Treepl Portal
Bugfix

BUG: {{this.member}} data does not output to system Invoice email

{{this.member}}data does not output to the system Invoice email layout.
It works on the system Workflow email but not the Invoice....
  • Bugs
Bugfix

BUG: SEO Priority Default Setting

In Custom Modules, when the SEO Priority default is set (under step 2. Item Properties), it is visually applied in admin view for all existing and new items but doesn’t actually apply to the item (not reflected in sitemap or in Liquid...

  • Bugs
Bugfix

BUG: Spaces Generated In Form Code

When adding Event and Payment fields to a Form, the generated HTML code has incorrect spaces forming.

space-generated-code.png
  • Bugs
v 4.4 Release date: 19 Jun, 2019

Full Release Notes

Beta

Implementation of previous beta items

  • Advanced Module Import/Export
  • Improved module search

Features above work constantly now and have been implemented.

Beta

Date and time fields

Date Time Management:

Allows choosing time in date fields on custom and system modules.

Backlog

Set time on add/edit module items

1) Provide ability to set time on date properties in the admin.

Fields are:

  • system fields
  • Release Date
  • Expiration Date
  • Event Start Date
  • Event End Date
  • custom fields
  • any field with type = "Date Time"

2) Set default time for the date fields above if time not set - use 00:00:00 as default time when saving any of datetime properties above.

Backlog

Save time on import/export items

Use time from the date fields in the excel columns to set date time in the timezone of the site.

Fields are:

  • system fields
  • Release Date
  • Expiration Date
  • Event Start Date
  • Event End Date
  • custom fields
  • any field with type = "Date Time"

If not set - use 00:00:00 as default time.

Backlog

Save time on create/update item (user submitted)

1) Save selected time when creating/updating module item via user submitted items.


2) Change generated input form (via toolbox) from date to datetime-local input

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local

If not set to the datetime field - use 00:00:00 as default time.

Backlog

Event calendar redo for date time

Modify calendar JS to use time part of the event start and event end date instead of relying on forcing 00:00:00 to the start date and 23:59:59 to the end date.

Backlog

Liquid output for displaying timezone

Add new property to request object:

"timezone" :

{

    "label" : "string",

    "offset" : int

}

Where label is a string value of the timezone name and offset is the difference in hours between UTC and current timezone

Example Output:
"timezone" :
{

    "label" : "(UTC-06:00) Central Time (US & Canada)",

    "offset" : -6

}

Example Liquid Usage:

{{request.timezone.offset}}

Would give value: -6

Backlog

Duplicating of existing module

Duplicate module with:

  • settings
  • default properties
  • custom properties
  • layouts

Allow selecting new name and url when clicking duplicate button.

Duplicate button located on Module Settings tab.

http://prntscr.com/o3wjp2

Plan restriction for duplicate Custom Module: Pro+

Backlog

WYSIWYG and ACE editor for form autoresponder with switcher

Add WYSIWYG and ACE editor options to the Form -> Settings -> Autoresponder body.

System Flow:

When user saves Settings - last selected editor should be saved as well.

When user comes to the form setting page - last chosen editor should be applied to the Body field.

If no editor was saved for the Form setting section - ACE editor should be chosen by default.

Chosen editor should be saved to the particular form, not for all forms in general.


When user clicks save the whole Settings section:

  • If WYSIWYG editor chosen AND previously was chosen ACE - show confirm message: Switching to WYSIWYG may corrupt some of your data. Confirm?
    - if clicked OK - continue saving process.
    - if clicked cancel - reject saving process.

Bug

(HOTFIX) Calendar toolbox builder - default options depended in Advanced Search flag

If Advanced search feature flag is enabled:

  • All - value = "0"
  • Ungrouped - value = "-1"

Old logic (if flag is off) :

  • All - value = "-1"
  • Ungrouped - value = "[[hiddenRootItemID]]"

http://prntscr.com/nux3hw

Bug

(HOTFIX) Calendar for Advanced search feature flag beta param

Modify calendar js and include file to use beta feature flag param.

Set param to 1 if Advanced search feature flag is on.

Bug

(HOTFIX) Add Image Bug (not adding actual uploaded image path)

When adding an image to an image field using the image manager it would add an incorrect image reference.

Bug

URL Redirect - when using .html

Fix URL redirect to recognize such url’s ("/myurl.html" and "/myurl") as different urls.

The fix allows creating redirect like

"/myurl.html" => "/myurl"

Bug

BUGS: User-Submitted Custom Module Items

BUG 1:
Not sure that user-submitted CM items are honouring site timezone for release date and expiry date IN THE WEB FORM RESPONSE - actual dates in the admin and when later rendering on site are correct.
(I’m testing with a Sydney timezone set)
Release date is always different.
Expiry is different when the date is set in the Create Item form, but not when ‘number of days till expiry’ is used or when left as default/no date set.

BUG 2:
User-submitted items do not honour the expiry date ‘number of days’ value set in the modules default properties.

BUG 3:
Expiry date fields are generated in the Create/Update Item forms even if expiry date is disabled from the CM default properties. (although they are removed if turned off from the Settings > Site User Permissions - but I’d think it should work the same in both cases?)

BUG 4:
Expiration Date input in the Create/Update Item forms is added as a type=“text” input - suggest changing to a type=“date” (as per custom properties dateTime fields)"

Show more less
New Feature

Duplicate Existing Custom Module

The ability to duplicate existing custom module.
Extended feature could be the ability to export settings/layouts etc. for Custom Module and import it in to another site.
Available in Pro+ plan
  • Custom Modules
New Feature

Release Time

Release *time* for blog posts, custom module items, pages etc. So instead of just a release date, also have the ability to choose a specific time the content is released.

  • Custom Modules
  • General
  • Pages and Templates
New Feature

Webform Autoresponders WYSIWYG

WYSIWYG editor so that customers can update the content in autoresponders.

  • General
  • WYSIWYG Editor
Bugfix

BUGS: User-Submitted Custom Module Items

BUG 1:
Not sure that user-submitted CM items are honouring site timezone for release date and expiry date IN THE WEB FORM RESPONSE - actual dates in the admin and when later rendering on site are correct.
(I’m testing with a Sydney timezone set)
Release date is always different.
Expiry is different when the date is set in the Create...
  • Bugs
v 4.3 Release date: 29 May, 2019

Full Release Notes

Backlog

Site speed increase

Performed CMS code optimization that slightly increase working speed of site pages (up to 15%).

Backlog

Liquid Context Rendering

New liquid object of {{LiquidContext}} to output all the available liquid for the current layout.

eg:

{% assign myCustomVar = "some value" %}

{{liquidContext}}

OUTPUT:

{

"this" :

{

"Name": "value",

"Description": "value"

...

},

"request" :

{

"request_url": {...},

"currentmember": {...}

...

},

"myCustomVar" : "some value"

}

Backlog

URL Redirects Import/Export

Ability to Import/Export URL redirects using an .xlsx file.

Backlog

Global Variables (Site Information) Builder

The ability to have a "Site Setting" App, where it is possible to add settings for the client that one could then feed and use throughout the entire site. It could be things like logo, phone, email, address etc.

With the ability to have the option of setting the liquid names/aliases so the tags are customisable. So instead of having for example something like {{siteInformation.companyContacts.webAddress}} one could specify an alias like {{si.cc.web}}

http://prntscr.com/nuymj4

Backlog

Toolbox -> Global variables (Site Information)

Add ability to get Site Information tags via the toolbox.

Toolbox options:

  • Group dropdown
  • Property dropdown (shows only when group is selected)
    Two liquid tags then shown for selected property for full alias and short alias.

Backlog

Secure Zone Subscriptions + Expiry dates

Added 2 system fields to the form builder relating to Secure Zones:

  • Secure Zone Expiry date
  • Secure Zone Expiry duration

Creating the input fields:

<input type="date" name="SZ_ExpiryDate">

<input type="number" name="SZ_ExpireAfterDays">:

User is not able to save the form with two chosen options.

If both options are present in the form the Expiry Date field will have priority.

Backlog

Secure Zone Expiration Settings

Create a new option on the Secure Zone Page:

  • Expiration option
    • Not specified (could be set from the form);
      this option is selected by default.
      If selected - allow applying date chosen on the form.
      If no value sent with the form - apply 31-Dec-9999.
  • Custom date;
    • if selected shows additional field type date.
      Apply to the form submission regardless of the Secure Zone Expiration field selected on the form.
  • Number of Days.
    • if selected shows additional number field.
      Apply to the form submission regardless of the Secure Zone Expiration field selected on the form.

Backlog

Add .kml, .kmz extension to allowed extension list

Add allowed file extensions:

  • .kml (application/vnd.google-earth.kml+xml)
  • .kmz (application/vnd.google-earth.kmz)

Backlog

Categorized rendering of events in the calendar.

Now using the component toolbox you can generate the calendar include widget that will render calendar of events by category.

Backlog

Import/Export of the detail layout

Now you can specify detail layout id in import and export file for module items.

Backlog

Data Center displaying in the portal.

Fixed the displaying of the data center in the partner portal. Partner should be able to see the actual information of which data center the website is located.

Backlog

Module lists in Admin to list by release date

Item lists in admin where release date is relevant now can be sorted by the release date column header.

Beta

Advanced search feature

Advanced search added to beta.

This feature uses new module index that allows retrieving searched module items in module search faster.

Current feature impacts:

  • Module Search load speed will be highly increased.
  • Filter by Event fields (such as start date end date price etc) will be highly increased.
  • Filter by url will be highly increased.
  • Added/edited module items via admin, frontent form or import functionality will be added to the index instantly (note – item may not be added to the index if reindex function is in process).
  • Events on the calendar will be loaded faster.

ATTENTION: all features under beta will be released one or two sprints after their released sprint. Some of them may change the logic already implemented (by way of improvement). So check if these features impact your site before the full feature release.

Beta

(HOTFIX) Calendar toolbox builder - default options logic change (when BETA Advanced Search enabled)

If Advanced Search BETA feature is enabled:

Toolbox -> Event -> Calendar generation will be changed:

  • Option “All“ will generate value = "0"
  • Option “Ungrouped“ will generate value = "-1"

Old logic (if flag is off) :

  • Option “All“ will generate value = "-1"
  • Option “Ungrouped“ will generate value = "[[systemRootItemID]]"

System will support both legacy version of the calendar and new version of the calendar.

Beta

Remove “Disable from site search” influence on MODULE specific search

Beta setting: Improved module search

Removes the effect of "Disable from site search" property for module specific searches.

Site search will not be affected by enabling this feature.

"Disable from site search" property should only be used for Site Search.

Bug

Time with calendar - on IOS

On iPhone if site has timezone set to “–GMT” - events were displayed one day back on certain time set on users device.

http://prntscr.com/nuvu5w

http://prntscr.com/nuvuhx

Bug

Form - Options in reverse order

Form fields that have options (ie: checkboxes, radios, dropdowns...) would have those options listed in reverse order in the generated layout

http://prntscr.com/nu9kbr

Bug

Admin - List View Pagination

When updating a custom module item on page 20 for example it jumps back to page 1. Which is frustrating if wanting to update multiple items on page 20.

Bug

Suspend Site text truncated

Descriptive text for Site Suspension options is truncated.

http://prntscr.com/nmv3vr

Bug

Bug with liquid

Module component tags configured with pagination would show total items count as the value in the ‘limit’ parameter.

Should shown total items count.

As a result generated pagination shows incorrect page numbers.

Bug

Event item showing on calendar before release date

Event item with release date in the future incorrectly shown on the calendar when it should not show at all until release date reached.

http://prntscr.com/nuw0ca

Show more less
Improvement

URL Redirects Import

Ability to import URL redirects using a .csv file.
Including PDF’s, media items, images, urls ending with a forward slash “/” and unusual urls that include special characters like &, =, $ or .aspx, .php etc. Ability to create wildcard redirects
  • General
  • SEO
New Feature

Global Variables Builder

The ability to have a "Site Setting" App, where it is possible to add settings for the client that one could then feed and use throughout the entire site. It could be things like logo, phone, email, address etc.

With the ability to have the option of setting the liquid names/aliases so the tags are customisable. So instead of...
  • Admin Panel
Improvement

BONUS: Form Fields Sorting

Sorting of form fields when making a form is reversed in the final layout.

form-sorting-reversed.jpg
  • Forms
Improvement

Liquid Context Rendering

The ability to output all available liquid on the current page.
The BC equivalent would be {{this|json}}

...
  • Liquid
v 4.2 Release date: 08 May, 2019

Full Release Notes

Backlog

Ability for partners to block the admin access and pause the websites for clients which are not paying.

If a partner chooses the soft option:

  • There’ll be a banner placed on the home page where the explanation of the issue can be described. The visitor of the website can confirm it and the banner will disappear. Then the visitor can continue browsing the website;
  • Clients can't access the admin dashboard using their credentials and will get the message with the issue

If a partner chooses the hard option:

  • The website is blocked and will not display. Every page will display the block-page with the description of the issue.
  • Clients can't access the admin dashboard using their credentials and get the message with the issue

Backlog

Ability to add multiple domain names to a website and point to different landing pages.

If the home page isn't set at all, there should be a customisable system page displayed.

‘Settings’ > ‘System Pages’ > “missing-home-page”


Ability for the user to set up the default pages in the Domains list section via the admin dashboard.

  • If the page option is not set for any domain the default page should be used.
  • If the default page option is not set on the default page, there should be "Not Set" status.

If the visitor enters on the custom domain of the current website;

  • If the page for the domain is set the system displays the page as the landing page;
  • If the page for the domain is not set the system shows the page of the default domain;
  • If the page is not set on the default domain the system shows the system page.

Backlog

Update Liquid To Include Date & Time Filters

Added date filters:

site_date

{{ “now” | date }} outputs "09-Jan-2015"

site_datetime

{{ “now” | datetime }} outputs "09-Jan-2015 02:46 PM"

date_utc

{{ “now” | date_utc }} converts a date to UTC (assuming that the date is always given in the site’s timezone)

date_add

myDate - filter input should be a date time object or a string convertible to a date time object

amount - an integer number or a string convertible to an integer number representing the amount of date or time units to add (if positive) or to subtract (if negative) from the input date time object

datePart - a string representing the date or time parts to be added or subtracted. The allowed values are:

  • "year"
  • "month"
  • "day"
  • "hour"
  • "minute"
  • "second"
  • "millisecond"

E.g. using either one of the variables below:




and

3016-06-15 12:30:30Z will output 3016-06-15T12:30:30

2016-09-15 12:30:30Z will output 2016-09-15T12:30:30

2016-06-30 12:30:30Z will output 2016-06-30T12:30:30

2016-06-16 08:30:30Z will output 2016-06-16T08:30:30

2016-06-15 11:50:30Z will output 2016-06-15T11:50:30

2016-06-15 13:00:30Z will output 2016-06-15T13:00:30

2015-06-16T08:30:29.900 will output 2015-06-16T08:30:29.900

If one of the parameters is of an incompatible type or value, the filter will not alter the input.

Backlog

Contact assignment to the Secure Zone.

Admin able to set/edit the expiry date of the secure zone for a contact

The configuration can be managed in the contact setting - http://prntscr.com/nip1uq.

Backlog

Default Expiry date for the Secure Zone.

If any of the forms have a secure zone, but the expiry date for it isn't specified, the default expiry date should be 31-Dec-9999.

Backlog

System Page if the access to the Secure Zone is expired.

If the expiry date of the contacts secure zone subscription is bigger than the set expiry date, the system should show the system page (403). The user should not be able to enter the secure zone by any means until the expiry date is less smaller than the current one.

Backlog

Change SEO Title To Meta Title In Liquid Properties

{{this[‘MetaTitle’]}} Added and renders the same value as {{this[‘SEOTitle’]}}

Backlog

Timezone for form submissions

The form submission times in the CRM now showing time in site timezone.

Backlog

Customise the “Create New” item name in modules

Admin is able to add the name for the "Create New" button on the "treeView" for modules:

The field where the admin can add the Alternative Item name - http://prntscr.com/nl0ow4.

The name for the "treeView" module should be displayed here - http://prntscr.com/nl0oob.

Backlog

Add support of .webp images

Add support of files with extension: ".webp" type: "image/webp"

Backlog

UI Improvements

File Manager:

  • filemanager download file option
  • filemanager duplicate file
  • filemanager download folder option
  • filemanager duplicate folder

Modules:

Component Manager:

Backlog

URL Redirect 302 status code changed to 301

Change current

  • 302 (Temporary redirect) status code to
  • 301 (Permanent redirect)

Bug

URL redirects with .html extension as source

Any url redirect that is added to the system with .html as the source url won’t redirect.

Another usability issue is that when you make a change to a url and go ‘back’ it takes you back to the first page of results every time and not just back to the page you were up to. It also defaults back to 20 results instead of 50.

Bug

Import/Export - doesn't react to Disable for site search

  1. Go to Galleries/Slider
  2. Create slider
  3. Export this item
  4. In file add one item and change Disable for site search to True and save
  5. Import this file
  6. New item doesn’t have checked checkbox for Disable from site search

Bug

Change Timezone - event in calendar displays one day back

  1. Create event and show item on Calendar http://prntscr.com/ne19h1
  2. Change time on your computer
  3. In calendar event start date change to one day back http://prntscr.com/ne1ad4

Bug

Custom Module and Event pagination no display results

When using Custom Module or Events search module with pagination, the paged views don’t show any items.

Bug

New Image manager not recognizing .jpg images

Image manager in WYSIWYG editor not displaying .jpg images in the file system and so cannot be selected.

Bug

New Image manager - breadcrumbs don't work correctly

Image manager in WYSIWYG editor not displaying breadcrumb/folder location correctly if reopening the image manager for a second time.

Bug

Create item from front end - change type

Expiration Date input in the Create/Update Item forms is added as a type=“text” input - suggest changing to a type=“date” (as per custom properties dateTime fields)

Bug

Business plan - disable advanced settings

Sites on Business plan had Advanced Settings enabled for Custom Modules when they should be disabled.

Bug

Set at Home and nICE

Page with ‘Set as Home Page’ enabled will revert to disabled if saved via nICE editor.

Bug

Default priority - doesn't save during import

  1. Go to custom module with Default priority http://prntscr.com/ndjzba
  2. Create item – priority doesn’t get saved until clicking save on seo tab

Bug

New Image manager - show full breadcrumbs

  1. Go to Image manager WYSIWYG
  2. Open folder with several folder inside - doesn’t show full path https://prnt.sc/nf57sh

Bug

Set up Time zone on create item in Custom module

User-submitted Custom Module items are not honouring site timezone for release date and expiry date IN THE WEB FORM RESPONSE - actual dates in the admin and when later rendering on site are correct. Initial response Release date is always different.
Expiry is different when the date is set in the Create Item form, but not when ‘number of days till expiry’ is used or when left as default/no date set.

Bug

Create item from front end - expiry days issue

With ‘Expiry Days’ set for user submitted custom module (http://prntscr.com/nfs5pk)

On item submission item is created with system default expiry date + expiry days - but should be calculated from today’s date http://prntscr.com/nfqq1b

Show more less
New Feature

Multiple Domain Names

Ability to add multiple domain names to a website and point to different landing pages.
  • SEO
New Feature

Pause Clients Which Are Not Paying

The ability to pause clients access to the admin and their email if they are not paying their bills.

  • Treepl Portal
Improvement

BONUS: Alternate Name Of Custom Module Item

cm-custom-name.png
Ability to set a custom name for custom module item.
Very useful when using nested custom modules.
  • Custom Modules
Improvement

BONUS: “Author” and “Added By” fields to include links to those CMS items

Add a link to the CRM record next to any “Added By” field.
Add a link to the Author item next to any “Author” field.
  • CRM
Improvement

BONUS: Change SEO Title To Meta Title In Liquid Properties

Version 3.2 brought a change to the SEO section changing the ‘SEO Title’ field name to ‘Meta Title’.

It would be great to have this passed through to the Liquid property naming also for consistency.

ie: {{this.metatitle}}

We may need both {{this.seotitle}} (old) and {{this.metatitle}} (new) available for backwards compatability

...
  • Liquid
  • SEO
Improvement

BONUS: Duplicate, Download Files & Folders

- Ability to download file from File Manager
- Ability to download folder from File Manager (as a seperate zip file)
- Ability to duplicate file and/or folder in File Manager
- Files and folders to render in alphabetical order
  • File Manager
Improvement

BONUS: Expiry Dates For Subscriptions

Functionality for admins to set expiry date for a customer to access a secure zone. (eg: access expires 31.12.2019)

  • Secure Zones
Improvement

Update Liquid To Include Date & Time Filters

Date Filters can be very important to web sites that use dates and calendering.

See the following link for BC's Date Filters:

Link to BC docs
  • Liquid
v 4.1 Release date: 17 Apr, 2019

Full Release Notes

Backlog

Code View In Custom Module WYSIWYG

For Custom Modules, the ability to switch to “Code View” in custom WYSIWYG fields.

Backlog

Menu Layouts and layoutGroups management

Add Menu layouts and layoutGroups management to the admin similar to other module layouts.

1) User should be able to create new layoutGroups

Creating layoutGroup should create folder in "/Content/MenuLayouts/[menuAlias]/[layoutGroupName]" and create there 3 files with default content.

2) User should not be able to delete Default layoutGroup.

3) User should be able to edit any layout inside layout group.

4) Creating new menu should create "/Content/MenuLayouts/[menuAlias]/Default" folder and insert default layout there instead of the previous location "/_MenuLayouts/[menuAlias]".

Backlog

Menu LayoutGroups FTP changes

FTP changes (for app start if _MenuLayouts" folder exist):

1) Copy "_MenuLayouts" folder from ftp root to "Content" folder.

Rename it to "MenuLayouts":

http://prntscr.com/n4ocag

2) Inside each menu alias named folder in "/Content/MenuLayouts/" folder - create Default folder. Move layout files from the "/Content/MenuLayouts/[menuAlias]" to "/Content/MenuLayouts/[[menuAlias]]/Default" folder.

3) Go through every layout "*.layout" file inside each "/Content/MenuLayouts/[[menuAlias]]/[[layoutGroup]]" folders and change the include string part like this:

/_MenuLayouts/{{this.alias}}

to

/Content/MenuLayouts/{{this.alias}}/{{this.layoutGroup}}

Backlog

Add Menu LayoutGroups to liquid component

Extend module component to use layoutGroup param:

{% component type: "menu", alias: "test", layoutGroup:"myCustomLayout" %}


If layoutGroup is empty string or null (parameter is not set) - use default.

layoutGroup should work the way described below:

  • Find /Content/MenuLayouts/{{this.alias}}/{{this.layoutGroup}}/menu.layout file and parse it instead of old /_MenuLayouts/{{this.alias}}/menu.layout
  • if file was not found - render empty string

Liquid changes:

add layoutGroup to this scope

Backlog

Upgrade menu in component toolbox

Selecting menu should be similar to Event subscription form:

http://prntscr.com/n4ops8

Default value for layoutGroup should be "Default".


New component parameters look like:

{% component type: "menu", alias: "[[someAlias]]", layoutGroup: "[[selectedLayoutGroupName]]"

%}

Backlog

‘Delete all items’ button (improved UI)

Add button "Delete all items" to bulk action list on list-view of a module.

Confirm window should be the same as for existed bulk delete action.

If user leaves the page while deleting process still running - show alert message:
Deleting items is still in process.

It will continue after you leave this page.

Design: http://prntscr.com/nd9k2w

Backlog

Custom Module - Properties - Advanced custom property editing

Ability to change custom module custom property data types.

Add alert message when type change will cause irreversible data changes:

WARNING: changing field type will cause data loss. Do you wish to proceed anyway?

Transformations are based on rules described in the documentation for Custom Modules.

Backlog

Edit & Re-shuffle Tags In Modules

Add ability to edit "Tags" in modules.

Add ability to reorder tags.

Backlog

Image manager in wysiwyg

Ability to access the file manager for image placement within WYSIWYG tools.

Beta

Import/Export feature improvement

Extended version of import/export file.

Add “disable from site search” property to the import/export file

Beta feature: Activate by checking the ‘Advanced Module Import/Export’ flag in the Beta area.

Bug

Release date issue on module items

When creating custom module item - its release date saved with incorrect hours.

When click save again - date is changed again until release date is changed to +1 day.

Expected:

Release and expiry date should be saved with time 00:00:00 in the site's timezone. Time part of the submitted datetime should be fully ignored - just force 00:00:00 in the site's timezone

Resaving should not change the time.

Bug

“site.webmanifest” Files Not Supported

"site.webmanifest" files are not accessible via their URLs and are therefore not usable by browsers and other applications.

Expected:

When adding site.webmanifest file with content to ftp root.

Go to /site.webmanifest url.

Access file's content.

Actual:

HTTP ERROR 404

Bug

Login to admin - can't access first few times

Issue with admin login not allowing access and returning to the login screen several times before finally allowing access.

Bug

Site Search With Multiple Keywords

Site search using more than one word as the search term is not returning any results, even with site reindexed.

Bug

Link Manager Changes the Link text

When using the Link Manager in the WYSIWYG editor for linking to a page, the Link Manager will overwrite the text selected as link with the name of the page.

Example:

"This is my LINK"

Then select "LINK" and go to the Link Manager and choose "Page" and then choose a page called "Test".

Your link will now show: "This is my Test" instead of still showing: This is my LINK"

Show more less
New Feature

BONUS: Lawyer Template

New custom grid template "Lawyer" is available from Partner Portal for all types of users.
  • Templates
New Feature

BONUS: Photography Template (Foundation)

New Foundation template "Photography" is available from Partner Portal for all types of users.
  • Templates
Improvement

BONUS: Custom Module Import/Export

1) Extended version of import/export file
2) Add disable from site search property to the import/export file
  • Custom Modules
Improvement

BONUS: Edit & Re-shuffle Tags In Modules

Ability to edit and shuffle “Tags” in modules. Right now, you can only add. So, if you make a mistake, misspell, etc, you need to delete the tag and re-add it again.
Also, would be nice to have the ability to re-shuffle tags (i.e. order of tags)
  • Custom Modules
Improvement

Code View In Custom Module WYSIWYG

The ability to go to “Code View” in custom WYSIWYG field in Custom module. (Not in the native item description field where is works already)

code-view-wysiwyg.png

  • Custom Modules
  • UI/UX
  • WYSIWYG Editor
Improvement

Menu Layouts Inline With Other Modules

For consistency, I’d like to see Menu layouts brought into the admin more in line with how all other module layouts are managed.

Some mockups below: menu-layout1.png

menu-layout2.png

menu-layout2.png

  • Admin Panel
  • Menus
Improvement

Update Import Templates To Allow "Disable From Site Search" For Items During Import

Items imported into Treepl using Templates do not always need to be found by Site Search.

By default, all imported Items are found by Site Search.

In Use Cases where Items should not be searchable it is necessary to edit every Item after it is imported and check the Disable From Site Search check box.

A number of partners have encountered this issue,...

  • Treepl Portal
Bugfix

BUG: Site Search With Multiple Keywords

Site search using more than one word as the search term is not returning any results, even with site reindexed.
Tested on both a live site and a trial site.

  • Bugs
  • General
Bugfix

BUG: “site.webmanifest” Files Not Supported

“site.webmanifest” files are not accessible via their URLs and are therefore not usable by browsers and other applications.

  • Bugs
  • General
Bugfix

Link Manager Changes Link Name

When using the Link Manager in the WYSIWYG editor for linking to a page, the Link Manager will overwrite the text selected as link with the name of the page. 

Example:

"This is my LINK"

Then mark "LINK" and go to the Link Manager and press "Page" and then choose a page called "Test".

When...

  • Bugs
  • General
  • WYSIWYG Editor
v 4.0.2 Release date: 27 Mar, 2019
Improvement

Auto-Collapse Item Settings / Custom Properties Toggle

The ability to have a “cookie” set to remember when you click the toggle to collapse container?
This way when you go back it is still set as collapsed? Or somewhere in a General Settings area where you can have it set to Auto Collapse (like a Global Setting).

Also the ability to apply this to the ‘Items Per Page’ pop-up...

  • Admin Panel
Bugfix

Events Not Sorting By ‘EventDateStart’ And ‘EventDateEnd’

When using sortBy parameters in the component module for events, ‘EventDateStart’ and ‘EventDateEnd’ do not work to sort by those dates.

  • Bugs
  • Events
Bugfix

Saving Template Will “Postpends” A "-1"

When saving Templates after within Content Template, it “postpends” a -1 after it.
Even after -1 is removed it brings it back again.

If saving it again, adds a 2, saving it a third time adds a 3 etc.

Screen shot is after removing, saving, back to list view, saving, and it comes back again.

template.png

  • Bugs
  • Pages and Templates
v 4.0 Release date: 20 Mar, 2019

Full Release Notes

Backlog

UPDATE
Liquid date filter - convert number to date

Now Liquid can convert numbers to date (interpreted as number of seconds from 1st Jan 1970).

For example:
{% assign newStartDateSeconds = 'now' | date: '%s'| minus: 1209600 %}
{% assign newStartDate = newStartDateSeconds | date: '%e-%b-%Y' %}

Backlog

WYSIWYG - Image padding UI

Provide ability to add/edit spacing around images

http://prntscr.com/n0jspm

Backlog

Managing Content templates through FTP

Add ability to manage Content Template via FTP.

Folder to check files in:

/Content/ContentTemplates

File to check schema:

.html

If Content template created in admin contains unaccessible symbols for file name - replace them with empty string ("") for file name (name of the template remains the same).

Extend Content template with the same FTP Path variable as Pages has.

Managing functions are the same as for pages:

  • create file -> create template
  • delete file -> delete template
  • update file -> update template's content
  • rename file -> rename content template
  • All above vice versa

Backlog

Managing Snippets through FTP

Add ability to manage Snippets via FTP.

Folder to check files in:

/Content/Snippets

File to check schema:

.html

If Snippet created in admin contains unaccessible symbols for file name - replace them with empty string ("") for file name (name of the Snippet remains the same).

Extend Snippets with the same FTP Path variable as Pages has.

Managing functions are the same as for pages:

  • create file -> create Snippet
  • delete file -> delete Snippet
  • update file -> update Snippet's content
  • rename file -> rename Snippet (alias remain the same)
  • All above vice versa

Backlog

Managing Email templates through FTP

Add ability to manage Email Template via FTP.

Folder to check files in:

/Content/EmailTemplates

File to check schema:

.html

If Email template created in admin contains unaccessible symbols for file name - replace them with empty string ("") for file name (name of the template remains the same).

Extend Email template with the same FTP Path variable as Pages has.

Managing functions are the same as for pages:

  • create file -> create template
  • delete file -> delete template
  • update file -> update template's content
  • rename file -> rename Email template
  • All above vice versa

Backlog

Managing Module Layouts through FTP

Add ability to manage Module Layouts via FTP.

Folder to check files in:

/Content/ModuleLayouts/

File to check schema:

.html

If Module Layout created in admin contains unaccessible symbols for file name - replace them with empty string ("") for file name (name of the Module Layout remains the same).

Extend Module Layouts with the same FTP Path variable as Pages has.

Managing functions are the same as for pages:

  • create file -> create Module Layout (as list layout)
  • delete file -> delete Module Layout
  • update file -> update Module Layout's content
  • rename file -> rename Module Layout
  • All above vice versa

Backlog

Managing Forms through FTP

Add ability to manage Forms via FTP.

Folder to check files in:

/Content/Forms

File to check schema:

.html

If Form created in admin contains unaccessible symbols for file name - replace them with empty string ("") for file name (name of the Form remains the same).

Extend Forms with the same FTP Path variable as Pages has.

Managing functions are the same as for pages:

  • create file -> create Form
  • delete file -> delete Form
  • update file -> update Form's content
  • rename file -> rename Form (alias remain the same)
  • All above vice versa

Backlog

Managing System Pages through FTP

Add ability to manage System Pages via FTP.

Folder to check files in:

/Content/SystemPages

File to check schema:

.html

If System Pages created in admin contains unaccessible symbols for file name - replace them with empty string ("") for file name (name of the System Page remains the same).

Extend System Pages with the same FTP Path variable as Pages has.

Managing functions are the same as for pages:

  • create file -> No Action (disallowed action for this type of item)
  • delete file -> No Action (disallowed action for this type of item)
  • update file -> update System Page's content (create file if it was deleted by ftp)
  • rename file -> No Action (disallowed action for this type of item)
  • All above vice versa

Backlog

Managing System Emails through FTP

Add ability to manage System Emails via FTP.

Folder to check files in:

/Content/SystemEmails

File to check schema:

.html

If System Email created in admin contains unaccessible symbols for file name - replace them with empty string ("") for file name (name of the System Email remains the same).

Extend System Emails with the same FTP Path variable as Pages has.

Managing functions are the same as for pages:

  • create file -> No Action (disallowed action for this type of item)
  • delete file -> No Action (disallowed action for this type of item)
  • update file -> update System Email's content (create file if it was deleted by ftp)
  • rename file -> No Action (disallowed action for this type of item)
  • All above vice versa

Backlog

Managing Workflow Emails through FTP

Add ability to manage Workflow Emails via FTP.

Folder to check files in:

/Content/WorkflowEmails

File to check schema:

.html

If Workflow Email created in admin contains unaccessible symbols for file name - replace them with empty string ("") for file name (name of the Workflow Email remains the same).

Extend Workflow Emails with the same FTP Path variable as Pages has.

Managing functions are the same as for pages:

  • create file -> create Workflow Email
  • delete file -> delete Workflow Email
  • update file -> update Workflow Email 's content
  • rename file -> rename Workflow Email (alias remain the same)
  • All above vice versa

Backlog

Beta Feature flags

Ability to enable/disable some beta features before they become default.

http://prntscr.com/n0jx5m

Backlog

Default auth cookie life time to 24h

Extend cookie life time after log in to secure zone from 30 min to 24hrs

Backlog

Admin URL management improvement

  • Remove # from url routes in admin
  • On login - redirect user to previous page (if user was redirected to login by the app).
  • If user goes via old urls with # - redirect him to the correct new styled URL

Backlog

Liquid engine refactoring (ALPHA)

Refined and optimized Liquid Parsing process.
Feature is in ALPHA state for now and under internal feature flag.
Feature is disabled by default but we can manually enable it upon request for any of your trial sites if you wish to play with it.

Benefits of the feature:

  • Parsing process now goes starting from template instead of page content.
  • Liquid parsing speed is slightly increased.

Feature is incompatible with nICE for now (compatibility is under development).

Bug

Allow ‘Amount’ payment when Event Price is 0

When

  • Event Has Price field set to 0
  • Form Has AcceptPayment field ON
  • Form Has AcceptEventSubscription field ON
  • Form submission data has Amount > 0

Than - proceed payment the same way as it does for event by event.price BUT use FormSubmissionData.Amount as Price

Show more less
New Feature

WYSIWYG Editor - Image Manager

Need to have the ability to add Spacing and Image Compression options as well, similar to how Shopify handles this

Right now one need to manually go in and update Margins. Would also be good to assign a custom CSS class to images.

wysiwyg-image-manager.png
  • Admin Panel
  • WYSIWYG Editor
Improvement

FTP Access to Templates Etc.

FTP access to Pages, Menus, Content Templates, Snippets, Web forms (!), Blogs + Blog Posts, Events and Event Groups, Banners (Ad rotators), Galleries/Sliders (Photo Galleries), Authors, FAQ's, Custom Modules, Workflow Emails, System Emails, Email Templates and System Pages
  • FTP
v 3.3 Release date: 27 Feb, 2019

Full Release Notes

Backlog

Documentation link in the admin

Documentation link in the admin should be viewed only for partners:

http://prntscr.com/mmlqzg

Backlog

'Do not use template' and 'use default' template behavior

Modify content template and email template wrapping behavior:

  1. Assigned template field is number field
  2. If number is int value > 0
    • Try find template by this ID. Apply found template to the content.
    • If template not found - go to step 4
  3. If number is int value == 0
    • Check for default template for this type of content. If found - Apply found template to the content.
    • If default template not found (or not provided) - go to step 4
  4. If number is int value == -1 or null (force apply -1 in this case if it happens while saving process)
    • Force apply Pseudo-template with the content:
      {{pageContent}} - for the Content Templates
      {{this.emailContent}} - for the Email Templates

In Admin added 2 options when assigning Content Template and Email Templates:

  • Don't use template (value -1)
  • Use default template (value 0)

Backlog

Event - Calendar Support

Design: http://prntscr.com/mu68eb

Responsive calendar support for Events:

  • Create JS plugin that builds month based calendar for events
  • Add ajax query for events for current month and display them on the calendar
  • Calendar should be responsive

Created new include file "/cms-assets/includes/event-calendar.inc".

Add component toolbox option

  • Events->Calendar
  • Select event group:
    • all (all items)
    • ungrouped (items in the root level, outside of any group)
    • (name of any created event group)
    • ...
  • show code:

Backlog

Add "Parentname" To module Component

  1. Add "templatename" to the module component to target the name of the template.
  2. Add "parentname" to the module component to target the name of the parent item (that can be defined by parentid).
  3. Add parenturl

{% component source: "Page", layout: ""...
{
"id": 1832,
"url": "",
" parentid": 1833,
" parentname": "Name of Parent",
" parenturl": "/relative/url",
"templatename": "Name of Template",
"lastupdateddate": "2018-10-21T23:34:21","

Backlog

Home Page Status Available In {{this}} Object

Include the ‘Set as Home Page’ data within the {{this}} object so we have it available in Liquid.

It can be helpful to know for setting certain conditions in the template; just some examples:

· Show a hero slider above content when on home page
· Do not show a global subscription pop-up/modal window when on home page


{{this}}:


{
"id": 1832,
"url": "",
"parentid": 1833,

"isHome" : true,

...
}

Backlog

Direct Link To CRM Form Submission Entry

  • Ability to grab direct link to CRM form submission entry from either the 'formsubmission' or workflow collections to place in workflow email.
    This is so that one can direct a workflow recipient straight to the Form submission in the admin console. Something like
  • {{this.formSubmissionData.crmContactLink}}
  • {{this.formSubmissionData.crmFormSubmissionLink}}
  • {{this.formSubmissionData.crmEventBookingLink}}
  • Add link to CRM contact from within the Form Submissions in the Admin: http://prntscr.com/mmlfnn (email address goes to CRM record, not a mailto: their email address)

Backlog

Internal Custom Module Search

The ability to search all items in Module List even with “Disable from Site Search” checked.

“Disable from Site Search" should only be for the front end site only, and not internally.

Looks like you lose search functionality within the custom module list when it is checked.

https://treepl.co/images/public-roadmap/Internal-Custom-Module-Search.png

Backlog

File Exports: Prepend Site URL And Postpend Date

When exporting files add the site url to the beginning of the file name and the date to the end of the filename i.e.

'website.com-team-module-export-2018-12-30.xls'

Backlog

Remove Event specific fields from Event Group module

These fields should not be present and are used for Event items, not their groups:

http://prntscr.com/mhi8h7

Backlog

Global setting for enable/disable text wrapping on a new line

Add a global setting that will enable/disable text wrapping on a new line in the ace editor.

'Settings' > 'Misc'

Backlog

Keyboard shortcut to save content in ACE and WYSIWYG editors

Apply CTRL+S/Command+S Shortcut Keys to save content when in ACE and WYSIWYG editors

Backlog

Reindex site - checkstatus and disallow reindex when indexing in progress

Apply loader and disabling of reindex site button in order to prevent multiple reindex process trigering. Button should be disabled even after page reloading.

Once reindex is finished - remove the loader and activate reindex button.

Design - http://prntscr.com/mu66s9

Backlog

Show treepl cms version in the admin


Show treepl cms version in the admin

Design - http://prntscr.com/mu679j

Backlog

Rename Documents to File Manager in WYSIWYG link manager

Rename "Documents" title to "File Manager" in WYSIWYG link manager http://prntscr.com/mnbls0

Backlog

Show Template and release date on module item list view

Add columns to module item list view in Admin:

  • Template
  • Release Date

Provide ability to sort by Release Date

Bug

Empty google analytics view ID showing and missing

http://prntscr.com/mgwu2g

Fix bugs with head auto added items:

  • tag is missing
  • google analytics code should not be output if no tracking id is set in the analytics settings.

Bug

OpenGraph Properties in Liquid not accessible

`{{this.opengraphproperties}}` renders the sub-properties as JSON ok, but couldn't access those sub-properties directly, ie: `{{this.opengraphproperties.title}}`.

Show more less
New Feature

Add TreeplCMS Version Number In Admin

Add version number in the admin

{% unless request.request_url.href contains "?tag" -%} version-number.png

{% endunless -%} ...
  • Admin Panel
New Feature

Calendar Support

Responsive calendar support for Events.
  • Events
New Feature

Use Blank Template

Sometimes when you want to create a new page on a site you don't want to use a template - perhaps for a differently style landing page or some other random page. Currently the system pulls in the default template. Can we have a page option that allows 'Don't use a template'.

  • Templates
Improvement

Add "Parentname" To Component Source: “Page”

Add "parentname" to component source: page to target the name of the template.

{ % component source: "Page", layout: "".........
{
"id": 1832,
"url": "",
"parentid": 1833,
"parentname":
"lastupdateddate": "2018-10-21T23:34:21","


  • Pages and Templates
Improvement

Direct Link To CRM Form Submission Entry

Ability to grab direct link to CRM form submission entry from the either the formsubmission or workflow collections to place in workflow email.
This is so that one can direct a workflow recipient straight to the Form submission in the admin console. something like {{ this.formSubmissionData.crm_link }} ...
  • CRM
  • Liquid
Improvement

File Exports: Prepend Site URL And Postpend Date

When exporting files add the site url to the beginning of the file name and the date to the end of the filename i.e. website.com-team-module-export-2018-12-30.xls
  • Admin Panel
  • General
Improvement

Home Page Status Available In {{this}} Object

Include the ‘Set as Home Page’ data within the {{this}} object so we have it available in Liquid.
It can be helpful to know for setting certain conditions in the template; just some examples:

· Show a hero slider above content when on home page
· Do not show a global subscription pop-up/modal window when on home page...
  • Liquid
Improvement

Internal Custom Module Search

The ability to search all items in Module List even with “Disable from Site Search” checked. “Disable from Site Search" should only be for the front end site only, and not internally. Looks like you lose search functionality within the custom module list when it is checked.

Internal-Custom-Module-Search.png
  • Custom Modules
v 3.2 Release date: 12 Feb, 2019

Full Release Notes

Backlog

Custom module items: Inheriting default settings on import/create from frontend

Use custom module settings on events below.

-> Settings -> 'Secure Zones'

  • Select Secure Zones

-> Item Properties -> 'Default Properties'

  • Default Template
  • Disable All Items From Site Search

Therefore, new imported items will inherit Custom Module setting. So if you have "Disable from Site Search" checked - all new imported items will have "Disable from Site Search" checked (already existing items will not be affected).


System flow:

  • Import Process:
    • IF items are new (create process):
      • If item template column is not specified: Set item template to "Default Template" setting of the module
      • Set Items' "Disable All Items From Site Search" property using value of the "Disable All Items From Site Search" setting of the module
      • Assign Items to Secure Zones that are Selected in the "Secure Zones" setting of the module http://prntscr.com/mgctf9
    • If Update Process
      • process remains the same as it is right now
  • Create module item from frontend (public create item API):
    • Set item template to "Default Template" setting of the module
    • Set Item's "Disable All Items From Site Search" property using value of the "Disable All Items From Site Search" setting of the module
    • Assign Items to Secure Zones that are Selected in the "Secure Zones" setting of the module http://prntscr.com/mgctf9

Backlog

Datetime oriented by site Timezone

On site creation process, save selected timezone to the site.

On the site use saved timezone for all date based variables.

Backlog

SiteSearch index rebuild function

Added Rebuild Index button to the header of the admin http://prntscr.com/mlioin

Clicking on it will trigger background process that will rebuild search index that is used by site search and custom module search

Backlog

Global 'Show this page for search engines' button

SEO:

Added two buttons under 'Pages search engines settings:'

  • Enable all
  • Disable all

Both do one time action - either enables or disables "Show this page for search engines" option in every system and custom module item.

http://prntscr.com/mlipzc


On click show confirmation message:

  • Are you sure you want to enable all pages for search engines?
  • Are you sure you want to disable all pages for search engines?

Backlog

Added SUBSCRIPTIONS tab to event item

http://prntscr.com/mlir0a

Backlog

Events in secure zones

Add ability to select event items from secure zone items combobox

Backlog

Add Event links to Menu link widget

Add ability to select event groups/items for menu items http://prntscr.com/mgihun

Backlog

restore_password/activate_account token lifetime change

Increase restore_password/activate_account token lifetime from 30 min to 24h (allowed secure zone users not respond longer on restore password emails. Especially make sense if restore password was triggered manually by the admin)

Backlog

File creation during copy page bugfix

Fixed issue caused during copying of a page: page file was not created.

Backlog

Add search form to Component Manager + search by trpEvents fields

Add Events -> Search Form item to the Component Manager http://prntscr.com/mgimch

Provide same iterface as for the Custom Module search form (except for selecting module since Event is the only module available for the section)

Generated search form should contain Event specific fields and be able to search by them:

  • prop_Price_Min (text input)
  • prop_Price_Max (text input)
  • prop_EventStartDate_Min (text input)
  • prop_EventStartDate_Max (text input)
  • prop_EventEndDate_Min (text input)
  • prop_EventEndDate_Max (text input)
  • prop_AllowMultipleSubscriptionPerEmail (checkbox)
  • prop_HideWhenFull (checkbox)
  • prop_Capacity_Min (text input)
  • prop_Capacity_Max (text input)
  • prop_Allocation_Min (text input)
  • prop_Allocation_Max (text input)

Backlog

Implement Emmet In The ACE Editor

Emmet is a system that allows coders to write shorthand and have it expanded when you push the tab key. It can save a lot of typing when writing web pages. Eg. you type 'p' and then press 'tab' and you get:

, or you type 'div.wrapper' and 'tab' you get:

You can even do more advanced things like creating multiple instances with nested objects.

Here is an code playground of Emmet implemented in Ace (Go ahead and type p +tab on an empty line or ul>(li.item>a)*5 plus tab. ) https://ace.c9.io/demo/emmet.html

Here is the documentation for Emmet https://docs.emmet.io/abbreviations/syntax/

Backlog

Collapse, And/Or Pre-collapse Content Boxes

Ability to collapse/expand content boxes in pages / templates / modules, etc. https://prnt.sc/mgi9l7

Backlog

Rename "seoTitle" To "metaTitle"

Module Item -> SEO tab:

Rename "seoTitle" to "metaTitle" for consistency and accuracy.

Backlog

WYSIWYG - Image and links titles

Add ability to set/edit titles for links and alt text for Images inside the WYSIWYG

Backlog

Extend meta description symbols limitation

Extend meta description symbols limitation to 1000

Backlog

Inactive state for module items (by dates)

Display inactive state on items list and tree view:

Item is inactive when currentDate < Release date or currentDate > Expiry date

Backlog

WYSIWYG - URL browser for links

Add ability to choose URL for links from:

  • Built-in modules (Pages, Blogs, etc.) and Custom Module items
  • Documents (File Manager))
  • external url

Similar to BC widget:

http://prntscr.com/mgiv0i

Backlog

Improve load speed of the pages

Pages that uses many liquid components now loads faster.

Backlog

Rollback overriden params in modules

When rendering module inside layout of the another module - params variable should not be overriden by the nested module.

Example

On any page:

Inside "List" layout of the "Example" module:





Inside "List" layout of the "Example 2" module:

any string


Expected:

  • myValue
    Any StringAny String
    myValue
    Any StringAny String
    myValue
    Any StringAny String

Actual

  • myValue
    Any StringAny String

    Any StringAny String

    Any StringAny String

Bug

ACE editor cut of JS content

Steps:

  • Enter code below to the page
  • Before



    After

  • click save

Expected:

  • Before



    After

Actual:

  • Before


Bug

Allow create sites under trialsite.co

Sites under trialsite.co now creating properly(previously was created under treepl.co domain)

Bug

Empty Google Analytics view ID showing

Google Analytics code will not be viewed if no tracking id is set in the analytics tab.

Bug

Liquid: Roll back number filter

" | number" filter is restored(previously was accidently removed from filters).

Bug

Allow event start date to be set to past

When saving Event:

Expected:

  • Start Date can be set to the past.

Actual

  • Validation error: The event has already ended.
Show more less
New Feature

BONUS: Advanced Link Manager inside WYSIWYG Editor

In the WYSIWIG editor on pages or any other location where a url / link is may be added (blog, page edits, custom modules ) -

- "browse to url"

- link option to open in a popup

- add "title" tag to url links


insert-link">

  • General
  • WYSIWYG Editor
New Feature

Match Date Format To Site's Time Zone

Display dates in the correct format depending on time zone selected in site settings in partner portal.
  • Admin Panel
Improvement

BONUS: Enable/Disable All Pages/Module Items for Search Engines

Ability to show or hide all pages/modules of the site for search engines (sitemap.xml needs be regenerated after disabling/enabling this feature).
enable-disable.png
  • SEO
Improvement

Collapse, And/Or Pre-collapse Content Boxes

Ability to collapse, and/or pre-collapse content boxes in pages / templates / modules, etc.


collapse-content-boxes.png

  • UI/UX
Improvement

Implement Emmet In The ACE Editor

Emmet is a system that allows coder to write shorthand and have it expanded when you push the tab key. It can save a lot of typing when writing web pages. Eg. you type p the tab and you get <p></p>, or you type div.wrapper and tab you get <div class="wrapper"></div> You can even do more advanced things like creating...
  • Admin Panel
Improvement

Rename "seoTitle" To "metaTitle"

Rename "seoTitle" to "metaTitle" for consistency and accuracy.
  • Blogs
  • Custom Modules
  • Pages and Templates
  • UI/UX
v 3.1 Release date: 29 Jan, 2019

Full Release Notes

Backlog

Event Groups and Events (CRUD)

Create two nested system modules (Event Group and Event) similar to the blog structure (Blog and Blog Post).

Event Group module created in order to help grouping events rather than keeping them all in one single list. Although, you're still able to view events in one list. For this reason List View was set as default layout (with ability to switch to Tree View http://prntscr.com/mf70zr
Unlike the blog and blog posts - events are allowed to be created in the root level of Event Groups and events (Blog post can’t be created in the root level only in the blog for example).

Event module has event specific fields:

  • Date From
  • Date To
  • Capacity: (number)
  • Hide when full: (boolean)
  • Price : (number)
  • Allow multiple subscription per one email: (boolean)

Backlog

CRM -> Booking Subscriptions created by an Event Form submission

If formData.eventId is not null - trigger eventSubscription flow:

  • Set allocations from formData.allocations. If value is empty or "<1" then set allocations=1
  • Validate Event Subscription (separate task created with the description)
  • If event has price not null and ">0" then trigger event payment flow
    • if payment is succeed
      • use standard form's redirect/output flow
    • Otherwise show payment error message from the payment flow
  • Otherwise - create event booking record from formData info and use standard form's redirect/output flow

Backlog

Form -> Event subscription validation

Event Subscription Validation:

  • Check event exists by formData.eventId:
    • if not found, alert: Event with such id does not exist
  • Check event is still available:
    • not disabled
    • Current Date is between EventDateStart and EventDateEnd (if EventDateEnd is empty - use EventDateStart with time 23:59:59)
    • Current Date is between ReleaseDate and ExpiryDate (same way as used now in custom modules), alert: The event you are subscribing for is not available
  • Check capacity and allocation requested. Messages:
    • if capatity = current event allocation, alert: The event is full
    • elseif capatity < (currentEventAllocation + formData.allocation), alert: The event hasn't enough seats. Only [[capatity-currentEventAllocation]] seats left.
  • Check Allow multiple subscription per one email
    • If Allow multiple subscription per one email option is false and formData.email is already subscribed to the event, alert: You already subscribed to this event

Backlog

Events

Permissions and Menu integration

Backlog

CRM -> Booking Subscription

Permissions and Menu integration

Backlog

CRM -> Orders section

Permissions and Menu integration

Backlog

Component box -> Events

  • List of Events and Event Groups (same as for module items but with such fields as capacity, price etc)
  • Event Subscription Form
    • List of Events to choose from. Default option is "For detail layout" which gives the form a value as {{this['id']}}. Example:
      {% component type: "form", alias: "[[formAlias]]", eventId: "{{this['id']}}" %}
    • list of forms (that has acceptEventSubscription field enabled).
    • Once user selects form and an event item, show code for copying, example: {% component type: "form", alias: "payment_form", eventId: 1939 %}

Backlog

Settings -> Payment Settings

Payments Gateways Section (also added to Permissions and Menu integration)

Gateway (select) options:

  • Stripe

Backlog

Payments Gateway - Section [Stripe]


Stripe Settings:

  • Key (required) (string)
  • Currency (string) (Default USD)
  • Image (string) (with upload widget like http://prntscr.com/mbx4v0
    Tooltip: A relative or absolute URL pointing to a square image of your brand or product.
    The recommended minimum size is 128x128px.The supported image types are: .gif, .jpeg, and .png

Specified image will be shown here http://prntscr.com/mf7c8a

Backlog

Form -> Form builder -> 'Accept Payment' and 'Accept Event Subscription' buttons

Option to add 'Accept Payment' and 'Accept Event Subscription' to the form on form builder section

  • Accept Event Subscription, generates the below code before the
    element:

    {% if params.eventId != null %}

    {% component source: "Event", layout: "", filterBy: "id", filterValue: "{{params.eventId}}", collectionVariable: "formEventData", type: "module" %}

    {% assign formEvent = formEventData.items[0] %}

    {% assign paymentAmount = formEvent.price %}

    {% assign orderDescription = formEvent.name %}

    {% assign orderName = "Book an event" %}

    {% endif %}

    Generated inside the element:

    {% if params.eventId != null %}

    <input type="hidden" name="eventId" value="{{formEvent.id}}" data-trp_price="{{paymentAmount}}">

    <label for="allocations">Allocation</label>

    <input type="text" name="allocations" data-trp_quantity="1" value="1">

    {% endif %}

    Therefore:

    If form has “Accept Event Subscription” field selected – you can specify event you want to subscribe for by id in component tag:
    {% component type: "form", alias: " [[formAlias]]", eventId: "1939" %}

  • Accept Payment, generates the below code inside the element:

    <label for="PaymentType">Payment Type</label>

    <select id="PaymentType" name="paymentType"> <option data-currency="" data-image="" data-key="" value="stripe">Stripe</option> </select>

    <input type="hidden" name="paymentData" value="">

    <label for="Amount">Amount</label>

    {% if paymentAmount == null %}

    {% assign paymentAmount = params.price | default: 0 %}

    {% endif %}

    <input type="text" id="Amount" name="Amount" value="{{paymentAmount}}" data-trp_price="{{paymentAmount}}">

    Generated as data-attributes on the element:


    data-trp_order_name="{{orderName | default: this.name}}" data-trp_order_description="{{orderDescription}}"

    Generated inside the page element:

    <script src="https://checkout.stripe.com/checkout.js"></script>
    <script src="/cms-assets/js/payment.js"></script>

    Therefore:

    If form has “Accept Payment” field selected – you can specify price in component tag:
    {% component type: "form", alias: "[[formAlias]]", price: "20" %}

Backlog

Add file payment.js and main.css to /cms-assets directory

Create/Update files:

  • /cms-assets/js/payment.js
    (for payment flow in general and stripe flow in particular)
  • /cms-assets/css/main.css
    (minified version of the default styles)

NOTE:

All files in /cms-assets folder could be overridden by treepl team via sprint updates. So don’t make any changes in those files. If you want to change something that is affected by those files – add them to your own files or remove default scripts and styles from desired pages.

Backlog

Payment Form Processing Logic

Payment flow

  1. If Form Payment type:
    • Event:
      • Get event.price
      • get totalAmount = event.price * allocations
    • General:
      • get totalAmount = formData.Amount
  2. Payment process:
    • If formData.paymentType == 'stripe'
      • Get token from formData.paymentData
      • Verify totalAmount with token
      • If success - end flow
      • else - show message: Payment is failed: [[error message from stripe]]

Backlog

System Email -> Invoice

Create new System Email that should be sent on successful payment

{{this.order}} liquid object contains

  • {{this.order.id}}
  • {{this.order.MemberEmail}}
  • {{this.order.MemberId}}
  • {{this.order.MemberLink}} (link to admin to CRM -> Order -> particular order)
  • {{this.order.Link}}
  • {{this.order.items}} collection of objects. Object ({% for item in this.order.items %}):
    • {{item.entityid}}
    • {{item.entityType}} (Event, Form)
    • {{item.name}}
    • {{item.price}} (totalCost/quantity)
    • {{item.quantity}}
    • {{item.totalCost}}
    • {{item.currency.code}}
    • {{item.currency.symbol}}
    • {{item.currency.digitalCode}}
    • {{item.currency.name}}
  • {{this.order.Status}}
  • {{this.order.PaymentType}}
  • {{this.order.TotalCost}}
  • {{this.order.currency.code}}
  • {{this.order.currency.symbol}}
  • {{this.order.currency.digitalCode}}
  • {{this.order.currency.name}}
  • {{this.order.TransactionID}}
  • {{this.order.CreatedDateTime}}
  • {{this.order.UpdatedDateTime}}

Backlog

Submission Process -> Custom Invoice behavior

On form submission process:

  • If payment
    • Check for name="customInvoiceId" field.
      • If found Email by that id - use that content for invoice
      • If not found or name="customInvoiceId" is null - send default System Email -> invoice

Backlog

Set admin page titles

Setup page titles in admin the same as in the title inside the content http://prntscr.com/m8rw77

Backlog

Recaptcha V3

  • Recaptcha v3 now a new button in the Form -> form builder.
  • Disallow - recaptcha v2 and recaptcha v3 to be selected together for a form (validation upon save)

Backlog

Add form related scripts only if they are required

Scripts should be automatically added before ONLY if there is at least one form that requires it.

  • recaptchav2
  • recaptchav3
  • acceptPayment field

Backlog

Sitemap generator - release/expiry options fix

Apply release/expiry options on Sitemap generator Only if they are Enabled in the module settings

Example:

  1. http://prntscr.com/m82qpa
  2. http://prntscr.com/m82qdp

Backlog

Upgrade liquid filters to the latest version of the liquid library

This fixed some issues like:

  • Divided_by will no longer be integer division.
    {{3 | divided_by : 2}} will be 1.5 instead of 1 as it was before
  • Sort filter now can sort simple arrays (not only array of objects by object’s field as it was before)
    {% assign arr = "c,d,a,b" | split: ","| sort | join: "," %}
    {{arr}}
    now returns a,b,c,d
  • Added sort_natural filer (case insensitive sorting)

Filter list now is (bolded items are new):

  • Array Filters:
    • join
    • first
    • last
    • concat
    • map
    • reverse
    • size
    • sort
    • sort_natural
    • uniq
  • Misc Filters
    • default
    • date
    • format_date
    • compact
    • url_encode
    • url_decode
    • strip_html
    • escape
    • escape_once
    • handle
    • handleize
  • Number Filters
    • ceil
    • divided_by
    • floor
    • minus
    • modulo
    • plus
    • round
    • times
  • String Filters
    • append
    • capitalize
    • downcase
    • lstrip
    • rstrip
    • newline_to_br
    • prepend
    • removefirst
    • remove
    • replacefirst
    • replace
    • slice
    • split
    • strip
    • truncate
    • truncatewords
    • upcase

Backlog

Empty custom menu fix

If custom menu consist only from empty items force redirect to menu configurator not the login screen.

Backlog

Add datasource name and datasource url to the item liquid data

Add datasource name and datasource url to the item liquid data:

  • {{this.dataSourcePropertyAlias}} - ID as it is now
  • {{this.dataSourcePropertyAlias_name}} - name of the datasource item OR null (if no item found by dataSourcePropertyAlias ID).
  • {{this.dataSourcePropertyAlias_url}} - url of the datasource item OR null (if no item found by dataSourcePropertyAlias ID).

Backlog

Convert Author image custom property from type Text to type Media

Convert Author image custom property from type Text to type Media (without losing currently saved values)

Backlog

Search custom modules by parentId and url slug

Add ability to search custom modules using

  • prop_Slug (equals rule)
  • prop_Url (contains rule)
  • prop_ParentId (add by default to search form html under prop_ModuleId with value "":
    • "-1" means the parent module's root folder id.
    • Empty means skip this filter

Backlog

Create new module - disable save button while saving

While creating a custom module when clicked save once Save button should become inactive.

If validation errors occurs - enable button

Bug

Default gallery layout wasn't patched

In Gallery/Slider Layouts -> Default List now creates correctly functioning layout code:

Bug

First login (after some time past) to the site admin issue

When admin user tried to login to the admin panel (after some time past) - it just keeps looping the login page (first time).

After refresh the page login works fine

Bug

Can't save page when its ftp html file name contains Capital letters

After creating an HTML page via the File Manager an error would be thrown if attempting to later save that page via the admin 'Pages' section.

Bug

Liquid engine – recursion fix

  • In menu sub item layout (/_MenuLayouts//sub_items.layout)
  • if replace {% for item in currentItem.items %} with {% for item in this.items %}
  • would result in infinite recursion that dramatically slowed down the site
Show more less
New Feature

Canada (Central) Data Center

Ability to create sites on Canada (Central) data center. Existing live and trial sites of Treepl Partners from Canada will be transferred by our admins upon request.
  • Infrastructure
New Feature

Booking Records

Adding event subscriptions as separate records inside CRM.
  • CRM
  • Events
New Feature

Payable Events, Items, Forms

- Ability to create events
- Ability to create event subscriptions
- Ability to create forms with payments
- Payments go through Stripe
  • Custom Modules
  • Ecommerce
  • Events
Improvement

reCAPTCHA v3 Support

The ability to add reCAPTCHA "invisible" so the user would not have to "solve" the reCAPTCHA by clicking the relevant images.
  • Forms
  • Secure Zones
v 3.0 Release date: 08 Jan, 2019

Full Release Notes

Backlog

Admin User Roles CRUD

Add ability to create, delete, update and view list of roles.

Each role detail layout provides a list of permissions based on the current site plan.

Backlog

Admin Users - permissions setup

Ability to set admin user role for every Admin User created.
Admin user can't setup role to themselves.

No admin user can edit/delete partner admin account.

Backlog

Admin menu configurator

Add ability to customize order, visibility and names of admin panel menu items.

Backlog

Change of custom menus and role restrictions with site plan upgrade/downgrade

  1. Plan Upgrade:
    1. Change site plan permission
  2. Plan Downgrade
    1. Change site plan permission
    2. Go through all admin user's roles and remove all permissions that is not exist in the current site plan permission
  3. New Module added
    1. Add new permission node to site plan permission
  4. Existing module deleted
    1. Remove permission node from site plan permission
  1. User Roles
    1. Go through all admin user's roles and remove permission for that module if such exists.

Backlog

Advanced admin search

Add ability to filter admin menu items by keyword

Backlog

{{this.formSubmissionData}} on thank you page

Added support for {{this.formSubmissionData}} to get access to formSubmissionData object the same way as now does {{formSubmissionData}}

{{formSubmissionData}} should also work as it does now for backward compatibility.

Custom thank you pages (by use of 'redirectURL' parameter) will also support both data tags.

Backlog

User friendly mailchimp error messages

Change "The resource submitted could not be validated. For field-specific details, see the 'errors' array." error message

http://prntscr.com/m2iqt3

To like:

"Validation error:

[Error key]: [error message]

..."

Backlog

System Pages and Emails default UI

Created folder in File Manager/FTP:

/cms-assets
Added here .css, .js, etc. that are needed for system pages and system emails.

Default system pages and emails on blank site include:

  • System pages
    • 404
    • Email Confirmation
    • Forbidden
    • Form Submission Results
    • Request Reset Password
    • Request Reset Password Result
    • Reset Password
    • Unauthorized
  • Galleries
    • Layout markup and js (with fancybox)
  • System Emails
    • Password Retrieve Email
    • Secure Zone Login Details
    • Workflow Notification
    • Confirm Email Notification
  • Forms
    • Email Notification (autoresponder)

Bug

Author column duplication in export bug

Repro Steps

  1. Go to any custom module.
  2. Enable authors in Properties section
  3. Go to items list
  4. Create item
  5. Call export
  6. Call export
  7. Call export

Expected

  • All 3 export files should contain only one Author column

Actual

  • Each next file has one more Author header column

Bug

Custom module search bug

Search by custom module form requires &paginatedModule=[[module_id]] param in order to paginate

Repro Steps

  • Go to page
  • Insert module search form via toolbox (check Display Pagination checkbox)
  • Save the page
  • Go to page
  • Click search
  • Go to second page
  • Remove &paginatedModule=[[module_id]] from the URL

Expected:

  • &prop_ModuleId=[[module_id]] is enough to determine module

Actual:

  • &prop_ModuleId=[[module_id]] is ignored, still waiting for &paginatedModule=[[module_id]]

Show more less
New Feature

Admin Menu Configurator

Ability to customize order and names of admin panel menu items.
  • Admin Panel
New Feature

Admin User Custom Restrictions

Ability to set custom restrictions for every Admin User created via roles.
  • Admin Panel
New Feature

Advanced Admin Search

Quick search of admin menu items.
  • Admin Panel
  • UI/UX
Improvement

_is_mobile_ Liquid Detection

Suggestion for {{request.request_data.is_mobile}} to become {{request.request_data.device_class}} with the output being 'mobile|tablet|desktop|...' as this will provide greater flexibility and future scalability as more device types could be added in over time. eg: 'tv|watch|glasses|car|spaceship|...'. Much like in BC we have {{globals.visitor.deviceClass}} giving us 'desktop|tablet|phone'.


The {{request.request_data.is_mobile}} just gives us a 'true|false' to whether it's mobile or not. I feel that the BC...
  • Liquid
v 2.4 Release date: 25 Dec, 2018

Full Release Notes

Backlog

Mailchimp API integration: Email Campaigns

Added 4 tabs for email campaign:

  1. Settings
    1. Name (100characters)
    2. Mailing List
    3. Schedule Delivery
      1. One time Campaign
      2. Schedule delivery
  2. Email info
    1. From Name(100 characters)
    2. FromEmail(100 characters)
    3. Subject(150 characters)
    4. Preview Text(150 characters)
  3. Content
  4. Preview(with ability to send test email)

Campaign can be changed between statuses:
Draft -> Sent (One time Campaign sent)
Draft -> Scheduled (Campaign scheduled)
Scheduled -> Draft (Campaign unscheduled)
Scheduled -> Sent (Schedule delivery Campaign sent)

Saving ability works only in Draft state.
Sent state doesn't allow any saving or unscheduling options.

Scheduled state allows unscheduling of the campaign (on preview tab).

Backlog

Mailchimp API integration: Send Email Campaign

Provided ability to send campaign

  • Instantly (if Settings - Schedule Delivery - One time Campaign setting selected and send button is triggered)
  • On specific time scheduled in campaign settings (if Settings - Schedule Delivery -Schedule deliver settings are set and send button is triggered)

Backlog

Mailchimp API integration: Send Test Email Campaign

Provided ability to send test campaign to the specific email addresses

Backlog

Email Marketing -> Campaign -> Toolbox for email content

Provided a toolbox with tags for email campaign content

Backlog

Partner Portal: Disable Save button after start creating site process

Save button now disables when site creating process is triggered

Backlog

Liquid consistancy in emails

  1. Body,Subject, FromEmail, FromName should be parsed by liquid:
    1. Forms -> Autoresponder
    2. Forms -> Workflow Emails
    3. Custom module item created from frontend -> Autoresponder
    4. Custom module item created from frontend-> Workflow Emails
  2. Context that passed for rendering Body should be also passed to email template:
    1. Forms -> Autoresponder
    2. Forms -> Workflow Emails
    3. Custom module item created from frontend -> Autoresponder
    4. Custom module item created from frontend-> Workflow Emails

Backlog

Partner Portal: Support Ticket Form

Created menu items "Support" that leads to the page with the form. On submit – if you are logged into codeproduction.co – your ticked will be created. If you are not logged in – you will be redirected to the login form. After successful submit of the login form – ticked will be created.

Bug

Sitemap is outputting disabled items

Sitemap will not add “disabled” module items.
Module items classified as “Disabled” are:

  • Enable checkbox is false
  • Release date is greater than current date
  • Expiry date is less than current date

Bug

Clicking on the same particular custom module in menu bug

When in a Custom Module showing list items, and you click on the same Custom module menu again, it doen't go to a blank screen any more -http://prntscr.com/lunwel

Bug

Over 4000 characters in form data crashes form submit

Fixed form submit error when submitting over 4000 characters (in sum between all form fields).

Bug

Filtering by tags and categories doesn't work

Fixed filtering by tags and categories via module search form. Previously result were:
Liquid Error: Invalid cast from 'System.String' to 'System.Collections.Generic.IEnumerable`1

Bug

nICE duplicates $ symbol in the content

If content contains "$1" or single "$" - after save dollar symbol doesn't duplicate multiple times.

Show more less
New Feature

Mailchimp API Integration Stage 2

Ability to create, update, delete and send Email marketing campaigns from Treepl CMS admin.
  • Marketing
v 2.3 Release date: 11 Dec, 2018

Full Release Notes

Bug

Double forward slash in URL when adding an item

Fixed double forward slash appending to the preview URL when creating new page/module item: http://prntscr.com/lue4cl

Bug

{{FormSubmissionData}} in autoresponders when creating a new item is not consistent

Submission data in autoresponders when creating new item now works correctly:

  • <pre>{{formSubmissionData}}</pre> - works case insensitive.
  • {{this.formSubmissionData}} - woking with or without the 'this' object.
  • {{this.formSubmissionData}} and {{this.member}} are now accessible in Email template for autoresponder when creating new module item.
  • Fixed empty object being returned if module had no custom properties, so system properties still accessible for general formSubmissionData object.

Bug

Custom Modules Search by categories, tags and checklists doesn't work properly.

Search by multiple categories, tags or checklist property values now works correctly and no longer results in a Liquid Error: Invalid cast from 'System.String' to 'System.String[]'

Bug

Opening custom module items in new tab goes to admin dashboard.

Opening custom module items in new tab now works as expected rather than redirecting to the admin dashboard.

Bug

Canonical link empty causing liquid error.

Fixed page crash if canonicalLink is empty (http://prntscr.com/lqz9vv) causing Liquid Error: This operation is not supported for a relative URI.

Now no <link rel="canonical"> tag displayed on the page if value of the canonicalLink property is empty or not a valid URL.

Bug

Can't add www. to domain in 'SEO' -> 'Primary Domain'

This field for setting the primary site domain now allows any subdomain to be entered, including www.

Bug

Disabled page renders blank document.

When attempting to load a disabled page a completely blank document was rendered. Now system renders a 404 page.

Bug

Date comparison via module components not working.

Date fields can now be filtered in {% component type: "module" ... %} via 'filterBy' and 'filterValue' attributes, including:

  • Release data
  • Expiry date
  • Any date custom field

If 'filterBy' is set to a date type field:

  • System will try parsing 'filterValue' as date.
  • If value is a date then compare it to the item’s date value (EXCLUDING the time component of the date value). Comparison rule is only “equals” to, so it's looking for an exact match.
  • If system can't parse 'filterValue' then filtering is ignored.

Bug

Nice editor - $[number] text bug

Texts that contain $ sign and a number next to it (eg: $2) no longer brakes text after saving.

Bug

Item without a detail layout shows completely blank document.

404 page is now displayed when an item’s detail layout has type “List” (or no layouts with type "Detail" are present or the default "Detail" layout has been saved as a "List" type).

Bug

Bug with rendering SEO Title.

SEO/meta title now renders by the system under the following conditions:

  • If <head> section already has <title> tag, than the system will not do anything, allowing custom title tag to display based on your own logic.
  • If <head> section of the page has no <title> tag than the system will add it populate the value firstly with the SEO title value or secondly using the item's name (if SEO title value is empty).

Bug

Item URL preview not updating correctly.

Item’s preview URL (shown under item’s URL field) is now displaying correctly when creating a new item and when editing existing and updating it's parent folder (resulting in URL change).

Backlog

Alternative Domain For Trial Sites

Added ability to choose an alternative domain for new trial sites (trialsite.co) rather than the current "treepl.co" domain.

Backlog

Mailchimp API integration.

Added new section: 'Email marketing' > 'API provider'.

This allows you to setup Mailchimp API credentials (API key) that are required for integrated email marketing functions.

API key can be retrieved on this page from the mailchimp account https://us19.admin.mailchimp.com/account/api/ (us19 in the url is datacenter that can be different for your account, so may need to replace this with your account’s datacenter)

Backlog

Mailchimp API integration: Mailing Lists

Added new section 'Email Marketing' > 'Mailing Lists'.

Section provides the ability to perform Create, Read, Update and Delete actions (CRUD operations).

When a Mailing List is added, updated or deleted – it will be automatically added, updated or deleted in the linked mailchimp account (using API credentials in 'Email Marketing' > 'API Provider').

Currently one way push from Treepl CMS to Mailchimp (two way sync will come later).

Backlog

Mailing Lists subscriptions in Forms.

In 'Content' > 'Forms':

  1. Added system form field "Mailing Lists" (checkbox list).
    When clicking on it opens window with the full list of all mailing lists and ability to select which mailing list(s) will be added to the form
  2. The selected mailing lists are then output automatically in the form's layout when first generated:
    <label for="MailingLists">Subscribe To</label>
    <input type="checkbox" id="MailingLists1" name="MailingLists" value="[[list1 id]]">[[List1 Name]]
    <input type="checkbox" id="MailingLists2" name="MailingLists" value="[[list2 id]]">[[List2 Name]]
    <input type="checkbox" id="MailingLists3" name="MailingLists" value="[[list3 id]]">[[List3 Name]]
  3. Once form is submitted - CRM contact record will be added to all selected lists.
  4. 'MailingLists' property added to the {{formSubmissionData}} object for liquid as well as the 'CRM' > 'Form Submissions' entity.

Backlog

Mailchimp API integration: Subscribe/Unsubscribe user event.

If a user subscribes or unsubscribes from a mailing list via Mailchimp, the event is pushed to Treep CMS to unsubscribe the CRM contact from the appropriate mailing list.

  • If mailing list does not exist in Treepl CMS - skip action (Example - mailing list was deleted via admin but the user unsubscribes after the mailing list was deleted).
  • If the CRM contact does not exist - skip action (Example - user was deleted via admin but actual the user unsubscribes after their CRM record was deleted)

Backlog

Mailchimp API integration: CRM Contact mailing lists management.

Added ability to view subscriptions via the CRM contact record, as well as subscribe and unsubscribe them to/from mailing lists.

Also added same ability in the 'Mailing List' > 'Subscribers' section.

Backlog

More settings on Google Analytics dashboard.

Added more data from Google Analytics available through the API:

Backlog

Refine reCaptcha For Mobiles

Default form layout generator now generates reCaptcha’s code in compact mode for mobile using liquid conditional statement (utilising the 'data-size="compact"' attribute).
A form label is also now added to the markup.

Backlog

Default Datepicker.

Date fields will be generated by the system using default datepicker (on content forms when form layout is generating by the system and when generating create/update module item forms).

Backlog

Settings area available for System Modules.

System Modules now have settings and properties available to access (found under the gear icon), which include:

  • Blogs
  • Blog posts
  • Banners
  • FAQ's
  • Galleries
  • Authors

Available on Pro+ plans only.

Backlog

Show correct IP Address for Data Center.

When activating a site in the Partner Portal, the relevant data center's IP address is displayed for use in your DNS.

Backlog

Change "Email Notification" To "Auto-response".

"Email Notification" title, in the forms settings page, is now more correctly changed to "Auto-response".

Backlog

Global site preview button.

Added "Home" button to admin header bar (next to the partner logo) that opens the home page in a new tab.

Backlog

{{request.device_type}} property.

Added 'device_type' property to request object {{request.device_type}}. Returns device type:

  • Desktop
  • Tablet
  • Mobile

Backlog

SEO OG image tag improvement.

System will automatically prepend "https://[current Domain]" to the path of the selected image when setting the OG tag properties under the SEO tab for various items.

Backlog

nICE - "Webpage Spell Check" compatibility.

Provided compatibility with Webpage Spell-Check (https://chrome.google.com/webstore/detail/webpage-spell-check/mgdhaoimpabdhmacaclbbjddhngchjik).
Now focus-in and focus-out on any editable area in nICE mode does not crash the page like it did before (https://prnt.sc/lresw0).

Backlog

Add 'Author' field in Import/Export.

Author system property field now added to Import/Export process for Custom Module items.

Backlog

Home page indicator in list view.

Added a home icon, in the item list view, that helps to more easily see which page/module item is set as the home page.

Backlog

Extend meta description max value.

Meta description, under the SEO tab, maximum character value extended to 400 characters.

Backlog

{% component type:"module" ... %} - pagination improvement.

Pagination for Custom Module items was slightly reworked:

  • Component tag now defines what module should be paginated via a URL parameter 'ModuleId' that adds to the system generated page links when the module is rendered. If it matches the module defined in 'source:"moduleName"' than pagination will be applied. Otherwise - ignore pagination.
  • Extended the default generated pagination HTML markup to define moduleId in pagination links.
  • Pagination will be applied always. Not only if 'displayPagination: "true"' for the modules defined in URL parameter 'ModuleId'.
  • 'displayPagination: "true"' parameter should ONLY define if component tag should output self-generated pagination HTML or not.

Backlog

Redirect to 'Unauthorized' system page if login failed.

On login process if the user failed to login, the system will redirect them to the 'Unauthorized' system page instead of redirecting to the home page with "/?login=failure" appended to the URL.

Show more less
New Feature

Global Preview Button

Add "Preview" button to admin header that will lead to the home page in a new tab.

It'll be somewhere here: 

  • Admin Panel
New Feature

Mailchimp API Integration Stage 1

Connect your Mailchimp account to Treepl CMS (same way you setup Google Analytics feed integration). Create mailing lists in Mailchimp through API from Treepl CMS submitted forms:
- Ability to create, update and delete mailing lists via mailchimp API
- Ability to setup mailchimp api integration
- Ability to add subscription functionality to the form
  • Marketing
Improvement

Change "Email Notification" To "Auto-response"

Change "Email Notification" to "Auto-response" on the "Settings" tab under "Forms"

  • Emails
Improvement

Default Datepicker

Use browser's default datepicker for datetime fields on content forms and create/update module item forms.
  • UI/UX
Improvement

Module Settings On System Modules

Allow using module settings on system modules:
- Blogs
- Blog posts
- Banners
- FAQ's
- Galleries
- Authors
(all except of Pages).
Available on Pro+ plans only.
*This feature would cover the following request: "Enable multiple detail layouts for blogs and blog posts."
  • Blogs
Improvement

More Settings On Google Analytics Page

Add more data from Google Analytics available through API.
  • Analytics
v 2.2 Release date: 27 Nov, 2018
New Feature

BONUS: Bulk Delete Of Items

Bulk delete feature for:
  • Custom module items
  • Snippets
  • Menus
  • Forms
  • URL redirects
  • Contacts
  • Form submissions
  • Email templates 
  • Content templates
  • Workflows (exclusions system workflows)
  • General
  • UI/UX
New Feature

Digital Agency Template

Framework: Foundation 6.5
Full nICE compatibility
MORE DETAILS
  • Templates
Improvement

Alternative Domain For Trial Sites

Ability to create trial sites under an alterntative "trialsite.co" domain.
Currently, you are only able to create trial sites under "treepl.co" domain.
THIS IS A TEMPORARY SOLUTION BEFORE "BRANDED DOMAIN" FEATURE IS AVAILABLE
  • Treepl Portal
Improvement

BONUS: Advanced URL Redirects

Ability to create redirects to external sites or other domains of the current site.
Ability to create redirects from URL's that contain file extension (.asp, .php, etc.) but not .htm and .html
If you want to setup a redirect from "/some/url.htm" to any other, just create a new URL redirect using "/some/url" (excluding ".htm" extension) in FROM field. Such setup...
  • SEO
Improvement

BONUS: Create/Update Media Files In A Custom Module Item By Logged In Users

Convert Media type field to <input type="file" name="prop_[[media_property_alias]]"> on forms that are retrieved by Components toolbox.
All files will be uploaded and stored in "/media_images/[[module_id]]/[[item_id]]/[[filename]]"
  • Custom Modules
Improvement

BONUS: Extra Slash At The End Of URL

Remove general rule of adding "/" in the end of every URL.
All file URL's that list in the ‘Pages’ layout display as a folder structure ie. /contact/ instead of /contact so they are harder to copy/paste.
With the url having a "/" at the end, the problem here is that with and without the slash are actually two different...
  • SEO
Improvement

BONUS: Image manager in WYSIWYG

Ability to add images from the WYSIWYG editor, instead of copying the code to the code editor.
All files uploaded through WYSIWYG editor will be stored in a separate "uploaded_images" folder on FTP.
  • UI/UX
Improvement

BONUS: <head> Section Extra

"Meta Tags" is now "<head> section extra" and is powered by ACE editor.
Minor label text changes.
  • SEO
  • UI/UX
Improvement

BONUS: Primary Domain Management

"Primary Domain" field validation prevents from saving strings that don't match domain pattern.
If "Primary Domain" field is empty and "Enable automation of sitemap.xml" is enabled, the validation error would appear.
  • SEO
  • UI/UX
Improvement

Extra CRM Contact Fields

New contact fields:
- Status (text)
- Notes (textarea)
Fields can be used in a form builder.
  • CRM
Improvement

Properties Categories To Become Global

Modules > Properties > 'Categories' become global (like in BC) while 'Tags' remain unique per module.
  • Blogs
  • Custom Modules
v 2.1 Release date: 13 Nov, 2018
New Feature

BONUS: Duplicate Button

Ability to duplicate any existing 'Page', 'Content Template', 'Custom Module item', 'menu' etc.
  • General
New Feature

BONUS: Duplicate Form

Ability to duplicate any existing form.
  • Forms
Improvement

Add, Edit And Delete Custom Modules Items (Frontend)

Ability to Add, Edit And Delete Custom Module Items for logged in users.
Ability to setup Add, Edit Or Delete module item permissions for particular Custom Module
Ability to setup autoresponder when new module item created by logged in user.
  • Custom Modules
  • Secure Zones
Improvement

Automation Of Sitemap.xml

Add an automatic sitemap.xml listed for each site and refreshed every 24 hours. If we can make selections about importance of each page ie. priority and change frequency that would be ideal with the last modified date automatically updated. The sitemap needs to be setup with all urls being the ‘default’ domain ie. either the www or non-www.

This should include...
  • SEO
Improvement

BONUS: FTPS

- Switching from FTP to FTPS
NOTE: Login process is the same as it has been. However, you may need to change Protocol or Encryption setting in your FTP client of choice when using saved/favorited connections.
  • FTP
Improvement

BONUS: Show “Enabled/Disabled” In “Pages”

Show if a page is enabled or disabled to better handle individual page visibility.

For example in the same way as in menus.

pages-enabled-disabled.png

  • General
  • UI/UX
Improvement

Pre-setup Default Workflow Notifications

All sites (with any plan) get a default workflow:
- Name: "Inquiry Workflow"
- "Inquiry Workflow" can not be deleted
- "Inquiry Workflow" can not be renamed

Workflow restrictions for "Essential" and "Business" plans:
- Disabled add/edit/delete options for all workflows other than "Inquiry Workflow"
- Disabled "Email Marketing" > "Emails" section
- Disabled workflow triggering on form submissions...
  • Workflow
v 2.0 Release date: 30 Oct, 2018
New Feature

Add Basic Open Graph Fields

Option to set Basic Open Graph http://ogp.me/ for every site page, detailed custom module pages, overall blog pages, blog posts (article og), products, media downloads (structured properties) if possible.
  • SEO
New Feature

Avoid Redirects

Remove the current forward setup on each homepage so that the domain name can be the homepage which is not recommended.
- https://developers.google.com/speed/docs/insights/AvoidRedirects
  • SEO
New Feature

BONUS: Robots.txt On Templates

Include a robots.txt file on all website templates that allows for spidering of whole site.
  • SEO
New Feature

Link Manager

All link/file selection field types throughout the admin. Like a 'link manager' type widget, similar to in BC.
For example in 'menus', this will give the ability to select a link in the "link manager", instead of manually typing it in.

  • General
  • UI/UX
New Feature

Primary Language On Site

Include option to set the primary language on a site.
  • SEO
New Feature

Site Activation Billing

Integrate billing as a first step of activating the site from trial to live.
  • Treepl Portal
Improvement

BONUS: Import/Export Of Items On Tree View

Ability to import/export items (parent or child) in a tree view.
All items are imported/exported to/from the level where you perform the action.
Import/export on tree view
  • Banners
  • Blogs
  • Custom Modules
  • Galleries/Sliders
  • Pages and Templates
Improvement

Default Home Page Setup

Abbility to setup any page as a home page.
As a result the "/" URL will render that selected page.
  • General
  • SEO
Improvement

Disable Content From Site Search

Ability to disable certain content from site search functionality as it is currently bringing up results like list items, galleries etc. that don’t have a whole page dedicated to them.
  • General
  • SEO
Improvement

Email Template For Autoresponders

Ability to assign email templates to autoreponders
  • Forms
Improvement

File Manager In Templates And Snippets

The ability to access file manager in templates and snippets like in a normal page.
  • File Manager
  • UI/UX
Improvement

"text type" to "media type"

In blogs and slides, make "text type" image source properties to become "media type" for easier image management.
  • Blogs
  • Galleries/Sliders
  • UI/UX
Improvement

Title On Admin Pages

Remove the title of the admin pages, so it doesn't say "Treepl".

Title-On-Admin-Pages.png
  • Admin Panel
Improvement

Title Tag In Menu Items

‘Title’ tag for the menu items - For improved SEO.

Allow menu items to have a tooltip added and only show target, id and class fields if they aren’t empty like how BC renders menu bar items.

  • Menus
  • SEO
v 1.4 Release date: 16 Oct, 2018
New Feature

Secure Zones

Ability to:
  • Create secure zones
  • Assign content to secure zones
  • Assign secure zones to registered users
  • Secure Zones
New Feature

AU + EU Data Centers

Ability to create sites on AU (Sydney) and EU (Frankfurt) data centers. Planned for October 10th release.
  • Infrastructure
New Feature

Visual In-Context Editor (nICE) v1.0

Will be rolled out only to paid Treepl Partners.
WARNING: some Treepl Partners may get it earlier.
  • General
  • UI/UX
New Feature

Sitemap in XML

- sitemap.xml is generated by request (separate button).
- Sitemap management (code editor).

  • SEO
New Feature

BONUS: Custom Workflows

Ability to setup custom workflow notifications to Admin Users and/or manually added emails.
  • CRM
  • Forms
New Feature

BONUS: System Pages

- "Settings" > "System Pages" - adding a separate section for customizing system pages.
-"404" and "Form Submission Results" pages will be moved to this section.
New system pages: "Forbidden" (secure zone access denied page), "Email Confirmation", "Request Reset Password", "Request Reset Password Result", "Reset Password", "Unauthorized".
  • Admin Panel
  • General
New Feature

"| number" Filter For Liquid

New filter for formatting:
- Format:
 {{variable | number: "[thousands separator]","[decimal point]","[decimals count]"}}

- Defaults:
{{variable | number: ",",".","2"}}

Example:
{{"3000" | number: ",",".","2"}}
Returns
3,000.00
...
  • Liquid
New Feature

Social Meta Tags Into Head Section

Social meta tags appear in the <head></head> of a webpage.

  • SEO
Improvement

BONUS: Edit Template From The Page

Screenshot at Aug 27 18-03-44.png Allow navigation ("Edit" link) from the page to the template page directly.
  • Pages and Templates
  • UI/UX
Improvement

BONUS: "Last Updated" Date Of Module Item

"Last Updated" date tracking and accessibility through liquid tag: {{ this.LastUpdatedDate }}...
  • Blogs
  • Custom Modules
  • Pages and Templates
Improvement

BONUS: Menus Improvement

- Splitting Menu properties (Name, Alias) and Menu builder into 2 separate tabs to remove extra white space
- Remove "Save" and "Delete" from "Menu builder" tab
  • Menus
Improvement

BONUS: "Save and New" and Delete buttons

- "Save and New" button next to "Save" on Snippets and Custom Module items
- Move delete button to the right bottom of the editing page
  • UI/UX
Improvement

Branded Background Image Caching

Make the branded background image for the login page to cache.
  • Treepl Portal
  • UI/UX
Improvement

Liquid Tag Insertion, Copying and Displaying

Module > Layouts > Properties (aka Toolbox)

Ability to:

  • Copy liquid tag
  • Insert liquid tag into last cursor position inside the layout
  • See Liquid tag in a plain view next to the property name for easy reference
  • Custom Modules
  • Liquid
  • UI/UX
Improvement

Split Up Elements Into Sections

module-panels-mockup.jpg Split up elements of the system and Custom Module items into sections
  • UI/UX
v 1.3 Release date: 25 Sep, 2018
New Feature

Manage Through FTP: Pages

- All pages of the site available via FTP
- Ability to create, delete or update pages via FTP
  • FTP
New Feature

Custom Module Items Import + Export

Ability to import and export Custom Module items through the admin.

  • Custom Modules
New Feature

Custom Module Items Search

- Ability to develop search by Custom Module items using search forms
  • Custom Modules
Improvement

BONUS: Multiple Files Deletion In File Manager

- Allow multiple files to be selected for deletion in tile view
- Double-click on on item opens it for editing
  • File Manager
  • UI/UX
v 1.2 Release date: 11 Sep, 2018
New Feature

BONUS: Dine&Wine Template

Dine&Wine template is available now in the Partner Portal (trial partner portal as well).
  • Templates
New Feature

CRM CRUD operations

Ability to manually create, update, and delete CRM records (contacts, form submissions).
  • CRM
New Feature

Force Download Handler

- Ability to specify "force download" behavior assigned to a certain media content link.
- If link matches the pattern than the content will be dowloadable to the site users regardless of the media content mime type.
Pattern: <link_to_media_content>?downloadable=1
Example:
File: /images/fruits/apple.png
Force Download Link: /images/fruits/apple.png?downloadable=1
As the result the apple.png media file will be downloaded and not rendered...
  • General
New Feature

WYSIWYG/Code Editor Switcher

- New Code Editor (ACE code editor) integrated on every page, snippet, item
- The "WYSIWYG/Code Editor" switcher saves preferred editing method for each page, snippet, item
- Removing "Code View" from the WYSIWYG
Adding this feature will resolve auto code cleanup issue in the WYSIWYG editor (you will have to use the Code Editor for all the...

  • Admin Panel
  • General
  • Pages and Templates
  • Snippets
  • UI/UX
  • WYSIWYG Editor
Improvement

Advanced Custom Property Editing

- Options builder for dropdown, checklist, radiolist property types
- Ability to change property types without loosing already saved data in the items

  • Custom Modules
  • UI/UX
Improvement

File Upload Type Field

- Ability to add custom form field for uploading files in forms
- Uploaded files are available through FTP (/_form_submissions/<formID>/<submissionID>)
  • Forms
Improvement

New Property Type: Media

- New property in Custom Modules - Media field type
- Calling out the File Manager with ability to insert image path right into the text field that is associated with the media type field
- "Make downdloadable" button that enables forced download action of the file instead of rendering in the browser (image, PDF etc.)
  • Custom Modules
Bugfix

Enable Release Expiry

Exclude items from rendering in lists through custom module compontent tag if:
- Item is not "Enabled"
- Current date is not in between "Release Date" and "Expiry Date"
  • Custom Modules
Bugfix

String Comparison in Liquid

- Ability to compare strings using ">" and "<" operators (just like in BC)
  • Liquid
v 1.1 Release date: 27 Aug, 2018
New Feature

URL redirects

Ability to setup custom URL redirects.
  • SEO
Improvement

Activate site

Automatic activation of a trial site into live site under end-client domain.

  • Treepl Portal
Improvement

Dashes In Slugs

All generated pages, blog posts and custom modules URLs to use dashes instead of underscores.
  • Blogs
  • Custom Modules
  • Pages and Templates
  • UI/UX
Improvement

More Liquid in autoresponders

Ability to render Liquid in "From Name", "From Email" and "Subject" fields.
Currently liquid is only rendered in "Body"
  • Forms
Improvement

Unsaved Data Alert

When you leave editing any content item without saving changes, the alert message appears with an option of saving the changes prior to leaving the page.
  • Admin Panel
  • UI/UX
Bugfix

Filter By DataSource

Liquid module component doesn't filter by DataSource field
  • Custom Modules
Bugfix

Liquid Components In Autoresponders

Component modules do not work properly in autoresponders.
  • Forms
v 1.0.1 Release date: 14 Aug, 2018

Full Release Notes

Released.

Show more less
New Feature

Forms

- Full stack form builder
- reCAPTCHA v2
- Custom layouts 
- Custom autoresponder layouts supporting Liquid

  • Forms
New Feature

Simple CRM

- CRM Contacts from form submissions
- Form submission records

  • CRM
Improvement

Instant site creation

- Ability to create a trial site instantly
- Ability to duplicate trial and live sites
Note: all live site duplicates will be created as new trial sites
  • Treepl Portal
Bugfix

Filtering by category

Filtering a custom module by category doesn't work.
  • Custom Modules