Server Task Plugin Configuration

 {
	// defines where new tickets are created - there must be at least one option specified (see below)
    projectsCreate: ITaksProjects[] 

	// ticket generation options
    useAsDescription?:ITaskTaskDescription // defines if and what to use as default description -> default is empty (an empty description box)
    useEmptyTitle?:boolean // by default the title of new task is the current item title, true leaves it empty
    requireCommitTicket?:boolean // set to true if saving should requires a task id (requires smartLinks to be configured)

	// search options    
	defaultSearches?:ITaskSearch[] // can be used to define default search expressions, (e.g. shortcuts to search task changed in last x hours, server plugin must understand these...)
    // the first search in the list will be executed automatically when the dialog is opened
    // in order not to run an automatic search define first element in array with name="" 
    allowEmptySearches?:boolean // can be set to true if plugin can handle it 
    searchHelp?:string // can be an url to any website to explain search options (e.g. jql https://..atlassian.. /jql)
    autoSearch?:boolean // can be set to true to start default search (when opening dialog)


	// automatic ticket link highlighting
    smartLinks?:ISmartTask[] // a set of rules to automatically show hyperlinks to items -> note these are available only in the client, in documents the same rules will not be applied!
    smartUrls?:ISmartUrls[] // a set of rules to automatically detect dropped links


	// hiding of tickets unless they are in specific projects (empty to show all)
    projectFilter: string[] // filter for projects of which items are displayed in workflow control, if not set all tasks are shown -> problem this also needs to be implemented in reports

	// allow to map one item in matrix with one external item
    one2OneMapping?:IOne2OneMapping // requires one2one capability. defines how external items are shown
	    
	// plugin name options
    pluginName:string  // e.g. JIRA, GitHub, ...
    pluginLongName:string  // e.g. JIRA Server Plugin, GitHub Plugin, ...
    
    // these can be set to limit the plugin's capabilities
    hideCreateTask?:boolean // overwrites canCreate capability
    hideSearchTasks?:boolean // overwrites canFind capability
    handleAsLink?:boolean // should not be changed - if true links are treated like URLs
    hasMeta?:boolean // should not be changed - if true external items have a descirption and a status
    
	// server computed settings which can be overwritten
    nativeCreateUrl?:string // overwrites nativeCreateUrl
    nativeCreateSearch?:string // overwrites nativeCreateSearch
}

type ITaskTaskDescription = "hide"|"empty"|"text"; // later we could support html editors - not now though |"html"

interface IOne2OneMapping {
    // configures 1-1 mapping
    projectId:string // id communicated to server to indicate in which project to create tickets
    taskTypeId:string // id communicated to server to indicate what type 
    showId?:boolean // shows external item's id in title
    statusOverwrites:IOne2OneMappingStatus[]
}
interface IOne2OneMappingStatus extends ITaskRenderInfo {
    externalStatusName:string // name of external status
}

interface ITaskRenderInfo {
    text:string, // one to one mapping will show this text
    color:string, // in this color
    background:string, // with bg color
    strikethrough?:boolean // optional strikethrough 
}

interface ITaskSearch {
    name:string // name of search to show in UI
    expression:string // expression to be send to server
}
interface ITaksProjects {
    projectId:string // id communicated to server (can be "" if there is no concept of a project in server plugin)
    projectName:string // name communicated to user 
    taskTypes: ITaskType[] // there must be at least one default task type per project
}

interface ITaskType {
    taskTypeId:string // id communicated to server (can be "" if there is no concept of a different task types in server plugin)
    taskTypeName:string // name communicated to user 
    iconUrl?:string // can be an url of an icon to display
    iconClass?:string // can be an class of an icon to display
}

interface ISmartTask {
    regex:string // regex which needs to match, e.g. (github-)([0-9]*) would match "github-12" with two groups, "github-" and 12
    issueProjectId:string  // a template which creates the project information for a matched issue (uses the same replacement as above)
    issueId:string  // a template which creates the issue information for a matched issue (uses the same replacement as above)
    title:string  // url template for a title
    url?:string  // url template which needs to be created, e.g. "https://myissue.com/myticket/ticke-$2/details" would replace the $2 with the second  group (like "12" above)
}
interface ISmartUrls {
    regex:string // regex which needs to match, e.g. (github-)([0-9]*) would match "github-12" with two groups, "github-" and 12
    issueProjectId:string  // a template which creates the project information for a matched issue (uses the same replacement as above)
    issueId:string  // a template which creates the issue information for a matched issue (uses the same replacement as above)
    title:string  // url template for a title
    priority?:number // if there are several matches the highest priority will win
}