Public Backlog

WebinOne announcements, releases, updates and achievements

v 6.2.0 - 6.2.1 Release date: 13 Oct, 2021

Full Release Notes

6.2.1

Features

Module Item Import Improvement (parent assignment improved logic)

Implemented improved logic of parent item assignment.

(1) When performing import from:

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

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

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

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

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

External ID

Item Name

Url Slug

Parents

Test SubItem

test-subitem

/module-slug/test-parent

Test Parent

test-parent

/module-slug

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

  • Test Parent
    |___Test Subitem

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

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

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

Parents

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

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

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

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

Page Caching Improvement

Caching Logic:

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

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

Cached page object should contain following data:

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

The logic of adding to the cache:

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


The logic when show page from the cache:

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

Here are the tables that represent all rules above:

(1)

Visitor is logged in user

FALSE

TRUE

ToShow

See table 3

FALSE

ToCache

See table 2

FALSE

(2)

ShoppingCartIsNullOrEmpty

TRUE

FALSE

UsedShoppingCartOnPage

TRUE

FALSE

TRUE

FALSE

ToCache

TRUE

FALSE

TRUE

(3)

ShoppingCartIsNullOrEmpty

TRUE

FALSE

UsedShoppingCartOnPage

TRUE

FALSE

TRUE

FALSE

ToShow

TRUE

FALSE

TRUE

FTP sync time improvement

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

Fixed site errors when upload more then 100 files at once

Bug Fixes

Slowly works page

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

Events - Start Date change after update 6.1.8

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

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

Search 2022 or 2021 years

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

Sitemap - Release date issue for blog post

Create new blog with future release date

Go to site map and generate new sitemap

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

Misc settings - checkbox in CRM settings is not saved

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

Reload the page

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

JSON - not correct display custom properties and pagination

Create custom module with data source and CRM group

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

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

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

favorites component

Not correct work includeItemData false.

Not display correct ProductDataJsonHTML.

Not correct display pagination and quantity.

Products - Sorting of group items doesn't work

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

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

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

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

Import contacts - secure zone is not deleted via import

Do export contacts

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

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

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

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

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

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

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

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

http://prntscr.com/t0ibqq

/admin vs /Admin

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

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

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

Go to Contacts and do export

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

URL with symbols doesn't open / download

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

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

Attributes - set up a lot of domains

Create on Domains more than 3 and set up different currency

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

Order of catalogs not correct

Go to Products

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

Custom module - sorting by tags doesn't work

Go to custom modules and enable tags

Add some items with tags

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

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

Error after clicking on the "login" button

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

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

Orders - Order statuses

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

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

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

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

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

Go to Advanced CRM Groups

Create new fields in any CRM group and click save

Reload page

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

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

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

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

6.2.0

Public Backlog Features

Unassign secure zone from front-end

CRM contact Role field

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

Field description:

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

Restrictions:

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

DESIGN:

Component for the subscriptions form

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

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

Toolbox

Secure Zone -> Update Member Form

Form validation and processing

Create update member subscriptions form handler API

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

Validate submission:

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

Admin UI -> CRM contact -> Subscriptions sort order

Add ordering to the Show Secure Zones list

  • show in alphabetical order by secure zone name

Component for the info form

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

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

Toolbox

Secure Zone -> Update Member Form

Form validation and processing

Create update member form handler API

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

Validate submission:

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

Import/Export Process for field Role

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

Create mailing list based on custom report

Custom Report Changes

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

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

DESIGN (take labels from task)

Update Report Logic

Every hour try to find a custom report by condition:

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

If found - force Generate Report flow

Sync Logic

Once Generate Report flow is triggered

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

Native Comments

Plan Restriction

  • Available starting from Pro

Comments General logic description

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

Comments Moderation

Add ability to moderate comments

  • Add page Content -> Comments

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

Design:

Comments Admin UI

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

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

Design;

Comments settings

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

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

Design

Comments body saving rules

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

Comment submit form

The form should contain the following fields

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

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

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

Use Comment body saving rules once saving the item

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

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

[Create Comment] Form Example

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

[Reply to comment] Form Example

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

Comment edit form

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

Use Comment body saving rules once saving the ite

[Edit Comment] Form Example

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

Comment delete form

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

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

[Delete Comment] Form Example

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

Comment Workflow liquid this object

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

Comments pagination

Implement pagination to comments
Take layout from the URL.

  • If empty - use the default comment layout.

Component type: "commentThreads"

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

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

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

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

DESIGN:

Component type: "comments"

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

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

Component Toolbox

Add both components to

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

1) Packing Slip and Package Label layouts

Add system Print Layouts for

  • Packing Slip
  • Package Label

Store them on FTP in the following paths:

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

Implement the following admin layouts and functionality:

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

2) Print Buttons

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

  • Invoice
  • Packing Slip
  • Package Label

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

Bug Fixes

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

Native Comments

Ability to add comments to modules of the site.

Comments Zapier integration:
Triggers:

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

Some features for comments:

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

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

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

At the moment we would need to do all...
  • BC Equivalent
  • Ecommerce