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