@wmfs/tymly-cardscript-plugin
Version:
Plugin which handles interactions to do with Cardscript
85 lines (71 loc) • 2.66 kB
JavaScript
class TasksService {
boot (options) {
this.stateMachines = options.blueprintComponents.stateMachines || { }
this.cardTemplates = options.blueprintComponents.cardTemplates || { }
} // boot
get longRunningTasks () {
if (!this.longRunningTasks_) {
this.longRunningTasks_ = findLongRunningTasks(
this.stateMachines,
this.cardTemplates
)
}
return this.longRunningTasks_
}
} // class TasksService
function findLongRunningTasks (stateMachines, cardTemplates) {
const tasks = { }
Object.entries(stateMachines)
.filter(([, definition]) => definition.instigatorGroup === 'app')
.filter(([, definition]) => isProgress(definition))
.forEach(([name, definition]) => {
tasks[name] = {
title: taskTitle(definition, cardTemplates),
clearable: isClearable(definition)
}
})
return tasks
}
function taskTitle (definition, cardTemplates) {
const templateName = cardTemplateName(definition)
if (!templateName) return definition.name
const template = findTemplate(templateName, cardTemplates)
if (!template) return definition.name
const titleCandidate = template.body[0].title
const titleIsGood = (titleCandidate && (titleCandidate.indexOf('{') === -1))
return titleIsGood ? titleCandidate : definition.name
}
function isClearable (definition) {
const progressOrInfo = Object.values(definition.States)
.filter(state => state.Type === 'Task')
.filter(state => state.Resource === 'module:awaitingHumanInput')
.filter(state => state.ResourceConfig)
.filter(state => state.ResourceConfig.clearTaskAfterCompleted)
return progressOrInfo.length !== 0
}
function isProgress (definition) {
const progressOrInfo = Object.values(definition.States)
.filter(state => state.Type === 'Task')
.filter(state => state.Resource === 'module:awaitingHumanInput')
.filter(state => state.ResourceConfig)
.filter(state => state.ResourceConfig.uiType === 'progress')
return progressOrInfo.length !== 0
}
function cardTemplateName (definition) {
const names = Object.values(definition.States)
.filter(state => state.Type === 'Task')
.filter(state => state.Resource === 'module:awaitingHumanInput')
.filter(state => state.ResourceConfig)
.map(state => state.ResourceConfig.uiName)
return names.length ? names[0] : null
}
function findTemplate (templateName, cardTemplates) {
for (const template of Object.values(cardTemplates)) {
if (templateName === `${template.namespace}_${template.name}`) { return template }
}
return null
}
module.exports = {
serviceClass: TasksService,
bootBefore: ['statebox']
}