|
Backlog
|
Event Groups and Events (CRUD)
|
Create two nested system modules (Event Group and Event) similar to the blog structure (Blog and Blog Post).
Event Group module created in order to help grouping events rather than keeping them all in one single list. Although, you're still able to view events in one list. For this reason List View was set as default layout (with ability to switch to Tree View http://prntscr.com/mf70zr
Unlike the blog and blog posts - events are allowed to be created in the root level of Event Groups and events (Blog post can’t be created in the root level only in the blog for example).
Event module has event specific fields:
- Date From
- Date To
- Capacity: (number)
- Hide when full: (boolean)
- Price : (number)
- Allow multiple subscription per one email: (boolean)
|
|
Backlog
|
CRM -> Booking Subscriptions created by an Event Form submission
|
If formData.eventId is not null - trigger eventSubscription flow:
- Set allocations from formData.allocations. If value is empty or "<1" then set allocations=1
- Validate Event Subscription (separate task created with the description)
- If event has price not null and ">0" then trigger event payment flow
- if payment is succeed
- use standard form's redirect/output flow
- Otherwise show payment error message from the payment flow
- Otherwise - create event booking record from formData info and use standard form's redirect/output flow
|
|
Backlog
|
Form -> Event subscription validation
|
Event Subscription Validation:
- Check event exists by formData.eventId:
- if not found, alert: Event with such id does not exist
- Check event is still available:
- not disabled
- Current Date is between EventDateStart and EventDateEnd (if EventDateEnd is empty - use EventDateStart with time 23:59:59)
- Current Date is between ReleaseDate and ExpiryDate (same way as used now in custom modules), alert: The event you are subscribing for is not available
- Check capacity and allocation requested. Messages:
- if capatity = current event allocation, alert: The event is full
- elseif capatity < (currentEventAllocation + formData.allocation), alert: The event hasn't enough seats. Only [[capatity-currentEventAllocation]] seats left.
- Check Allow multiple subscription per one email
- If Allow multiple subscription per one email option is false and formData.email is already subscribed to the event, alert: You already subscribed to this event
|
|
Backlog
|
Events
|
Permissions and Menu integration
|
|
Backlog
|
CRM -> Booking Subscription
|
Permissions and Menu integration
|
|
Backlog
|
CRM -> Orders section
|
Permissions and Menu integration
|
|
Backlog
|
Component box -> Events
|
- List of Events and Event Groups (same as for module items but with such fields as capacity, price etc)
- Event Subscription Form
- List of Events to choose from. Default option is "For detail layout" which gives the form a value as {{this['id']}}. Example:
{% component type: "form", alias: "[[formAlias]]", eventId: "{{this['id']}}" %}
- list of forms (that has acceptEventSubscription field enabled).
- Once user selects form and an event item, show code for copying, example: {% component type: "form", alias: "payment_form", eventId: 1939 %}
|
|
Backlog
|
Settings -> Payment Settings
|
Payments Gateways Section (also added to Permissions and Menu integration)
Gateway (select) options:
|
|
Backlog
|
Payments Gateway - Section [Stripe]
|
Stripe Settings:
- Key (required) (string)
- Currency (string) (Default USD)
- Image (string) (with upload widget like http://prntscr.com/mbx4v0
Tooltip: A relative or absolute URL pointing to a square image of your brand or product.
The recommended minimum size is 128x128px.The supported image types are: .gif, .jpeg, and .png
Specified image will be shown here http://prntscr.com/mf7c8a
|
|
Backlog
|
Form -> Form builder -> 'Accept Payment' and 'Accept Event Subscription' buttons
|
Option to add 'Accept Payment' and 'Accept Event Subscription' to the form on form builder section
- Accept Event Subscription, generates the below code before the
- Accept Payment, generates the below code inside the element:
<label for="PaymentType">Payment Type</label>
<select id="PaymentType" name="paymentType">
<option data-currency="" data-image="" data-key="" value="stripe">Stripe</option>
</select>
<input type="hidden" name="paymentData" value="">
<label for="Amount">Amount</label>
{% if paymentAmount == null %}
{% assign paymentAmount = params.price | default: 0 %}
{% endif %}
<input type="text" id="Amount" name="Amount" value="{{paymentAmount}}" data-trp_price="{{paymentAmount}}">
Generated as data-attributes on the element:
data-trp_order_name="{{orderName | default: this.name}}" data-trp_order_description="{{orderDescription}}"
Generated inside the page element:
<script src="https://checkout.stripe.com/checkout.js"></script>
<script src="/cms-assets/js/payment.js"></script>
Therefore:
If form has “Accept Payment” field selected – you can specify price in component tag:
{% component type: "form", alias: "[[formAlias]]", price: "20" %}
|
|
Backlog
|
Add file payment.js and main.css to /cms-assets directory
|
Create/Update files:
- /cms-assets/js/payment.js
(for payment flow in general and stripe flow in particular)
- /cms-assets/css/main.css
(minified version of the default styles)
NOTE:
All files in /cms-assets folder could be overridden by treepl team via sprint updates. So don’t make any changes in those files. If you want to change something that is affected by those files – add them to your own files or remove default scripts and styles from desired pages.
|
|
Backlog
|
Payment Form Processing Logic
|
Payment flow
- If Form Payment type:
- Event:
- Get event.price
- get totalAmount = event.price * allocations
- General:
- get totalAmount = formData.Amount
- Payment process:
- If formData.paymentType == 'stripe'
- Get token from formData.paymentData
- Verify totalAmount with token
- If success - end flow
- else - show message: Payment is failed: [[error message from stripe]]
|
|
Backlog
|
System Email -> Invoice
|
Create new System Email that should be sent on successful payment
{{this.order}} liquid object contains
- {{this.order.id}}
- {{this.order.MemberEmail}}
- {{this.order.MemberId}}
- {{this.order.MemberLink}} (link to admin to CRM -> Order -> particular order)
- {{this.order.Link}}
- {{this.order.items}} collection of objects. Object ({% for item in this.order.items %}):
- {{item.entityid}}
- {{item.entityType}} (Event, Form)
- {{item.name}}
- {{item.price}} (totalCost/quantity)
- {{item.quantity}}
- {{item.totalCost}}
- {{item.currency.code}}
- {{item.currency.symbol}}
- {{item.currency.digitalCode}}
- {{item.currency.name}}
- {{this.order.Status}}
- {{this.order.PaymentType}}
- {{this.order.TotalCost}}
- {{this.order.currency.code}}
- {{this.order.currency.symbol}}
- {{this.order.currency.digitalCode}}
- {{this.order.currency.name}}
- {{this.order.TransactionID}}
- {{this.order.CreatedDateTime}}
- {{this.order.UpdatedDateTime}}
|
|
Backlog
|
Submission Process -> Custom Invoice behavior
|
On form submission process:
- If payment
- Check for name="customInvoiceId" field.
- If found Email by that id - use that content for invoice
- If not found or name="customInvoiceId" is null - send default System Email -> invoice
|
|
Backlog
|
Set admin page titles
|
Setup page titles in admin the same as in the title inside the content http://prntscr.com/m8rw77
|
|
Backlog
|
Recaptcha V3
|
- Recaptcha v3 now a new button in the Form -> form builder.
- Disallow - recaptcha v2 and recaptcha v3 to be selected together for a form (validation upon save)
|
|
Backlog
|
Add form related scripts only if they are required
|
Scripts should be automatically added before ONLY if there is at least one form that requires it.
- recaptchav2
- recaptchav3
- acceptPayment field
|
|
Backlog
|
Sitemap generator - release/expiry options fix
|
Apply release/expiry options on Sitemap generator Only if they are Enabled in the module settings
Example:
- http://prntscr.com/m82qpa
- http://prntscr.com/m82qdp
|
|
Backlog
|
Upgrade liquid filters to the latest version of the liquid library
|
This fixed some issues like:
- Divided_by will no longer be integer division.
{{3 | divided_by : 2}} will be 1.5 instead of 1 as it was before
- Sort filter now can sort simple arrays (not only array of objects by object’s field as it was before)
{% assign arr = "c,d,a,b" | split: ","| sort | join: "," %}
{{arr}}
now returns a,b,c,d
- Added sort_natural filer (case insensitive sorting)
Filter list now is (bolded items are new):
- Array Filters:
- join
- first
- last
- concat
- map
- reverse
- size
- sort
- sort_natural
- uniq
- Misc Filters
- default
- date
- format_date
- compact
- url_encode
- url_decode
- strip_html
- escape
- escape_once
- handle
- handleize
- Number Filters
- ceil
- divided_by
- floor
- minus
- modulo
- plus
- round
- times
- String Filters
- append
- capitalize
- downcase
- lstrip
- rstrip
- newline_to_br
- prepend
- removefirst
- remove
- replacefirst
- replace
- slice
- split
- strip
- truncate
- truncatewords
- upcase
|
|
Backlog
|
Empty custom menu fix
|
If custom menu consist only from empty items force redirect to menu configurator not the login screen.
|
|
Backlog
|
Add datasource name and datasource url to the item liquid data
|
Add datasource name and datasource url to the item liquid data:
- {{this.dataSourcePropertyAlias}} - ID as it is now
- {{this.dataSourcePropertyAlias_name}} - name of the datasource item OR null (if no item found by dataSourcePropertyAlias ID).
- {{this.dataSourcePropertyAlias_url}} - url of the datasource item OR null (if no item found by dataSourcePropertyAlias ID).
|
|
Backlog
|
Convert Author image custom property from type Text to type Media
|
Convert Author image custom property from type Text to type Media (without losing currently saved values)
|
|
Backlog
|
Search custom modules by parentId and url slug
|
Add ability to search custom modules using
- prop_Slug (equals rule)
- prop_Url (contains rule)
- prop_ParentId (add by default to search form html under prop_ModuleId with value "":
- "-1" means the parent module's root folder id.
- Empty means skip this filter
|
|
Backlog
|
Create new module - disable save button while saving
|
While creating a custom module when clicked save once Save button should become inactive.
If validation errors occurs - enable button
|
|
Bug
|
Default gallery layout wasn't patched
|
In Gallery/Slider Layouts -> Default List now creates correctly functioning layout code:
|
|
Bug
|
First login (after some time past) to the site admin issue
|
When admin user tried to login to the admin panel (after some time past) - it just keeps looping the login page (first time).
After refresh the page login works fine
|
|
Bug
|
Can't save page when its ftp html file name contains Capital letters
|
After creating an HTML page via the File Manager an error would be thrown if attempting to later save that page via the admin 'Pages' section.
|
|
Bug
|
Liquid engine – recursion fix
|
- In menu sub item layout (/_MenuLayouts//sub_items.layout)
- if replace {% for item in currentItem.items %} with {% for item in this.items %}
- would result in infinite recursion that dramatically slowed down the site
|