Public Backlog

WebinOne announcements, releases, updates and achievements

v7.5 Release date: 10 Sep, 2025

Mailchimp Full CRM Sync

This release introduces major updates to mailing list management, Mailchimp synchronization, and email content editing, giving you more control, flexibility, and clarity when working with subscribers.

What’s new

Mailchimp list import

  • New Import from Mailchimp action with a dropdown to select lists (showing subscriber counts).
  • Mailing lists view now includes a Subscribers column with counts from Mailchimp.

General settings for mailing lists

  • Added in the 'General Settings' section with two options:
    • Email opt-in method (Double opt-in / Single opt-in) – stored per list and applied only to new subscribers.
    • Tags management – view tags, add via popup, and store them with each list.

Subscription status sync

  • CRM status changes (subscribed/unsubscribed) are now synced with Mailchimp.

Mailchimp sync tab

  • New 'Mailchimp Sync' tab for comparing and aligning audiences.
  • Options to sync manually (in addition to auto-sync every 24h).
  • Contact mismatch resolution with per-field radio buttons or bulk apply from CRM/Mailchimp.
  • Visual highlighting of differences and per-contact sync actions.

Tag synchronization and bulk management

  • Tags now sync on subscribe/unsubscribe events.
  • Bulk add/remove tags for selected contacts via toolbar.

Mailing lists field in Form Builder

  • Mailing lists remain available as a default user field.
  • Displayed as checkboxes inside forms, with related tags shown under each list.
  • Selected lists and tags are saved and visible in user profiles.

WYSIWYG Editor for All Admin Code Editors

A WYSIWYG (visual) editor is now available across all admin code editors, making it easier to create and format content.

What’s new

  • Enabled WYSIWYG mode in all admin code editors.

Code Editor in Full Screen Mode

The built-in code editor can now be expanded to full screen, giving developers more space and focus when working with code.

What’s new

  • Added an option to toggle the code editor into full screen mode.

Multiple Data Source property

A new option has been added to Data Source properties, allowing multiple values to be selected instead of just one. This makes properties more flexible and better suited for scenarios where multiple related items should be stored together.

What’s new

  • Added a “Multiple” checkbox for Data Source custom properties.
  • When enabled:
    • Users can select multiple Data Source items.
    • The property value is stored as an array (with item ID, Name, and URL).

System Emails And Autoresponders Test Button

A new "Send Test Email" button has been added across all types of system and autoresponder emails, making it easier to preview messages before sending them to real contacts.

What’s new

  • The "Send Test Email" button is now available in the bottom action bar for:
    • System emails
    • Workflow, follow-up, abandoned cart, and reminder emails
    • Autoresponders (including module-based ones)
  • The button appears only after the email content has been saved.
  • Clicking it sends the email to the selected address exactly as it is in the template, with sample test data substituted where needed.

Control Auto-Generated SEO Content

You can now control whether SEO metadata tags are auto-added when values are set in the items SEO settings, or only taken from your custom page or template code. This gives developers and SEO specialists more flexibility in managing search-optimized metadata.

What’s new

  • Added a new checkbox setting: "Auto-generate SEO Content" (located in 'Settings' > 'SEO').
  • Default value: Enabled (True).
  • When enabled, SEO meta tags are added automatically (current behavior).
  • When disabled, auto-generation is skipped, and only manually defined SEO metadata in the site code is used.

Extend DateTime Field Support in Form Fields

The DateTime field in forms now supports both date and time selection, making it more flexible for scheduling and time-specific submissions.

What’s new

  • DateTime field upgrade: previously worked as a simple Date field, now supports full date + time input.
  • Added a new Date only checkbox in Form Builder:
    • Enabled → renders <input type="date">.
    • Disabled → renders <input type="datetime-local">.

For more info, see the HTML specs for the differences between 'datetime-local' and 'date' input types.

Liquid File List Access

The feature previously called API (File system) has been renamed and repositioned to make its purpose clearer and more accessible.

What’s new

Bugfixes

The following bugs have been fixed:

  • Fixed the removal of expired extensions after the trial period.
  • Fixed uploading folders (with files) via FTP.
  • Fixed reversed forloop.rindex and forloop.rindex0 values (0-based now starts at 0; 1-based at 1).
  • Fixed HiddenValidator: it now trims spaces in name and capitalizes the following word.
  • Fixed incorrect redirect URL in the Portal after changing the billing cycle via PayPal.
  • Fixed the Prices tab not showing for events on the Pro plan.
  • Fixed login creating a 30-day member cookie when “Remember Me” is unchecked – it now expires after 24 hours.
  • Fixed an issue preventing workflow deletion on Business and Starter plans.
  • Fixed the error message when deleting an admin user who owns a non-shareable custom report.
  • Fixed API error when creating a custom module item with Disable detail layout enabled.
  • Fixed Admin list-view sorting resetting to A–Z on navigation – the chosen sort now persists.
  • Fixed searchScope filtering: multiple conditions are again combined with AND.
  • Fixed in the On-Site Editor, clicking Add item with the toolbar closed no longer reopens the toolbar.
  • Fixed in the On-Site Editor, when adding an item with the toolbar closed, the Content field no longer collapses.
  • Fixed in the On-Site Editor, multiline fields no longer expand to full screen height.
{% endraw %}
v7.4 Release date: 16 Jul, 2025

AgentOne - Design Parser

Converts Figma designs into ready-to-use HTML/CSS/JS code in just a few clicks — no manual coding required.

Simply design your layout in Figma as usual; the parser automatically reads your layers, frames, and components. It generates clean HTML, responsive CSS (using Tailwind 4.1), and lightweight JS, ready for development or publishing.

Works instantly, making it easy to go from design to working webpage in minutes. Great for landing pages, home screens, UI mockups, and more — no need to rebuild layouts manually. It is built to understand common naming conventions and structure, so well-prepared designs are transformed more accurately.

Recommendations for best results

  • Use keywords in layer names:

    • e.g., icon, ico, logo, bg, or background
    • Examples: insta-icon, dentist-icon, header-bg --> Helps the parser treat them as single assets instead of raw SVG vector sets.

  • Name the main frame using home or landing:

    • Examples: home screen, landing page --> The parser uses this to generate the main index.html.
  • Keep Figma designs structured, with clean layers and components.

  • Avoid excessive repetition or duplicated frames for more accurate parsing.

What’s new

  • ~50% faster CSS generation

  • Now outputs Tailwind 4.1 code using the Vite Build Tool

  • Improved background image handling: now uses bg-[url()] classes instead of absolutely-positioned <img> elements

  • New walkthrough video How to use the Design Parser

AgentOne - Implementor

Implements finished HTML/CSS/JS projects into WebinOne components, ready to publish with no extra setup needed.

Implementor can be used in three ways

  1. One-click from Design Parser – if the generated code is ready, you can send it directly to Implementor via the “To Implementor” button.

  2. After code review and edits – make any necessary changes to the Design Parser output, then repackage it as a .zip and upload it manually to Implementor.

  3. Using your own project – upload any valid HTML/CSS/JS project following the structure above to generate a working WebinOne site.

How it works

  • Simply upload a .zip file containing your project.

    • Include your main HTML files and asset folders like JS, CSS, fonts, and images.

  • No configuration or cleanup required – the system automatically maps your files into WebinOne components and structure.

Limit

  • Supports archives up to 300 MB.

Ideal for turning design output into a real, editable, and publishable website on the WebinOne platform, quickly and seamlessly.

Implement WebP ImageProcessor Plugin

The ImageProcessor now includes built-in support for WebP images via a new plugin.

What’s new

  • Added WebP plugin to the ImageProcessor toolset

  • Enables handling, optimizing, and serving .webp files natively

  • Improves image compression and performance across supported browsers

This update helps ensure modern image standards are fully supported, making websites faster and more efficient, especially for mobile users.

New System Order Statuses

New post-purchase order statuses have been added for improved tracking and clarity in order management.

  • Return Requested – indicates that the customer has initiated a return.

  • Partially Refunded – reflects a refund applied to part of the order.

  • Refunded – shows that the full order amount has been refunded.

These statuses enhance transparency in the order lifecycle and help both merchants and customers better understand the state of each transaction.

Option To Index Custom Fields

A new setting now allows you to include or exclude custom fields from Site Search indexing, giving you more control over what content is searchable on your website.

What’s new

  • Added a checkbox in Custom Properties settings labeled: Enable for Site Search

  • Available for the following field types:

    • Lists — Checkbox / Dropdown / Radio

    • Single Line (Text)

    • Multiline (Text)

    • Media

When the checkbox is enabled:

  • The field is included in the search index

  • Site Search will return results based on the field’s content

When disabled:

  • The field is excluded from indexing and search results

This update gives you flexible indexing control so that only relevant custom data contributes to on-site search — helping deliver more accurate and useful results to users.

Open API v2 (new endpoints)

Expands the Open API with new endpoints, providing developers with greater control over integrations, site data, and automation workflows. Supports the creation of more efficient and intelligent connections with external tools.

  • MENUS

  • SNIPPETS

  • FORMS

  • MEMBER AREAS

  • WORKFLOWS

  • EMAILS

  • EMAIL TEMPLATES

  • SYSTEM EMAILS

  • ADVANCED CRM GROUPS

  • ORDER STATUSES

  • ECOMMERCE SETTINGS

  • SYSTEM PAGES

  • ADMIN MENU CONFIGURATOR

  • URL REDIRECTS

  • URL REWRITES

  • ADMIN USERS

  • ADMIN USER ROLES

  • PAYMENT GATEWAYS

Bug Fixes

  1. Mailbox password reset in the Portal now works correctly and applies a new password as expected.

  2. Media files (e.g., .mov, .mp4, .webm) no longer trigger 500 errors; they are now served properly on the frontend.

  3. Invalid admin logins no longer lead to a 404 page. Users now see a proper error message when entering an incorrect email.

  4. Admin user invitations now function as intended; new admin users can be invited without issues.

  5. The Back button on module item pages now behaves consistently across tabs such as Settings and SEO, returning to the correct folder every time.

  6. Sorting blog posts no longer affects the entire blog module; post-level sorting is now applied correctly.

  7. Stability improvements and multiple fixes have been made to the OSE module.

  8. The Insert Link pop-up now appears above the full-screen WYSIWYG editor in both the Admin Panel and OSE, ensuring proper visibility.

  9. Volume discounts can now be added without errors.

  10. Custom module layouts edited via File Manager after module duplication now sync properly and reflect changes as expected.

  11. Shipping calculations in the shopping cart now exclude products that don’t require shipping.

  12. Addressed UI display issues on tablets.

{% endraw %}
v7.3 Release date: 20 May, 2025

Email Accounts

A new extension for managing email mailboxes is now available.

Buying Mailboxes:

  • Buy any number of 5 GB mailboxes ($2 each)
  • Purchase via popup with quantity input
  • New mailboxes appear in the list instantly

Managing Mailboxes:

  • View list with email address, used/total storage
  • Real-time updates when changes are made

Actions via dropdown:

  • Add Vault: +5GB ($2), +15GB ($4), +25GB ($6), +45GB ($10), +95GB ($20)
  • Reset Password
  • Delete Mailbox (with confirmation)

Buttons:

  • Buy Mailbox (opens popup)
  • Add New Mailbox (quick add from dashboard)

Payments:

  • Charges are added to the main account
  • Payment confirmations shown in the interface
  • All changes are applied in real-time

File Manager - Trash and Version History Management

Several new features and improvements were added to the File Manager.

Trash Bucket:

  • New section to view deleted files
  • Search by file name
  • Sort by name, size, or date deleted
  • Restore latest or any previous version
  • Preview deleted files (text files open in popup)
  • Permanently delete files (single or bulk)
  • Bulk restore

File Version History:

  • All files now keep version history for 30 days
  • You can preview or restore any version

Access Control:

  • New admin role permission: Can Access File History
  • History features are only available if:
    • User has this permission
    • Website Backup extension is active

Drag & Drop Upload:

  • Added simple drag-and-drop upload area

HiddenValidator Field for Anti-Bot Protection (Honeypot)

Added a new custom field type HiddenValidator to help prevent bot submissions.

How It Works:

  • HiddenValidator fields are invisible to users but included in form validation.

Submission is allowed only if:

  • All HiddenValidator fields are empty, or
  • The fields exist in the Form Builder but were not added to the layout (not submitted).

Validation Rules:

  • Fields are ignored if:
    • Not added in the Form Builder
    • Have incorrect HTML (type, name, or mismatched field name)

HiddenValidator values are not saved in form records and not sent in email notifications.

Monaco Code Editor

Replaced the built-in code editor in the admin panel with the Monaco Editor (used in VS Code).

Key Benefits:

  • Improved performance
  • Syntax highlighting for multiple languages
  • IntelliSense support
  • Professional, developer-friendly editing experience

Notification About Mandatory Update to Version 7+

Sites running on version 6.11 that exceed system limits must now be upgraded to version 7. Limit checks are updated daily.

Upgrade Required If:

  • More than 25 custom properties per module
  • Over 2,000 items (system or custom modules items)
  • Over 10,000 CRM records

Portal Notifications:

  • A warning banner is shown in the portal header for affected 6.11 sites
  • Includes a link to a detailed page listing all affected sites with upgrade recommendations
  • The banner is visible only if the site exceeds the limits

Reseller Role Upgrade

Added the ability for resellers to upgrade their role directly from the My Settings page in the admin, under the Profile tab.

Upgrade Options:

  • Associate – $999
  • Partner – $1,999
  • Agency – $4,999

If a reseller already has a paid role, only higher roles are available for upgrade (downgrades not needed). The user pays only the difference in price.

Upgrade Flow:

  • Dropdown with available roles appears under the Email field
  • On selection, a popup shows upgrade info and a PAY button
  • Payment is processed via Stripe
  • After successful payment, the role is upgraded automatically, and the user is returned to the Profile page

Notifications:

  • Email confirmation of successful payment
  • Email notice about role change

URL Rewrites

Added a new URL Rewrites section (available on PRO plan).

Key Features:

  • Add/edit rules with the following fields:
    • Rewritten URL* (RegExp), e.g. ^article/([0-9]+)/([_0-9a-z-]+)
    • Rewrite To* (RegExp), e.g. /article/article-detail-name
    • Enabled (default: true)

Notes:

  • Rewrites work only within the same application (domain).
  • Rules are stored in the same config file as domain redirects.
  • Admin user roles updated with new permissions: View, Add, Edit, Delete.

Change Partner Email

Users can now change their email address in the Profile section of the portal.

How It Works:

  • The Email field is now editable
  • After entering a new address, a confirmation email is sent to the new address
  • The email is updated only after confirmation via the link (expires in 24 hours)

UI Behavior:

On input:

  • "A confirmation email will be sent to your current email. The change will take effect only after confirmation."

After saving:

  • Confirmation popup is shown

If not yet confirmed, a warning is displayed under the field:

  • "Your email is not verified. Please check your inbox to confirm it or resend the confirmation email."

Until confirmed, the old email stays visible in the field.

Filter Reminder Recipients by States

Added a new Member State filter to recurring reminders.

Key Benefits:

  • Target reminders to members in specific (US) states
  • Reminders are sent only to contacts matching the selected states

Disable Sender ReplyTo Option in Workflows

Under Email Notifications > Workflows, each Workflow's settings will have an option to Disable Sender ReplyTo.
When checked, the sender’s email (the user's email address used in the form submission) will not be added to the Reply-To field in the outgoing Workflow email. Instead, the receiving email client will use it's default reply-to method (likely the From Address, which will be the domain email used in the system Workflow Email's From field).

Cancel Subscription (Site Deactivation)

Added full support for canceling paid subscriptions and reverting sites to trial mode.

Subscription Info Page:

  • New Subscription tab in each live site's Settings page in the WebinOne portal
  • Shows current status, activation date, next billing date
  • Includes plan details, pricing and summary of all active features
  • Includes a Cancel Subscription button

Cancellation Flow:

  • Cancel subscription in Stripe and PayPal
  • Double confirmation required
  • Optional exit survey shown after cancellation

Site Changes After Cancellation:

  • Domains removed (except trial domain)
  • Removed from server monitoring
  • Site reset to trial mode
  • Email domains removed
  • Notification sent to partner via email
{% endraw %}
v7.2 Release date: 13 Mar, 2025

Global File Type Restrictions

A new section has been introduced under Misc Settings to enhance control over file uploads across the site.

Settings Configuration

Location: 'Settings' > 'Misc'

Section: Server File Settings

Setting Name: Enable file restrictions

Enable/Disable Control: A checkbox is provided to activate or deactivate file type restrictions.

Default Restricted List: When enabled, a default list of disallowed file types is applied, including but not limited to .exe and .php.

Custom Input: Administrators can add, remove, or modify the list of restricted file types to tailor restrictions to site requirements.

Scope of Restriction: The file type restriction applies to all key upload channels:

  • FTP uploads
  • File Manager uploads
  • Public forms (e.g., via custom forms or modules)

Validation Logic: Files are checked using extension-based validation and MIME type validation for enhanced security.

Error Messaging:

  • Frontend Forms: “The file upload failed because the file type {fileType} is not allowed on this site. Please ensure that your upload complies with the site's file type restrictions. If you need assistance, contact us.”
  • Admin/FTP Uploads: “File upload rejected. The file type {fileType} is not permitted based on the site's global file restrictions. To modify these restrictions, please review the prohibited file extensions settings in the site Admin.”

Enabling Restriction with Existing Files: If the checkbox is selected while restricted files are already present in the File Manager, the following error is shown:

“Unable to activate file type restrictions. Your site already contains files of the following restricted types: {restrictedFileTypes}. Please remove these files from the File Manager before enabling this option.”

Server Cache Exclusion Rules

A new option has been introduced under Misc Settings to allow administrators to exclude specific URLs from server-side caching, providing greater flexibility in cache management.

Settings Configuration

Location: 'Settings' > 'Misc'

Section: Server Cache Settings

Setting Name: Exclude URL Rules

Input Field: Administrators can specify URL rules that should be excluded from server caching.

URL Matching Rules:

  • Case-Insensitive Matching: All URL checks are performed case-insensitively. For example, /marketplace and /Marketplace are treated as identical.
  • Wildcard Support (*): If a rule ends with an asterisk (*), the system checks whether the current URL starts with the rule.
    Example: Setting: /marketplace/shopping_cart?* matches /marketplace/shopping_cart?item=123
  • Exact Match: If no wildcard (*) is used, only an exact match will trigger exclusion.
    Example: Setting: /marketplace/shopping_cart matches exactly /marketplace/shopping_cart but does not match /marketplace/shopping_cart?item=123

System Emails Delivery Options

A new dropdown menu has been introduced in the system email settings, allowing users to configure email sending behavior with predefined options.

Settings Configuration

Location: 'Email Notifications' > 'System Emails' > {EMAIL}

Section: Email Delivery Options

Setting Name: Delivery Option

Dropdown Options:

  • Send Always (Default behavior, currently active for all emails)
  • Never Send
  • Send Only for Main Orders (For invoice emails only)

Logic Implementation:

Invoice Emails

  • Send Always: Emails are sent for every invoice event.
  • Never Send: No invoice emails are sent.
  • Send Only for Main Orders: Based on the MainOrderId:
    If MainOrderId is null: The email is sent (indicating the main order).
    If MainOrderId has a value (e.g., "23293"): The email is not sent (indicating a sub-order).

Other System Emails

  • Send Always: Emails are sent for every event.
  • Never Send: No system emails are sent.

Recurring Subscription Reminder Emails

A new Recurring Subscription Reminder feature has been introduced, allowing users to configure and schedule automated email reminders for Member Areas, Events, Forms, and Products. The system supports item-based selection, filtering, and sorting, ensuring precise control over notification settings.

Settings Configuration

Location: 'Email Notifications' > 'Reminders'

Section: Reminders

Menu Update: A new Reminders option has been added to the admin menu between Workflows and Emails.

Reminder Fields:

  • Name* (string) – Reminder name
  • Email* (string) – Associated email
  • Type* (dropdown) – Options: Member Area, Events, Forms, Products
  • All Items (checkbox): If checked, the dropdown for items is hidden.
  • Items* (dropdown, multiple selection) – Available when “All Items” is unchecked
  • Days Before Notification* (int) – Defines when the reminder email should be sent

Email Notifications: A new Recurring Reminder Emails tab has been added under Emails with dynamic email tags:

  • {{this.item}} – Displays item data
  • {{this.member}} – Displays member data
  • {{this.recurringsubscription}} – Displays subscription details

Sending Logic:

  • If a specific item is selected, emails are sent only to subscribers of that item.
  • If no item is selected, emails are sent to all subscribers of the selected category.
  • Emails are sent N days before renewal, based on the configured value.

Stripe Customer ID in Member Component

A new property, stripeCustomerId, has been added to the {{request.currentmember}} component to improve Stripe integration and customer data management.

Component Update

Component: {{request.currentmember}}

New Property: stripeCustomerId

Behavior:

  • If a Stripe subscription exists, stripeCustomerId returns the corresponding Stripe Customer ID.
  • If no active subscription is found, stripeCustomerId returns null.

Angular Upgrade to v17

The system has been upgraded to Angular v17, providing enhanced performance, stability, and compatibility with the latest web technologies.

Key Improvements:

  • Performance Enhancements: Optimized rendering and reduced load times.
  • Compatibility: Improved support for modern browsers and frameworks.
  • Security Updates: Integrated latest security patches to safeguard against vulnerabilities.
  • Developer Experience: Enhanced tooling and debugging capabilities for faster development workflows.

Custom Form Validation Before Submission

Added support for manually triggering form validation before submission by calling a JavaScript function. This enhancement allows developers to apply validation to a specified DOM form element dynamically.

Implementation Details:

A new global function window.validateCmsForm(form) has been introduced. This function validates the given form element before submission.

Example Usage:

HTML:

<script>
let form = document.getElementById('validation');
window.validateCmsForm(form);
</script>
        

For individual fields:

  • class="validation-error" – Applied to fields with validation errors.
  • class="validation-success" – Applied to successfully validated fields.

For the entire form:

class="form-validation-error" – Applied if the form fails validation.

Improved Calendar Events - Cell by Cell Output

Enhanced the event calendar with Cell by Cell Events Output, improving event rendering and display for better clarity and usability.

Component Manager:

In the Component Manager, under 'Events' > 'Calendar', a new checkbox option is available for "Cell by Cell Events Output" which will configure the calendar output code with the appropriate parameter.

`include` parameter:

Enable 'Cell by Cell Events Output' with the addition of a parameter added to the Event Calendar include tag: cellByCellEventsOutput: "true", eg:
{% include "/cms-assets/includes/event-calendar.inc", group: "0", moduleId: "1234", cellByCellEventsOutput: "true" %}

Key Improvements:

  • Better Event Visualization: Events are now rendered within each individual calendar cell, ensuring a structured and intuitive layout.
  • Improved Readability: Events are displayed more clearly, reducing clutter and overlapping information.
  • Enhanced Usability: Users can interact with events more easily, improving the overall user experience.

Improved URL Redirects UI/UX

The user interface and experience for managing URL redirects is now consistant with other 'quick add' items by means of the pop-out sidebar, making the process more intuitive and user-friendly.

Installed Extensions Page

A new Installed Extensions page has been added to the site admin, providing better visibility and management of active extensions.

Found under the gear icon (top right of admin).

Order Transaction ID in Custom Reports

The Order Transaction ID is now available in custom reports, enabling improved tracking and filtering of transaction data.

Settings Configuration

Location: 'Admin' > 'Extensions' > 'Custom Reports'

Available In:

  • Report Fields
  • Report Filters
  • Report Results

Key Features:

  • New Field in Reports: Order Transaction ID can now be added to report outputs.
  • Filtering & Sorting: Users can filter reports based on specific transaction IDs or sort columns based on ID.
{% endraw %}
v7.0.3 Release date: 06 Sep, 2024

Validation for Module Names

New feature to prevent the creation of custom modules with duplicate names.

  • When you try to create a new module, the system will automatically check if a module with the same name already exists.
  • If a duplicate name is detected, a pop-up message will appear, advising you to change the module's name.

Screenshots:
https://prnt.sc/LPkuPb-A5CAU

Enhanced Export Logic for Orders

The Order Export feature has been enhanced to provide more detailed information and greater control over the data being exported.

The new capabilities include:

Screenshots:
https://prnt.sc/3OF_uujwkFj5
https://prnt.sc/t5-Lu3-FvxVP
https://prnt.sc/1PD-3dcGF46y
https://prnt.sc/-YJuwkISlCmc

New System Page: reset-password-result

A new system page for reset-password-result has been added. After resetting the password, the user is redirected to this page from the reset-password system page. This page also contains the formSubmissionData object, which, if there are errors, includes a list of errors that are displayed.

Added this.formSubmissionData liquid object with the following structure

{
     "form_alias": "reset-password",
     "error": 0,
     "errormessages": [],
     "formtype": "System"
}
  • 'formtype' is always 'System'
  • 'form_alias' is always 'reset-password'
  • 'error' and 'errormessages' should be set based on errors occurred during the reset-password flow. On success, 'error' = 0

Screenshots:
https://prnt.sc/Bx_O-nZ4DZNy
https://prnt.sc/pm10eXlMZxZu
https://prnt.sc/VvZs_4r7tkJG
https://prnt.sc/GjctWpl-FFBH

When we enter the same password reset link for the second time:
https://prnt.sc/4dMqo0FeWQLV
https://prnt.sc/QXPFHEKxNe5M

Add this.siteURL to all emails and provide all variables in toolbox

1) Add this.siteURL parameter to all email’s liquid context. The parameter should appear here in the toolbox https://prnt.sc/hdl6H0MHqPLq

It should contain protocol and domain (save that domain that was used by the site visitor at the time the email sending was scheduled).

List of emails:

  • form autoresponders
  • system emails
  • custom emails and custom workflows

2) Provide toolboxes ( https://prnt.sc/ru2bmo) to all emails with the list of variables that are accessible on this object in liquid context for:

  • form autoresponders
  • system emails
  • custom emails

Screenshots:
https://prnt.sc/uhHv1Mu4SSeq
https://prnt.sc/0eq81KiJLCh9

New Component for Booking Subscriptions

Add new component tag for Bookings.

The {% component type:"booking_subscriptions" %} component returns subscriptions. It either returns all existing subscriptions or only the subscriptions of the current user.

Pattern:

{% component type:"booking_subscriptions", 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 [Boolean | default = true] (not required)
    • if false get all booking subscriptions of all users
    • otherwise get booking subscriptions of current logged in CRM member only
  • object [item|collection - default = collection] (not required)
  • collectionVariable (not required)
    • works the same way as in type: module.
  • layout (not required)
    • path to FTP file that will contain layout content that needs 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 = 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) [default = 10]
  • offset (not required) [default = 0]

Single tag item context is described below.
If object = collection than this contains attribute property that holds the list of attributes (ie: {{this.items}}):

viewType == list

{
    "formId": 0,
    "memberId": 0,
    "id": 0,
    "formName": "",
    "EventName": "",
    "Allocation": 0,
    "Price": "",
    "dateSubmission": ""
}

viewType == detail

{
    "formId": 0,
    "memberId": 0,
    "fields": [
       {
          "name": "",
          "alias": "",
          "value": "",
          "type": ""
       }
    ],
    "id": 0,
    "formName": "",
    "EventName": "",
    "Allocation": 0,
    "Price": "",
    "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>

The new component will be added here: https://prnt.sc/wqRi_L8xLv9o

Screenshots:
https://prnt.sc/6cP1FQJD1Z2y
https://prnt.sc/AS93RF_SyYZe

Improvement to the ‘Setup Analytics’ file input

If a Service Account Key File has already been uploaded, the file input will be filled with asterisks to indicate that a file is present.

A "Delete" button will now be visible. Clicking this button will trigger a confirmation popup: "Are you sure you want to remove this file?"

If the user clicks "Ok," the file data will be removed from the Google Analytics configuration in the database.

If a new file is uploaded and submitted with the setup analytics form, it will replace the old one.

If no file is submitted with the form, the existing file data in the Google Analytics configuration will not be removed.

DESIGN: https://invis.io/TA104JA6C9VP

Screenshots:
https://prnt.sc/g4sA72UFpT-F

Website Backup Scheduling Interface Updates

The Website Backup extension scheduling options have been adjusted.

The "Period" and "Every" dropdowns have been switched: https://prnt.sc/TJUqZPQ6NC5i

A new "Hour" option has been added to the "Period" dropdown.

If "Hour" is selected, the time dropdown will be removed.

When "Hour" is selected, the "Every" dropdown will show options for 6 and 12 hours (default is 12).

If a user had a backup previously, we would count a time based on the previous backup time. The tooltip should say: “Your next backup creation will be launched approximately at [time]”

If the user didn't have a backup and it's their first backup, we will do a backup within the next hour. The tooltip should say: “Your next backup creation will be launched approximately at [time]”

Screenshots:
https://prnt.sc/99KgYCCAX8Wm
https://prnt.sc/qEsk4gu7bUU8

eCommerce Сatalog duplication with or without sub-content

Now, users can choose to duplicate not only the catalogs but also the products within those catalogs.

When duplicating a catalog, a message will appear with two options:

  • Duplicate Sub-Catalogs Only:
    This option allows you to duplicate the catalog along with its sub-catalogs, but without duplicating the products.
  • Duplicate Sub-Catalogs and Products:
    This option duplicates both the catalog with its sub-catalogs and all the products within them.

Screenshots:
https://prnt.sc/kMUu0iyQ3C7O

Custom Modules Advanced Filtering

Public Backlog request link: https://webinone.com/public-backlog-state/delivered/custom-modules-advanced-filtering

Add the "Where" parameter to the admin panel. This parameter will be used for the items.

Add the "Filter Type" dropdown with the 2 options: "Simple Filtering" and "Advanced Filtering". The default is "Simple filtering". Default view will show a "Filter Type" dropdown and a "Filter by" dropdown.

If the user switches to "Advanced filtering" in the "Filter Type" dropdown, the "Filter By" dropdown will be removed and replaced with the "Where" drop-down, which will be a text input field.

If the user configures both "Filter By" and "Where", then "Where" will be prioritized, and the system will do filtering based on "Where". "Filter By" will be ignored in such case.

The filter value will use the JSON Query Language format as per: https://github.com/clue/json-query-language/blob/master/SYNTAX.md

Screenshot:
https://prnt.sc/-YJuwkISlCmc

Liquid Parser Inside Text Based Files

Backlog request: https://webinone.com/public-backlog-state/request/custom-modules-advanced-filtering

Liquid (and module rendering) is now available inside other text based files such as .css, .js, .xml, .json, .txt, etc.

Add the liquid parameter to the file URL to force it to be processed by the liquid engine.

Example

File:

/assets/css/main.css

In order to parse file with liquid reference the file with the URL parameter:

/assets/css/main.css?liquid=1

With the new functionality, the liquid will be parsed within the file, so the file is returned with the parsed liquid, providing the URL param is used when referencing the file.

{% endraw %}
v7.0 Release date: 05 Jun, 2024

Open API

OpenAPI version 2 is now released with a number of endpoints for sites on Treepl version 7.

Here is a link to the OpenAPI documentation:
https://docs.webinone.com/open-api-admin
and:
https://docs.webinone.com/open-api-frontend

Webhooks

After setting up an API application under ‘Settings’ > ‘API Application’, you can configure your Webhook on the “Webhooks” tab (https://prnt.sc/g_UDGnzrmDcF).

Choosing the entity/item type will then display the available actions (OnCreate, OnUpdate, OnDelete, OnTrigger) and if applicable, the modules/collections to receive webhooks - allowing you to enable just the modules you need to work with Webhooks.

Webhook documentation is here:

https://docs.webinone.com/webhooks

BUGFIX

Admin Roles: 'Abandoned Cart Reports' Restriction Incorrectly Displayed

  1. Go to any site without the "Abandoned Cart Recovery" extension.
  2. Navigate to Admin Roles.
  3. The "Abandoned Cart Reports" restriction should not be displayed.
  4. Additionally, the "Abandoned Cart Emails" restriction has been fixed.

Screenshot for reference: Link to screenshot

Orders: Internal Error When Setting Negative Product  Units

  1. Go to the Orders section.
  2. Create a new order.
  3. Open the order details and navigate to the Products tab.
  4. Open the toolbox for adding products.
  5. Select any product (Screenshot for reference: Link).
  6. Change the units to a negative value (validation works and the SAVE button is inactive) (Screenshot for reference: Link).
  7. Change the product without changing the units.
  8. Change the units value (Screenshot for reference: Link).
  9. Click SAVE (Screenshot for reference: Link).

Result: An internal error is displayed (Screenshot for reference: Link).

Module Item: Enable Draft

If the draft version of a page is enabled (Screenshot for reference: Link) while the live version is disabled (Screenshot for reference: Link), the draft preview will result in a 404 error (Screenshot for reference: Link).

Cancel on Bambora and PayPal Redirect

  1. Set up Bambora or PayPal redirect on the site.
  2. Add one product to the cart and choose to pay by Credit Card (Bambora).
  3. After being redirected to Bambora, click Cancel (Screenshot for reference: Link).
  4. On the checkout page, choose "Cash" as the payment method (Screenshot for reference: Link).
  5. In the admin panel, the order is displayed with "None" as the payment status (Screenshot for reference: Link).

Authorize.Net: Paid Secure Zone + Free Secure Zone Issue

  1. Set up Authorize.Net on the site to provide one-day access.
  2. Create a form that includes both a free secure zone and a paid secure zone.
  3. Submit this form.
  4. In the user's Subscribes, the free secure zone is not applied; only the paid secure zone is applied (Screenshot for reference: Link).

Roles for Portal Users: Display Informative Error

When a Portal user attempts to add their email to an Admin user:

  1. Display an error.
  2. The error popup should contain an informative message stating that this user cannot be added as an Admin user because they are a Portal user in some portal (Screenshot for reference: Link).

504 Gateway Timeout: Deleting Large Folder in File Manager

  1. Go to the File Manager.
  2. Try to delete a folder that is approximately 1 GB in size (Screenshot for reference: Link).
  3. After removing some large folders (Screenshot for reference: Link), a 500 error (Screenshot for reference: Link) or 504 error will be displayed.

Forms: Assigned CRM Groups Issue

  1. Create two different CRM groups: one applied to "Form Submissions" and the other to "Event Booking" (Screenshot for reference: Link).
  2. Go to Forms and create a new form.
  3. Assign both CRM groups to the created form (Screenshot for reference: Link).
  4. Submit the form from the frontend.
  5. Go to Form Submissions.
  6. The "Event Booking" CRM group should not be applied to form submissions (Screenshot for reference: Link).

The same issue occurs with event bookings, where the "Form Submissions" CRM group should not be applied to event bookings (Screenshot for reference: Link).

Catalogs: Deleting Assigned Catalog Issue

  1. Go to Catalogs.
  2. Create a new catalog.
  3. Assign this new catalog to any product (Screenshot for reference: Link).
  4. Delete the assigned catalog.

Expected: An alert should be shown indicating the catalog is assigned to a product (Screenshot for reference: Link).

Actual:

  • The catalog was deleted.
  • In the list view, the product shows an empty URL tab (Screenshot for reference: Link).
  • On the frontend, the product page is unavailable (Screenshot for reference: Link).

Product: Add to Cart Deleted Product

  1. Go to Products in the admin.
  2. Create a new product.
  3. Go to the frontend to view this product.
  4. Delete the product in the admin (Screenshot for reference: Link,Link).
  5. Attempt to add this product to the shopping cart on the frontend.

Result: An error is shown when trying to add the deleted product to the cart (Screenshot for reference: Link).

Payment: PayPal Flow ID Issue

  1. Go to the Payment section.
  2. Create a PayPal flow (Screenshot for reference: Link).
  3. The created PayPal flow initially has an ID of 0 (Screenshot for reference: Link).
  4. Reload the page.
  5. On the GET request for all payments, the PayPal flow now has a proper ID number (Screenshot for reference: Link).
  6. This ID is then used for the delete request (Screenshot for reference: Link).

Display Zero Values After Decimal Point in Prices

  1. Ensure that prices and totals are displayed with two decimal places, showing .00 after the decimal point (Screenshot for reference: Link).
  2. Apply a discount and check the displayed price, which should also show .00 after the decimal point (Screenshot for reference: Link).
  3. When JavaScript sends a request to:
    /public/api/forms/calculate-form-totalcost?‌Price=29&‌GiftVoucherCode=&‌DiscountCode=&‌Quantity=&‌EventId=0&‌FormAlias=patriot_membership_d
  4. After receiving the response, JavaScript updates the displayed price, ensuring it shows two decimal places.

Forms: Quote Form Should Not Include 'Accept Event Booking' Field

  1. Go to the Forms section.
  2. Create a generic form and include the "Accept Event Booking" field.
  3. Change the form type to "Quote".
  4. Click Save (Screenshot for reference: Link).

Expected Result:

  • The "Quote" form should not have the "Accept Event Booking" field (Screenshot for reference: Link).
  • An error should be displayed indicating that the "Accept Event Booking" field is not allowed in a "Quote" form (Screenshot for reference: Link).

Module Item: URL Duplicates (Inactive) Issue

  1. Go to Misc Settings and uncheck the checkbox (Screenshot for reference: Link).
  2. Go to the Custom Module and create an item (Screenshot for reference: Link).
  3. Go to Pages and create a page folder and a page with the same name as the custom module item (Screenshot for reference: Link).
  4. Both items should display a "duplicate warning" (Screenshots for reference: Link 1,Link 2).

Results:

  • The custom module item has a higher priority than the page.
  • If you click preview, the frontend shows the content of the custom module item (Screenshot for reference: Link).
  • If you set the custom module item to inactive (by choosing a future date for the release date) (Screenshot for reference: Link), the page content does not show on the frontend, and instead, a 404 page is displayed (Screenshot for reference: Link).
  • If you change the URL of the custom module item and set it to active (by choosing a past date for the release date) (Screenshot for reference: Link), the page content is shown on the frontend (Screenshot for reference: Link).

Custom Report: Internal Error When Using Duplicate Field Names

  1. Go to Forms.
  2. Create a new form with default and custom fields having the same names (e.g., "Address") (Screenshot for reference: Link).
  3. Submit this form from the frontend.
  4. Go to Custom Reports.
  5. Create a new report with the type "Contacts and Cases" and use the submitted form as a filter (Screenshot for reference: Link).
  6. Go to the Fields tab and select both checkboxes for "Address" (Screenshot for reference: Link).
  7. Go to the Results tab, where an internal error is displayed (Screenshot for reference: Link).

Email Marketing: Incorrect CreateDateTime Value in Email Campaigns

  1. Go to Email Marketing.
  2. Create a new mailing list.
  3. Go to Email Campaigns.
  4. Create a new campaign.
  5. Observe the CreateDateTime option on both the list and detail views, which displays an incorrect value (Screenshots for reference: Link 1,Link 2).

History: Preview Button Not Working

  1. Log in to the admin panel
  2. Go to Event settings and enable the Rollback extension.
  3. Go to the event item and make some changes.
  4. Open the history window and try to click the Preview button.

Result: An error is displayed when clicking the Preview button (Screenshot for reference: Link).

Order: Incorrect Shipping Option Calculation

  1. Create a new tax (Screenshot for reference: Link).
  2. Create a new shipping option with the applied tax (Screenshot for reference: Link).
  3. Create a new order.
  4. Go to the PRODUCTS tab and add any product.
  5. Select the created shipping option (Screenshot for reference: Link).

Result:

  • The total cost is not calculated correctly (Screenshot for reference: Link). The total should be $37.25.
  • From the frontend, the calculation is correct.
  • The shipping price does not recalculate when the shipping option is set up, only when something else is updated (Screenshot for reference: Link).

Portal: Site Copying Issue with Extensions

  1. Copy a site that includes extensions.
  2. Check the admin panel: the extensions remain enabled (Screenshot for reference: Link).
  3. Check the portal: the extensions are disabled (Screenshot for reference: Link).

Admin Roles: Remove Extra Restrictions

  1. Go to Admin Roles.
  2. Observe that extra restrictions are being added (Screenshots for reference: Link 1,Link 2).

Expected Result: The following restrictions should be removed from Admin Roles, as they are unnecessary:

  • Menus
  • ContentTemplates
  • Snippets
  • Forms
  • Contacts
  • AdvancedCrmGroups
  • Workflows
  • WorkflowEmails
  • EmailTemplates
  • EmailCampaigns
  • MailingLists
  • AdminUsers
  • AdminUserRoles
  • Taxes

Current Issue: These extra restrictions are appearing in various sections (Screenshot for reference: Link).

eCommerce: System Properties of Products Not Resetting to Zero

  1. Go to any product.
  2. Change the values in the system properties fields (Screenshot for reference: Link) and click SAVE.
  3. Clear those fields and click SAVE again (Screenshot for reference: Link).

Expected Result: The values should be reset to 0, similar to the behavior in stage v5 (Screenshots for reference: Link 1,Link 2).

Actual Result: After saving, the fields are restored with the last values instead of being reset to 0 (Screenshot for reference: Link).

Workflows: Incorrect Error Text Displayed

  1. Go to Comment Settings.
  2. Add a workflow notification to any module (Screenshot for reference: Link).
  3. Click SAVE.
  4. Go to Workflows.
  5. Delete the workflow selected in the comments (Screenshot for reference: Link).

Result: An error is displayed with incorrect text referring to forms instead of the relevant module (Screenshot for reference: Link).

Event Group: Naming Consistency

Issue: In the module names, which consist of two words, both words are capitalized except for "Event Group," where "group" is written in lowercase.

  1. Module names with inconsistent capitalization (Screenshots for reference: Link 1,Link 2).
  2. "Event Group" is displayed with "group" in lowercase (Screenshot for reference: Link).
  3. In the dropdown menu for modules, all names are capitalized except for "Event Group," which starts with a lowercase letter (Screenshot for reference: Link).

Expected Result:

  • "Event Group" should be consistently capitalized as "Event Group" in all instances, aligning with the naming convention used for other modules.

Forms: Inconsistent Aliases Between Admin and FTP

  1. Go to Forms.
  2. Create a form with a multi-word name from the admin panel (Screenshot for reference: Link). The alias is generated with an underscore.
  3. Create a form with a multi-word name from FTP (Screenshots for reference: Link 1,Link 2). The alias is generated with a dash.
  4. Observe that forms created from the admin and FTP have different aliases (Screenshot for reference: Link).

Expected Result: Forms created via FTP should use the same alias format as forms created in the admin panel, with underscores.

Actual Result: Forms created via FTP have dashes in their aliases, whereas forms created via the admin panel have underscores.

Custom Module: Creating Items from Frontend with Enabled Bookings

  1. Go to Custom Module settings.
  2. Enable bookings (Screenshot for reference: Link).
  3. Create a new module item from the admin and add a form for creating module items from the frontend on any page.

Result:

  • In the admin, the "Event Date End" field is required (Screenshot for reference: Link).
  • In the form for creating an item from the frontend, this field is not required (Screenshot for reference: Link).

Screen recording for reference.

Misc Settings: Inconsistent Use of Dots at the End of Sentences

  1. Go to Misc Settings.
  2. Observe that two select options have a dot at the end of the sentence, while the other two do not (Screenshot for reference: Link).

Expected Result: All select options should have consistent punctuation, either with or without dots at the end of the sentences.

Custom Module: Parent/Child Table List View Issue

  1. Go to the custom module with the parent-child relationship (Screenshot for reference: Link).
  2. Go to the table tab in the child module and add a new table (Screenshot for reference: Link).
  3. Go to the parent module with the items list view (Screenshot for reference: Link).

Expected Result: The child table should be displayed only in the tree view.

Actual Result: The child table is displayed in the items list view of the parent module (Screenshot for reference: Link).

Products: Incorrect Volume Discount Calculation

  1. Create a new product.
  2. Go to the Price tab.
  3. Create a new price with a volume discount, but ensure it is disabled (Screenshot for reference: Link,Link).
  4. Go to the frontend for this product and increase the quantity to 5 to get the discount.

Result:

  • The displayed price for 5 products is incorrect (Screenshots for reference: Link 1,Link 2).

Screen recording for reference.

Security Bug with Comments: Liquid Tags Rendering Issue

  1. Go to the comments section.
  2. Enter a comment containing Liquid tags, such as {{this}} or {% endraw %} {{this}} {% raw %}.
  3. Submit the comment.

Original request:
Possible Security Bug With Comments

When using the Comments module and submitting a comment, the CMS wraps the body text in Liquid RAW tags if there is Liquid present in the text. However, it's possible to get around this by adding opposing RAW tags around the Liquid to be injected. eg:

Some text {% endraw %} {{this}} {% raw %} more text...

I've tried this with regular forms and it is not successful and the CMS correctly blocks the Liquid injection attempt (I think by removing the submitted RAW tags).

So perhaps the Comments form needs an upgrade to the same security features used for regular forms.

Import/Export Parent/Child Module: Connection Issue

  1. Go to the Parent module settings atthis link.
  2. Export the Parent module (Screenshot for reference: Link).
  3. Go to the stage environment and import the module atthis link.
  4. After the import, observe that the connection between the parent and child modules is not displayed (Screenshot for reference: Link).

Expected Result: The connection between the parent and child modules should be preserved and displayed after importing the module.

Actual Result: The connection between the parent and child modules is not displayed after the import.

Comments: Default Item Limit Shows Strange Number in Liquid Output

  1. Use the Comment component in Liquid without specifying a limit value for comments or commentThreads.
  2. Observe the Pagination.ItemsPerPage in the Liquid output.

Expected Result: If the limit value is not specified, the Pagination.ItemsPerPage should show a reasonable default value.

Actual Result: The Pagination.ItemsPerPage shows a very large number when the limit value is not specified (Screenshots for reference: Link 1,Link 2).

Additional Information: When the limit parameter is specified, it correctly shows the specified value.

Event Subscribers: Incorrect Display of Capacity in Event List

  1. Create a free event.
  2. Open the event page in two separate tabs.
  3. In the first tab, fill in all fields and click Send.
  4. In the second tab, fill in all fields and click Send.
  5. Go to the Bookings tab and observe the displayed quantity.
  6. Go to the list of Events and observe the displayed capacity.

Expected Result: The capacity should be correctly updated and displayed in both the Bookings tab and the list of Events.

Actual Result: The Bookings tab displays the correct quantity, but the list of Events shows an incorrect capacity.

System/Custom Modules: Internal Error When All Columns Are Deleted

  1. Go to any module.
  2. Open the Settings and navigate to the Tables section.
  3. Delete all columns (Screenshot for reference: Link).
  4. Go to Module Items.

Expected Result: The module items should be displayed without errors.

Actual Result: An internal error is displayed (Screenshot for reference: Link).

"Events: Add Pagination to Follow-Up Tab

  1. Go to the Events module settings.
  2. Navigate to the Follow-Up tab (Screenshot for reference: Link).

Expected Result: Pagination should be added to the Follow-Up tab for better navigation and user experience.

Actual Result: Currently, there is no pagination on this page, which can make it difficult to navigate through a large number of follow-ups.

Comments: Inconsistent Capitalization in 'Comment Sending Policy' Dropdown

  1. Go to the Comments section.
  2. Navigate to Comments Settings.
  3. Click on the "Comment sending policy" dropdown (Screenshot for reference: Link).

Expected Result: The dropdown values should be consistently spelled with proper capitalization.

Actual Result: The two values are spelled differently, with one using capital letters and the other not (Screenshot for reference: Link).

Comments: Inconsistent Capitalization in 'Comment Sending Policy' Dropdown

  1. Go to the Comments section.
  2. Navigate to Comments Settings.
  3. Click on the "Comment Sending Policy" dropdown (Screenshot for reference: Link).

Expected Result: The dropdown values should be consistently capitalized.

Actual Result: The two values are spelled differently, with one using capital letters and the other not (Screenshot for reference: Link).

Custom Report: Inconsistent Capitalization in 'Fields' Tab

  1. Create a CRM group and apply it to every select (Screenshot for reference: Link).
  2. Go to any custom report.
  3. Navigate to the "Fields" tab.
  4. Observe the names of each block. The word "Fields" is written with a capital letter, while the CRM groups use a lowercase letter (Screenshot for reference: Link).

Expected Result: The capitalization should be consistent, with either both words capitalized or both in lowercase.

Actual Result: The word "Fields" is written with a capital letter, while the CRM groups use a lowercase letter.

Events: Missing Validation for Follow-Up Emails with Same Name

  1. Go to the Events module settings.
  2. Navigate to the Follow-Up tab (Screenshot for reference: Link).
  3. Create a new follow-up email (Screenshot for reference: Link).
  4. Create a second follow-up email with the same name.

Expected Result: An error or validation message should be displayed, preventing the creation of two follow-up emails with the same name.

Actual Result: Two follow-up emails with the same name were created without validation (Screenshot for reference: Link).

All Templates: Add Error Message on Thank You Page

Add validation to display an error message on the thank you page for all templates. This ensures that if a user submits a form and an error occurs, or if a user reloads the thank you page, an appropriate error message is shown.

Steps to Implement:

  1. Go to the system pages settings, specifically the Thank You page (Link).
  2. Add the following code snippet to the Thank You page template to handle error display:
{% if formSubmissionData == "" or formSubmissionData.error >= 1 %}
<div class="grid-container">
    <h1>Error</h1>
    <p>{{formSubmissionData.errormessages | default : "The form wasn't submitted"}}</p>
    ...

Expected Result:

  • When a form is submitted and an error occurs, the thank you page displays an error message.
  • When the thank you page is reloaded, an error message is displayed if the form data is invalid or contains errors.

This ensures users are informed about submission errors and prevents confusion when reloading the thank you page.

Backup: Restoring Issues

Issue: Backups are not being restored correctly. After initiating a backup restore, no files or data appear in the File Manager or other parts of the site. Additionally, backups are not deleted properly.

Steps to Reproduce:

  1. Go to the backup site: Backup Site.
  2. Test on the stage site with ID 32648.
  3. Observe that there are backups with storage sizes ranging from 300-900MB.
  4. Attempt to restore a backup (Screenshot for reference: Link).

Expected Result:

  • Files and data should appear in the File Manager and other parts of the site after restoring the backup.
  • Backups should be deleted properly when requested.

Actual Result:

  • After restoring a backup, no files or data appear in the File Manager or other parts of the site (Screenshot for reference: Link).
  • Backups are not being deleted properly (Screenshot for reference: Link).

Additional Information: Please investigate the issue to ensure backups are restored and deleted correctly.

System Pages: SEO URL Mappings Display Double Slashes

  1. Go to any system page.
  2. Navigate to the SEO settings (Example link).
  3. Open the request SEO settings.

Expected Result:

  • The UrlMappings should display a single /.

Actual Result:

  • The UrlMappings display double slashes // (Screenshot for reference: Link).

Action Required:

  • Investigate and correct the URL mapping to ensure it displays only a single /.

System Pages: CodeView/WYSIWYG Switching Issue

Issue: On system pages, switching between CodeView and WYSIWYG sends the correct values (true/false) in the request. However, after reloading the page, it always opens in WYSIWYG mode.

Steps to Reproduce:

  1. Go to any system page.
  2. Switch between CodeView and WYSIWYG.
  • The correct values (true/false) are sent in the request (Screenshots for reference: Link 1,Link 2).
  1. Reload the page.

Expected Result:

  • The editor should remember the last selected mode (CodeView or WYSIWYG) and open in that mode after reloading the page.

Actual Result:

  • After reloading the page, it always opens in WYSIWYG mode, regardless of the last selected mode.

Action Required:

  • Investigate and fix the issue to ensure the editor remembers and opens in the last selected mode after reloading the page.

Orders: Internal Error When Quickly Disabling Gift Certificate and Discount Code

  1. Create a new order.
  2. Add any product to the order.
  3. Add a discount code and a gift voucher to the order.
  4. Quickly disable the gift certificate and discount code without waiting for a response from the server.

Expected Result:

  • The system should handle the quick disable actions gracefully without causing any errors.

Actual Result:

  • An internal error is shown (Screenshot for reference: Link).

Additional Information:

Action Required:

  • Investigate and fix the issue to ensure that the system can handle rapid disable actions without causing an internal error.

Forms: Inconsistent Naming for reCaptcha Fields

  1. Go to Forms.
  2. Create a new form.
  3. Add reCaptcha v2 and reCaptcha v3 fields to the form.

Expected Result:

  • The reCaptcha fields should have consistent naming conventions.

Actual Result:

  • The reCaptcha fields have different names (Screenshot for reference: Link).

Action Required:

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

1) Site reactivation and Billing Cycle change (Portal)

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

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

2) Site reactivation and Billing Cycle change (CMS)

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

3) Reminder emails

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

Invoice email fix

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

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

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

BUG FIXES

Form with two paid secure zones

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

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

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

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

Products - inventory control

1. Go to products

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

3. Go to frontend and buy this product

4. Go to the product INVENTORY tab

the "In Stock" field again = 1

Form submission export with new fields

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

after filling this form from the front

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

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

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

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

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

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

Rename Site information to Site Globals -  liquidcontext

Rename Site information to Site Globals -  liquidcontext

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

Custom module - delete URL in module

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

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

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

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

1. Go to admin like admin user

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

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

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

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

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

Contacts - uppercase letters

1. Go to contacts

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

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

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

{% endraw %}
v 6.8 Release date: 03 Oct, 2022

E-commerce Quoting Option

Original Description:

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

DESIGN

https://invis.io/YAX7PB2EC3Q 

1) Create Order functionality

Provide ability to create new order from the admin

Default status is ‘New’

Invoice Number should not be generated during this action

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

2) Change products in the order

Provide ability to edit order products from the admin

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

Design:

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

Implement following functionality:

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

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

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

3) Change overall order data

Provide ability to change the following data for an Order:

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

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

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

4) New Payment type of “Refund”

Provide ability to add “Refund” as a payment type

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

5) Form changes

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

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

6) Shopping cart changes

Add request quote button to shopping cart liquid object:

{% component type:"shopping_cart" %}

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

7) Request a quote system pages

Create system pages for Quotes

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

8) System emails

Create System email for Quotes

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

9) Secure zone logic

On Quote form submit with Secure Zones assigned:

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

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

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

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

Fields on formbuilder:

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

11) Plan restrictions

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

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

12) Admin User Role Restrictions

Add following admin user role restrictions

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

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

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

Logic

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

eWay payment field expiration workaround

1) Extend eWAY payment gateway settings

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

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

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

2) Logic for Modal

Do not show payment fields on the form.

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

3) Improve payment fields validation

After form submit:

  • if payment fields error occurred
    • reload payment fields iframe

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

Event payment to include tax and volume discounts

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

Liquid output improvement of the event item:

Add following properties to liquid output of the event item:

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

JS for volume discount:

When changing allocation field:

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

On page load:

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

Headers settings custom setup

1) Add header settings page

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

DESIGN

https://invis.io/M4107BHKYUDC

Content

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


>> Strict-Transport-Security



>> X-Content-Type-Options



>> X-Frame-Options



>> Access-Control-Allow-Origin



>> Content-Security-Policy

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


>> Referrer-Policy



>> Permissions-Policy

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


>> (For page requests) Cache-Control

  • Content is same as below


>> (For files requests) Cache-Control



>> (For page requests) Age

  • Content is same as below


>> (For files requests) Age



>> (For page requests) Expires

  • Content is same as below


>> (For files requests) Expires

2) Logic

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

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

3) Admin user role restrictions

Add following admin user role restrictions

  • HTTP Header Settings
    • Can View
    • Can Manage

4) Site plan restrictions

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

  • Pro

----------

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

Checklist values with commas improvement

1) Request params improvement

Add new property to ‘request.request_url’ liquid object

  • request.request_url.originalParams

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

Example:

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

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

Outputs:

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

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

Outputs:

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

2) Advanced CRM group field liquid object improvement

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

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

Example:

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

{{groupFieldsList}}

Output:

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

3) Save entity improvement

For the following property types:

  • checklist
  • dropdown multiple

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

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

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

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

Entities that requires this improvement (admin UI)

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

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

  • Module item update form
    • For Checklist property type

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

      change to

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

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

      change to

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

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

      change to

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

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

      change to

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

4) Custom report improvement

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

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

5) Import/Export improvement

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

  • Module item
  • Contact
  • Case
  • Booking
  • Order

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

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

Example:

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

6) Improve filters on custom reports

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

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

Logic:

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

Design: https://prnt.sc/KsffJVqXl2pm

Example:

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

  • options
    • 1
    • 2
    • 3
    • 4

Select the following values for the contacts:

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

Setup Custom report for contacts and:

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

"Remember Me" for CRM login form

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

Settings:

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

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

Login form upgrade:

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

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

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

Example: https://prnt.sc/mhd_q974tKDb

Login form logic:

When user submit login form with checked Remember me checkbox

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

if not checked

  • Member logged-in cookie lifetime defaults to 1 day

Improve Site load speed while saving module item

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

Improve the following logic that using the Table solution

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

Tax rounding strategy setting

1) Add a new eCommerce setting

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

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

2) Rounding Logic on shopping cart calculation

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

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

When banker rounding (unit price only) applied:

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

Abandon Cart Functionality

1) Extension setup

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

“Abandoned Cart Recovery”

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

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

For logged-in users only.

Design: https://invis.io/JP13194K9QFA

​Pricing: Free during the beta period

Extension Restrictions logic:

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

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

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

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

Likewise, if the Restore cart functionality is attempted:

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

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

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

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

Logic:

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

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

Validation:

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

DESIGN: https://invis.io/CW10NLS86GBJ 

4) Abandoned Cart Emails

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

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

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

5) Abandoned Cart Email

LIQUID object should contain following data:

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

Email Sending Logic:

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

On email save:

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

6) Tracking URL logic

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

7) Restore cart functionality

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

8) Abandoned Cart Extension Page

Add new menu item

  • ‘Extensions’ > ‘Abandoned Cart Recovery’

Content

  • Notifications
  • Abandoned Carts
  • Reports

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

9) Abandoned Cart Recovery -> Notifications tab

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

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

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

Add new notification functionality:

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

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

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

List of all abandoned carts.

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

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

Abandoned Cart Details page

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

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

11) History data

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

12) Shopping cart delete operation upgrade

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

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

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

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

14) Analytics dashboard charts

Provide ability to add

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

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

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

15) Admin User Role Restrictions

Add following admin user role restrictions

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

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

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

Disable detail layout feature

New module setting:

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

Logic:

If ‘Disable detail layout’ is TRUE:

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

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

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

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

Module item rating

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

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

Add new system property to Edit module item form

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

2) New module item liquid property

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

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

3) Searching logic

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

  • prop_Item_Rating_Min
  • prop_Item_Rating_Max

4) Sorting logic

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

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

Add full Urls to Export

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

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

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

Rename Site information to Site Globals

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

Example: https://prnt.sc/KpeG14rpKr4w

2) Change liquid aliases accordingly

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

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

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

OSE Related Improvements

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

Multiline Text property changes

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

Eg: https://prnt.sc/c4PmuscwOLMd

Feature flags changes (v6.8)

Remove the following feature flag: ‘Improved Custom Reporting’

BUG FIXES

Bug

Liquid in domain_settings

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

Liquid data is not correctly outputting the Currency Name.

Bug

CRM Contact - in secure zone not display ID

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

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

Bug

Site Information - edit datapicker

Go to Site Information

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

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

Bug

Page caching - desktop/mobile

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

Bug

Create/update item from front

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

{% endraw %}