⚙️ Scheduler Configuration Guide

Complete guide to configuring the Isimio Scheduler component, data model, styling, actions, plugins, and validators

📖 Introduction

The Isimio Scheduler is a highly configurable Lightning Web Component that can be adapted to work with virtually any Salesforce data model. Rather than hardcoding behaviour, almost all aspects of the scheduler are driven by declarative configuration stored in custom objects and custom metadata types.

This guide covers the full configuration surface for an Isimio installation, from the basic Lightning page design-time properties through to advanced developer features such as client-side plugins and custom validators.

How Configuration is Stored

Isimio's configuration lives in several places:

  • LWC Design-Time Properties — set on the Lightning page via App Builder
  • Schedule_Object__c / Schedule_Field__c — defines which Salesforce objects and fields are loaded
  • Schedule_Style_Control__c — declarative CSS rules driven by field values
  • Schedule_Action__c — right-click context menu entries
  • Plugin__mdt — custom metadata records pointing to static-resource JavaScript/CSS bundles
  • Schedule_Validator__c — server-side validation rules attached to objects
  • Personal_Config__c — per-user (or global) key/value settings used as merge variables in filters
Prerequisites This guide assumes the Isimio managed package is already installed and that at least one Lightning page has been created with the Isimio Scheduler component. For latest package install links, please reach out to [email protected].

🧩 The Scheduler Component

When you add the Isimio Scheduler LWC to a Lightning App Page, Home Page, Record Page, or Experience Cloud page, the Lightning App Builder exposes a set of design-time properties in the right-hand panel. These properties control the initial appearance and default behaviour of the scheduler for that specific page.

Where to Find These Settings
  1. Open the Lightning page in Lightning App Builder (Setup → Lightning App Builder, or Edit Page from the page itself)
  2. Click the Isimio Scheduler component on the canvas
  3. The properties panel on the right shows all configurable attributes

Display & Layout

These properties control the visual dimensions and initial view of the scheduler.

Property Default Description
Display Type Daily The initial view when the scheduler first loads. Available options:
Type Description
Daily Swimlane view where columns represent individual days. Suitable for scenarios with one or two records per cell, such as shift scheduling.
GANTT Swimlane view where record width reflects the duration of the activity. Best for shorter views of 1–2 days containing multiple overlapping records.
Weekly Swimlane view where each column represents a calendar week. Suitable for week-based long-term planning activities.
Monthly Swimlane view where each column represents a calendar month. Suitable for long-term project planning such as construction.
Hourly Swimlane view where columns represent individual hours within a day. Useful for fine-grained intra-day scheduling.
Calendar Monthly calendar view. Suitable for scenarios with only 1–2 records per day globally, such as an individual's work calendar or public sessions.
Agenda Vertical list of records ordered and sized by their duration. Provides a clean chronological overview of activities.
Default Schedule Length (Days) 7 The number of days visible in the scheduler when it first loads. This is the default; users can adjust the date range at runtime.
Start of Week Today Controls what date the scheduler opens to. Today opens at the current date; By Locale uses the user's locale to determine the start of the week; or specify a fixed weekday (Monday through Sunday).
Day Width (pixels) 200 The width of each day column in Daily, Weekly, Monthly, Agenda, and Calendar views, in pixels.
Hours Width (pixels) 80 The width of each hour column in the GANTT view, in pixels.
Header Width (pixels) 200 The width of the leftmost row-header column (containing row names), in pixels.
Row Height (pixels) 41 The minimum height of each swimlane row. Rows grow taller automatically when records would otherwise overlap.
Minimum Height (pixels) 600 The minimum overall height of the scheduler component, in pixels.
Maximum Height (pixels) 0 An optional cap on the scheduler height. Set to 0 to allow the scheduler to grow to fill the available screen height automatically.
Automatic Height Adjustment -30 Isimio attempts to fill the remaining screen height automatically. Use this field to nudge the calculated height by a fixed number of pixels - useful when using a utility bar in the app.
Gantt Start Hour (0–24) 0 In GANTT and Hourly views, the first hour displayed on the horizontal axis. Set to 8 to start at 8 AM, for example.
Gantt End Hour (0–24) 24 In GANTT and Hourly views, the last hour displayed on the horizontal axis.
Page Size 99999 Controls the maximum number of rows displayed per page. Reduce this on schedules with a very large number of rows to improve scroll performance.
Date Parameters {} Not currently in use.
Locale Override (empty) Forces a specific locale for date and number formatting, e.g. en-GB. Leave blank to use the user's own browser locale.
12-Hour Inputs (AM/PM) false When enabled, time input fields in record edit forms switch to a 12-hour AM/PM format instead of 24-hour.

Behaviour & Interaction

These properties toggle features that affect how users interact with the scheduler.

Property Default Description
Display Top Bar true Shows or hides the top bar containing the date navigator, view selector, filter button, and other controls. Set to false for an embedded read-only view.
Allow Display Switching true Controls whether users can switch between display types (e.g. Daily ↔ GANTT ↔ Calendar) at runtime. Set to false to lock the scheduler to the configured Display Type.
Manual Saving false When enabled, dragging, resizing, or otherwise editing records does not save immediately. Changes are held in a pending state and a Save button appears. The user must explicitly confirm before writes are sent to Salesforce.
Remember Last Dates false When enabled, the scheduler reopens at the same date range it was on when the user last left the page, rather than defaulting to today.
Allow Box Select true Enables multi-select by click-and-dragging a selection box over records. Disable to prevent accidental selections on dense schedules.
Limit to Context false Only relevant on Record Pages. When enabled, only the record associated with the current page is shown as a row, rather than all records. Useful for embedding a personal schedule on a User or Contact record page.
Show Success Toast false Displays a brief green toast notification at the top of the screen whenever records are saved successfully. Off by default to reduce visual noise.
Filter Set (empty) Scopes this scheduler instance to a named configuration group. Only Schedule Objects, Actions, and Plugins that share the same Filter Set (or have no Filter Set) will be loaded. See Multiple Schedulers.

Advanced & Developer

Property Default Description
Debug Mode false When enabled, Isimio loads its un-minified JavaScript bundles rather than the optimised production files. This makes browser console stack traces readable. Never enable in production.
Print Offset (Up) 0 When using the browser print feature, shifts the printed scheduler upward by this many pixels. Use to correct whitespace in the printed output.
Print Offset (Left) 0 When using the browser print feature, shifts the printed scheduler to the left by this many pixels.
Show Assistant Deprecated false The AI assistant is now available as a separate package. This property no longer has any effect.
Static Resource Path Deprecated (Experience Cloud only) (empty) Obsolete. Previously used to specify the path to the /resource directory in Experience Cloud. No longer required.

🗂️ Data Model Configuration

The scheduler does not know which Salesforce objects to display until you tell it. The Schedule_Object__c and Schedule_Field__c custom objects form the schema layer — they describe which objects are queried, what roles they play, and which fields are loaded and surfaced to users.

Object Types

Every Schedule_Object__c record plays one or more roles. All objects defined here are loaded when the scheduler starts, so it is important to filter large objects as appropriate. Understanding these roles is essential before creating any configuration:

Role Description Example
Scheduled Record Records from this object appear as blocks inside the scheduling grid, placed according to their start and end dates. Shift, Appointment, Task
Row Record Records from this object form the swimlane rows on the left-hand side. Typically a parent of the scheduled object. User, Contact, Room, Vehicle
Both An object can be both scheduled and a row simultaneously, though this is uncommon. A Project that also contains tasks and is itself shown on a timeline
Neither (Support Object) The object is loaded purely to provide data for plugins or lookup resolution, but does not appear as rows or scheduled records. Skill, Location reference table
Minimum Required Fields per Object
  • Every Scheduled object needs at least one Start Date field and one End Date field configured. If the same field represents both (for example, an activity with a single date), mark it as both Start Date and End Date.
  • Every Row object needs a name field (the standard Name is used by default, but this can be overridden with Name Field Override).

Schedule Objects (Schedule_Object__c)

To add an object to the scheduler, create a new Schedule_Object__c record. The Name field must be the Salesforce API Name of the object you want to load — for example Contact, My_Object__c, or a managed-package object such as kruvi_staff__Shift__c.

Core Role Fields

Field Description
Scheduled Record Tick to make records from this object appear inside the scheduling grid.
Row Record Tick to make records from this object appear as swimlane rows.
Default For Row objects: this row object is shown by default when the scheduler loads. For Scheduled objects: this is the object type created when a user double-clicks an empty grid cell.
Active Master switch for the object. Untick to stop loading this object without deleting the configuration record.
Parent Object Lookup to another Schedule_Object__c. Used when one object is a child of another in the scheduler hierarchy (e.g. we want to create opportunities but also opportunity products).
Parent Relation The API name of the child relationship field that links this object to its parent (e.g. OpportunityLineItems).

Display Options

Field Description
Label Override Replaces the standard Salesforce object label with a custom name. Must also set the plural version.
Label (Plural) Override Overrides the plural label displayed in the UI.
Name Field Override By default, the standard Name field is used as the display name. Enter an alternative field API name here to use a different field. The field must also be configured as a Schedule_Field__c.
Color Code Sets the default left-border colour for all records from this object. Accepts any valid CSS colour value: English names (Blue), hex codes (#1976D2), or RGB (rgb(25,118,210)).
Show Formatted Date/Time When ticked, the time range (e.g. 10:30 – 15:45) is shown above the visible fields inside each record block.
Multinode When a record spans more than one calendar day, this causes a separate block to appear under each day it spans. If unticked, the record only shows on the column of its start date.
Charted Include records from this object in the chart bar at the top of the schedule.
Dynamic Row Loading When ticked, rows will be created dynamically as records are loaded, even for row records that are only referenced (not directly queried).

Data Loading & Performance

Field Description
Filter A SOQL WHERE clause fragment to restrict which records are loaded. See Filtering Records below.
Load Order Controls the sequence in which objects are queried. Lower values load first. Normally this does not affect end-user experience, but can matter when writing plugins that depend on load sequencing.
Custom Batch Size Override the number of records fetched per query batch. Leave blank for the system default. Useful for very large datasets.
Query Sort Field Improves paged loading performance by sorting on a unique, ideally numeric field (e.g. an auto-number field) rather than the record ID. Greatly improves performance on large data sets.
Indexed Start Field API name of an indexed date field in YYYYMMDD format. When populated, Isimio uses this field for date-range filtering instead of the standard date field, significantly improving query performance on large datasets.
Indexed End Field Companion to Indexed Start Field — the indexed end date field in YYYYMMDD format.
Loader Class The API name of an Apex class that implements the SchedulerLoader interface. Allows fully custom data loading logic for advanced use cases.
Bypass Sharing When ticked, the object's records are loaded without respect for Salesforce's record-level sharing rules. Note: creating and editing records still obeys profile permissions.

Other Settings

Field Description
Row Selectable When ticked, clicking a row header visually marks it as selected. This has no built-in behaviour but is useful for plugins that respond to row selection events.
Edit in Salesforce UI Replaces the Isimio side-panel record form with the standard Salesforce record form (respecting your page layouts). Useful when field types not fully supported by Isimio's form are required.
Timezone Field A relational field path pointing to the field containing the record's timezone (e.g. kruvi_staff__Place__r.kruvi_staff__Timezone__c). The referenced field must contain a valid Salesforce timezone code.
Filter Set Scopes this object to a specific scheduler instance. See Multiple Schedulers.
Feed Object If ticked, this object's records will be included in the public iCal calendar feed. Feed Organizer Email and Feed Organizer Name fields configure the path to the organizer metadata fields.
Assistant No longer used. Ask us about Omni if interested in our AI harness.
A single Salesforce object can have more than one Schedule_Object__c record — for example one scoped to a FilterSet = "Managers" with different fields visible, and a second scoped to FilterSet = "Staff". See Multiple Schedulers.

Schedule Fields (Schedule_Field__c)

Once a Schedule Object is created, you define which Salesforce fields are loaded by creating child Schedule_Field__c records. The Name of each Schedule Field record must be the field API name as it appears on the Salesforce object (e.g. Status__c, OwnerId, StartDateTime).

Date/Time Role Flags

Every scheduled object requires exactly one start and one end field. These are identified by ticking the relevant checkbox on the field record:

Field Description
Start Date Marks this field as the record's start date/time. Only one Start Date field per object is permitted. Required for all scheduled objects.
End Date Marks this field as the record's end date/time. Only one End Date field per object is permitted. If the same field is used for both start and end, both checkboxes can be ticked.
Dependent On Links this date-time field to another date field on the same object. The system will copy the date portion from the referenced field, and the user's input will only be for the time portion. Useful when end times are always on the same day as start times.
Repeat Days (Beta) Marks a Text or Multiselect Picklist field whose values represent days of the week (Monday, Tuesday, etc.). Records with this field populated will appear on all matching weekdays indefinitely.

Visibility & Editing Flags

Field Description
Visible The field's value is shown inside the record block on the grid. Limit to the most important fields — no more than 6 is recommended.
Show Label When visible, prefixes the value with the field label in the format Label: Value. Only applies when Visible is also ticked.
Editable The field appears in the create/edit form when a user opens a record. Profile-level field permissions still apply.
Required Forces the field to be required in the scheduler's form, regardless of how it is defined in the Salesforce schema.
Read-Only Forces the field to be read-only in the form, regardless of user permissions.
Popup The field's value is shown in the hover-over tooltip that appears when the user rests the mouse on a record.
Show as Tag Displays the field as a small box at the bottom-right corner of the record block instead of inline text.
Filterable The field appears in the top-bar filter panel. All field types supported.
Photo URL For row objects only. Marks a text field that contains a URL to a photo; the image is displayed in the row header column.

Aggregation & Organisation Flags

Field Description
Counted Displays a running total of this numeric field across all visible records in the row, shown beneath the row name. Only numeric fields are supported.
Counted in Cell Similar to Counted, but the total is shown inside each individual grid cell rather than under the row header.
Sortable For row objects, rows are sorted by the value of this field.
Groupable For row objects, rows can be grouped by the value of this field.
Enable Rows and Columns For Picklist fields on a scheduled object, the picklist values can be used as both rows and columns in the scheduler.
Charted Field This numeric field's values are used in the chart bar at the top of the scheduler. Only one field per object can be the charted field.

Form Behaviour

Field Description
Default Value Pre-populates this field when creating a new record from the scheduler. For date-time fields, use HH:MM format to set a default time. If not set, the Salesforce schema's default value is used (formula-based defaults are not supported).
Tab Name Places this editable field into a named section (tab) in the record edit form, grouping related fields together.
Copy Options Controls whether this field's value is copied when a record is duplicated via copy/paste or Repeat. Options: Default (copies if the field is marked as editable), Always Copy, Never Copy.
Autocomplete Fieldset For lookup fields, specifies a Salesforce fieldset on the related object whose fields are shown in the autocomplete drop-down. Great for adding more details than just the record name.
Map Lookup Associates this field with a Schedule_Map_Lookup__c record, allowing users to search for values via an interactive map.

Developer Flags

Field Description
Attribute Adds the field name and value as an HTML data attribute on the record's DOM node, in the format attr-fieldname="value". This is the foundation for writing CSS rules and JavaScript plugins that respond to field values.
Load Order Controls the display order of the field inside the record block and the edit form. Lower numbers appear first. Fractions are permitted for fine-grained ordering.
Primary Relation To For objects with multiple lookup fields pointing to the same parent object, this designates which field is the primary relationship. Affects how records are organised when that object is used as the row type.
Assistant No longer used. Ask us about Omni if interested in our AI harness.

Step-by-Step: Adding a New Object

  1. From the App Launcher, open Schedule Objects
  2. Click New and set the Name to the object API name (e.g. My_Booking__c)
  3. Tick Scheduled Record (and/or Row Record as appropriate)
  4. Set Color Code to a distinguishing colour (e.g. #4CAF50)
  5. Save the Schedule Object record
  6. In the Related section, find Schedule Fields and click New
  7. Add a field record for the start date field, tick Start Date
  8. Add a field record for the end date field, tick End Date
  9. Add any additional fields you want visible, editable, or filterable
  10. Refresh the scheduler — the new object should now appear

Filtering Records (SOQL WHERE Clauses)

The Filter field on a Schedule Object accepts any valid SOQL WHERE clause. This restricts which records are loaded into the scheduler at runtime.

Example Filters
-- Only load open cases
Status != 'Closed'

-- Only load shifts in the next year
Start_Date__c >= TODAY AND Start_Date__c <= NEXT_N_DAYS:365

-- Only load records of a particular record type
RecordType.DeveloperName = 'Standard'

-- Combine conditions
Status__c = 'Active' OR CreatedDate >= YESTERDAY
Performance Tip Always filter out records that are not relevant to the scheduler. Unnecessary records increase load time and reduce query performance. Date-range-based filters are automatically applied by the scheduler in addition to any static filter you configure here.

🎨 Custom CSS Styling

Isimio provides two complementary mechanisms for applying custom visual styles to records on the scheduler: declarative Schedule Style Controls (no code required) and developer-facing CSS Plugins (for more advanced rules).

Schedule Style Controls

Schedule_Style_Control__c records are child records of either a Schedule Object or a Schedule Field. They allow you to write CSS property rules that are automatically applied when a record matches the specified condition — all through point-and-click configuration.

Style Control Fields

Field Description
Schedule Object Apply this style to all records from the selected object. When set without a Schedule Field or Value, the style applies to every record of that type unconditionally.
Schedule Field Scope the style to a specific field on the object. The style is only applied when the record's value for this field matches the Value field below.
Value The field value that triggers this style. For example, if Schedule Field is Status__c, set Value to Cancelled to target cancelled records.
Properties One or more CSS property declarations, one per line, in standard CSS syntax. Example:
background-color: #ffebee;
border-left-color: #f44336;
color: #333;
Custom Selector For advanced use: override the auto-generated CSS selector with a fully custom one. Use this to target elements that are not tied to a specific object or field value.

Example: Highlighting Cancelled Records

  1. Open the Schedule Object record for your booking object
  2. Ensure the Status__c field has its Attribute checkbox ticked on the Schedule Field record (this is required for value-based styling)
  3. Navigate to the Status__c Schedule Field record
  4. In the Schedule Style Controls related list, click New
  5. Set Value to Cancelled
  6. Set Properties to:
background-color: #f5f5f5;
border-left-color: #9E9E9E;
color: #9E9E9E;
text-decoration: line-through;
Pro Tip: Object-Level Colours The simplest styling option is the Color Code field on the Schedule Object itself. This sets the left-border colour for all records of that type without needing a Style Control record. Use Style Controls for conditional styling (i.e. styling that varies by field value).

CSS via Plugins

For styling rules that cannot be expressed through the declarative Style Controls — for example, targeting hover states, nested elements, or using complex CSS selectors — you can write a plain CSS file and deploy it as a plugin. See the Plugins section for instructions on uploading and configuring plugin files.

When writing CSS rules that target records by object type, use the following selector pattern:

.kruviScheduler .isimio-table .UIElement.your_object_api_name {
    /* CSS properties here */
}

Object API names in CSS selectors must be written in lower-case and include the full namespace and __c suffix. For field-value-based rules, combine with HTML attribute selectors (the field must have Attribute ticked in Schedule Fields):

.kruviScheduler .isimio-table .UIElement.my_booking__c[attr-status__c="Cancelled"] {
    background-color: #f5f5f5;
    border-left-color: #9E9E9E;
}

🖱️ Right-Click Actions

When a user right-clicks on a record (or selects multiple records and right-clicks), Isimio displays a context menu. The menu items are driven entirely by Schedule_Action__c records — so you have full control over what options appear, for which objects, and under what conditions.

Overview

Each Schedule_Action__c record defines one menu item. The Name of the record is what appears as the label in the menu. Actions can be:

  • Linked to a specific Schedule Object so they only appear for records of that type
  • Organised into sub-menus using the Parent lookup
  • Hidden when nothing is selected, using Hide if Empty
  • Conditionally shown using the Condition field

Action Fields

Field Description
Name The label displayed in the context menu.
Method The fully-qualified JavaScript function to call when the user selects this action. Standard built-in methods begin with window.com.kruvi.actions.. Custom methods from plugins use their own namespace.
Method Parameter A string passed as the first argument to the method. For example, the newRecord method expects the object API name here; the flow method expects the flow API name.
Schedule Object When set, this action only appears when the selected record(s) belong to the specified object type. Leave blank to show the action regardless of record type.
Icon An optional icon name or URL to display alongside the menu label. Support for FontAwesome 5, 6, and 7 free icons. Example: fas fa-user
Load Order Controls the position of this action within the context menu. Lower numbers appear higher in the list.
Parent Lookup to another Schedule_Action__c. When set, this action appears as a child item under the parent, creating a nested sub-menu.
Hide if Empty If ticked, this action is hidden when no records are selected. Use for actions that require a selection (e.g. Delete).
Condition A JavaScript expression that is evaluated at runtime. The action is only shown if the expression evaluates to true.
Default Action For Makes this action the default for Left Click or Double Click on records, so users do not need to right-click.
Filter Set Scopes this action to specific scheduler instances. See Multiple Schedulers.

Standard Methods

The following built-in methods are available without writing any code. All standard method names must be prefixed with window.com.kruvi.actions. in the Method field.

Method Name Method Parameter What it Does
newRecord Object API Name Creates a new record of the specified type and opens the record edit form. The parameter must be the API name of the object (e.g. My_Booking__c).
edit (none) Opens the edit form for the first selected record.
delete (none) Prompts the user to confirm, then deletes the selected record(s).
copy (none) Copies the selected record(s) to the internal clipboard.
cut (none) Copies the selected record(s) to the clipboard. When pasted, the originals will be moved rather than cloned.
paste (none) Pastes clipboard contents to the currently selected cell(s).
viewDetails (none) Opens the standard Salesforce record detail page for the selected record.
viewRelatedRecord Lookup Field API Name Navigates to the record detail page of the related record referenced by the specified lookup field.
repeat (none) Opens the Repeat form for the selected record(s), allowing them to be scheduled across multiple dates.
selectAll (none) Selects all currently visible records on the scheduler.
print (none) Opens the browser's Print dialog for the current scheduler view.
update JSON data packet Updates the selected record(s) with the values in the JSON packet without opening an edit form. Example parameter: {"Status__c":"Confirmed"}. All fields in the packet must be loaded on the object.
quickFlow Flow API Name Opens a modal window displaying the specified Screen Flow. The record ID of the first selected record is passed into the flow's recordId input variable. Use the Flow API name (not the label).
flowBackground Flow API Name Executes the specified Auto-Launched Flow silently in the background. The record ID of the first selected record is passed into recordId. No UI feedback is shown.

Custom Actions

Beyond the standard methods, you can trigger any JavaScript function defined in a client-side plugin. The function must be attached to the window object.

Example: Custom JavaScript Action

This plugin code opens the selected record's Salesforce page in a new browser tab:

window.com.myCompany = {
    openInNewTab: function() {
        // Get the first selected HTML element
        let selectedElement = window.com.kruvi.mouse.selected[0];

        // Get the underlying record object
        let item = selectedElement.parent;

        // Open the record page in a new tab
        window.open('/' + item.id);
    }
};

To wire this to a right-click menu item, create a Schedule Action with:

  • Name: Open in New Tab
  • Method: window.com.myCompany.openInNewTab
Use the flow standard action for no-code custom actions. Screen flows let you capture additional data, perform logic, and update records — no plugin required. The flowBackground method is ideal for one-click status changes or record updates without any UI.

🔌 JavaScript & CSS Plugins

Client-side plugins allow developers to extend the scheduler with custom behaviour and advanced styling. Plugins are plain .js or .css files bundled into a Salesforce Static Resource (as a zip archive), then registered via a Plugin__mdt Custom Metadata record.

Step 1: Upload Your Plugin Files

  1. Create your .js and/or .css file(s) locally
  2. Zip them into a single .zip archive (the zip can contain one or more files)
  3. In Salesforce, go to Setup → Static Resources
  4. Click New
  5. Enter a descriptive Name for the resource (note this name — you'll need it in the next step)
  6. Set Cache Control to Public
  7. Click Choose File and select your zip archive
  8. Save

Step 2: Create a Plugin__mdt Record

Once your static resource is uploaded, register it as a plugin through Custom Metadata:

  1. Go to Setup → Custom Metadata Types
  2. Find Plugin in the list and click Manage Records
  3. Click New
  4. Fill in the fields as described below
  5. Save

Plugin__mdt Fields

Field Description
Label / Name A human-readable name for this plugin (e.g. My Custom Styles).
Static Resource The API Name of the static resource created in Step 1.
Files A comma-separated (or newline-separated) list of filenames to load from inside the zip archive. Example: myStyles.css,myScript.js. File types are detected automatically — the order listed here is the load order.
Component Type Set to Scheduler UI Extension for standard plugins. Use Validator only for plugins that implement server-side validation logic (rare — most validators use Schedule_Validator__c instead).
Active Untick to disable this plugin without deleting it. Useful for toggling plugins during debugging.
Load Order When multiple plugins are configured, they are loaded in ascending order of this value. Lower numbers load first.
Filter Set When set, this plugin is only loaded for schedulers with a matching Filter Set attribute. See Multiple Schedulers.
Description Free-text description of what this plugin does. Not used at runtime; purely for documentation purposes.
Plugin Type Deprecated File types are now auto-detected. This field has no effect.

Plugin Examples

Example 1: Record Background Colours (CSS)

To give all records of a specific object type a custom background colour, create a CSS file containing:

/* All booking records get a teal background */
.kruviScheduler .isimio-table .UIElement.my_booking__c {
    background-color: #E0F7FA;
    border-left-color: #00ACC1;
}

/* Cancelled bookings are shown in grey */
.kruviScheduler .isimio-table .UIElement.my_booking__c[attr-status__c="Cancelled"] {
    background-color: #EEEEEE;
    border-left-color: #9E9E9E;
    color: #9E9E9E;
}
Attribute Fields are Required for Value-Based CSS For the [attr-fieldname="value"] CSS selectors to work, the field must have the Attribute checkbox ticked on its Schedule Field record. The attribute name is always lower-case and uses the full API name including namespaces.

Example 2: Setting Dynamic Default Values (JavaScript)

When a static default value is not enough (e.g. you need the current time, or a value that varies per user), you can intercept the record creation process with a JavaScript plugin:

if (!window.classes.UIElement.prototype.update_orig) {
    window.classes.UIElement.prototype.update_orig =
        window.classes.UIElement.prototype.update;

    window.classes.UIElement.prototype.update = function(data, params) {
        if (this.sObjectType.name === 'my_booking__c') {
            if (params && params.isNew === true && !data['id']) {
                // Set default record type on new records
                data['recordtypeid'] = '012f4000000fZ1aAAE';
            }
        }
        this.update_orig(data, params);
    };
}

The pattern shown above safely wraps the original UIElement.update() method: it stores a reference to the original first, then replaces it with a new function that adds custom logic before calling the original.

All Isimio classes are accessible via window.classes. The primary class for record blocks is window.classes.UIElement. The scheduler runtime is accessible via window.com.kruvi.

✅ Validators

Validators allow you to define business rules that are checked whenever a record is created or modified. When a validation fails, the user is shown a warning or error message, and (depending on severity) the save may be blocked. Validators are configured as child records of Schedule Objects.

Overview

Each Schedule_Validator__c record binds an Apex validation class to a Schedule Object, with configuration, a message, and a severity level. The built-in validators cover the most common scheduling constraints, but custom validators can be written by implementing the Validation Apex interface.

Schedule_Validator__c Fields

Field Description
Name A descriptive name for this validator rule (e.g. Maximum Shifts per Week).
Schedule Object The parent Schedule Object this validator is attached to. The validator runs when records of this object type are saved.
Apex Handler The API name of the Apex class that implements the validation logic (e.g. Val_Length_Counter or Val_Record_Overlap).
Parameters A JSON string containing configuration values for the validator. The exact parameters depend on the validator class. These are typically edited via Isimio's built-in configuration editor rather than raw JSON.
Error Message The message shown to the user when the validation rule is triggered.
Severity Controls the behaviour when the rule fires:
  • Critical — blocks the save entirely
  • High — shows a prominent warning; user can still save
  • Medium — shows a moderate warning; user can still save
  • Low — shows a minor notice
  • Hidden — the rule runs silently; violations are recorded but not shown to the user
Active Untick to disable this validator without deleting it.

Val_Length_Counter

This validator counts the total hours (or number of records) assigned to a group within a rolling time window, and triggers if the total exceeds a specified maximum. Use it to enforce limits like "no more than 40 hours per week per person" or "no more than 8 shifts per day per employee."

Configuration Parameters

Parameter Description
Group By One or more field API names. Records are grouped by the combination of these field values before counting. Typically this is a lookup field to the worker or resource (e.g. OwnerId).
Maximum Hours The maximum total hours (or record count, if Count Records is enabled) allowed in the time window.
In Hours… / In Days… / In Weeks… / In Calendar Weeks… Defines the rolling time window. Fill in exactly one of these. "Calendar Weeks" means the validator counts from Monday to Sunday (or whichever week-start day is configured), rather than a rolling N-day window.
Week Start Date When using Calendar Weeks, this sets the first day of the week (e.g. Monday). Leave blank to use the system default.
Count Records If ticked, each record counts as 1 regardless of its duration. Useful for enforcing a maximum number of assignments rather than a maximum number of hours.
Example: Maximum 8 Shifts per Day per Employee
Apex Handler:  Val_Length_Counter
Error Message: This employee has too many shifts today.
Severity:      High
Parameters (JSON):
{
  "groupby": ["OwnerId"],
  "max": 8,
  "days": 1,
  "count": true
}
Example: Maximum 40 Hours per Calendar Week per User
Apex Handler:  Val_Length_Counter
Error Message: This person would exceed 40 hours this week.
Severity:      High
Parameters (JSON):
{
  "groupby": ["OwnerId"],
  "max": 40,
  "cal-weeks": 1,
  "week-start": "Monday"
}

Val_Record_Overlap

This validator detects when two records assigned to the same group have overlapping time ranges. Use it to prevent double-booking a person, room, or piece of equipment.

Configuration Parameters

Parameter Description
Group By One or more field API names. Records with the same combination of values are considered to be in the same group and checked for overlap (e.g. OwnerId groups by person).
Break Before (Hours) Adds a required gap before each record. If set to 0.5, records must have at least 30 minutes of free time before them to avoid triggering the validator.
Break After (Hours) Adds a required gap after each record. If set to 1, there must be at least 1 hour free after each record ends.
Example: Prevent Double-Booking by Owner
Apex Handler:  Val_Record_Overlap
Error Message: This person is already booked during this time.
Severity:      Critical
Parameters (JSON):
{
  "groupby": ["OwnerId"]
}
Example: Require 1 Hour Between Shifts
Apex Handler:  Val_Record_Overlap
Error Message: There must be at least 1 hour between this person's shifts.
Severity:      High
Parameters (JSON):
{
  "groupby": ["OwnerId"],
  "padEnd": 1
}
The validator configuration editor in Isimio (accessible via the Schedule Validator record page) provides a form-based UI for setting these parameters without writing raw JSON. Use it as a starting point and export the JSON for reference.

👤 End-User Variables (Personal_Config__c)

Personal_Config__c records allow administrators to define named key/value variables that can be used as merge fields inside SOQL filter expressions on Schedule Objects. This enables the scheduler to load a different set of records for different users — without writing any code.

A common use case is allowing each user to see only records assigned to their own team, their own region, or a record type relevant to their role.

Creating Variables

Personal Config records are created directly in Salesforce. Each record is owned by a specific user and holds a single named value:

Field Description
Name The variable name used as the merge field token in filters (e.g. MyRegion). Must be unique per user. This is case-sensitive when referenced in filters.
Value The value that will be substituted into the filter at runtime (e.g. North). This is what gets injected into the SOQL WHERE clause.
Global When ticked, this record serves as the default value for all users who do not have a personal record with the same Name. Acts as the fallback. There should always be exactly one Global record per variable name.
Always Create a Global Default Every variable used in a filter should have at least one record with Global ticked. Without a default, users who do not have their own Personal Config record will fail to load any records at all.

Using Variables in Filters

To reference a Personal Config variable in a Schedule Object filter, use the merge syntax {!VariableName}. At runtime, Isimio replaces this token with the value from the current user's Personal Config record (or the Global record if no personal value exists).

Examples
-- Filter by a record type stored as a Personal Config variable named "CaseRecordType"
RecordType.DeveloperName = '{!CaseRecordType}'

-- Filter to a specific region
Region__c = '{!MyRegion}'

-- Combine a static filter with a personal config variable
Status__c = 'Active' AND Territory__c = '{!UserTerritory}'

Step-by-Step: Setting Up a User Variable Filter

  1. Decide on a variable name, e.g. DefaultTeam
  2. Create a Personal_Config__c record owned by a system administrator with Name = DefaultTeam, Value = TeamA, and Global = true — this is the default
  3. For each user who needs a different value, create a Personal Config record owned by that user with Name = DefaultTeam and their specific Value
  4. On the Schedule Object, set Filter to: Team__c = '{!DefaultTeam}'
  5. Each user will now see only records from their own team
Personal Config variables are also useful as user preferences — for example, letting users choose which record type they prefer to create by default, or which region's records they want to view, without requiring administrator intervention each time.

🔀 Multiple Schedulers

A single Salesforce org can host multiple independent Isimio schedulers, each with its own data model, actions, plugins, and styling. This is achieved through a mechanism called Filter Sets. Typical use cases include:

  • A scheduler for shift management and a separate one for resource bookings, on different Lightning pages
  • A manager view with additional columns and actions, alongside a simplified staff-facing view
  • Department-specific schedulers each showing a different subset of objects and record types

How Filter Sets Work

The Filter Set attribute on the Isimio LWC component is a plain text string (e.g. ShiftManager or Bookings). When the scheduler loads, it evaluates every configurable element against a simple rule:

Loading Rule

An element (Schedule Object, Action, Plugin) is included if:

  • Its Filter Set field is blank (loaded by all schedulers), OR
  • Its Filter Set field matches the scheduler component's Filter Set attribute

Elements with a different Filter Set are ignored entirely.

This means that any configuration element without a Filter Set is global — it appears in every scheduler in your org. You only need to set a Filter Set on elements that should be exclusive to one particular scheduler instance.

Setting Up Multiple Schedulers

Step 1: Name Your Scheduler Instances

Choose a short, descriptive name for each scheduler instance. These names are case-sensitive and must match exactly between the component attribute and the configuration records. Good examples: ShiftManager, RoomBooking, ProjectTimeline.

Step 2: Set the Filter Set on the LWC Component

  1. Open the Lightning App Builder for the page where this scheduler will live
  2. Click the Isimio Scheduler component
  3. In the properties panel, set Filter Set to your chosen name (e.g. RoomBooking)
  4. Save and activate the page

Step 3: Tag Configuration Records with the Filter Set

For each configuration element that should only appear in this specific scheduler, set its Filter Set field to the same name:

Object Filter Set Field Location Effect When Set
Schedule_Object__c Filter Set field on the object record This object (and all its fields) is only loaded by schedulers with the matching Filter Set
Schedule_Action__c Filter Set field on the action record This menu item only appears in the matching scheduler's context menu
Plugin__mdt Filter Set field on the metadata record This plugin is only loaded by the matching scheduler
Pro Tip: Shared Configuration Leave common objects, actions, and plugins with a blank Filter Set — they will automatically appear in every scheduler. Only tag the elements that are truly unique to one scheduler. This avoids duplicating configuration.

Example: Two Schedulers from the Same Object

Suppose you want a Manager view that shows a Shift__c object with all fields, and a Staff view that only shows the name and start/end time:

  1. Create two Schedule_Object__c records, both with Name = Shift__c:
    • Record 1: Filter Set = Manager, all fields configured
    • Record 2: Filter Set = Staff, only name and date fields configured
  2. Create two Lightning pages, one with Filter Set = Manager, one with Filter Set = Staff
  3. Each page will load the correct configuration independently
The Default Isimio Tab The out-of-box Isimio tab installed with the package has no Filter Set configured. It will therefore only load Schedule Objects, Actions, and Plugins that also have a blank Filter Set. If all your objects have Filter Sets assigned, they will not appear on the default tab.
The Filter Set attribute is available on: Schedule_Object__c, Schedule_Action__c, Plugin__mdt, Schedule_Saved_Filter__c, and Schedule_Object_Filter__c. It is the same string value compared against the LWC component's filterSet property at load time.