Update 5.21.0

New: BusinessCollection.Import can now merge matched rows giving preference to either the imported row or existing row.

New: BusinessCollection.Import can now import from multiple line fields to one. If the property is of type MultipleLineText then the system will look for a column in the import ending in Line1, Line2, etc. For example, PostalAddressLine1, PostalAddressLine2 and PostalAddressLine3 will be imported into PostalAddress.

New: BusinessCollection.Import can specify the date format being imported as one of the following:

  • Day Month Year
  • Month Day Year
  • Year Month Day

New: Common.ConvertToDateTime(DateTimeText, GenericDateFormat) has been added to enable manual sorting within the parent group.

New: Group.Position has been added to enable manual sorting within the parent group.

New: All Articles menu item under content management.

New: Many functions on business objects have been modified to return self.

New: All object properties including application and collection now can specify where the Repository is.

Fix: Error when adding a promotion.

Fix: After adding a promotion it returns to the list.

Fix: An object's item and collection properties filter and sort attributes are no longer visible and cannot be edited by the user.

Fix: Group.GetActiveMembershipCount returns an error when Group.MaximumMemberships set.

Fix: The actual error when making a payment is now displayed correctly.

Fix: CollectionClassDefintion.GenerteHTML merge expressions.

Update 5.20.0

New: BusinessCollection.Import will now except JSON and XML.

New: BusinessCollection.Import new excepts two more parameters MatchItemBy which except a unique column name and UpdateMatches which specified whether to skip or update rows that match.

New: JSON and XML exports now include both the ID and FileName along with ToString in a sub-element for Item types. When an item's property is referenced (i.e. Country.Code) then the system will create a sub-element for it. When multiple are grouped together (i.e. Country,Country.Code,Country.Name) then they will be grouped in the same sub-elememt.

New: XML export format now uses the definition name as the element name and ID is a sub-element, not an attribute.

Fix: JSON export now has the correct file extension.

New: BusinessCollection.IsExistingItem and BusinessCollection.Item now except a dictionary of name value pairs. It will first look for FileName and if not available use ID.

New: BusinessCollection.FilterOnIDFileNameOrUniqueValues now except a dictionary or array of dictionary of name value pairs. It will first look for FileName and if not available use ID.

New: Common.XMLToObject converts xml to an array/dictionary the same format as Common.JSONToObject.

Fix: JSON export now has the correct file extension.

Fix: Submit name in defintion inspector.

Update 5.19.0

New: ValueDefinitionAttribute.StoreSessionOnly had been replaced by enumeration ValueDefinitionAttribute.Repository which indicate where the value is stored:

  • Database: stores in a column in the table.
  • More Info: stores the name and value in a JSON column named More Info.
  • Request: stores only for the current request.
  • Session: stores in the user's session state.
  • Application: stores in the application state.

New: JSON table column MoreInfo replaces XML table column CustomProperties to store the custom properties in a name value collection.

New: PaymentMethod.MoreInfo and Email.MoreInfo have been created to store the custom properties from the inherited classes. For example, SecurePayPaymentMethod.MerchantID, OrderEmail.OrderStatus, etc.

New: A table column has been created for each custom property and the following system properties:

  • GatewayPaymentMethod.ReconciliationRequired
  • GatewayPaymentMethod.VerificationRequiredWithStoredPaymentMethod
  • OrderItem.RegularPrice
  • ServiceBooking.AdditionalInformation

New: ClassDefinitionAttribute.BaseType returns one of the following:

  • BusinessApplication
  • BusinessCollection
  • BusinessCollectionItem

New: JavaScript function to create a tabs on the client-side. To use set class="tabs" on the container element. The same element must have a child element of nav, to hold the table of contents, and one or more elements with an id for each content section. For example:

<div class="tabs">
  <nav>
    <ul>
      <li><a href="#content-one"><span>Content Section One</span></a></li>
      <li><a href="#content-two"><span>Content Section Two</span></a></li>
      <li><a href="#content-three"><span>Content Section Three</span></a></li>
    </ul>
  </nav>
  <div id="content-one">Content section one here...</div>
  <div id="content-two">Content section two here...</div>
  <div id="content-three">Content section three here...</div>
</div>

New: Definition inspector has been overhauled with a new look. You can also add a collection class or property directly via the inspector and it will add the table or column in the database if need be.

New: The dashboard shop now lists all products to easily add products to the cart without multiple roundtrips to the server to do so. A client-side search and filter by category have also been added to make it easy for the customer to find what they want fast.

New: ItemTypes.InheritsRank is a calculated column on the table used for sorting.

New: CustomDefinitionNamesStartWith now defaults to underscore if not provided.

New: ValueDefinitionAttribute.SQLDataType returns the data type required to store the property value in an SQL table column. For example, HTML = nvarchar(max), ID = int, Money = decimal(19,3), etc.

Fix: Error in MoneyDefinitionAttribute.FormatValue when round to value is whole number.

Fix: Error in EnumerationDefinitionAttribute.CompareValues when enumeration name passed.

Fix: GetCollection now throws an appropriate error if not found.

Fix: To output of ConvertSiteToXHTMLCompliant.

Fix: To the attributes of the following properties:

  • AutomatedTask.URL
  • AutomatedTask.Duration
  • CourseResult.CompletedOn
  • Email.FromEmailAddress
  • Email.ReplyEmailAddress
  • Email.MergeCollection
  • Email.MergePropertyForRecipient
  • Email.MergeFilterExpression
  • Email.MergeSort
  • Order.DiscountTaxRate
  • Order.FreightTaxRate
  • OrderItem.TaxRate
  • Payment.ProcessingFeeTaxRate
  • PaymentMethod.Currency
  • PaymentMethod.ProcessingFeePercentage
  • Promotion.DiscountRate
  • Subscription.AutoRenewDue
  • Task.URLToRun
  • Task.PercentageComplete
  • TaxRate.Rate
  • User.PasswordLastUpdatedOn

Update 5.18.1

Fix: To pricing for selected or logged in user.

Fix: When loading the filter expressions, the filter is reset without unnecessary code.

Fix: Organisation.Region was required in the database causing an error.

Update 5.18.0

New: counter.js function that shows a number incrementing or decrementing to a target value when visible in view port. To use set class="counter" on an element and the inner text is the target value. Also can use these optional attributes:

  • data-start is the starting value. Defaults to 0.
  • data-incremental-pause is the number of milliseconds to pause between increments. Defaults to 50.
  • data-increments is the number of increments to perform. Default is 40.
  • data-locale is the locale to use when formatting the number. Default is en-AU.
  • data-format-options are the options for formatting the number. Default is { style: 'decimal', minimumFractionDigits: 0, maximumFractionDigits: 0 }.

Fix: Menu item not showing as current when URL matched the current URL.

Fix: Parent group property not set when adding a sub group from that parent.

Fix: Processing boolean parameters of a method.

Fix: Display values when filtering a collection with in operator.

Fix: Dashboard membership summary and order summary clickable totals.

Update 5.17.4

Fix: Fix to checkout process returning an error due to invalid URL.

Update 5.17.3

Fix: Fix to freight calculations based on delivery zones.

Fix: Fix when an item in the object is not found the system will check for a redirect. For example, if /blog/my-blog-post was renamed to /blog/my-renamed-blog-post.

Update 5.17.2

Fix: Fix to function that determines if a member can renew automatically to a group.

Update 5.17.1

Fix: Postmaster email address ignored when checking for bounced emails.

Update 5.17.0

New: Membership.AutoRenew now can be set to:

  • No
  • Maybe: Send me an invoice.
  • Yes: Pay via my stored payment method.

New: When an email is generated, prior to sending to the recipients, the system scans the HTML for images that need to be resized, copies and resizes them in the email folder and updates the link.

New: Property data type PhoneNumber will check if number is compliant. Allows leading +, 3 to 15 numbers, opening bracket ( with matching closing bracket ), space and hyphen - separators. For example, +61 7 5535 8942, (07) 5535-8942, etc.

New: The following property was created on the website object to return organisations visible to the current user.

  • VisibleOrganisations with filename organisations

New: The system only retrieves required table rows when necessary. This can be overridden if you know most rows are going to be accessed, like menu items, and the system will return all so there are less requests to the database. To do this set CollectionDefinition.AlwaysFillWithoutFilters.

Fix: The search control, clear filter and items per page now include nofollow so search engines don't index.

Fix: When processing an order and notifications, invoice, etc. failed to send the process would stop. Now it continues with a note added to order.

Fix: Error retrieving display value in filter on collection when filtered on a variable like [Today].

Fix: Error in GenerateCaptchaImage.

Update 4.18.0

New: ServiceSchedule.AvailableQuantity and ServiceTime.AvailableQuantity when blank default to Service.AvailableQuantity.

Fix: Attachments can now be viewed without going via the primary object if allowed.

Update 5.16.2

Fix: BusinessObject.GetHTMLBreadCrumbs to show current object. Also, now will create links to the custom view by default if one exists.

Fix: Modified BusinessCollectionItem.ToString for new items.

Update 5.16.1

Fix: Canonical path for pages including home page.

Fix: Canonical path for collections.

Fix: Filter menu for items with sub-items such as categories and sub-categories.

Update 5.16.0

New: ClassDefinitionAttribute.SubmitDisplayNameExpression and MethodDefinitionAttribute.SubmitDisplayNameExpression allow you to set the name of submit button. For example, login method submit button might say "Sign In".

Update 5.15.1

Fix: Error when trying to cascade delete rows when the related table is a view.

Fix: When checking out from dashboard cart.

Update 5.15.0

New: ValueDefinitionAttribute.FilterMenuGrouping is used to group items in the filter menu. For example, grouping on Article.Issue might be [IssueYear] desc or grouping on User.Region might be [CountryName], [StateName]. Note: the group column names must exist on the table of the column filtering by. For example, CountryName and StateName must also exist on the Users table.

New: ValueDefinitionAttribute.FilterMenuSortAscending is used to sort items in the filter menu. True = Ascending and False = Descending.

New: Add calculated property Article.IssueYear which is used to group issues in filter menu.

Fix: EnumerationDefinitionAttribute.DefaultValue produced an error when enumeration name like Now could be evaluated.

Update 5.14.0

New: The following properties were created on the website and group objects to return published articles visible to the current user.

  • VisibleServiceTimes with filename servicetimes

New: Filter functions on visible service times.

  • Upcoming
  • Past
  • FilterByCategory
  • FilterByCountry
  • FilterByState
  • FilterByRegion

New: When specifying users for a booking the system can now ask for additional information for each user such as Dietary Requirements. You can specify the name of that additional information in Service.BookingAdditionalInformation.

New: CartItems.HasSubscriptions and CartItem.IsSubscription.

New: You can now set BusinessCollection.ItemsPerPage to zero.

Fix: Breadcrumbs filter expression were showing the values instead of the formatted display text.

Fix: Membership.Subscription set where possible and Membership.AutoRenew set on.

Fix: Pages moved to templates have wrong item type.

Fix: Several speed issues when requesting a page.

Fix: User.Industry was a readonly property.

Fix: Disposal of business object when processing a return value.

Fix: Articles.FilterByIssue.

Fix: FilterExpression.ToString.

Fix: ValueDefinitionAttribute.CreateFilterMenu.

Fix: EnumerationDefinitionAttribute.DefaultValue.

Fix: GenerateHTMLSearchControl when using short-cut paths.

Fix: Styles for search-control.

Fix: Styling issues in CartItems.ConfirmOrder.

Fix: Styling for readonly HTML control.

Update 5.13.0

New: Title and Description properties have been added to the Template. These properties can contain merge scripts and the results are added as meta tags on a web page or subject of an email.

New: All pages that were used as templates such as success messages and email templates are now moved to templates. Pages are now simply used for web pages and no longer used for emails.

Update 4.17.2

Fix: SendEmailForm will no longer send from email address of the user entering the information. If you want to send from anyone other than the administrator, then an input control with type=hidden or type=text, name=Sender and the value being the email address should be included on the form. However the Reply-To will have the email address of the user entering the information.

Update 4.17.1

Fix: When ServiceBooking.Time is update it resets the start and finish time.

Fix: Function ServiceBooking.AllowSendEmail and ServiceBooking.AllowSendEmailIncludingUser.

Update 5.12.0

New: Group.MaximumMemberships: the maximum number of active memberships a group is allowed.

New: Group.Image: can be used for a banner image or like.

New: Organisation.Logo: the representative logo of an organisation.

Update 4.17.0

New: ServiceTime.SpecifyUsers now asks for additional information (if required) for each user such as meal preference.

New: You can now customise the booking confirmation letter for each service. This can be done by creating a merge page named [Service.FileName].servicebooking.confirmationletter.

New: Base styles nav.minimize1080 and nav.minimize1200.

Update 4.16.0

New: You can now change the maximum bookings for both a service schedule and time.

New: When adding custom properties to a service available schedule, the values are copied to a service time when generated, if the custom properties exist.

Fix: Custom properties and methods on the inherited class are now included.

Fix: Duplicate note created when service booking email sent.

Update 5.11.2

Fix: Output of meta tags for canonical and next and prev pages.

Fix: Output of filter menu to add meta tags telling search engines not to follow link when there is more than one filter applied to the link.

Update 5.11.1

New: There are several new operators for comparing item type properties (ItemDefinition) where the item has a parent. For example, Category.Parent. For this to work there must be a calcualated columns on the table with same name plus "Ancestors" and "Descendants". For example, for Article.Category there would also be Article.CategoryAncestors and Article.CategoryDescendants. These return a pipe delimiter list of IDs. The operators are as follows:

  • AncestorOf is /
  • AncestorOfOrEqualTo is /=
  • DescendantOf is \=
  • DescendantOfOrEqualTo is \=
  • RelativeOf is /\
  • RelativeOfOrEqualTo is /\=

Fix: Filtering articles by category now includes the articles of descendant categories.

Fix: Site default static index file will now be loaded if exists.

Fix: Output of ValueDefinition.GenerateHTMLControl and ValueDefinition.CreateFilterMenu.

Update 4.15.3

Fix: A HTML form with class disable-window-on-submit now on submit includes the message "Please wait while processing..." with spinning repeat icon.

Update 5.11.0

New: Website.ClientIPInfo will return information about the client IP address as follows. This will use a free service but is limited to 45 requests per minute. Obtaining an API Key will give you unlimited requests. Create a configuration setting named IPAPIKey with the value being the key.

  • Country Name
  • Country Code
  • State Abbreviation
  • State Name
  • City
  • Suburb
  • Postcode
  • Latitude
  • Longitude
  • ISP
  • Organisation
  • TimeZone
  • Offset 'Timezone UTC DST offset in seconds
  • Currency Code
  • Mobile 'Is mobile connection
  • Proxy 'Is proxy, VPN or Tor exit address
  • Hosting 'Is hosting, colocated or data center

New: Website.UserCountry and Website.UserGeolocation now get their info from Website.ClientIPInfo.

New: Articles can now have a single category.

New: Search results for users on dashboard now include "Login as User".

New: Collection.DefaultItemsPerPage now set to 25. Templates and Snippets set to 100, while Email set to 5.

New: CollectionClassDefinition.GenerateFilterMenus includes a clear filter option.

New: Styles for nav.filter-menu.

Fix: Various fixes to ValueDefinition.CreateFilterMenu.

Fix: The return URL when logging in via custom register.

Fix: Article.Publish return URL.

Fix: Article.StatusMessage retrieving template to use.

Fix: CourseEnrolmentEmail.SendNow.

Fix: Email.SendNow sort order.

Fix: RelatedTradingItem.RelatedItemSelectableValues.

Fix: New process path method now checks for redirect when path not found.

Fix: The page title generated for HTML output has been modified.

Fix: Collection.Definition.GenerateHTML now shows the correct methods for each item.

Fix: Data.ConvertSQLToFilterExpressions.

Fix: A HTML form with class disable-window-on-submit now on submit includes the message "Please wait while processing..." with spinning repeat icon.

Update 5.10.2

Fix: Error when renaming items with UpdateAllLinks parameter set to yes.

Update 5.10.1

Fix: Error viewing Trading Item Discounts.

Fix: Info message not detected in client-side scripts.

Update 4.15.2

Fix: Couldn't add a large number of items to the cart due to storage size of cookies.