List View Configuration

Introduction

Below are the pages with lists like the view across the application. These list views can be configurable:

  • Participants

  • Specimens

  • Specimen cart

  • Reserved Specimens

  • Collection Protocol List

  • Order Specimen List

  • Container Specimen List

What can be configured?

  1. Columns

  2. Sorting order

  3. Filters (on the right-hand side)

  4. Conditional data display: Fixed criteria can be set to display only specific participants and specimens. For example, display only aliquots.

How to configure the system level list view?

A default view is shipped with the installation package and applies to all protocols. Super admins can change default system-level list view configuration by uploading a new configuration file through 'Settings->Biospecimen→SystemWorkflows'.

How to configure the CP level list view?

To configure the list view for specific CP, go to the CP overview → More → Import Workflows.

JSON Examples

Participant and Specimen List View

 For participants and specimens, this configuration can be done at two levels:

  1. System-wide - applies to all protocols

  2. Protocol-level - overrides the system setting for that protocol

There is a separate section for each list view in the JSON, as shown below.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 [ { "name": "common", "data": { "listView": "cp-specimens" } }, { "name":"participant-list-view", "data":{ "columns":[ { "expr":"Participant.ppid", "caption":"Participant Protocol ID", "metainfo":{ "showLink":"true" } }, { "expr":"concat(Participant.firstName, \" \", Participant.lastName)", "caption":"Name" }, { "expr":"Participant.regDate", "caption":"Registration Date" }, { "expr":"concat(years_between(current_date(), Participant.dateOfBirth), \" yrs\")", "caption":"Age" } ], "criteria":"Participant.id exists", "orderBy":[ { "expr":"Participant.regDate", "direction":"desc" } ], "filters":[ { "expr":"Participant.ppid", "caption":"Participant Protocol ID", "searchType":"contains" }, { "expr":"concat(Participant.firstName, \" \", Participant.lastName)", "caption":"Name", "metainfo":{ "phi":"true" } }, { "expr":"Participant.regDate", "caption":"Registration Date" }, { "expr":"years_between(current_date(), Participant.dateOfBirth)", "caption":"Age", "temporal":"true", "metainfo":{ "phi":"true" } } ] } }, { "name":"specimen-list-view", "data":{ "columns":[ { "expr":"Specimen.label", "caption":"Label", "metainfo":{ "showLink":"true" } }, { "expr":"Specimen.createdOn", "caption":"Created On" }, { "expr":"Specimen.type", "caption":"Type" }, { "expr":"Specimen.tissueSite", "caption":"Anatomic Site" }, { "expr":"Specimen.pathologicalStatus", "caption":"Pathology Status" }, { "expr":"Specimen.availableQty", "caption":"Quantity", "metainfo":{ "showUnit":"true", "measure":"quantity" } }, { "expr":"concat(Specimen.specimenPosition.containerName, \" (\", Specimen.specimenPosition.positionDimensionTwoString, \", \", Specimen.specimenPosition.positionDimensionOneString, \")\")", "caption":"Location" } ], "criteria":"Specimen.availableQty > 0 and Specimen.collectionStatus = \"Collected\"", "orderBy":[ { "expr":"Specimen.createdOn", "direction":"desc" } ], "filters":[ { "expr":"Specimen.label", "caption":"Label", "searchType":"contains" }, { "expr":"Specimen.lineage", "caption":"Lineage" }, { "expr":"Specimen.createdOn", "caption":"Created On" }, { "expr":"Specimen.type", "caption":"Type" }, { "expr":"Specimen.tissueSite", "caption":"Anatomic Site" }, { "expr":"Specimen.pathologicalStatus", "caption":"Pathology Status" }, { "expr":"Specimen.availableQty", "caption":"Quantity" } ] } } ]

 

Screenshots

 

Participants list view: 

This is a list of all registered participants of a protocol.

Specimen list view:

This is a list of all specimens collected under a protocol.

You can sort the list view based on specimen id, location, etc. 

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 { "name": "specimen-list-view", "data": { "columns": [ { "expr": "Specimen.label", "caption": "Label", "metainfo": { "showLink": "true" } }, { "expr": "Specimen.createdOn", "caption": "Created On" }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.tissueSite", "caption": "Anatomic Site" }, { "expr": "Specimen.pathologicalStatus", "caption": "Pathology Status" }, { "expr": "Specimen.availableQty", "caption": "Quantity", "metainfo": { "showUnit": "true", "measure": "quantity" } }, { "expr": "concat(Specimen.specimenPosition.containerName, concat_ws(\"\", concat(\" (\", Specimen.specimenPosition.formattedPos, \")\")))", "caption": "Location" } ], "criteria": "Specimen.collectionStatus = \"Collected\" and Specimen.activityStatus = \"Active\"", "orderBy": [ { "expr": "Specimen.id", "direction": "asce" } ], "filters": [ { "expr": "Specimen.label", "caption": "Label", "searchType": "contains" }, { "expr": "Specimen.lineage", "caption": "Lineage" }, { "expr": "Specimen.createdOn", "caption": "Created On" }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.tissueSite", "caption": "Anatomic Site" }, { "expr": "Specimen.pathologicalStatus", "caption": "Pathology Status" }, { "expr": "Specimen.availableQty", "caption": "Quantity" } ] } },



 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 { "name": "specimen-list-view", "data": { "columns": [ { "expr": "Specimen.label", "caption": "Label", "metainfo": { "showLink": "true" } }, { "expr": "Specimen.createdOn", "caption": "Created On" }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.tissueSite", "caption": "Anatomic Site" }, { "expr": "Specimen.pathologicalStatus", "caption": "Pathology Status" }, { "expr": "Specimen.availableQty", "caption": "Quantity", "metainfo": { "showUnit": "true", "measure": "quantity" } }, { "expr": "concat(Specimen.specimenPosition.containerName, concat_ws(\"\", concat(\" (\", Specimen.specimenPosition.formattedPos, \")\")))", "caption": "Location" } ], "criteria": "Specimen.collectionStatus = \"Collected\" and Specimen.activityStatus = \"Active\"", "orderBy": [ { "expr": "concat(Specimen.specimenPosition.containerName, concat_ws(\"\", concat(\" (\", Specimen.specimenPosition.formattedPos, \")\")))", "direction": "asce" } ], "filters": [ { "expr": "Specimen.label", "caption": "Label", "searchType": "contains" }, { "expr": "Specimen.lineage", "caption": "Lineage" }, { "expr": "Specimen.createdOn", "caption": "Created On" }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.tissueSite", "caption": "Anatomic Site" }, { "expr": "Specimen.pathologicalStatus", "caption": "Pathology Status" }, { "expr": "Specimen.availableQty", "caption": "Quantity" } ] } },



System Level Lists

These lists can be configured at the system level only via Settings → System Workflows:

  • Reserved Specimens

  • Cart

  • Collection Protocol

  • Order Specimen

  • Container Specimen

Reserved specimen list page

  1. Configured under the 'reserved-specimens-list-view' section of the JSON

  2. If there is no section for reserved specimens added, then the 'common-specimens-list-view' (if specified) else 'specimen-list-view' is used.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 { "name": "reserved-specimens-list-view", "view": null, "ctrl": null, "data": { "columns": [ { "expr": "Participant.empi", "caption": "MRN" }, { "expr": "concat_ws(\" \", Participant.firstName, Participant.lastName)", "caption": "Name" }, { "expr": "Specimen.label", "caption": "Label", "metainfo": { "showLink": "true" } }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.tissueSite", "caption": "Anatomic Site" }, { "expr": "Specimen.pathologicalStatus", "caption": "Category" }, { "expr": "Specimen.creationEvent.createdBy", "caption": "Created By" }, { "expr": "concat(Specimen.specimenPosition.containerName, concat_ws(\"\", concat(\" (\", Specimen.specimenPosition.formattedPos, \")\")))", "caption": "Box Location" } ], "criteria": "Specimen.availableQty > 0 and Specimen.collectionStatus = \"Collected\"", "orderBy": [ { "expr": "Specimen.createdOn", "direction": "desc" } ], "filters": [ { "expr": "Specimen.label", "caption": "Label", "searchType": "contains" }, { "expr": "Specimen.lineage", "caption": "Lineage" }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.tissueSite", "caption": "Anatomic Site" }, { "expr": "Specimen.pathologicalStatus", "caption": "Pathology Status" } ] } }

Specimen cart page

  1. Configured under the 'cart-specimens-list-view' section of the JSON

  2. The configuration for cart specimens list view is picked from system workflow in the following order of preference: cart-specimens-list-view -> common-specimens-list-view -> specimen-list-view.

  3. The configuration detail is the same as that for specimen-list-view specifying the columns to display in the table, filters, ordering, additional restrictions, etc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 { "name": "cart-specimens-list-view", "data": { "columns": [ { "expr": "Specimen.label", "caption": "Label", "metainfo": { "showLink": "true" } }, { "expr": "Specimen.id", "caption": "Specimen ID" }, { "expr": "Specimen.createdOn", "caption": "Created On" }, { "expr": "Specimen.creationEvent.createdBy", "caption": "Created By" }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.availableQty", "caption": "Quantity", "metainfo": { "showUnit": "true", "measure": "quantity" } }, { "expr": "concat(Specimen.specimenPosition.containerName, concat_ws(\"\", concat(\" (\", Specimen.specimenPosition.formattedPos, \")\")))", "caption": "Location" } ], "criteria": "Specimen.collectionStatus = \"Collected\" and Specimen.activityStatus != \"Disabled\"", "orderBy": [ { "expr": "Specimen.createdOn", "direction": "desc" } ], "filters": [ { "expr": "Specimen.label", "caption": "Label", "searchType": "contains" }, { "expr": "Specimen.lineage", "caption": "Lineage" }, { "expr": "Specimen.createdOn", "caption": "Created On" }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.tissueSite", "caption": "Anatomic Site" }, { "expr": "Specimen.pathologicalStatus", "caption": "Pathology Status" }, { "expr": "Specimen.availableQty", "caption": "Quantity" } ] } }

Order specimen list view page

  1. Configured under the "order-specimens-list-view" section of the JSON

  2. If the user is not configured any "order-specimens-list-view" in the system workflow, then OpenSpecimen uses the default configuration.

  3. Added an option to hide the empty columns by specifying the property "hideEmptyColumns": true,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 { "name": "order-specimens-list-view", "data": { "columns": [ { "expr": "Specimen.specimenOrders.label", "caption": "Distribution Label" }, { "expr": "Specimen.label", "caption": "Label", "metainfo": { "showLink": "true" } }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.pathologicalStatus", "caption": "Pathology Status" }, { "expr": "Specimen.creationEvent.createdBy", "caption": "Created By" }, { "expr": "CollectionProtocol.shortTitle", "caption": "Collection Protocol" } ], "hideEmptyColumns": true, "criteria": "", "orderBy": [ { "expr": "Specimen.specimenOrders.itemId", "direction": "asc" } ], "filters": [ { "expr": "Specimen.label", "caption": "Label", "searchType": "contains" }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "CollectionProtocol.shortTitle", "caption": "Collection Protocol" } ] } }

Order specimens add and edit page

  1. Configured under "order-addedit-specimens" of the JSON

  2. If the user has not configured any "order-addedit-specimens" in the system workflow, then OpenSpecimen uses the default configuration.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 { "name": "order-addedit-specimens", "data": { "columns": [ { "name": "specimen.label", "caption": "Label", "type": "text", "width": "140px" }, { "name": "specimen", "caption": "Description", "type": "specimen-description", "width": "140px" }, { "name": "specimen.cpShortTitle", "caption": "Collection Protocol", "type": "text", "width": "140px" }, { "name": "specimen.ppid", "caption": "Participant ID", "type": "text", "width": "120px" }, { "name": "specimen.collectionEvent.procedure", "caption": "Collection Procedure", "type": "text", "width": "140px" }, { "name": "specimen.storageLocation", "caption": "Location", "type": "storage-position", "width": "140px" }, { "name": "specimen.availableQty", "caption": "Available", "type": "specimen-quantity", "specimen": "specimen", "width": "100px" }, { "name": "specimen.createdBy", "caption": "Created By", "type": "user", "width": "100px" } ] } }

Collection protocol list page (Implemented from v6.3 onwards) 

  1. Configured under "cp-list-view" of the JSON

  2. If the user is not configured any "cp-list-view" in the system workflow, then OpenSpecimen uses the default configuration.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 { "name": "cp-list-view", "data": { "columns": [ { "expr": "CollectionProtocol.shortTitle", "caption": "Title", "metainfo": { "showLink": "true" } }, { "expr": "CollectionProtocol.principalInvestigator.investigatorName", "caption": "Principal Investigator" }, { "expr": "CollectionProtocol.startDate", "caption": "Start Date" }, { "expr": "CollectionProtocol.endDate", "caption": "End Date" }, { "expr": "CollectionProtocol.customFields.cPCustomField.type", "caption": "CP Type" } ], "criteria": "CollectionProtocol.id exists", "orderBy": [ { "expr": "CollectionProtocol.shortTitle", "direction": "asc" } ], "filters": [ { "expr": "CollectionProtocol.shortTitle", "caption": "Title", "searchType": "contains" }, { "expr": "CollectionProtocol.Title", "caption": "Long Title", "searchType": "contains" }, { "expr": "CollectionProtocol.principalInvestigator.investigatorName", "caption": "Principal Investigator" }, { "expr": "CollectionProtocol.cpSites.siteName", "caption": "Repository" } ] } },

Container Specimen List

  1. Configured under the "container-specimens-list-view" section of the JSON

  2. If the user has not configured any "container-specimens-list-view" in the system workflow, then OpenSpecimen uses the default configuration.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 { "name": "container-specimens-list-view", "data": { "columns": [ { "expr": "Participant.ppid", "caption": "PPID", "metainfo": { "showLink": "true" } },{ "expr": "Specimen.label", "caption": "Label", "metainfo": { "showLink": "true" } },{ "expr": "Specimen.barcode", "caption": "Barcode" },{ "expr": "Specimen.lineage", "caption": "Lineage" }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.tissueSite", "caption": "Anatomic Site" },{ "expr": "CollectionProtocol.shortTitle", "caption": "Collection Protocol", "metainfo": { "showLink": "true" } }, { "expr": "Specimen.availableQty", "caption": "Quantity", "metainfo": { "showUnit": "true", "measure": "quantity" } }, { "expr": "concat(Specimen.specimenPosition.containerName, concat_ws(\"\", concat(\" (\", Specimen.specimenPosition.formattedPos, \")\")))", "caption": "Location" },{ "expr": "Specimen.createdOn", "caption": "Created On" } ], "criteria": "Specimen.collectionStatus = \"Collected\" and Specimen.activityStatus = \"Active\"", "orderBy": [ { "expr": "Specimen.createdOn", "direction": "desc" } ], "filters": [ { "expr": "Participant.ppid", "caption": "PPID", "searchType": "contains" },{ "expr": "Specimen.label", "caption": "Label", "searchType": "contains" },{ "expr": "Specimen.barcode", "caption": "Barcode" }, { "expr": "Specimen.lineage", "caption": "Lineage" }, { "expr": "Specimen.type", "caption": "Type" }, { "expr": "Specimen.tissueSite", "caption": "Anatomic Site" },{ "expr": "CollectionProtocol.shortTitle", "caption": "Collection Protocol" }, { "expr": "Specimen.availableQty", "caption": "Quantity" },{ "expr": "concat(Specimen.specimenPosition.containerName, concat_ws(\"\", concat(\" (\", Specimen.specimenPosition.formattedPos, \")\")))", "caption": "Location" },{ "expr": "Specimen.createdOn", "caption": "Created On" } ] } }

 

Screenshots

 

Reserved Specimens List: 

This is a list of reserved specimens of a distribution protocol. It is displayed as a separate tab within the distribution protocol.

Specimen Cart:

This is a list of specimens added to a cart. This is accessible via 'Carts' from the menu.

Specimen Order Overview List:

This is a list of specimens distributed under a specific order. This is displayed as a separate tab within an Order.

Specimen Order Add/Edit List:

While performing a distribution, the specimens being distributed are displayed in this list. 

Collection Protocol(CP) List View:

This is a list of all protocols created in the system. This is accessible via the 'Collection Protocols' menu.

Container Specimen list view:

This is a list of all specimens stored in the container.



JSON Attributes and Uses

 

Attribute

Usage

Attribute

Usage

name

Name of the list configuration.
Ex: participant-list-view or specimen-list-view or common.

data

 

 



Expressions for other fields that can be added to the list view

 

List Page

Field Name

Expression

List Page

Field Name

Expression

Participant List

MRN Site

1 2 3 4 { "expr": "Participant.medicalRecord.mrnSiteName", "caption": "Site" }

Participant List

MRN

1 2 3 4 { "expr": "Participant.medicalRecord.medicalRecordNumber", "caption": "MRN" }

Participant List

External Subject ID

(Supported version V5.1 and onwards)

1 2 3 4 { "expr": "Participant.externalSubjectId", "caption": "External Subject ID" }

Participant List

Date formatting("participant-list-view")

(Supported version V5.2 and onwards)

Refer wiki for 'Date Formats'

1 2 3 4 5 { "expr": "Participant.dateOfBirth", "caption": "Date Of Birth", "expr": "date_format(Participant.dateOfBirth, \"%month2%-%month_day%-%year4%\")" }

Participant List

Consent Document Title

1 2 3 4 { "expr" : "Participant.econsents.docTitle", "caption" : "eConsent Doc Title" }

Participant List

Consent Version

1 2 3 4 { "expr" : "Participant.econsents.docVersion", "caption" : "Version" }

Participant List

Consent Statement

1 2 3 4 { "expr" : "Participant.econsents.stmtResponses.statement", "caption" : "Consent Statement" }

Participant List

Consent Response

1 2 3 4 { "expr" : "Participant.econsents.stmtResponses.response", "caption" : "Response" }

Participant List

Consent Custom Field

1 2 3 4 { "expr" : "Participant.customFields.additionalRegistration.preferredLanguage", "caption" : "Preferred Language" }

Participant List

Consent Date

1 2 3 4 5 { "expr": "Participant.consentSignDate", "caption": "Date of Consent", "datatype": "date" }

Participant List

Custom Form Fields (Participant level)

Syntax: Participant.extensions.<formName>.<attributeName>

<formName>: Replace it with the 'Form Name' of the custom form

<attributeName>: Replace it with the 'Attribute Name' of the custom form field

1 2 3 4 5 { "expr": "Participant.customFields.smokingHistoryForm.dateOfSigning", "caption": "Signing Date of Smoking History Form", "datatype": "date" }

Specimen List

Date formatting ("specimen-list-view")

(Supported version V5.2 and onwards)

Refer wiki for 'Date Formats'

1 2 3 4 5 { "expr": "Specimen.createdOn", "caption": "Created On", "expr": "date_format(Specimen.createdOn, \"%month3%-%month_day%-%year4%\")" }

Specimen List

Add Custom field of any type dropdown, text, number, fancy control, etc

  1. "Specimen.customFields" → Default syntax to call specimen custom field 

  2. "wCMCSpecimenFields"→ Custom form name

  3. "diseaseStatus"→ Field udn present in a custom form XML

Eg:1

Disease Status

1 2 3 4 { "expr":"Specimen.customFields.wCMCSpecimenFields.diseaseStatus", "caption" : "Disease Status" }

Eg:2

Technician(User Fancy Control)

1 2 3 4 { "expr" : "Specimen.customFields.wCMCSpecimenFields.technician", "caption" : "Technician" },

Specimen List

Collection Date and Time

1 2 3 4 { "expr" : "Specimen.spmnCollRecvDetails.collTime", "caption" : "Collection Date" }

Specimen List

Specimen Laterality

1 2 3 4 { "expr" : "Specimen.tissueSide", "caption" : "Laterality" }

Specimen List

Visit Name

1 2 3 4 { "expr" : "SpecimenCollectionGroup.name", "caption" : "Visit Name" }

Specimen List

Visit Custom Field

Add visit custom fields to the specimen list view page:

  1. “SpecimenCollectionGroup.customFields”: Default syntax to call visit custom field

  2. “visit_data_extension“: Custom form name

  3. “sequence_number“: Field udn present in a custom form XML

1 2 3 4 { "expr":"SpecimenCollectionGroup.customFields.visit_data_extension.sequence_number", "caption" : "Sequence Number" }

CP List View

Custom Field:

In 'expr', 'cPCustomFields' is a Form Name, 'type' is an attribute name.

1 2 3 4 { "expr": "CollectionProtocol.customFields.cPCustomField.type", "caption": "CP Type" }