cmsbacklog-updates-apr2024

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 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: 2024-04-28)
  • endDate (default: 2024-05-28)
  • eventName (default: page_view)
  • requestJSON (default: see "Content" from section (5))
    • if provided - ignore all params above.

Output Value

To use this functionality you need to configure Google Analytics 4 (GA4)

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 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:

{% 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: 2024-04-28)
  • endDate (default: 2024-05-28)
  • 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

You are not allowed to perform this action

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 liquid object and

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="471768a23597b1c63c415d22daaee010">alert(9);</script>
  • <script nonce="471768a23597b1c63c415d22daaee010" 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 471768a23597b1c63c415d22daaee010 variable.

Example:

  • HTTP Header Settings for: Content-Security-Policy:
  • Field: script-src
  • Value: 'self' 'nonce-cspNonceHash'
  • Page content:
            <html>
    <head>
     <script nonce="471768a23597b1c63c415d22daaee010" src="/js/my-main.js">alert(9);</script>
       </head>
    <body>
     <script nonce="471768a23597b1c63c415d22daaee010">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: 1415eb33-ea82-4962-b045-6f2c8facbcf0

Params [[format]]:

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

Output format:

  • Liquid String

Examples with output:

20e3cfcd44e249b384134cffb88d90cc
234fa26ee4c14ea8b3b916d15982d410


143c7597-9a40-447c-a4c6-cb7324ce2bdf
234fa26e-e4c1-4ea8-b3b9-16d15982d410


{d58342e5-02ab-4475-90c0-d31ed6ced439}
{234fa26e-e4c1-4ea8-b3b9-16d15982d410}


(9d37fcf4-94f2-4477-833a-bafdf183652b)
(234fa26e-e4c1-4ea8-b3b9-16d15982d410)


{0x1d284134,0xa600,0x44eb,{0xa8,0xe7,0xa3,0x18,0xc0,0xe9,0x22,0xe5}}
{0x234fa26e,0xe4c1,0x4ea8,{0xb3,0xb9,0x16,0xd1,0x59,0x82,0xd4,0x10}}

2) Add a "Random" liquid filter

Add new number filter:

Name: random

Syntax: 0

Params:

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

Output format:

  • Liquid Number

Example with output:

59
46

55
18

3) Add "Hash" liquid filter

Add new string filter:

Name: hash

Syntax: 3E195EC863071DE54719625493FF79A50CD72908CFCD997AC838ED51D9BF40D7

Params:

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

Output format:

  • Liquid String

Examples with output:

5a105e8b9d40e1329780d62ea2265d8a
5a105e8b9d40e1329780d62ea2265d8a

1F5DDC06F9A25B02F58EF47E0A223288
1F5DDC06F9A25B02F58EF47E0A223288

B444AC06613FC8D63795BE9AD0BEAF55011936AC
B444AC06613FC8D63795BE9AD0BEAF55011936AC

7C9CDF43AD36F6A35053CD9676733D40CC5DDCFF
7C9CDF43AD36F6A35053CD9676733D40CC5DDCFF

1B4F0E9851971998E732078544C96B36C3D01CEDF7CAA332359D6F1D83567014
1B4F0E9851971998E732078544C96B36C3D01CEDF7CAA332359D6F1D83567014

DE7762D598CB0B6A8B354BF11C90A313E2888545CFC1B84CE24A191DD8E6D631
DE7762D598CB0B6A8B354BF11C90A313E2888545CFC1B84CE24A191DD8E6D631

B16ED7D24B3ECBD4164DCDAD374E08C0AB7518AA07F9D3683F34C2B3C67A15830268CB4A56C1FF6F54C8E54A795F5B87C08668B51F82D0093F7BAEE7D2981181
B16ED7D24B3ECBD4164DCDAD374E08C0AB7518AA07F9D3683F34C2B3C67A15830268CB4A56C1FF6F54C8E54A795F5B87C08668B51F82D0093F7BAEE7D2981181

C2E390DEE58F2DFF074A38E60E40353795DD7EF0514A57C9DE366E179DEF57F5C4133A2BE1E83AA625D2ACB4C47EFC1B7F92214016E71A54D2B2587FBB110382
C2E390DEE58F2DFF074A38E60E40353795DD7EF0514A57C9DE366E179DEF57F5C4133A2BE1E83AA625D2ACB4C47EFC1B7F92214016E71A54D2B2587FBB110382

dGVzdDE=
dGVzdDE=​

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 of the secure zones
- Admin Users
2) Ownership restriction
- Only Owner of …
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
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 draft module …
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 …
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 …
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 …
  • Liquid
Improvement

Category in the module item view improvement

Remove redundant level 4-dashes ("----") in the output if parent category is not root:
- in the
- in the add/edit module item forms of admin …
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 …
Improvement

Added "nonce" attribute support for CSP

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

Site search case insensitivity improvement

Improve site search to use case insensitive search by module item …
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 Then in another group called ‘Company Branding’ with a property of ‘Logo’ you might want Short Alias of . 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: `07`) 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 ):

  • {% 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 we will fix it to match actual path - /Content/Pages/TestFolder/TestIncludeFile.inc and it will become )

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

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>Liquid Error: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')</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 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


    ----

  • On page display not correct tag with "equally" https://prnt.sc/iSQPxriPa3Qk

Orders - discount prices

New Feature

Create Default JS Validation

Default validation for mandatory …
  • Forms
  • General
New Feature

Google Analytics Global Time Selector

The ability to change all time periods at once in the analytics …
  • 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 pages to be able to pull …
  • UI/UX
  • Admin Panel
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 a few clicks …

  • Admin Panel
  • Analytics
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 setting up the Media property? So …

  • Custom Modules
Improvement

Create Folder Within Image/Media Manager

The ability to add a folder within Media/Image Manager

  • File Manager
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. However, this seems to …
  • Admin Panel
Improvement

File Upload On Mobile Devices

The ability to upload files to the file manager from mobile …
  • UI/UX
  • Admin Panel
  • File Manager
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 …
  • Custom Modules
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.

  • UI/UX
  • Pages and Templates
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 …
  • Ecommerce
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
  • 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

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.

cm-notes1.png

Solution:
  • Admin Panel
  • Custom Modules
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 it hard to select …
  • File Manager
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 nice to …

  • 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 All’ function is for …
  • UI/UX
  • Admin Panel
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 have white areas …

  • File Manager
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 …
v 6.9.1 Release date: 21 Jun. 2023

Full Release Notes

BACKLOG

Google Analytics GA4 integration
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 (
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

Improvement

Misc Improvements (v6.9)

- Improvements based on support tickets. More details will be provided in the release …
  • UI/UX
  • General
  • Admin Panel