用表单生成器创建一个输入表单

BaseSpace Form Builder是一个表单引擎,负责为BaseSpace Apps生成表单。开发人员可以访问开发门户并使用简单的JSON格式.在BaseSpace界面中将JSON转换为html表单元素。

本文档描述了表单的Json格式,当添加新控件时,应该将其用作资源。

任何应用程序都可以使用报表生成器工具,无论是Web应用程序、桌面应用程序还是本地应用程序。

如何使用表单生成器

表单生成器工具可以通过在开发人员门户中导航到应用程序的页面并单击表单生成器选项卡。

活性形式

你会被带到修正标签,你第一次访问一个应用程序的表单生成器标签。

活性形式激活表单是用户在启动应用程序时将在BaseSpace中看到的表单。一旦你为你的应用程序激活了一个表单,你可以直接在BaseSpace中查看该表单!现在,它将只是一个占位符表单,直到你为应用程序激活一个表单。

修正

点击后表单生成器,你会被带到修正选项卡。从“修订”选项卡,可以管理活性形式你的应用。

默认情况下有两种表单可用默认的形式示例的形式

  1. 默认表单建议只需要项目作为输入的应用程序使用,通常只有希望创建自己的输入表单的Web应用程序才会使用此表单。

  2. 示例表单是可以使用Forms Builder创建的一个非常基本的表单示例。该表单的目的是向开发人员展示一个简单的表单,以便更容易地创建复杂的表单。

除了这些表单,您还将在Revisions选项卡上看到一些按钮。

下面是每个按钮功能的简要说明:

  • 开放:在“修订”选项卡中选择表单并单击开放时,将使用所选表单打开表单生成器工具。
  • 激活:此按钮将激活所选表单。的窗体时不活跃的状态,它只能在Forms Builder选项卡中查看。但是,当窗体处于活跃的状态,它将是任何用户从BaseSpace启动应用程序时将看到的表单(当然,如果他们有权限查看应用程序)。一旦表单处于活动状态,就不能在Forms Builder工具中修改它。
  • 重复的:复制所选表单。要修改现有表单,建议使用重复的在已存在的表单上添加特性,进行修改,然后激活新表单以保存表单更改的历史记录。
  • 删除:删除所选表单。
  • 加载更多:“修订”选项卡中将显示最后10个自定义表单(不包括默认表单)。如果您希望查看更多表单,只需单击此按钮,接下来的10个也将加载。

如何取得表格内所选的资料

Forms Builder工具的最后一个重要特性是它如何将输入表单中选择的数据传递给应用程序。

根据创建的应用类型和访问数据的方式,获取数据的方法略有不同,所以我们将这部分分为三个部分:通过Javascript在表单用于Web和桌面应用程序,对于原生应用

通过Javascript在表单

在某些情况下,应用程序可能需要对其表单中的其他表单元素进行自定义验证。在这种情况下,可以在Callbacks.js脚本和任何ScriptValidationRule在表单中访问这些输入的表单值。

例如,如下所示SampleChooser字段:

{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "label": "Input Sample", "required": true, "requiredMessage": "Please choose a Sample", "id": "Sample -1", "rules": "Sample -reader"}

当用户使用这个表单时,他们会选择一个Sample作为输入,在这个例子中,我们设这个Sample的Id为123.然后,用户将完成表单,并单击继续运行应用程序。此时,一个AppSession被创建,该AppSession的Properties字段被填充如下:

"Properties": {"Items": ["Type": "sample", "Href": "v1pre3/appsessions/{AppSession_Id}/ Properties /Input. "sample-1", "Name": "输入。示例1", "Description": "", "Content": { "Id": "123" }, ], }

我们可以使用以下方法访问所选样本的IddataProvider.GetProperty .Id(“Input.sample-1”)在这种情况下,哪个会返回123.如果SampleChooser也包含“多选”:“真正的”,这将返回一个由用户选择的Sample id组成的数组,而不是单个值。

在某些情况下,内容属性响应对象的字段将不包含Id字段。对象中直接存储该值内容字段。

例如,对于a文本框Idcustom-1,如果用户选择,将在AppSession上生成以下属性123作为输入值:

"Properties": {"Items": ["Type": "textbox", "Href": "v1pre3/appsessions/{AppSession_Id}/ Properties /Input. "custom-1", "Name": "输入。custom-1", "Description": "", "Content": "123" ], }

现在,用户选择或插入的值将以以下方式返回:

dataProvider.GetProperty(“Input.custom-1”)

通过这种方式,可以使用用户输入来驱动复杂的表单。

如何使用dataProvider.GetProperty()方法

dataProvider.GetProperty ()接受属性名作为输入。当表单提交时,formbuilder将自动追加输入。输出。id并将其保存为创建的AppSession的属性项中的属性名称。一般来说,Properties将具有输入。但如果用户选择了Output Project或AppResult,则它将被追加输出。代替。例如,如果表单中SampleChooser字段的Id为示例1,可以使用下面的方法来获取用户选择的Sample:

dataprovider.GetProperty(“Input.sample-1”)

如果物业类型属性是一个BaseSpace资源(例如,它是一个运行项目appresult,或样本,或这些的数组),返回值将是完整的BaseSpace资源或完整的BaseSpace资源的数组。此外,如果表单中字段的id为app-session-id,整个AppSession将通过该方法返回。

由于返回的是整个资源,您可能希望找到关于所选资源的特定信息。例如,如果我们用dataProvider.GetProperty(“Input.sample-1”), AppSession上的属性(如果样本的Id是888888)将会是:

{"Type": "sample[]", "Href": "v1pre3/appsessions/2695119/properties/Input. "样本","名称":"输入。样品", "Description": "", "Items": [ { "Id": "888888", "Href": "v1pre3/samples/888888", "UserOwnedBy": { "Id": "3003", "Href": "v1pre3/users/3003", "Name": "Illumina Inc", "GravatarUrl": "https://secure.gravatar.com/avatar/702e4f8795f80bd0929a8b818bb19f65.jpg?s=20&d=https%3a%2f%2fbasespace.illumina.com%2fpublic%2fimages%2fDefaultCustomerGravatar.png&r=PG" }, "Name": "HBr1", "SampleId": "HBr1", "Status": "Complete", "StatusSummary": "", "DateCreated": "2013-10-16T17:19:56.0000000", "TotalSize": 0, "Genome": { "Id": "4", "DisplayName": "Homo Sapiens - UCSC (hg19)", "SpeciesName": "Homo sapiens", "Source": "UCSC", "Build": "hg19", "Href": "v1pre3/genomes/4", "HrefFileSets": "v1pre3/genomes/4/filesets", "HrefAnnotations": "v1pre3/genomes/4/annotations" }, "Read1": 51, "Read2": 51 } ], "HrefItems": "v1pre3/appsessions/2695119/properties/Input.Samples/items", "ItemsDisplayedCount": 1, "ItemsTotalCount": 1 }

现在,表单可以访问来自此响应的任何信息。如果我们想回去Read1对于上面的例子,我们可以用下面的方式使用简单的点操作符:

dataProvider.GetProperty .Read1(“Input.sample-id”)

它会返回51因为这是for的值Read1在上述回应中。

每个完整的BaseSpace资源中包含的所有信息都在Rest API参考

如果物业类型不是上面的任何一个,字段的id不是吗app-session-id,上述方法将返回表单中的值(由用户设置或默认情况下由表单设置)。

例如,如果类型是一个文本框与idtextbox-1用户输入是你好,然后dataProvider.GetProperty(“Input.textbox-1”)将返回值你好作为字符串。

中描述了有关使用dataProvider创建复杂表单和规则集的更多信息开放式脚本验证文档。

用于Web和桌面应用程序

在用户为输入表单选择数据并单击之后发射,用户被重定向到应用程序的redirect_uri与一个appsessionuri.这appsessionuri包含AppSession的Id,该Id是在提交输入表单时创建的。

用户在输入表单上选择的所有数据都保存为已创建的AppSession的Properties。任何标记的属性输入。*输入值和任何标记输出。*是输出值(例如,输出项目)。

应用程序可以解析AppSession的Properties来查找用户在输入表单上选择的所有数据。

对于原生应用

在用户为输入表单选择数据并单击之后发射,创建AppSession。对于本地应用程序,一个名为AppSession.json创建并存储在/ /数据输入目录在Docker映像中。

用户在输入表单上选择的所有数据都保存为AppSession的Properties。任何标记的属性输入。*输入值和任何标记输出。*是输出值(例如,输出项目)。

应用程序可以解析AppSession的Properties来查找用户在输入表单上选择的所有数据。

表单构建器组件

BaseSpace应用程序的表单有两个组件,可以通过单击当前的模板下拉菜单,选择如下:

  1. 形式JSON编辑器,允许开发人员为用户创建复杂、健壮的UI表单。表单有两个主要组成部分,“字段”:[]而且“规则集”:[].以下是它们的简短描述:

    • 字段:每个字段对应于在输入表单上生成的HTML UI表单元素(例如,文本框,下拉菜单,选择器等)
    • 规则集:每个规则验证它应用的字段的某些属性(例如,只允许选择hg19 Samples作为输入)。此外,可能会对整个表单应用一些规则进行验证。
  2. callbacks.js脚本,仅适用于本地应用:这包含了当用户从BaseSpace启动应用程序时传递给Docker镜像的命令行参数,以及其他启动特定的信息。

表单

只有一个表单元素,它包含用户输入启动应用程序所需的所有字段和规则。你放置字段的顺序是它们在表单上显示的顺序。

{fields: [], rulesets: []}

这定义了一个没有字段和规则的表单。

字段

表单至少需要两个字段才有用;一个用户输入字段和一个提交按钮。默认表单包含一个ProjectChooser,一个SampleChooser和一个TextBox:

{"$type": "Form", "fields": [{"$type": "TextBox", "size": 400, "minLength": 0, "maxLength": 150, "value": "Example [LocalDateTime]", "label": "Analysis Name", "required": true, "requiredMessage": "Please enter Name for your app session.", "id": "app-session- Name"}, {"$type": "SampleChooser", "size": 300, "valueType": "Input", "allowedPermissions": "read", "label": "Sample", "required": false, "id": "samples", "rules": "Sample -reader"}, {"$type": " projecectchooser ", "size": "size": "size"}, {"$type": " projecectchooser ", "size": "size": "300, "valueType": "Output", "allowedPermissions": "owner", "label": "Save Results To", "required": true, "requiredMessage": "请选择一个项目","id": "project", "rules": "is-project-owner"}, {"$type": "SectionBreak"}], "rulesets":[{"$type": "PermissionValidationRule", "permissions": "Read", "severity": "Error", "message": "You not Read access To the selected sample", "id": "sample-reader"}, {"$type": "PermissionValidationRule", "permissions": "Own", "severity": "severity": "severity": "severity": ""Error", "message": "你不是所选项目的所有者","id": "is-project-owner"}]}

每个字段必须有一个id和一个$type。$type是BaseSpace的特定表单元素。

常见字段JSON元素

对于每个表单元素,都有一些常见的JSON属性。下面是表单中常见JSON元素的列表,以及每个元素的描述:

  • 美元的类型:指定的字段类型。这是每个字段的必需元素。可能的选项有:
    • 文本框:在表单中创建一个HTML字符串Textbox元素。
    • ProjectChooser:创建一个选择器,显示供用户选择的项目。
    • SampleChooser:创建一个选择器,显示供用户选择的样本。
    • RunChooser:创建一个选择器,显示“运行”供用户选择。
    • AppResultChooser:创建一个选择器,显示AppResults供用户选择。
    • FileChooser:创建一个选择器,显示供用户选择的文件,它们被组织在与之绑定的Project和AppSession下。
    • 复选框:在表单中创建HTML复选框元素。
    • RadioButton:在表单中创建HTML单选按钮元素。
    • 选择:在表单中创建一个HTML下拉列表项。
    • 数字:在表单中创建一个数字HTML文本框元素。
    • SectionBreak:在表单中创建分段分隔符(水平线分隔)。
    • 自定义字段:将多个字段组合在一起,规则可以应用到整个字段集,而不是每个单独的字段。用于在表单上进行分组。
  • id:表单中该字段的Id。这是每个字段的必需元素。这也将被添加到JSON中的AppSession的Property字段中。所以,当应用程序启动时,每个字段的Id将以以下格式保存:输入。{id}输出。{id}在哪里{id}字段的Id。
  • 要求:一个布尔值,它决定这是否是一个用户需要填写的字段。如果真正的,应用程序不会启动除非该字段有值。如果,该字段可以由用户选择填写,但不是运行应用程序的必要条件。
  • requiredMessage:如果用户试图在不填写此表单字段的情况下运行应用程序,将显示给用户的消息。
  • valueType:确定选择的数据是输入数据还是输出数据。此元素默认为输入.公认值为:输入而且输出.如果输出时,添加到AppSession的属性将有输出。附在它后面。如果输入时,添加到AppSession的属性将有输入。附在它后面。
  • 大小:表单UI中HTML字段的大小。
  • 标签:字段的标签。这将显示在表单字段左侧的UI中。
  • helpText:将帮助文本添加到字段,帮助文本将显示为一个悬停图标,该图标将显示此处指定的帮助文本。
  • 规则:应用于该字段的验证规则。如果规则的Id在该元素中,则该规则将应用于该字段。
  • searchQuery目前只支持SampleChooser, AppResultChooser, ProjectChooser, FileChooser和资源匹配器字段元素。根据提供的查询筛选可用项列表。它使用BaseSpace搜索并且搜索的范围设置为所选的资源类型,您可以搜索任何元数据(通过Rest API)与该资源相关联
  • 价值:该字段的默认值。可以是字符串、数字、双精度值或布尔值,具体取决于字段。
  • 善变者:该元素将切换指定的toggleFields价值在切换器中被选中。
  • displayfields:对于任何选择器美元的类型,该元素将为选择器中选择的每个项添加字段。接受displayFields是选择,单选按钮,文本框,复选框和数字字段。

文本框

任何文本输入都可以使用这个选项

除了常见字段JSON元素,该字段还支持以下元素:

  • 最小长度:该字段允许的最小字符数。
  • 最大长度:该字段允许的最大字符数。
  • 价值:该字段的默认值。该元素的默认值是一个空字符串。如果“默认值”!时,默认值将改为{App_Name日期时间},例如App_Name为HelloWorldHelloWorld 1/1/2014 00:00:01

    {"$type": "TextBox", "size": 300, "value": "默认值!","label": "App Session Name", "required": true, "requiredMessage": "请输入您的App Session Name .", "id": "App - Session - Name", "helpText": "此帮助文本将显示在弹出窗口的控件旁边"}

如果“id”是一个文本框“app-session-name”,该属性将存储为AppSession而不是字符串值。

预览:

文本框

项目选择器

初始化项目选择器,以便用户可以选择项目作为输入或输出。当用户从BaseSpace中的项目或示例页面启动应用程序时,ProjectChooser将自动填充该项目或示例所包含的项目。

除了常见字段JSON元素,该字段还支持以下元素:

  • allowedPermissions:所选项目所需的权限。允许的值为老板而且老板意味着用户必须是项目的所有者。意味着用户必须至少是所选项目的合作者。
  • 多选:如果的布尔值真正的,允许用户在此选择器中选择多个项目。默认值为
  • valueType:指定此项目是Input还是Output。公认的值是输入输出,默认值为输入是未指定的。如果输入时,所选资源将作为输入。财产。如果输出时,所选项目将作为输出。{id}财产,{id}是ProjectChooser字段的id。
  • searchQuery:根据提供的查询筛选可用项目列表。它使用BaseSpace搜索搜索范围设置为项目

    {"$type": "ProjectChooser", "size": 300, "allowedPermissions": "owner", "label": "Save Results To", "required": true, "requiredMessage": "Please choose a project", "id": "project-id", "rules": "is-project-owner"}

预览:

ProjectChooser

样本选择器

初始化示例选择器,以便用户可以选择一个示例作为输入或输出。

除了常见字段JSON元素,该字段还支持以下元素:

  • genomeFilters:禁止在选择器中选择指定基因组的样本(逗号分隔)。
  • 多选:如果的布尔值真正的,允许用户在这个选择器中选择多个样本。默认值为
  • searchQuery:根据提供的查询筛选可用的Samples列表。它使用BaseSpace搜索搜索范围设置为样品,您可以搜索任何元数据(通过Rest API)也与该样本有关

    {"$type": "SampleChooser", "size": 300, "label": "Sample", "required": true, "requiredMessage": "请选择一个样本","genome efilters ": "hg19", "id": "samples", "rules": "is-pair -end,min-cycles-1,min-cycles-2,is-sample-reader, Sample -is-not-empty"}

预览:

SampleChooser

运行选择器

初始化运行选择器,以便用户可以选择运行作为输入。

除了常见字段JSON元素,该字段还支持以下元素:

  • 多选:如果的布尔值真正的,允许用户在这个选择器中选择多个run。默认值为
  • searchQuery:根据提供的查询筛选可用的run列表。它使用BaseSpace搜索搜索范围设置为运行,您可以搜索任何元数据(通过Rest API)与Run相关

    {"$type": "RunChooser", "size": 250, "label": "run", "required": true, "requiredMessage": "请选择一个run", "id": "run-id"}

预览:

RunChooser

应用结果选择器

初始化一个应用结果选择器,以便用户可以选择一个应用结果作为输入。

除了常见字段JSON元素,该字段还支持以下元素:

  • 多选:如果的布尔值真正的,允许用户在这个选择器中选择多个AppResults。默认值为
  • searchQuery:根据提供的查询筛选可用的AppResults列表。它使用BaseSpace搜索搜索范围设置为appresults,您可以搜索任何元数据(通过Rest API)也与那个AppResult有关

    {"$type": " apppresultchooser ", "size": 250, "valueType": "Input", "multiselect": "true", "label": "AppResult ", "required": true, "requiredMessage": "请选择一个AppResult ", "id": "App - Result -id", "searchQuery": "property.{property_name}. "{content_path}:{value} AND App.Id:210210"}

方法过滤用户帐户中的AppResults,上面的表单生成器代码示例将使用searchQuery价值。在这种情况下,唯一会显示的AppResults将是那些附加了以下元数据的AppResults(通过该AppResult的API找到):

  • apppresult的App Id(意思是创建这个结果的App Id)是210210
  • 房地产财产。{property_name}on AppResult的值必须为价值

预览:

AppResultChooser

文件选择器

初始化文件选择器,以便用户可以选择文件作为输入。这些文件必须存在于用户帐户下的BaseSpace中。这些文件将显示在它们所属的Project下。

除了常见字段JSON元素,该字段还支持以下元素:

  • extensionFilters:要过滤的文件扩展名。用户将无法选择任何未指定的文件扩展名。这可以是一个以逗号分隔的列表,用于筛选。的例子是.vcf.fastq本演讲
  • 多选:如果的布尔值真正的,允许用户在这个选择器中选择多个文件。默认值为
  • searchQuery:根据提供的查询筛选可用文件列表。它使用BaseSpace搜索搜索范围设置为文件,您可以搜索任何元数据(通过Rest API)与该文件相关联

    {"$type": "FileChooser", "size": 500, "valueType": "Input", "extensionFilters": "。bam", "multiselect": true, "label": "File", "requiredMessage": "请选择一个文件","id": "File -id"}

资源匹配器

注意:Matcher控件只能用于Sample组。对其他组类型的支持将在未来的版本中添加。

Matcher控件包括选择器的所有功能(搜索、过滤和选择数据),以及将选择组合在一起的功能。示例包括三元分析,其中用户必须识别每个样本中匹配的母亲、父亲和孩子;或双链应用,其中用户必须选择正链或负链样本。资源匹配器也支持AppResults。

用户可以通过搜索或筛选来发现他们的数据,然后将所选项目拖放到一个矩阵中。

样本匹配器

最基本的

Matcher允许用户将样本或估计值排列到拖放矩阵上。

  • 该矩阵的列表示样本/估计组。例如,应用程序可能包括要求用户将样本/评价添加到“正链”或“负链”组;“父亲”组和“母亲”组。每个组可以是由开发者定义的单一资源类型(示例、应用结果、文件、项目)。(如上所述,目前只支持样本组和估计组。
  • 行表示应该一起分析的相关样本和估计值。

作为开发人员,您可以编写自定义验证规则来在给定的单元格、行或列中强制执行某些规则;或者作为一个整体的控制。例如,您可以指定列A中的任何样本必须与列B中的相应样本具有相等的读长度。

当用户选择项目并提交它们时,一组输入属性将在你的应用程序会话上创建,描述在Resource Matcher控件中所做的选择以及顺序。

样本匹配器(使用样本的资源匹配器)为每一列生成一个样本数组属性。如果您创建了一个名为“mymatcher”的匹配器控件,并且在其中有一个“父”列和一个“母”列,则生成的属性将包括一个Input.mymatcher.father财产和Input.mymatcher.mother财产;这两个属性都将包含一个示例项数组。(见属性的API有关详情。)数组中的每个项以与匹配器控件相同的顺序出现。因此,在第5行添加的项将在fatherSamples。项目[4]而在motherSamples。项目[4](4而不是5,因为数组使用从零开始的索引;看到关于匹配器行号的说明下面)。下面将详细讨论Matcher属性。

匹配器:属性

给定一个id为“mymatcher”的Matcher,样本组为“positive”和“negative”,Matcher将产生以下属性:

  • 描述列属性的属性:Input.mymatcher.columns.属性所创建的列属性的名称mymatcher控制。
  • 一个字符串属性,用于指定控件中的列数:Input.mymatcher.num-columns.此属性的值就是列数。
  • 每列的数组属性示例:
    • Input.mymatcher.positive
    • Input.mymatcher.negative

数组属性的JSON示例:

{类型:"sample[]", Href: "v1pre3/appsessions/123/properties/Input.mymatcher. ", Name: "输入。mymatcher。,描述:"",项目:[{UserOwnedBy:{/*用户信息*/},名称:"NA123a", SampleId: "NA123a",状态:"完成" /*样本详情到这里*/},{UserOwnedBy:{/*用户信息*/},名称:"NA456a", SampleId: "NA456a",状态:"完成" /*样本详情到这里*/}},{类型:"样本[]",Href: "v1pre3/appsessions/123/properties/Input.mymatcher. ", Name: "输入。mymatcher。负", Description: "", Items: [{ UserOwnedBy: { /* user info */ }, Name: "NA123b", SampleId: "NA123b", Status: "Complete" /* sample details go here */ }, { UserOwnedBy: { /* user info */ }, Name: "NA456b", SampleId: "NA456b", Status: "Complete" /* sample details go here */ }] }

Matcher:表单生成器JSON

除了常见字段JSON元素,该字段还支持以下元素:

  • maxRows:允许用户输入选择矩阵的最大数据行数。目前,该值可能不超过100。
  • 规则: ScriptValidationRules的名称数组,用于应用整个控件。(请参阅下面的验证规则。)
  • buttonText:确定打开匹配器对话框的按钮的标签。
  • :列定义数组。每一列将产生一个相应的属性数组。每个列定义包含以下字段:
    • id:就像控件本身一样id属性将确定列的属性数组的名称。例如,名为在一个名为sample-pairs将产生一个名为Input.sample-pairs.negative
    • 标签:将出现在拖放矩阵的标题行中的文本。
    • allowunpairedcells:允许资源匹配器中的项目不均匀配对。例如,这不是总是要求在列1和列2中选择相同数量的项目,而是允许每列中的项目数量不匹配。在某些情况下,应用程序可能需要这种类型的输入功能。
    • 规则: ScriptValidationRules的名称数组,用于添加到此列的每个项。(请参阅下面的验证规则。)
    • resourceType:可以添加到此列的资源类型。目前只支持“Sample”和“Appresult”。
  • searchQuery:筛选可用的列表resourceType根据提供的查询。它使用BaseSpace搜索并且搜索的范围设置为所选的资源类型,您可以搜索任何元数据(通过Rest API)与该资源相关联

使用示例:

{"$type": "ResourceMatcher", "required": false, "id": "Sample -grouper-id", "maxRows": 100, "columns":[{"id": "fpa", "label": "fpa Samples", "resourceType": "Sample", "rules": "Sample -reader,hg19-only,is-pair -end,min-cycles-1,min-cycles-2,min-reads,max-size"}, {"id": "fpb", "label": "fpb Samples", "resourceType": "Sample", "rules": "Sample -reader,hg19-only,is-pair -end,min-cycles-1,min-cycles-2,min-reads,max-size"}], "rules": "script-pair -cycle-match"}}

Matcher:验证规则

验证规则可以应用于整个控制级别,作为一个整体;在个体群体层面;或者在行或单元格级别。

由您决定错误消息的具体程度。

所有验证规则都应该返回一个匹配器错误对象数组,格式如下:

{rowNumber: '0', columnId: 'positive', message: '错误。'}

除消息外,其他字段都是可选的。基于行或列信息,UI将尝试将用户引导到产生错误消息的单元格。

注意,行号的UI显示值将比您指定的值高1——请参见关于匹配器行号的说明

下面的示例演示了一个控制级验证规则,该规则强制给定行必须具有匹配的读长度。

{"$type": "ScriptValidationRule", "id": "script-pair -cycle-match", "severity": "error", "callback":"var columns = dataProvider.GetCurrentControlProperty();Var样本= [];For (var I = 0;I < columns.length;i++){var columnSamples = dataProvider.GetProperty(columns[i]);samples.push (columnSamples);} var错误= [];For (var I = 0;I < samples[0].length;i++){var col1Sample = samples[0][i]; var col2Sample = samples[1][i]; var col2 = columns[1].substring(columns[1].lastIndexOf('.') + 1); if(col1Sample.Read1 != col2Sample.Read1){ errors.push({ rowNumber: (i) + '', resourceId: col2Sample.Id, message: 'sample ' + col2Sample.SampleId + ' read1 cycles of '+ col2Sample.Read1 + ' do not match its pair sample ' + col1Sample.SampleId + ' read 1 cycles of ' + col1Sample.Read1 }); } if(col1Sample.Read2 != col2Sample.Read2){ errors.push({ rowNumber: (i) + '', resourceId: col2Sample.Id, message: 'sample ' + col2Sample.SampleId + ' read2 cycles of '+ col2Sample.Read2 + ' do not match its pair sample ' + col1Sample.SampleId + ' read 2 cycles of ' + col1Sample.Read2 }); } } return errors;" }

关于匹配器行号的说明

请注意,所有数组属性,包括每个Matcher组生成的属性,都使用从零开始的指数。然而,在BaseSpace UI中,Matcher本身列出了从1开始的行号,而不是0。请注意,当您返回验证错误并指定行号时,BaseSpace将自动在行号的显示值中添加1。

表格字段集

允许将表单字段分组到一个集合中,用户可以在输入表单上复制该集合。此输入表单字段适用于在输入表单中对表单中的不同数据分组有一些重复步骤的应用程序。

除了常见字段JSON元素,该字段还支持以下元素:

  • seriesHeader:表列字段集中第一列的标题标签
  • maxrows:用户能够添加的最大行数,用于限制用户选择超过应用程序构建的数据行数
  • :每列显示的标题,该字段是字符串值的数组。例如,对于aTabularFieldSet如果只有一个额外的列,我们想给它命名,Field就是(“集团”).然而,如果有两个额外的列,我们想要命名列而且分别为,Field就是(“团体”,“集”)
  • 字段属性的每一行都可以添加的字段数组TabularFieldSet对象上的每一行上都将复制添加到该数组中的任何内容TabularFieldSet当用户单击+图标

    {"$type": "TabularFieldSet", "id": "sample-experiments", "seriesHeader": "Groups", "maxrows": 2, "headers": ["Samples", "AppResults"], "fields": [{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "required": true, "requiredMessage": "请选择一个样本","multiselect": true, "id": "control-samples", "rules": "" displayFields": [{"$type": "Select", "id": "Select -1", "label": "Library type", "multiselect": false, "choices": [{"value": 0, "text":“配对-结束”,“选定”:true},{“值”:1,“文本”:“单个”,“选定”:false},{“值”:2,“文本”:“配偶对”,“选定”:false}]},{“值”:3,“文本”:“下一个配偶对”,“选定”:false}]},{“$type”:“选择”,“id”:“选择-2”,“标签”:“库方向”,“多选”:false,“选择”:[{“值”:0,“文本”:“正向-反向”,“选定”:true},{“值”:1,“文本”:“正向-向前”,“选定”:false},{“值”:2,“文本”:“正向-向前”,“选定”:false},{“值”:2,“文本”:“正向-向前”,“选定”:false},{“值”:2,“文本”:“正向-向前”,“选定”:false:{“值”:2,“文本”:“选定”:“选定”:false:{"value": 3, "text": "reverse-reverse", "selected": false}]}]}, {"$type": "AppResultChooser", "size": 250, "valueType": "Input", "multiselect": "true", "required": true, "requiredMessage": "请选择一个应用结果","id": "app-result-id"}]}

上面的代码片段将创建一个TabularFieldSet与一个SampleChooser和一个AppResult选择器,并且行数限制为2,因为maxrows属性。的SampleChooser也设置了一对下拉菜单,将弹出。空间是有限的,在创建表单时,最好确保它适当地显示给用户。

预览TabularFieldSet

复选框

定义一组选项,用户可以从其中的多个选项中选择复选框。

除了常见字段JSON元素,该字段还支持以下元素:

  • 选择:用户可以从中选择的选项数组,将显示为复选框。

    • 价值:选中复选框的值。当应用启动时,这个值将被添加到AppSession的属性项中。
    • 标签:将为用户显示的复选框标签。
    • 检查:默认选中此复选框的布尔值。默认值为

      {" $类型”:“复选框”、“id”:“checkbox-1”、“标签”:“复选框控制”,“选择”:[{“价值”:0,“标签”:“零”},{“价值”:50岁“标签”:“五十”,“检查”:真正}]}

预览:

复选框

单选按钮

定义一组选项,用户只能选择其中一个作为HTML单选按钮。

除了常见字段JSON元素,该字段还支持以下元素:

  • 价值:默认值,匹配此值的选项将被选中。
  • 选择:用户可以从中选择的选项数组,将显示为RadioButtons。

    • 价值:所选radiobutton的值。当应用启动时,这个值将被添加到AppSession的属性项中。
    • 标签:将为用户显示的RadioButtons标签。

      {" $类型”:“RadioButton”、“id”:“random-radio”、“标签”:“困吗?”,“价值”:1,“选择”:[{“价值”:0,“标签”:“不”},{“价值”:1、“标签”:“是”}]}

预览:

RadioButton

选择(下拉列表)

定义一个选项列表,用户可以选择on或多个选项。这将显示为用户选择的下拉列表值。

除了常见字段JSON元素,该字段还支持以下元素:

  • 多选:如果的布尔值真正的,允许用户在此列表中选择多个项目。默认值为
  • 选择:用户可以从中选择的选项数组,该数组将显示为下拉列表中的项。

    • 价值所选列表项的值。当应用启动时,这个值将被添加到AppSession的属性项中。
    • 文本:将显示给用户的列表项的标签。
    • 选择:默认选择此列表项的布尔值。默认值为

      {"$type": "Select", "id": "Select -1", "label": "Select control", "multiselect": false, "choices": [{"$type": "SelectListItem", "value": 0, "text": " 0 ", "selected": false}, {"$type": "SelectListItem", "value": 50, "text": "fifty", "selected": true}]}

预览:

DropdownList

数值字段

只允许数字输入的文本框字段。

除了常见字段JSON元素,该字段还支持以下元素:

  • 最小值:允许用户在此字段中输入的最小值
  • 马克斯:允许用户在该字段中输入的最大值
  • numericType:指定值是浮点数还是整数。公认值为:整数而且FloatingPoint.默认值为整数
  • 价值:该字段的默认值。

    {"$type": "Numeric", "id": "circles", "size": 50, "required": false, "label": "Location in circles", "min": -6.28, "max": 6.28, "value": 0, "numericType": "FloatingPoint", "rules": "is-it-a-pi"}

预览:

NumericField

节休息

在表单中添加一个可见的空格,以标记部分的结束

  • 标题: Section的标题,这是显示给用户的头
  • 描述:该章节的描述

    {" $类型”:“SectionBreak”、“id”:“section-break-1”}

预览:

SectionBreak

字段设置

方法对一组控件进行分组,然后可以将规则应用于整个字段集,或者整个字段集可以是窗体中的可折叠区域。

除了常见字段JSON元素,该字段还支持以下元素:

  • 字段:在这个字段集中分组在一起的字段数组。
  • isCollapsible:如果的布尔值真正的,可以使整个字段设置一个可折叠的字段在表单上。默认值为
  • isOpen:如果它是可折叠的,那么这个布尔值将决定字段设置默认是Open还是Closed。如果真正的时,可折叠部分为Open。默认值为
  • 规则:应用于整个字段集的规则。

    {"$type": "FieldSet", "id": "address", "label": "账单地址"," is可折叠":true, "isOpen": true, "helpText": "一些关于这个字段集的有用段落","fields": [{"$type": "TextBox", "size": 300, "value": "" label": "Name", "required": true, "requiredMessage": "请为您的应用程序会话输入名称","id": "Name"}, {"$type": "TextBox", "size": 300, "value": "" label": "Street", "required": true, "requiredMessage": "requiredMessage": ""请为您的应用程序会话输入名称","id": "street"}, {"$type": "Select", "id": "state", "label": "state", "choices": [{"$type": "SelectListItem", "value": "CA", "text": "California", "selected": true}, {"$type": "SelectListItem", "value": "Other", "text": "Other state"}]}]}]}

预览:

自定义字段

显示字段

对于选择器,您可以选择指定显示字段,可以是一组复选框、单选按钮和选择

  • displayFields:可以在选择器中为每个选择的资源添加的字段数组。复选框、单选按钮、数字和选择都是可接受的项目。

下面是一个带有复选框、单选按钮和选择的SampleChooser字段的示例。当用户选择一个Sample时,这些字段将在Sample旁边弹出,以便用户可以为每个选择指定更多信息。如果选择了多个Sample,那么每个Sample都会重复这些字段。

{"$type": "SampleChooser", "size": 550, "valueType": "Input", "multiselect": true, "allowedPermissions": "read", "label": "Sample", "required": true, "requiredMessage": "请选择一个样本","helpText": "This is help text.", "id": "samples-displayFields", "displayFields":[{"$type": "CheckBox", "id": "is- Sample - Awesome ", "label": "Awesome?", "choices":[{"label": "Y", "value": "Y+", "value": 2}]},{"$type": "RadioButton", "id": "is- Sample -wicked", "label": "label": " 2}]}, "$type": "RadioButton", "id": "is- Sample -wicked", "label": "“邪恶吗?”,“选择”:{“标签”:“Y”,“价值”:1},{“标签”:“N”,“价值”:0},{“标签”:“M”,“价值”:2  }] }, { "$ 类型”:“选择”、“id”:“is-sample-extraordinary”、“标签”:“非凡?”、“多选”:“真正的”,“大小”:3,“选择”:[{“文本”:“噢,是的!”,“价值”:1},{“文本”:“哦,不!”,“价值”:0},{“文本”:“竞争者”,“价值”:0.5  } ] } ] }

善变者

对于复选框、单选按钮和选择,您可以选择指定善变者允许您在某些条件下启用或禁用其他控件。

控件时,切换器要求选择一个值选择属性在字段上可用。当价值选中时,在toggleFields然后切换为启用。

  • toggleOnValue:选择“all”时toggleFields将被启用。如果这是一个逗号分隔的列表,那么toggleFields如果列表中有任何选定的值,将启用。使用要启用toggleFields当没有选择时。
  • toggleFields:需要启用/禁用的字段id。这可以是一个逗号分隔的列表。

    {" $类型”:“复选框”、“id”:“requires-a-state”、“标签”:“需要名字和国家?”,“选择”:[{“价值”:1}],“善变者”:[{“toggleOnValue”:1、“toggleFields”:“名称、状态 " } ] }, { "$ 类型”:“选择”、“id”:“requires-a-street”、“标签”:“需要街?”、“选择”:[{“美元类型”:“SelectListItem”、“价值”:“1”,“文本”:"是的"},{" $类型”:“SelectListItem”、“价值”:“0”、“文本”:“不”}],“善变者”:[{“toggleOnValue”:1、“toggleFields”:“街”}]}

先进的切换

当启用/禁用字段需要更复杂的逻辑时(例如,根据多个字段的值进行切换或切换表格字段集字段),您可以添加formUpdatesJavaScript函数callback.js来实现所需的行为。使用formUpdates回调还允许基于复选框、单选按钮和选择以外的字段值进行切换。

下面的示例演示如何根据复选框中的选择启用/禁用表格字段集中所有行的字段。

{"$type": "Form", "fields": [{"$type": "CheckBox", "id": "Disable - tabularfield -set", "label": "Disable Experiments", "choices": [{"value": 1}]}, {"$type": "TabularFieldSet", "id": "sample-experiments", "seriesHeader": "Experiments", "headers": ["Control Samples", "Comparison Samples", "Diff. Expression?"], "fields": [{"$type": "SampleChooser", "size": 150, "allowedPermissions": "read", "required": true, "requiredMessage": "请选择一个样本","multiselect": true, "id": "control-samples", "rules": "is-paired-end,is-sample-reader,is-sample-empty"}, {"$type": "SampleChooser", "size": 150, "allowedPermissions": "read", "required": true, "requiredMessage": "请选择一个样本","multiselect": true, "id": " compare -samples", "rules":}, {"$type": "CheckBox", "id": "differential-expression", "choices": [{"value": 1}]}]}]}]}

对于这个表单,将以下函数添加到callback.js中

function formUpdates(dataProvider) {var disable = (" + dataProvider. getproperty ("input.disable- tabar -field-set")) === "1";var rowCount = dataProvider.GetProperty("input.sample-experiments.rowcount");For (var I = 1;i <= rowCount;i++){if (disable) {dataProvider.AttributeUpdates。添加({ElementId: "sample-experiments.control-samples. "row" + i, AttributeName: "disabled", AttributeValue: "disabled"});dataProvider.AttributeUpdates.Add({ ElementId: "sample-experiments.comparison-samples.row" + i, AttributeName: "disabled", AttributeValue: "disabled" }); dataProvider.AttributeUpdates.Add({ ElementId: "sample-experiments.differential-expression.row" + i, AttributeName: "disabled", AttributeValue: "disabled" }); } else { dataProvider.AttributeUpdates.Remove({ ElementId: "sample-experiments.control-samples.row" + i, AttributeName: "disabled" }); dataProvider.AttributeUpdates.Remove({ ElementId: "sample-experiments.comparison-samples.row" + i, AttributeName: "disabled" }); dataProvider.AttributeUpdates.Remove({ ElementId: "sample-experiments.differential-expression.row" + i, AttributeName: "disabled" }); } } }

在上面的例子中,我们根据切换来改变输入表单中某些字段的值。ElementId是输入表单字段的Id(在这种情况下,它是从sample-experiments对照组的研究comparison-samples,或差异表达AttributeName而且AttributeValue是与表单中创建的实际HTML元素相关的值。您可以查看AttributeName通过查看浏览器中的源代码,找到要切换的字段上属性的名称。

上面的例子将启用TabularFieldSet中的所有字段或禁用所有字段,这取决于切换器。

规则集

规则集是可选的,可以应用于任何字段,甚至表单本身。要使用规则集,您需要在表单的规则数组中定义一些规则集,然后选择将哪些规则集应用于表单中的每个字段。

所有规则都要求向用户显示$type、id和一条消息。

何时进行验证?

公共规则集JSON元素

对于每个规则集元素,都有一些常见的JSON属性。下面是规则集中常见JSON元素的列表,并对每个元素进行了描述:

  • 美元的类型:指定接下来的规则集类型。这是一个要求字段。
  • 严重程度:验证问题的严重程度。接受的价值观:警告错误.如果错误时,表单将显示为红色,用户无法完成表单并启动应用程序,直到修复错误。如果警告时,该表单会将消息显示为黄色,用户可以选择忽略它并继续使用应用程序。
  • id:规则集的Id,它应用于将对其执行验证的每个字段。需要Id。
  • 消息:验证失败时显示给用户的验证消息。

价值

字段值的常规验证

除了公共规则集JSON元素,该字段还支持以下元素:

  • “关系”:用户选择的值与ValueValidationRule中的值之间的关系。允许取值:Equals、LessThan、GreaterThan、LessThanOrEqualTo、GreaterThanOrEqualTo、Contains、NotContains、notqual。
  • “价值”:比较运算符将与用户输入值进行比较的值。这可以是一个数字(Double)或字符串。

在下面的例子中,我们有一个“文本框”场,我们应用“ValueValidationRule”它可以检查文本框中的值是否等于3.14159265359

{"$type": "Form", "fields": [{"$type": "TextBox", "size": 300, "label": "输入一个数字","required": true, "requiredMessage": "请输入一个数字","id": "Enter - Number", "helpText": "此帮助文本将在弹出窗口中显示在控件旁边","rules": "is-it-pi"}], "rulesets": [{"$type": "ValueValidationRule", "relation": "Equals", "value": 3.14159265359, "message": "That is not pi", "severity": "Warning", "id": "is-it-pi"}], "id": "Form -container"}}

许可

测试用户对基本空间资源的访问权限。

除了公共规则集JSON元素,该字段还支持以下元素:

  • “权限”:用户需要对资源或文件的权限,以便该字段可以接受。取值范围:浏览、读、写、拥有、创建。

    {"$type": "Form", "fields": [{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "label": "Input Sample", "required": true, "requiredMessage": "请选择一个样本","id": "samples", "rules": "Sample -reader"}], "rulesets": [{"$type": "PermissionValidationRule", "permissions": "read", /*浏览,读取,写入,拥有,创建*/ "severity": "Error", "message": "You not read access to the selected Sample", "id": "Sample -reader"}], "id": "Form -container"}

开放式脚本验证

允许开发人员为任何表单元素运行自定义javascript验证。此规则集可以应用于整个表单或某个字段。如果在该字段上,验证错误消息将显示在该字段旁边。

除了公共规则集JSON元素,该字段还支持以下元素:

  • “回调”:这是一个开放的javascript函数,可用于对表单中的任何字段执行验证。回调函数通常使用dataProvider.GetProperty ()方法获取表单中选定的数据。

归还什么

回调javascript需要一个返回语句。通常,当验证未通过时,您可以向用户返回一个字符串或值,然后在验证失败时将此消息显示给用户。返回验证是否通过。

dataProvider.GetProperty ()

为了进行更复杂的表单验证,必须能够通过表单构建器工具中的方法访问用户在表单中选择的值。幸运的是,此功能可通过所的GetProperty ()方法。

GetProperty ()方法接受属性名作为输入。当应用启动并提交表单时,表单中选择的值会保存到为分析而创建的AppSession中(对于原生应用,这是AppSession)。Json文件保存到输入目录。)有关如何在AppSession上将表单值保存为属性的详细信息,请参阅如何取得表格内所选的资料上面的部分。

如何使用dataProvider.GetProperty()方法

dataProvider.GetProperty ()接受属性名作为输入。当表单提交时,formbuilder将自动追加输入。输出。id并将其保存为创建的AppSession的属性项中的属性名称。一般来说,Properties将具有输入。但如果用户选择了Output Project或AppResult,则它将被追加输出。代替。例如,如果表单中SampleChooser字段的Id为示例1,可以使用下面的方法来获取用户选择的Sample:

dataprovider.GetProperty(“Input.sample-1”)

如果物业类型属性是一个BaseSpace资源(例如,它是一个运行项目appresult,或样本,或这些的数组),返回值将是完整的BaseSpace资源或完整的BaseSpace资源的数组。此外,如果表单中字段的id为app-session-id,整个AppSession将通过该方法返回。

由于返回的是整个资源,您可能希望找到关于所选资源的特定信息。例如,如果我们用dataProvider.GetProperty(“Input.sample-1”), AppSession上的属性(如果样本的Id是888888)将会是:

{"Type": "sample[]", "Href": "v1pre3/appsessions/2695119/properties/Input. "样本","名称":"输入。样品", "Description": "", "Items": [ { "Id": "888888", "Href": "v1pre3/samples/888888", "UserOwnedBy": { "Id": "3003", "Href": "v1pre3/users/3003", "Name": "Illumina Inc", "GravatarUrl": "https://secure.gravatar.com/avatar/702e4f8795f80bd0929a8b818bb19f65.jpg?s=20&d=https%3a%2f%2fbasespace.illumina.com%2fpublic%2fimages%2fDefaultCustomerGravatar.png&r=PG" }, "Name": "HBr1", "SampleId": "HBr1", "Status": "Complete", "StatusSummary": "", "DateCreated": "2013-10-16T17:19:56.0000000", "TotalSize": 0, "Genome": { "Id": "4", "DisplayName": "Homo Sapiens - UCSC (hg19)", "SpeciesName": "Homo sapiens", "Source": "UCSC", "Build": "hg19", "Href": "v1pre3/genomes/4", "HrefFileSets": "v1pre3/genomes/4/filesets", "HrefAnnotations": "v1pre3/genomes/4/annotations" }, "Read1": 51, "Read2": 51 } ], "HrefItems": "v1pre3/appsessions/2695119/properties/Input.Samples/items", "ItemsDisplayedCount": 1, "ItemsTotalCount": 1 }

现在,表单可以访问来自此响应的任何信息。如果我们想回去Read1对于上面的例子,我们可以用下面的方式使用简单的点操作符:

dataProvider.GetProperty .Read1(“Input.sample-id”)

它会返回51因为这是for的值Read1在上述回应中。

每个完整的BaseSpace资源中包含的所有信息都在Rest API参考

如果物业类型不是上面的任何一个,字段的id不是吗app-session-id,上述方法将返回表单中的值(由用户设置或默认情况下由表单设置)。

例如,如果类型是一个文本框与idtextbox-1用户输入是你好,然后dataProvider.GetProperty(“Input.textbox-1”)将返回值你好作为字符串。

样本选择器的示例“多选”:“真正的”使用自定义ScriptValidationRule检查用户是否选择了一个PairedEnd样本:

{"$type": "Form", "fields": [{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "label": "Input Sample", "required": true, "multiselect": true, "requiredMessage": "请选择一个样本","id": "samples", "rules":"is- pairs -end"}], "rulesets": [{"$type": "ScriptValidationRule", "callback": " var samples = dataproviders . getproperty (\"Input.samples\");For (var I = 0;I < samples.length;i++) {var样本=样本[I];if(! Sample . ispairedend) {return{消息:'这个样本不是成对结束'};} if(sample.TotalClustersRaw>3000000){返回{消息:'覆盖到高。这个应用程序是为<100X细菌数据而设计的。}}返回null;”、“id”:“is-paired-end}],“id”:“form-container "}

示例验证规则

以下规则是特定于样本的,这些规则适用于任何SampleChooser字段:

确认在SampleChooser字段中选择的样本不是空的

{"$type": "Form", "fields": [{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "label": "Input Sample", "required": true, "requiredMessage": "请选择一个样本","id": "samples", "rules": "Sample -is-not-empty"}], "rulesets": [{"$type": "EmptySampleValidationRule", "message": "Sample -is-not-empty"}], "id": "Sample -is-not-empty"}], "id": "Form -container"}}

基因组

验证所选样本是否标记有指定的基因组参考。

除了公共规则集JSON元素,该字段还支持以下元素:

  • 价值:应用程序支持的基因组值。可能的值:
    • Arabidopsis_thaliana
    • Bos_taurus
    • Escherichia_coli_K_12_DH10B
    • Homo_sapiens
    • Mus_musculus
    • PhiX
    • Rhodobacter_sphaeroides_2.4.1
    • Rattus_norvegicus
    • Saccharomyces_cerevisiae
    • Staphylococcus_aureus_NCTC_8325
    • BacillusCereus

例如,当选择非homo_sapiens基因组的样本时,在应用程序中显示警告:

{"$type": "Form", "fields": [{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "label": "Input Sample", "required": true, "requiredMessage": "请选择一个样本","id": "samples", "rules": "hg19-only"}], "rules sets": [{"$type": "GenomeSampleValidationRule", "message": "此应用程序目前只支持人类基因组(hg19)的样本","value": "Homo_sapiens", "severity": "Warning", "id": "hg19-only"}], "id": "Form -container"}}

最大尺寸

验证样本量

除了公共规则集JSON元素,该字段还支持以下元素:

  • 关系:用户选择的值与ValueValidationRule中的值之间的关系。允许取值:Equals、LessThan、GreaterThan、LessThanOrEqualTo、GreaterThanOrEqualTo、Contains、NotContains、notqual。
  • 价值:比较运算符将与用户输入值进行比较的值。这可以是一个数字(Double)或字符串。

    {"$type": "Form", "fields": [{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "label": "Input Sample", "required": true, "requiredMessage": "请选择一个样本","id": "samples", "rules": "Sample -size-maximum"}], "rulesets": [{"$type": "MaxSizeSampleValidationRule", "message": "此应用程序目前只支持小于200g的样本","relation": "LessThan", "value": 200000000000, "severity": "Warning", "id": "Sample -size-maximum"}], "id": "id": "Sample -size-maximum"}], "id":“form-container”}

最小循环次数

验证样本读取1的周期

除了公共规则集JSON元素,该字段还支持以下元素:

  • 关系:用户选择的值与ValueValidationRule中的值之间的关系。允许取值:Equals、LessThan、GreaterThan、LessThanOrEqualTo、GreaterThanOrEqualTo、Contains、NotContains、notqual。
  • 价值:比较运算符将与用户输入值进行比较的值。这可以是一个数字(Double)或字符串。

    {"$type": "Form", "fields": [{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "label": "Input Sample", "required": true, "requiredMessage": "请选择一个样本","id": "samples", "rules": "min-cycles-1"}], "rulesets": [{"$type": "MinCycles1SampleValidationRule", "message": "此应用程序目前只支持最小32个碱基的读取长度。","relation": "GreaterThan", "value": 32, "severity": "Error", "id": "min-cycles-1"}], "id": "Form -container"}

最小周期读取2

验证样本读取2的周期

除了公共规则集JSON元素,该字段还支持以下元素:

  • 关系:用户选择的值与ValueValidationRule中的值之间的关系。允许取值:Equals、LessThan、GreaterThan、LessThanOrEqualTo、GreaterThanOrEqualTo、Contains、NotContains、notqual。
  • 价值:比较运算符将与用户输入值进行比较的值。这可以是一个数字(Double)或字符串。

    {"$type": "Form", "fields": [{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "label": "Input Sample", "required": true, "requiredMessage": "请选择一个样本","id": "samples", "rules": "min-cycles-2"}], "rulesets": [{"$type": "MinCycles2SampleValidationRule", "message": "此应用程序目前只支持最小32个基对的读取长度。","relation": "GreaterThan", "value": 32, "severity": "Error", "id": "min-cycles-2"}], "id": "Form -container"}

分钟读

验证样本必须具有的最小读取值

除了公共规则集JSON元素,该字段还支持以下元素:

  • 关系:用户选择的值与ValueValidationRule中的值之间的关系。允许取值:Equals、LessThan、GreaterThan、LessThanOrEqualTo、GreaterThanOrEqualTo、Contains、NotContains、notqual。
  • 价值:比较运算符将与用户输入值进行比较的值。这可以是一个数字(Double)或字符串。

    {"$type": "Form", "fields": [{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "label": "Input Sample", "required": true, "requiredMessage": "请选择一个样本","id": "samples", "rules": "minimum- Sample -reads"}], "rulesets": [{"$type": "MinReadsSampleValidationRule", "explanation": "此应用程序通常只支持读取最少100,000,000次的样本。此样本包含reads.", "message": "Insufficient number of reads.", "relation": "GreaterThanOrEqualTo", "value": 100000000, "severity": "Warning", "id": "minimum-sample-reads"}], "id": "form-container"}

成对的结束

验证样本是否是成对的

除了公共规则集JSON元素,该字段还支持以下元素:

  • 关系:用户选择的值与ValueValidationRule中的值之间的关系。允许取值:Equals、LessThan、GreaterThan、LessThanOrEqualTo、GreaterThanOrEqualTo、Contains、NotContains、notqual。
  • 价值:比较运算符将与用户输入值进行比较的值。这可以是一个数字(Double)或字符串。

    {"$type": "Form", "fields": [{"$type": "SampleChooser", "size": 300, "allowedPermissions": "read", "label": "Input Sample", "required": true, "requiredMessage": "请选择一个样本","id": "samples", "rules": "is-paired-end"}], "rulesets": [{"$type": "PairedEndSampleValidationRule", "message": "此应用程序目前只支持配对端读取","relation": "Equals", "value": true, "severity": "Error", "id": "is-paired-end"}], "id": "Form -container"}}

流行的规则集

下面是一个流行的规则集列表,包括下面的自定义规则集:

"rulesets": [{"$type": "PermissionValidationRule", "permissions": "Own", "severity": "Error", "message": " youmustbeanownertocreateappresultsinselelectedproject ", "id": "is-project-owner"}, {"$type": "GenomeSampleValidationRule", "message": "ThisappcurrentlyonlysupportsalignmenttotheHumanGenome(hg19).", "relation": "Equals", "value": "Homo_sapiens", "severity": "Warning", "id": "hg19-only"}, {"$type": "PairedEndSampleValidationRule", "message": "" thisappcurrentlyonlysupportspaied -endreads.", "relation": "Equals", "value": true, "severity": "Error", "id": "is-paired-end"}, {"$type": "MinCycles1SampleValidationRule", "message": "Thisappcurrentlyonlysupportsaminimumread-lengthof32basepairs.", "relation": "GreaterThan", "value": 32, "severity": "Error", "id": "min- loops -1"}, {"$type": "MinCycles2SampleValidationRule", "message": "Thisappcurrentlyonlysupportsaminimumread-lengthof32basepairs.", "relation": "GreaterThan", "relation": "GreaterThan", "value": "value": "value": "min- loops -1", "relation": "GreaterThan", "value": "value":32, "严重性":"错误","id": "min- cyclationrule "}, {"$type": "PermissionValidationRule", "permissions": "Read", "严重性":"Error", "message": " youdonothavereadaccesstoselelectedsample ", "id": "is-sample-reader"}, {"$type": "EmptySampleValidationRule", "message": "Insufficientnumberofreads.", "relation": "GreaterThan", "value": 0, "严重性":"Error", "id": "sample-is-not-empty"}, {"$type": "MaxSizeSampleValidationRule", "message": "is- sample-is-not-empty":" thisappcurrentlyonlysupportssampleswithlessthan .", "relation": "LessThan", "value": 220000000000, "severity": "Warning", "id": "normal-sample-size-maximum"}, {"$type": "MaxSizeSampleValidationRule", "message": " thisappcurrentlyonlysupportssampleswithless90g .", "relation": "LessThan", "value": 390000000000, "severity": "Warning", "id": "肿瘤-sample-size-maximum"}, {"$type": "MinReadsSampleValidationRule", "message": "Insufficientnumberofreads.", "relation": "relation": "Insufficientnumberofreads.""GreaterThanOrEqualTo", "value": 100000000, "severity": "Warning", "id": "minimum-sample-reads"}, {"$type": "ApplicationPaymentValidationRule", "maxFreeAllowed": 5, "severity": "Error", "message": "Thisapponlysupports5freeruns", "id": "max-free-analyses"}, {"$type": "ScriptValidationRule", "callback": " var inputs = datacontroller . getinputs (currentControl);var samples = new Array();如果输入。长度> 0){var样本;For (var i=0;i < input . length; i++) { sample = inputs[i].ContentSample; if (sample) { samples.push(sample); } } if (samples.length < 2) { return { Message: 'Please specify a tumor and a normal sample. Both a tumor and a normal sample need to be specified.' }; } else { if (samples[0].Id != samples[1].Id) { return null; } else { return { Message: 'The tumor and the normal sample specified must be different. Both tumor and normal samples specified are the same.'}; } } } return null;", "id": "tumor-normal-custom" } ]

回调函数的脚本

js脚本可以通过打开一个表单,单击旁边的下拉菜单来编辑当前的模板,并选择callbacks.js.js脚本用于将输入表单信息与应用程序连接起来。

在回调脚本中,可以配置以下javascript函数:

  • launchSpec ():配置launchSpec功能本地应用以便在启动应用程序之前指定运行参数。launchSpec函数将指定要使用哪个docker映像,以及要向docker映像发送哪个命令,以便运行分析。此外,launchSpec函数可用于传递自定义属性、在一个或多个节点上运行以及向应用程序传递其他参数。
  • formUpdates (): formUpdates函数允许应用程序在对表单元素进行任何更改后添加/删除字段属性。

launchSpec函数

本地应用程序可以在一个节点上运行,也可以优化该进程以在多个节点上运行。文档将介绍这两种场景。这需要对launchSpec

单节点模板

function launchSpec(dataProvider){返回{commandLine: ["/ helloworld .sh"], containerImageId:"tliu1/helloworld"};}

这是一个单节点分析模板,这意味着应用程序将在一个节点上运行,该节点将拥有所有输入数据。

在上面的例子中,我们在callback .js脚本中看到了以下动作:

  • 返回:这是返回语句,将被发送到正在运行应用程序的机器。
  • 命令行:指定将下列命令输入到Docker容器的命令行中以启动应用程序
    • [" / helloworld.sh”]:这将生成以下命令行参数/ helloworld.sh这意味着运行/ helloworld.shShell脚本位于文件夹中。如果在其他路径中,则在此命令中指定该路径。
  • containerImageId:此应用程序的Docker注册表中的Docker容器
    • “tliu1 / helloworld”:这是Docker注册表中的Docker容器。tliu1是用户名和helloworld是Docker映像的名称。该容器将输入上面的命令行脚本。

除了上述内容之外,callback .js脚本还可以用于指定跨多个节点运行分析。

基于多节点模板的单节点分析

当一个多节点模板应用程序启动时,一个AppSession是为每个节点的聚合而创建的孩子AppSession被创建每个节点分析。的AppSession将包含表单中的所有输入属性,但是孩子节点的AppSession需要从Callbacks.js脚本中显式地分配属性,否则它将没有属性。

函数launchSpec(dataProvider) {var retval = {nodes: []};var samples = dataProvider.GetProperty("Input.samples");retval.nodes。push({commandLine: ["/helloworld.sh"], containerImageId:"tliu1/helloworld ",属性:{"输入。[Samples [0]]}});返回retval;}
  • var samples = dataProvider.GetProperty("Input.samples");:该命令正在设置变量样品作为属性的IdInput.samples如果选择多个Sample作为输入,该变量将是一个Sample id数组。
  • 返回:这是返回语句,将被发送到正在运行应用程序的机器。
  • 命令行:指定将下列命令输入到Docker容器的命令行中以启动应用程序
    • [" / helloworld.sh”]:这将生成以下命令行参数/ helloworld.sh这意味着运行/ helloworld.shShell脚本位于文件夹中。如果在其他路径中,则在此命令中指定该路径。
  • containerImageId:此应用程序的Docker注册表中的Docker容器
    • “tliu1 / helloworld”:这是Docker注册表中的Docker容器。tliu1是用户名和helloworld是Docker映像的名称。该容器将输入上面的命令行脚本。

多节点模板多节点分析

当一个多节点模板应用程序启动时,一个AppSession是为每个节点的聚合而创建的孩子AppSession被创建每个节点分析。的AppSession将包含表单中的所有输入属性,但是孩子节点的AppSession需要从Callbacks.js脚本中显式地分配属性,否则它将没有属性。

函数launchSpec(dataProvider) {var retval = {nodes: []};var samples = dataProvider.GetProperty("Input.samples");var project = dataProvider.GetProperty("Input.project-id");For (var I = 0;I < samples.length;i++) {retval.nodes。push({commandLine: ["/helloworld.sh"], containerImageId:"tliu1/helloworld",属性:{"输入。Samples ": [Samples [i]], "输入。project-id": project}});}返回返回;}

在上面的callback .js脚本中样品variable是多个sample的数组。下面将遍历该数组循环,每个节点从样品(我)价值。

在这里,应用程序手动将每个节点的属性传递给appsession进行分析。可以为每个节点手动设置的属性数量的当前限制为One hundred.

对于多节点应用程序,输入表单中的信息必须通过属性从callback.js传递到节点。为了成功下载/挂载输入数据,输入。样品输入。AppResults,输入。文件必须传递属性。所有这些属性都是数组并且应该作为数组传递给每个节点,即使它是一个只有一个值的数组。指定的数据被下载到每个节点.在大多数情况下,应用程序将在输入表单上有一个多选选择器,并将选择器上的每个项目传递给不同的节点。所有这些属性都将存储在标准中AppSession.json文件。

在将来,callback .js脚本还将用于为应用程序指定计算需求。

formUpdates函数

每次对输入表单进行更改后,都会调用formUpdates函数。通过实现这个功能,应用程序可以添加或删除属性从表单元素使用dataProvider.AttributeUpdates.Add而且dataProvider.AttributeUpdates.Remove方法。

警告:这是一个高级特性,应该谨慎使用。

下面的示例演示如何启用/禁用复选框,以及如何根据另一个复选框中的选择添加/删除其工具提示。

function formUpdates(dataProvider) {var checked = (" + dataProvider. getproperty ("input.disable-child-check")) === "1";if (checked) {dataProvider.AttributeUpdates。添加({ElementId: "child-check", AttributeName: "disabled", AttributeValue: "disabled"});dataProvider.AttributeUpdates.Add({ ElementId: "child-check", AttributeName: "title", AttributeValue: 'Uncheck "Disable Child" to enable' }); } else { dataProvider.AttributeUpdates.Remove({ ElementId: "child-check", AttributeName: "disabled" }); dataProvider.AttributeUpdates.Remove({ ElementId: "child-check", AttributeName: "title" }); } }

开发人员工具部分

本节为希望在开发过程中使用Forms Builder的开发人员提供了一些有用的选项。你可以看到开发人员工具部分在Formbuilder窗口的右侧窗格。

这里列出了三个按钮:

  • 模拟发射:通过向开发人员显示一个页面来模拟应用程序的启动,该页面使用输入表单的Properties创建了一个模拟AppSession。

  • 创建AppSession:通过基于输入表单创建带有属性的AppSession来模拟启动应用程序

  • 发送给本地代理:创建一个由输入表单指定的新作业,并将该作业从BaseSpace发送到本地虚拟机以在本地运行,如果您遵循前面的步骤并运行须藤太空船坞…命令时,只要按下此按钮,就会看到作业提交到本地终端

模拟发射

模拟发射选项将开发人员带到另一个页面,该页面显示在提交表单和启动应用程序时创建的信息。

这些信息包括:

  • AppSession id在BaseSpace中为通常会生成的AppSession(这个选项实际上不会创建AppSession,参见上面截图顶部的消息)
  • 访问令牌这是为应用程序生成的,以便访问用户帐户中的适当数据
  • 范围访问令牌允许的权限(基于您配置的表单)的
  • 发布规范其中包括注册表中Docker Image的Id,以及启动时将提供给应用程序的命令行(对于原生应用
  • 显示完整内容的区域AppSession包括属性。

创建AppSession

创建AppSession选项将开发人员带到另一个页面,该页面显示了在提交表单和启动应用程序时创建的信息模拟发射因为这个选项实际上创建了新的AppSession,而不仅仅是模拟将要创建的AppSession,所以如果需要的话,你可以通过BaseSpace的REST API访问那个AppSession。

否则,单击此按钮后,开发人员被带到的页面与用于的页面相同模拟发射除了顶部的消息是不同的,表明AppSession实际创建。

发送给本地代理

发送给本地代理选项与开发人员工具中的其他选项略有不同,因为它只适用于本地应用程序.点击发送给本地代理将从BaseSpace的作业调度程序发送作业到本地本地应用程序虚拟机,该虚拟机正在您的机器上运行。BaseSpace将此作业发送到您粘贴示例命令行启动本地代理来自开发人员工具的信息。

BaseSpace发送到本地虚拟机的作业将包括通过创建AppSession而且模拟发射选项。中的命令行参数callbacks.js一旦在本地找到或下载脚本,脚本就会被提供给Docker映像,然后执行。

使用发送给本地代理选项,您将需要遵循以下步骤:

  1. 本地运行本机应用程序虚拟机

  2. 从您的终端SSH到虚拟机并登录(用户名和密码都是basespace

  3. 去你的表格Formbuilder然后复制这一行示例命令行启动本地代理并将其粘贴到您通过SSH登录到虚拟机的终端

    Sudo太空船坞…- m https://hoth-mission.basespace.illumina.com

    一旦成功,您将在终端中看到一条消息,上面写着docker服务ping成功,这意味着您的本地虚拟机现在正在轮询BaseSpace作业调度器进行工作。每当从BaseSpace提交此应用程序的新作业时,如果发送给本地代理选项由开发人员选择,作业将在他们的本地虚拟机中执行,您可以实时看到这个过程!

    后面的值。——一个是您特定的代理Id,这是BaseSpace如何知道从这个应用程序发送作业到这个本地虚拟机。url是指向BaseSpace Job Scheduler的url。

  4. 确保你的callbacks.js

  5. 文件为你的应用程序引用正确的Docker镜像,并且正在发送的命令行参数足以让你的应用程序运行

  6. 点击发送给本地代理

    的BaseSpace中的该作业的AppSession页面Formbuilder窗口。您可以看到应用程序输出的运行日志。

    如果你切换到你通过SSH登录到虚拟机的终端,你会看到应用程序执行,执行以下操作:

    • 下载Docker映像
    • 将输入数据从表单下载到数据/输入文件夹
    • 方法运行命令行参数callbacks.js
    • 在Docker容器中执行脚本
    • 将结果上传回BaseSpace数据输出
    • 将AppSession标记为Complete

    在上述过程中,应用程序将不断更新AppSession的状态和状态摘要。

启动按钮

对于不同类型的应用程序,启动按钮的作用是不同的。

用于Web和桌面应用程序

在用户为输入表单选择数据并单击之后发射,用户被重定向到应用程序的redirect_uri与一个appsessionuri.中更详细地描述了此行为从BaseSpace触发应用程序

如上所述,将创建一个AppSession,并将所有选择的输入表单值存储在其Properties元数据中。

对于原生应用

发射选项将启动应用程序Amazon S3而不是发送到本地虚拟机。作业被发送到BaseSpace作业调度器,然后它会找到或创建一个Amazon Machine Image (AMI)来运行应用程序。这个AMI的规范与我们提供的本机应用程序虚拟机的规范类似。AMI从作业调度器接收到作业后,它将Docker映像从Docker注册中心下载到AMI,并在callbacks.js

发射按钮用于测试应用程序的启动,用户将使用Amazon S3基础设施,而不是运行虚拟机的本地机器。

例子

艾萨克v2

表单界面:

代码:

{"$type": "Form", "fields": [{"$type": "SampleChooser", "size": 250, "valueType": "Input", "allowedPermissions": "read", "label": "Sample", "required": true, "requiredMessage": "请选择一个样本","readOnly": true, "id": "samples", "rules": "min-cycles-1,min-cycles-2,is-sample-reader, Sample -is-非空"},{"$type": "Select", "id": " Genome -id", "label": "Reference Genome", "choices": [{"value": "Human", "text": "Human (UCSC HG 19)", "selected": "true"}, {"value": "value": "value": "value": "“拟南芥”、“文本”:“拟南芥(NCBI)”,“选择”:“false”},{“价值”:“b .金牛座”、“文本”:“b .金牛(运用UMD3.1)”,“选择”:“false”},{“价值”:“大肠杆菌DH10B”、“文本”:“大肠杆菌DH10B (NCBI 2008-03-17)”,“选择”:“false”},{“价值”:“大肠杆菌MG1655”、“文本”:“大肠杆菌MG1655 (NCBI 2001-10-15)”,“选择”:“false”},{“价值”:“鼠标”,“文本”:“老鼠(UCSC的MM9)”,“选择”:“false”},{“价值”:“φX”、“文本”:“φX (Illumina公司)”,“选择”:“false”},{“价值”:“金黄色葡萄球菌ntc 8325”,“文本”:“金黄色葡萄球菌ntc 8325 (NCBI 2006-02-13)”,“选定”:“假”},{“值”:“大鼠”,“文本”:“大鼠(UCSC RN5)”,“选定”:“假”},{“值”:“葡萄球菌”,“文本”:“葡萄球菌(NCBI 2005-10-07)”,“选定”:“假”},{“$type”:“SectionBreak”},{“$type”:“TextBox”,“size”:250,“minLength”:0,“maxLength”:150,“value”:“BWA WGS v1 [LocalDateTime]”,“label”:"分析名称","required": true, "requiredMessage": "Please enter Name for your app session.", "id": "app-session- Name"}, {"$type": "ProjectChooser", "size": 250, "valueType": "Output", "allowedPermissions": "owner", "label": "Save Results To", "required": true, "requiredMessage": "请选择一个项目","id": "project-id", "rules": "is-project-owner"}, {"$type": "CheckBox", "id": "SV_CNV_Call", "label": "Enable SV/CNV Calling(仅对配对数据使用)","choices": [{"value":1}]}, {"$type": "RadioButton", "id": "AnnotationSource", "label": "Annotation", "value": "Ensembl", "label": "RefSeq"}, {"value": "Ensembl", "label": "Ensembl"}]}, {"$type": "SectionBreak", "title": "Advanced"}, {"$type": "Numeric", "id": "GQX-id", "size": 30, "required": true, "requiredMessage": "请输入最小GQX for Variants.", "label": "Min ": 0, "max": 99, "value": 30, "numericType": "Integer", "rules":"noop"}, {"$type": "Numeric", "size": 30, "minLength": 0, "maxLength": 6, "label": "Max StrandBias for versions .", "value": 10, "min": 0, "Max ": "请输入Max StrandBias for versions .", "id": "StrandBias-id", "rules": "noop"}, {"$type": "CheckBox", "index": 1, "id": " flagpcrduplcopies ", "label": "FlagPCR duplcopies(仅用于配对端数据)","choices": [{"value": 1, "checked": true}]}], "rulesets": [{"$type": "required": true, "requiredMessage": "Please enter Max StrandBias for versions .""PermissionValidationRule", "permissions": "Own", "severity": "Error", "message": "你必须是一个所有者才能在选定的项目中创建应用结果","id": "is-project-owner"}, {"$type": "MinCycles1SampleValidationRule", "relation": "GreaterThan", "value": 32, "severity": "Error", "id": "min-cycles-1"}, {"$type": "MinCycles2SampleValidationRule", "relation": "GreaterThan", "value": 32, "severity": "Warning", "id": "min-cycles-2"}, {"$type": "PermissionValidationRule", "permission ", "permissions":"Read", "severity": "Error", "message": "You do not have Read access to the selected sample", "id": "is-sample-reader"}, {"$type": "EmptySampleValidationRule", "message": "Insufficientnumberofreads.", "relation": "GreaterThan", "value": 0, "severity": "Error", "id": "sample-is-not-empty"}]}