Embed widgets from other services, eg videos from youtube, maps from google maps, etc. For most of these there are built in Kademi components to make life easy, but when there is no special component you can still just drop in a code snippet, referred to as "embedding"
Edit the main templates, e.g - dashboard, login and home etc..
the more applications that are installed on your website, the more templates will appear.
The auctions app lets you run auctions on your websites, either using points or as regular cash auctions.
Auctions can be of different types including the usual highest bid type, or lowest unique bid.
This app lets you create blogs, where each blog is a list of blog articles. Blogs have tags which users can select
to indicate preference or browse. Articles can be featured for greater prominence and have a set of images.
Calendars are mobile enabled, and allow you to invite users to events by email which they can register to attend. Includes
scheduled reminders and confirmation emails.
The ContactUs app creates contact pages for users of your website to submit forms, typically requesting informtation. These forms can be customised to collect general information, such as surveys
The Dashboard app gives each user a dashboard which presents them with a jumping off point when they log in. Other apps might add components to the dashboard
The Products app gives you a database that you can add your products to. Users can browse the products and order them. Normally used for ordering samples and marketing materials.
The common base class for both the store folder and category folders
Provides methods for searching for products within this resource. Eg a search
within a ECommerceStoreCategoryFolder only yields results within that
category, but a search on ECommerceStoreFolder yields results from all
categories in the store
A transaction manager intended specifically for use with custom apps
This is available as the transactionManager variable. So in custom apps you
use this:
Fired when a bid is placed. Can mean that a user has placed a new bid, or
that a user who was previously in teh lead is no longer leading
Event ID: auctionBid
An article has a title, body, brief description and blog images. An article
is also a folder and can contain resources such as images used in body
content
Blog images are images which are specifically assigned to the article with an
orientation and they are used for templating purposes.
Articles have an approval process to allow blog authors to have their work
checked before being published to the website.
A goal which is linked to multiple other goals. This goal is achieved when
one of the subsequent goals is achieved
This allows a journey to have branches, like decision nodes but where we wait
for an outcome.
Represents a shopping cart including virtual items.
Physical cart items are those the user has explicitly added
Virtual items are those the system has added based on additional rules.
This includes vouchers, after a user has entered a valid voucher code.
And also promotional items, such as 'free gift with purchase'
Virtual items cant be explicitly removed or have their quantity changed.
Represents a certificate, typically awarded for completed training activities
This folder will generate HTML applying a template. The parent folder will
usually be a module folder, and if so status for the current user about that
module will be referenced in the certificate.
Represents a shopping cart including virtual items.
Physical cart items are those the user has explicitly added
Virtual items are those the system has added based on additional rules.
This includes vouchers, after a user has entered a valid voucher code.
And also promotional items, such as 'free gift with purchase'
Virtual items cant be explicitly removed or have their quantity changed.
This HTML Templater assumes page templates contain components, so should not
be directly templated.
Instead this will look for a master template tag in the page template, and
then invoke that passing the template path for it to use
This event is fired when a user submits a contactus form.
It contains an attribute called contactRequest, which returns the
ContactRequest record
Event ID: contact
Submit forms to this resource (usually on /contactus) as a POST to send
contact email requests
The contactus form page is conceptually very similar to the group
registration page. Both will create a profile if it doesnt exist and you can
submit data to both, and both can trigger events to send emails, etc.
The difference is that a contact submission only creates new data, it never
changes existing data. Whereas registering a user can allow existing profile
data to be modified.
Captcha
If a Captcha app is enabled it will be used to verify the response. You can
customise the error response message by sending a parameter called
invalidCaptchaMessage
The main thing it does is convert FileResource objects to RenderFileResource
objects, for html files which are accessed within a website. This is what
allows templating to occur.
Note that this will not return a RenderFileResource for html files which have
a doctype
Use this to do queries, optionally including aggregations and selecting terms
Eg contentSearch?q=farm&aggregations=type/categories&term-type=News
This will query for: query text = farm (will search in title, content) type =
News (will look for a type field of exact value News) aggregations: first by
type, then with a nested aggregation of categories
Is a mapping of a path to a logical controller. For each controller there are
a list of methods which can be called based on the http method and parameters
Use this to create a URL to controller mapping for a custom app or for a
website controller.
Use either the admin or website controller root objects depending on whether
you want to create a controller for websites or for the administration system
controllerMappings.adminController() - For admin screens
controllerMappings.websiteController() - For website controllers
For example:
controllerMappings.adminController().path("/bluefin").enabled(true).defaultView(views.templateView("bluefin/manageProjects"))
.addMethod("POST", "addProject", "newProjectName")
.addMethod("POST", "setupDatabase", "setupDatabase") // temporary only, needs to be part of initialisation
.addMethod("POST", "newCandidate", "newCandidateId")
.addMethod("POST", "publish", "publish")
.addMethod("POST", "startSync", "sync") // start a sync operation, will redirect if need oauth login
.addMethod("POST", "updateFields", "updateFields") // update project fields
.build();
This is the resource which gets created when a controller mapping is located.
It executes the javascript and templates
Scripts executed from a ControllerResource have access to these global
variables
Represents some type of currency which can be used to make payments.
Different currencies are not interchangeable. Currencies, in this context,
include actual physical currencies like USD, AUD, etc, as well as things
which can be considered means of payment within Kademi but are not
necessarily actual currencies, such as reward points, Bitcoin, trade dollars,
etc
Dashboard for the user. Most functions will be provided by
PortletApplications which will be invoked from the template using the
PortletsDirective
Eg: #portlets("messages") , which will render portlets for the messages
section of the page
Standard sections are intended to be: messages - brief list of messages at
top of page primary - this is the main section of the page, with about 70%
width secondary - this is a narrowed section of the page, possible lower down
for small screen clients
Represents a ranking of a participant. The rank is zero indexed, and zero
is the highest or lowest as appropriate for the method which returned the
results
The participant is either an OrgData or ProfileBean
This represents a period of time (if dates have been specified) for a data
series, which can be queried to find the top (or lowest) results
Note that results can be attributed either to an individual (ie a profile) or
to the organisation they're in (eg store or other business unit)
Intended to receive rows.
Updates, deletes or inserts into the selected provider based on the mode
property which can be - update, insert, delete, updateOrInsert
Update, Delete and updateOrInsert operations require an identifier
This step works with a provider that provides access to a particular table.
Available providers are:
This will replace formatter for date functions. Note this uses a versioned
name, to allow evolution. As changes are made with break backwards
compatibility, this will be copied to a new version
Selects the next step from a list of options
Configured with a map of next steps, where the key for each step is used to
select it
Provide with either a column number or an attribute name to use to get the
value to select the next step
The root resource for an e-commerce store. This provides access to categories and
products linked to this store
See the base class AbstractECommerceStoreCollectionResource for more
Represents a task to send an email, which may have been sent or might be
queued to be sent.
Also represents an email received, if the recipient profile is set it will
show in their internal inbox.
Email attachments: TODO - probably just have a list of name and crc, then the
attachment can be put in any repository
Parses incoming stream as an excel workbook (xslx). This step can be
configured to pass on the entire workbook, or just a single sheet, or it can
process rows optionally skipping headers.
You can specify a nexts step for each sheet (either use sheetNum or
sheetName)
<ExcelInputStep> <skipHeaderRow>false</skipHeaderRow>
<processRows>false</processRows> <nextSheetSteps>
<ExcelInputStep sheetNum="0"> <next
class="JsRowStep"/> </ExcelInputStep>
</nextSheetSteps> <useXml>false</useXml>
</ExcelInputStep>
Or a single next step which will be given the entire workbook as a
org.apache.poi.ss.usermodel.Workbook
<ExcelInputStep> <skipHeaderRow>false</skipHeaderRow>
<processRows>false</processRows> <next
class="JsRowStep"/> </ExcelInputStep>
Is intended to be used by other steps to create, populate, and output an
excel document dynamically
This class has methods to create a workbook which can then be manipulated
from a previous step
A FileResource represents a file, such as an image or video.
It will also represent HTML pages and there are methods for accessing the
structured content within a HTML page, such as title, body and data
parameters
Represents a rule for whether items should be specifically included or
excluded from the content viewing role.
This allows fine grained control, ie specific directories can be enabled or
disabled
Note that if this excludes access, other roles can still grant access
This app assists with getting data in and out of your kademi account,
integrating with your external data stores.
Integration services are made available through the websites which have the
integration app enabled. You configure it by creating an XML file in
/theme/integration.xml, which has a list of endpoint mappings. For example:
Each end point identifies the type, ie http, email, etc, as well as the
address to handle requests for (ie email address or the path of a web
resource)
Represents the various factors which contribute to a final cost
The final cost is generally the sub of the adjusted extax cost plus tax
Note that if a promotional final cost is set, then that will not be the case,
and the tax + adjustedPriceExTax will NOT equal the final cost.
Executes javascript for each row. The js is expected to transform or
aggregate incoming data, probably holding stateful information between calls
to writeRow.
Output will be generted from the js by calling writeRow(..)
Script context variables:
pipeline - a Pipeline object
thisStep - also a referene to the current Pipeline
formatter - the Formatter
nextStep - a NextStep object, representing the next step to be executed
after the current
log - the logger for generating console log output
applications - an Applications object, use it to reference other apps and
their services, eg applications.search.searchManager.search(...)
This represents a database which may contain JSON documents
A JsonDatabase will normlly be connected to a website and accessed either
through a REST api, or server side through js controllers
Generates JSON output. The source can be a named page attribute, or an actual
object.
There is an option to wrap the data in a JsonResult object to be compatible
with the kademi forms plugin
var product =
services.criteriaBuilders.get("product").eq("name",
"p1").executeSingle();
log.info("product {}", product);
var builder =
services.criteriaBuilders.getBuilder("productOrder");
var newOrder = builder.instantiate();
newOrder.product = product;
builder.save(newOrder);
log.info("Created order with ID={}", newOrder.id);
});
A KpiDataPage is a resource class which represents a KPI. The parent of a
KpiDataPage is the data series that it belongs to.
A KPI has 3 main ingredients:
A way of aggregating records to get a single number. Eg sum, count,
average. This is the aggregation
A time interval, such as weekly, monthly, quarterly. As well as the
interval there is a multiples, ie 2 weekly, 3 monthly, etc
A list of levels which categorise the result. Eg 0-80% is Poor, 80-90% is
Good, and 90-100% is Great
When a KPI period is passed then assessments can be generated. Eg if you have
a monthly KPI you might generate assessments for January on the 1st of Feb.
The assessment is a final result which will not change even if the data
series records are subsequently altered.
Depending on what KPI result user has achieved they may reach a level, and
level may have rewards associated with it. Rewards are allocated as a second
step after KPI assessments are generated.
An event triggered by some condition related to learning progress, eg
starting, completing or not completing after some period.
Event ID: learnerProgress
The learner role is a context-less role, in that any member of a group
with this role will get access to learning content. However, content is
protected by the Program/Group enrolement, which is checked here.
Represents something to do when a user completes a module. Typically: -
generate a certificate: defines the certificate to generate (by ID) and the
number of CPD points to award (if any) - give rewards such as gift vouchers
or entries in a draw: defintes the reward (by ID) and the number of rewards
to give
Type should be one of: - certificate - reward
An event triggered when a comment is posted
Attributes
comment - the text of the posted comment pageUrl - the url of the page on
which the comment was posted
Event ID: newComment
Represents an organisation, and allows access to information about members of
that organisation
You can get the OrgData for the organisation which owns the current website
in templating with the orgData property of the WebsiteRootFolder eg
$page.find("/").orgData
You can also get the OrgData object for a user's membership
And once you have an OrgData, if it contains child organisations then you can
use the childOrgs and allSubOrgs methods on the OrgData object to get them
Contains module statistics for the user's primary organisation. ie the
organisation which the user's primary membership is for
Typically accessed from a CourseFolder or Module folder via orgStats
Called when a payment has been made Defines attributes - payment and
recurring (RecurringTransactionBean) for recurring payments and customer
(CustomerBean) for non recurring Trigger1 = true/false, where true indicates
recurring Trigger2 = payment response code Example of email content: Thanks
for your payment! Amount:
Represents the issue of a number of credits in an incentive program, such as
a prize draw or a set of gift vouchers to be allocated
These are the credit side of the ledger, with PointsDebit being the debit
side. The result of credits - debits is the points balance
This represents a tag being received by a user on a specific post or comment
Trigger items:
1 - website
2 - the tag comment which is optional
Event ID: postTagReceived
The ProductOptionsTable handles inserting and updating product parameters and
options, often called product variants
A ProductParameter is something about a product which can have options, for
example "size" and "color" are 2 common parameters.
Each ProductParameter can have associated options. For example the "color"
parameter could have options of "red" and "blue"
The fields supported by this provider are:
productCode - Code for this variant, eg 'black'
parameterCode - Code for this variant type, eg 'colour'
parameterTitle - Title for this variant type, eg 'Choose your wonderful
colour'
name - Code for this variant, eg 'black'
title - A descriptive title for the variant, eg 'Glossy Black'
This is a database table provider for Products
Note that products can be associated with categories, and product options,
and can also be added to reward stores.
Use the CategoryTableProvider to setup categories, the ProductOptionsTable to
setup variants, parameters and options for each product, and
ProductInRewardTableProvider to associate products with reward stores
This handles specific fields:
This is the root folder for e-learning. Its direct children are all programs
in the current website. You can use this to find programs and courses
available for the current user, or all which exist.
Wraps processing in a transaction and commits it in the finished phase
This allows executions to be tagged with an execution ID, which is intended
to unqiuely identify an import or export of this pipeline. This can be used
to prevent multiple processings of the same data.
For example, you might have a file containing points being loaded once each
day. You might use an execution ID template which evaluates to (for example)
"points-31012015". Then if another execution generated the same ID you would
conclude this is a double-import and throw an error.
This represents a referral step.
This will be fired twice on a referral, once for the sender as the source
profile, and once with the recipient as the source profile
It will also be fired when a referral converts to a signup
See the action property for determining which of those.
Event ID: referral
Post to /referral in a website with the following: - toName: the name of the
recipient, user entered - toEmail: the email address of the recipient, user
entered - message: the optional personal message to send, user entered. -
pageHref: the optional page path to invite the user to, defaults to the root
This class is for rendering HTML pages.
It wraps a normal FileResource and parses its content, expecting it to be a
well formed HTML page. It extracts a template, if present in a link tag, and
if not present defaults it to theme/page, so it will use the page.html
template of the current theme
Example:
home page The title, template and body can be updated with a POST to this
Also supports read/write parameters embedded in the html
Parameters can be accessed via milton/ajax integration with the milton
namespace
Eg: module1/_DAV/PROPFIND?fields=milton:learningTimeMins
And those parameters can be updated via PROPPATCH in a similar manner
Creating new html pages is supported by integration with NewPageResource,
which looks for a .new suffix, and creates an instance of RenderFileResource
on the fly
When entered, this node will search through all repo apps looking for a
RepoAppActionNodeType (aka customAction) with the same nodeType value. If
found it will execute the jsMethod on the app, passing the current
rootfolder, lead, funnel and exiting node as arguments
If the function returns a value, this will be returned as the next node id
This Listens for event's on the platform and Passes it on to custom apps
listening for that event. The following event types are captured:
TriggerEvent - This includes all the
automation triggers available
ResourceEvent - This gets fired when a repository resource gets accessed
or changed. Includes events like DeleteEvent, AccessedEvent, MoveEvent,
PutEvent, NewFolderEvent
This is a specialised List used for manipulating and querying resources
You'll usually this to sort, group, filter lists, as well as create new lists
which you can add to in the template
Displays resources based on what gruops the current user is enrolled in
Reads from a conventional folder structure associated with the website:
/resources/[group-name]
where group-name is the name of a group which is associated with the current
website
This is for non-learning rewards, ie competitions
A RewardsFolder represents a Reward, and is a folder which can contain
arbitrary content resources like images etc
Represents a reward store. Provides methods for accessing the current user;s
transaction history, points balance
Child resources are category folders, which contain the products
Get recent points activity with the pointsActivity parameter:
?pointsActivity☆tDate=...&endDate...
Get the current points balance with the points parameter: ?points { balance :
1000, availableBalance: 950 }
This is a special folder which is a child of a RewardFolder, which allows
uploaded files to be viewed. There is a child for each entry with an uploaded
file as an attachment
This page lets you POST to create, update and delete records of any data
series by specifying parameters, including the amount and series name
A data series is any series of time stamped values, often used for collecting
sales data but can be used for any series.
Creates a new sales data record for each call. Requires the following
arguments
Amount
Attributed to - orgId for an organisation, or email or userid for a
profile
From - date/time for the beginning of the period
To - date/time for the end of the period. Same as from if the data is for
a single point in time
And any extra fields defined on the dataseries
The columns list maps fields onto column numbers. The standard fields are:
amount, attributedTo, fromDate, toDate
Selects the next step from a list of options
Configured with a map of next steps, where the key for each step is used to
select it
Provide with either a column number or an attribute name to use to get the
value to select the next step
Instances of this app can provide items to the social wall, ie information
that a user might want to share with friends or colleagues
This should be used in conjunction with ShareableItemEvent so push events
into the forums app
Integrates with the Products app to allow products to be opted-in to reward
programs. Once opted-in these products can be purchased with points
acculuated for that program
Product rewards can be searched and browsed by category, added to a shopping
cart
We might have a seperate shopping cart which supports multiple payment
methods
This represents the execution result of a table, which is a list of rows
(where each row is just a list of values), as well as the number of matched rows.
Note that pagination means usually only a subset of matched rows is included
in the result. The result includes the pagination parameters - startRow and maxRows
The result also includes a list of headers, identifying each column
This is wrapped around Report instaneces of type TemplateReport. Most notably
this includes reports defined in custom apps
This will generate a downloadable attachment (eg CSV) from the TemplateReport
instance
This is wrapped around Report instaneces of type TemplateReport. Most notably
this includes reports defined in custom apps
This type of report is the most generic, it allows the report author to
provide a template which generates any output. There are no filtering options
built in so the template must define and apply any which are required
However the standard ReportParams object is included as a property for
convenience
For custom apps, they will normally execute a search using the searchManager
which is a property of this resource
Wraps processing in a transaction and commits it in the finished phase
Use alwaysRollback for testing, so the transaction is always rolled back
Use the isolated property so that the transaction is local to each invocation
of this step. Ie if the transaction is called for each of 10 rows, the
transaction will be started and commited 10 times.
This is useful for sequences of transaction steps, otherwise you will get a
"nested transactions not supported" error.
A TriggerEvent gets fired when some significant event occurs on the
server.
The trigger item properties represent textual values that can be keyed on for
event triggers. Typically these will be id's of objects in context of the
event, such as the website, group, etc.
Builds pages by plugging a few things in together: - a static skeleton for a
HTML page, ie the html, header and body tags - a Theme, which defines web
resources, such as js and css files, to include in the header. And which
defines one or more layouts for the body. - the template itself, which
provides more web resources to be included in the header, and the body layout
which will be injected into the theme template. Also defines a parameter
indicating which theme template to use
This represents a vote being received by a user on their post or comment
Trigger items:
1 - website
2 - the vote amount (usually +1 or -1)
3 - total votes for the post or comment
4 - the type of the post, C=comment, FP=forum post, FR=forum reply
Event ID: voteReceived
This represents a user voting on a post. The user in context is the user
doing the voting, not the user receiving the vote!
Trigger items:
1 - website
2 - the vote amount (usually +1 or -1)
Event ID: VotedEvent
This is the top level resource for voucher redemptions and management
Users use this page to search for vouchers and change their status to
redeemed, pending, etc, or to reset their status when a mistake has occurred.
Holds a fully qualified URL with login tokens, and the precise domain
name used in the URL. This is often important because the login token
will only work with the precise domain name, and you might need to use it
for other things
Represents the root of a website. A "website" in this context is a product,
its a customer facing side of some activity, such as Learning Management
System or business website.
Resources within a WebsiteRootFolder will often behave differently then if
they were located under a OrganisationRootFolder, because the assumption is
that websites are for customers, while aadministrators will accessing the
organisation directly
While WebsiteRootFolder is a view of a repository (or rather a branch within
a repository) it also provides access to other repositories. Any repository
within the containing organisation can be access by name from the root
folder. For example, if an org has this structure:
myOrg - milton.io - maven
... then requests to http://milton.io/maven will show the maven repository
The Kademi jquery forms plugin allows seemless integration between simple html forms and server side data, behaviour and responses. All forms should be submitted with this plugin.
The Kademi Module plugin for E-learning module page. This plugin initializes click event handlers for Previous, Next, Submit and page links on module page.
The Kademi jQuery plugin allows to search organisation by free text and display matched ones in a list and Google Map. User can select organisation by click on list item or marker on Google Map