new MerjentApp()

Description

Framework for managing common data events in Merjent Fulcrum apps using a composable template system.

Architecture

MerjentApp uses a template + mixin pattern for composability:

  • Mixins (./mixins/): Reusable method collections organized by concern (status, permissions, locking, photos)
  • Templates (./templates/): Functions that compose mixins into complete app behaviors

Important: The methods defined in this class are placeholder stubs. The actual implementations are provided by mixins and bound to the instance at runtime via DefaultTemplate or a custom template.

File Structure

src/mApp/
			├── MerjentApp.js              # This file - class definition with property defaults and method stubs
			├── templates/
			│   └── DefaultTemplate.js     # Default template that binds mixin methods to the app
			└── mixins/
			    ├── StatusMixins.js        # Status calculation methods (draft_complete, p_s_complete, etc.)
			    ├── PermissionMixins.js    # Permission methods (fourTier, standardUpdate, etc.)
			    ├── LockingMixins.js       # Field locking methods (checkLockStatus, standardLockEditing, etc.)
			    └── PhotoMixins.js         # Photo validation methods (standardValidation, limitCaption, etc.)
			

How It Works

  1. new MerjentApp() creates an instance with default property values
  2. Constructor calls install_template(DefaultTemplate) automatically
  3. The template binds mixin methods to the instance, replacing the placeholder stubs
  4. Your data event code uses the configured instance

Available Mixins

Mixin Methods Description
StatusMixins draft_complete, p_s_complete, active_resolved, etc. Status calculation based on field values
PermissionMixins fourTier, standardUpdate, hideCoordInit User permission levels and restrictions
LockingMixins checkLockStatus, standardLockEditing, checkCompleteLockStatus Field locking logic
PhotoMixins standardValidation, limitCaption, validateAllPhotos Photo validation

Default Template Bindings

The DefaultTemplate binds these mixin methods:

  • getStatusStatusMixins.draft_complete
  • getPermissionsPermissionMixins.fourTier
  • baseUpdatePermissionPermissionMixins.standardUpdate
  • getLockStatusLockingMixins.checkLockStatus
  • getCompleteLockStatusLockingMixins.checkCompleteLockStatus
  • baseLockEditingLockingMixins.standardLockEditing
  • validatePhotoPhotoMixins.standardValidation
  • limitCaptionPhotoMixins.limitCaption
  • validateAllPhotosPhotoMixins.validateAllPhotos

Creating Custom Templates

Create a new template by importing mixins and binding them to the app instance:

Examples
// templates/MyCustomTemplate.js
import { StatusMixins } from '../mixins/StatusMixins';
import { PermissionMixins } from '../mixins/PermissionMixins';

export function MyCustomTemplate(app) {
  // Use 3-state status instead of default 2-state
  app.getStatus = StatusMixins.p_s_complete.bind(app);
  app.fieldLockCondition = ['Submitted', 'Complete'];

  // Use standard permission system
  app.getPermissions = PermissionMixins.fourTier.bind(app);
  app.baseUpdatePermission = PermissionMixins.standardUpdate.bind(app);

  // ... add composite methods like start(), updatePermission(), etc.
}

// In your data event:
const mApp = new MerjentApp();
mApp.install_template(MyCustomTemplate);

## Configuration

To turn off fieldLock and completeLock:
mApp.completeLockCondition = []
mApp.fieldLockCondition = []

To turn off updateStatus:
mApp.dnSubmit = null

Members


restrictNewRecords :boolean

Description
  • Disable creation of new records except for certain permission levels. Set this.newRecordCreators to the user level(s) that is allowed to create new records.
Details
boolean

- false


newRecordCreators :string

Description
  • Permission levels allowed to create new records.
Details
string

- ['Admin']


adminNames :Array.<string>

Description
  • Array of user names to have "Admin" privleges in this app.
Details
Array.<string>

- ['Jason Hendricks', 'Amanda Johnson', 'Mikel Paiva']


editorNames :Array.<string>

Description
  • Array of user names to have "Editor" privleges in this app.
Details
Array.<string>

- []


userNames :Array.<string>

Description
  • Array of user names to have "User" privleges in this app.
Details
Array.<string>

- []


viewerNames :Array.<string>

Description
  • Array of user names to have "Viewer" privleges in this app.

The default getPermissions() method places all users not listed in another permission level in this category.

Details
Array.<string>

- ['Field User 1', 'Field User 2']


adminRoles :Array.<string>

Description
  • Array of Fulcrum user roles to have "Admin" privleges in this app.
Details
Array.<string>

- []


editorRoles :Array.<string>

Description
  • Array of Fulcrum user roles to have "Editor" privleges in this app.
Details
Array.<string>

- []


userRoles :Array.<string>

Description
  • Array of Fulcrum user roles to have "User" privleges in this app.
Details
Array.<string>

- []


viewerRoles :Array.<string>

Description
  • Array of Fulcrum user roles to have "Viewer" privleges in this app.
Details
Array.<string>

- []


lockOnLoad :boolean

Description
  • Option to check for fieldLock on load.
Details
boolean

- true


defaultPermissionLevel :string

  • The default permission level for users that are not specified as being under a specific permission level.
Description
  • Possible values are 'Admin', 'Editor', 'User', 'Viewer'.
Details
string

- 'User'


photoCapMax :number

Description
  • Max characters allowed in a photo caption
Details
number

- 1258


requireLandscape :boolean

Description
  • Option to force landscape format for the photo field with data name mApp.dnPhotoLoc
Details
boolean

- false


setLocoff1photo :boolean

Description
  • Option to set the record location to the location of the first photo taken from photo field with data name mApp.dnPhotoLoc
Details
boolean

- false


disableLocationEdit :boolean

Description
  • Disable location editing for User and Editor. Checked in default updatePermission method. Calls M.disableLocationEdit()
Details
boolean

- false


dnAutoName :string|null

Description
  • Data name of the auto-name field. Set to null to disable auto-naming.
Details
string | null

- null


dnDt :string

Description
  • Data name of the primary report date field.
Details
string

- 'date'


dnDueDate :string

Description
  • Data name of the due date field.
Details
string

- 'due_date'


dnReportID :string

Description
  • Data name of the report id field.
Details
string

- 'report_id'


dnFollowUp :string

Description
  • Data name of the follow=up required y/n field.
Details
string

- 'report_id'


dnResolved :string

Description
  • Data name of the follow-up resolved field. Could be a y/n field or a date field.
Details
string

- 'resolved_date'


dnFollowUpRepeatable :string

Description
  • Data name of the follow-up repeatable field.
Details
string

- 'follow_up_report'


dnSubmit :string

Description
  • Data name of the 'submit_report' field. Default status functions are checking for value of 'yes'. Turns on field lock. If you are not using the updateStatus data event set this to null.
Examples
mApp.dnSubmit = null //Turns off updatStatus Method.
Details
string

- 'submit_report'


dnReviewed :string

Description
  • Data name of the 'coordinator_reviewed' field. Default status functions are checking for value of 'yes'. Turns on complete lock.
Details
string

- 'coordinator_reviewed'


dnCoordinatorInitials :string

Description
  • Data name of the 'dnCoordinatorInitials' field. Signed with coordinator initials when mApp.dnReviewed gets checked 'yes'
Details
string

- 'coordinator_reviewed'


dnPhotoLoc :string

Description
  • Data name of the photo field to use for setting record location and also landscape validation.
Details
string

- 'site_photos'


allPhotos :Array

Description
  • Array of photo names to check for missing captions and exceeding max character limit.
Details
Array

- 'site_photos'


completeLockCondition :Array.<string>

Description

Array of status values to match for turning on complete record lock.

To turn off complete lock use empty array [].

Examples
mApp.completeLockCondition = []
Details
Array.<string>

- ['Complete', 'Resolved']


completeLockExclude :Array.<string>

Description

Array of data names to exclude from read-only status when complete lock is on.

Details
Array.<string>

- [this.dnSubmit,this.dnReviewed]


fieldLockCondition :Array.<string>

Description

Array of status values to match for turning on field lock.

To turn off field lock use empty array [].

Examples
mApp.fieldLockCondition = []
Details
Array.<string>

- ['Submitted']


fieldLockExclude :Array.<string>

Description

Array of data names to exclude from read-only status when field lock is on.

Details
Array.<string>

- [this.dnSubmit]


install_template

Description

Installs an app template, binding all template methods to this MerjentApp instance.

Templates are functions that configure the app by binding mixin methods and setting defaults. See MerjentApp.DefaultTemplate for the default template implementation.

Parameters
Name Type Attributes Default Description
template function <optional>
DefaultTemplate

Template function to install. Defaults to DefaultTemplate.

Returns
Examples
// Use default template
const mApp = new MerjentApp();
// Use custom template
import { CustomTemplate } from './templates/CustomTemplate';
const mApp = new MerjentApp();
mApp.install_template(CustomTemplate);

Methods


start( event ) → {void}

Description

App entry point. Runs: updatePermission > updateStatus > updateLock (if lockOnLoad).

Stub - Implementation provided by DefaultTemplate.

Parameters
Name Type Description
event *

Fulcrum event object

Returns

enterReportID( event ) → {void}

Description

Set report id to: {year}{month}{day}_T{hours}{minutes}_{initials}

Stub - Implementation provided by DefaultTemplate.

Parameters
Name Type Description
event *

Fulcrum event object

Returns

reportIDprefix() → {string|null}

Description

Callback that returns a prefix for the report ID. Override to customize.

Stub - Implementation provided by DefaultTemplate.

Returns

addCoordinatorInitials( event ) → {void}

Description

Adds coordinator initials when dnReviewed is checked 'yes'.

Stub - Implementation provided by DefaultTemplate.

Parameters
Name Type Description
event *

Fulcrum event object

Returns

getStatus( event ) → {string}

Description

Calculate the record status based on field values.

Stub - Default implementation: StatusMixins.draft_complete

Available alternatives in StatusMixins:

  • draft_complete - Two-state: Draft → Complete
  • active_resolved - Two-state: Active → Resolved
  • p_s_complete - Three-state: Pending → Submitted → Complete
  • p_s_c_f_resolved - Five-state with follow-up
Parameters
Name Type Description
event *

Fulcrum event object

Returns

Status value


updateStatus( event ) → {void}

Description

Update the record status if it has changed.

Stub - Implementation provided by DefaultTemplate.

Parameters
Name Type Description
event *

Fulcrum event object

Returns

getPermissions( event ) → {string}

Description

Get the permission level for the current user.

Stub - Default implementation: PermissionMixins.fourTier

Parameters
Name Type Description
event *

Fulcrum event object

Returns

'Admin' | 'Editor' | 'User' | 'Viewer'


getCompleteLockStatus( event ) → {boolean}

Description

Check if complete lock conditions are met.

Stub - Default implementation: LockingMixins.checkCompleteLockStatus

Parameters
Name Type Description
event *

Fulcrum event object

Returns

standardAdmin( event ) → {void}

Description

Apply Admin permission restrictions.

Stub - Default implementation: PermissionMixins.standardAdmin

Parameters
Name Type Description
event *

Fulcrum event object

Returns

standardEditor( event ) → {void}

Description

Apply Editor permission restrictions.

Stub - Default implementation: PermissionMixins.standardEditor

Parameters
Name Type Description
event *

Fulcrum event object

Returns

standardUser( event ) → {void}

Description

Apply User permission restrictions.

Stub - Default implementation: PermissionMixins.standardUser

Parameters
Name Type Description
event *

Fulcrum event object

Returns

standardViewer( event ) → {void}

Description

Apply Viewer permission restrictions.

Stub - Default implementation: PermissionMixins.standardViewer

Parameters
Name Type Description
event *

Fulcrum event object

Returns

baseUpdatePermission( event ) → {void}

Description

Apply base permission restrictions (read-only fields based on user level).

Stub - Default implementation: PermissionMixins.standardUpdate

Parameters
Name Type Description
event *

Fulcrum event object

Returns

addUpdatePermission( event ) → {void}

Description

Hook for additional permission logic. Override in your template.

Stub - Implementation provided by DefaultTemplate. Returns null by default.

Parameters
Name Type Description
event *

Fulcrum event object

Returns

updatePermission( event ) → {void}

Description

Apply all permission restrictions. Calls baseUpdatePermission + addUpdatePermission.

Stub - Implementation provided by DefaultTemplate.

Parameters
Name Type Description
event *

Fulcrum event object

Returns

getLockStatus( event ) → {boolean}

Description

Check if field lock conditions are met.

Stub - Default implementation: LockingMixins.checkLockStatus

Parameters
Name Type Description
event *

Fulcrum event object

Returns

updateLock( event ) → {void}

Description

Toggle field lock based on getLockStatus().

Stub - Implementation provided by DefaultTemplate.

Parameters
Name Type Description
event *

Fulcrum event object

Returns

baseLockEditing( event ) → {void}

Description

Apply base field locking based on permission level.

Stub - Default implementation: LockingMixins.standardLockEditing

Parameters
Name Type Description
event *

Fulcrum event object

Returns

addLockEditing( event ) → {void}

Description

Hook for additional locking logic. Override in your template.

Stub - Implementation provided by DefaultTemplate. Returns null by default.

Parameters
Name Type Description
event *

Fulcrum event object

Returns

lockEditing( event ) → {void}

Description

Apply all field locking. Calls baseLockEditing + addLockEditing.

Stub - Implementation provided by DefaultTemplate.

Parameters
Name Type Description
event *

Fulcrum event object

Returns

validatePhoto( event ) → {void}

Description

Validate photo (landscape requirement, set location from photo).

Stub - Default implementation: PhotoMixins.standardValidation

Parameters
Name Type Description
event *

Fulcrum event object

Returns

limitCaption( event ) → {void}

Description

Alert if photo caption exceeds photoCapMax characters.

Stub - Default implementation: PhotoMixins.limitCaption

Parameters
Name Type Description
event *

Fulcrum event object

Returns

validateAllPhotos( event ) → {void}

Description

Validate all photos have captions on submit.

Stub - Default implementation: PhotoMixins.validateAllPhotos

Parameters
Name Type Description
event *

Fulcrum event object

Returns

disableNewRecordCreation( event ) → {void}

Description

Prevent users without permission from creating new records.

Stub - Implementation provided by DefaultTemplate.

Parameters
Name Type Description
event *

Fulcrum event object

Returns
Examples
ON('new-record', mApp.disableNewRecordCreation)