Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
146 changes: 143 additions & 3 deletions SQL/0000-00-05-ElectrophysiologyTables.sql
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ CREATE TABLE `physiological_task_event` (
`InsertTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`Onset` DECIMAL(11,6) NOT NULL,
`Duration` DECIMAL(11,6) NOT NULL,
`Channel` TEXT DEFAULT NULL,
`EventCode` INT(10) DEFAULT NULL,
`EventValue` varchar(255) DEFAULT NULL,
`EventSample` decimal(11,6) DEFAULT NULL,
Expand Down Expand Up @@ -577,14 +578,16 @@ CREATE TABLE `physiological_task_event_hed_rel` (
`HasPairing` boolean DEFAULT FALSE, -- Is grouped with #AdditionalMembers# members
`PairRelID` int(10) unsigned NULL, -- The `ID` of right side of the pair
`AdditionalMembers` int(10) unsigned DEFAULT 0, -- Number of additional members to encapsulate
`TaggedBy` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`ID`),
CONSTRAINT `FK_physiological_task_event_hed_rel_pair` FOREIGN KEY (`PairRelID`)
REFERENCES `physiological_task_event_hed_rel` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
KEY `FK_physiological_task_event_hed_rel_2` (`HEDTagID`),
CONSTRAINT `FK_physiological_task_event_hed_rel_2` FOREIGN KEY (`HEDTagID`)
REFERENCES `hed_schema_nodes` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_physiological_task_event_hed_rel_1` FOREIGN KEY (`PhysiologicalTaskEventID`)
REFERENCES `physiological_task_event` (`PhysiologicalTaskEventID`) ON DELETE CASCADE ON UPDATE CASCADE
REFERENCES `physiological_task_event` (`PhysiologicalTaskEventID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_pte_tagged_by_user` FOREIGN KEY (`TaggedBy`) REFERENCES `users` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Create `bids_event_dataset_mapping` table
Expand All @@ -599,10 +602,12 @@ CREATE TABLE `bids_event_dataset_mapping` (
`HasPairing` BOOLEAN DEFAULT FALSE, -- Is grouped with #AdditionalMembers# members
`PairRelID` int(10) unsigned NULL, -- The `ID` of right side of the pair
`AdditionalMembers` int(10) unsigned DEFAULT 0, -- Number of additional members to encapsulate
`TaggedBy` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`ID`),
INDEX idx_event_dataset_PropertyName_PropertyValue (`PropertyName`, `PropertyValue`),
CONSTRAINT `FK_project_id` FOREIGN KEY (`ProjectID`) REFERENCES `Project` (`ProjectID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_dataset_hed_tag_id` FOREIGN KEY (`HEDTagID`) REFERENCES `hed_schema_nodes` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
CONSTRAINT `FK_dataset_hed_tag_id` FOREIGN KEY (`HEDTagID`) REFERENCES `hed_schema_nodes` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_bed_tagged_by_user` FOREIGN KEY (`TaggedBy`) REFERENCES `users` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Expand All @@ -618,8 +623,143 @@ CREATE TABLE `bids_event_file_mapping` (
`HasPairing` BOOLEAN DEFAULT FALSE, -- Is grouped with #AdditionalMembers# members
`PairRelID` int(10) unsigned NULL, -- The `ID` of right side of the pair
`AdditionalMembers` int(10) unsigned DEFAULT 0, -- Number of additional members to encapsulate
`TaggedBy` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`ID`),
INDEX idx_event_file_PropertyName_PropertyValue (`PropertyName`, `PropertyValue`),
CONSTRAINT `FK_event_mapping_file_id` FOREIGN KEY (`EventFileID`) REFERENCES `physiological_event_file` (`EventFileID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_file_hed_tag_id` FOREIGN KEY (`HEDTagID`) REFERENCES `hed_schema_nodes` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
CONSTRAINT `FK_file_hed_tag_id` FOREIGN KEY (`HEDTagID`) REFERENCES `hed_schema_nodes` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_bef_tagged_by_user` FOREIGN KEY (`TaggedBy`) REFERENCES `users` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- Create parameter_project table to track channel delimiter
CREATE TABLE `parameter_project` (
`ParameterProjectID` int(10) unsigned NOT NULL auto_increment,
`ProjectID` int(10) unsigned NOT NULL default '0',
`ParameterTypeID` int(10) unsigned NOT NULL default '0',
`Value` varchar(255) default NULL,
`InsertTime` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`ParameterProjectID`),
UNIQUE KEY `project_type` (`ProjectID`,`ParameterTypeID`),
KEY `parameter_value` (`ParameterTypeID`,`Value`(64)),
CONSTRAINT `FK_parameter_project_2` FOREIGN KEY (`ParameterTypeID`) REFERENCES `parameter_type` (`ParameterTypeID`),
CONSTRAINT `FK_parameter_project_1` FOREIGN KEY (`ProjectID`) REFERENCES `Project` (`ProjectID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT IGNORE INTO `parameter_type_category` (Name, Type)
VALUES ('Project Parameters', 'Metavars');

-- Add channel delimiter, taken from events.json to DB
INSERT IGNORE INTO parameter_type (Name, Type, Description, SourceFrom, Queryable, IsFile) VALUES
('ChannelDelimiter', 'text', 'Channel name separator', 'parameter_project', 1, 0);

INSERT INTO parameter_type_category_rel (ParameterTypeID, ParameterTypeCategoryID)
SELECT pt.ParameterTypeID, ptc.ParameterTypeCategoryID
FROM parameter_type pt, parameter_type_category ptc
WHERE ptc.Name='Project Parameters' AND pt.Name IN ('ChannelDelimiter');



-- Create `hed_tag_endorsement` table
CREATE TABLE `hed_tag_endorsement` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`HEDRelID` int(10) unsigned NOT NULL, -- TODO: Manually handle ON DELETE CASCADE
`HEDTable` enum(
'physiological_task_event_hed_rel',
'bids_event_dataset_mapping',
'bids_event_file_mapping'
) NOT NULL,
`EndorsedBy` int(10) unsigned NOT NULL,
`EndorsementStatus` enum(
'Endorsed',
'Caveat',
'Comment'
) NOT NULL,
`EndorsementComment` TEXT DEFAULT NULL,
`EndorsedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastUpdate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
CONSTRAINT `FK_endorsed_by_user`
FOREIGN KEY (`EndorsedBy`) REFERENCES `users` (`ID`) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Create `hed_tag_endorsement_history` table
CREATE TABLE `hed_tag_endorsement_history` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`EndorsementID` int(10) unsigned NOT NULL,
`Action` enum(
'INSERT',
'UPDATE',
'DELETE'
) NOT NULL,
`HEDRelID` int(10) unsigned NOT NULL,
`HEDTable` enum(
'physiological_task_event_hed_rel',
'bids_event_dataset_mapping',
'bids_event_file_mapping'
) NOT NULL,
`EndorsedBy` int(10) unsigned NOT NULL,
`EndorsementStatus` enum(
'Endorsed',
'Caveat',
'Comment'
) NOT NULL,
`EndorsementComment` TEXT DEFAULT NULL,
`EndorsedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
CONSTRAINT `FK_endorsement_id`
FOREIGN KEY (`EndorsementID`) REFERENCES `hed_tag_endorsement` (`ID`) ON UPDATE CASCADE,
CONSTRAINT `FK_endorsed_by_user_history`
FOREIGN KEY (`EndorsedBy`) REFERENCES `users` (`ID`) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Create `hed_tag_history` table
CREATE TABLE `hed_tag_history` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`HEDTableID` int(10) unsigned NOT NULL,
`HEDTable` enum(
'physiological_task_event_hed_rel',
'bids_event_dataset_mapping',
'bids_event_file_mapping'
) NOT NULL,
`HEDReferenceID` int(10) unsigned NOT NULL, -- PhysiologicalTaskEventID, ProjectID, EventFileID
`TaggedBy` int(10) unsigned DEFAULT NULL,
`PropertyName` varchar(50) DEFAULT NULL,
`PropertyValue` varchar(255) DEFAULT NULL,
`HEDTagID` int(10) unsigned DEFAULT NULL, -- Reference to hed_schema_nodes.ID. Can be null to only add parentheses
`TagValue` TEXT NULL,
`Description` TEXT NULL,
`HasPairing` BOOLEAN DEFAULT FALSE, -- Is grouped with #AdditionalMembers# members
`PairRelID` int(10) unsigned NULL, -- The `ID` of right side of the pair
`AdditionalMembers` int(10) unsigned DEFAULT 0,
`ModificationType` enum('insert', 'update', 'delete') NOT NULL,
`ModifiedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
CONSTRAINT `FK_hed_tagged_by_history`
FOREIGN KEY (`TaggedBy`) REFERENCES `users` (`ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Create `physiological_task_event_history` table
CREATE TABLE `physiological_task_event_history` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`PhysiologicalTaskEventID` int(10) unsigned NOT NULL,
`PhysiologicalFileID` int(10) unsigned NOT NULL,
`EventFileID` int(10) unsigned NOT NULL,
`InsertTime` timestamp NOT NULL,
`Onset` decimal(11,6) DEFAULT NULL,
`Duration` decimal(11,6) DEFAULT NULL,
`Channel` TEXT DEFAULT NULL,
`EventCode` int(10) DEFAULT NULL,
`EventValue` varchar(255) DEFAULT NULL,
`EventSample` decimal(11,6) DEFAULT NULL,
`EventType` varchar(50) DEFAULT NULL,
`TrialType` varchar(255) DEFAULT NULL,
`ResponseTime` time DEFAULT NULL,
`ModifiedBy` int(10) unsigned DEFAULT NULL,
`ModificationType` enum('insert', 'update', 'delete') NOT NULL,
`ModifiedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
CONSTRAINT `FK_physiological_task_event_modified_by_history`
FOREIGN KEY (`ModifiedBy`) REFERENCES `users` (`ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

31 changes: 31 additions & 0 deletions SQL/New_patches/2025-09-29_channel_delimiter.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
-- Add column to track associated channel names
ALTER TABLE physiological_task_event ADD COLUMN `Channel` TEXT DEFAULT NULL;

-- Create parameter_project table to track parameters and channel delimiter
CREATE TABLE `parameter_project` (
`ParameterProjectID` int(10) unsigned NOT NULL auto_increment,
`ProjectID` int(10) unsigned NOT NULL default '0',
`ParameterTypeID` int(10) unsigned NOT NULL default '0',
`Value` text default NULL,
`InsertTime` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`ParameterProjectID`),
UNIQUE KEY `project_type` (`ProjectID`,`ParameterTypeID`),
KEY `parameter_value` (`ParameterTypeID`,`Value`(64)),
CONSTRAINT `FK_parameter_project_2` FOREIGN KEY (`ParameterTypeID`) REFERENCES `parameter_type` (`ParameterTypeID`),
CONSTRAINT `FK_parameter_project_1` FOREIGN KEY (`ProjectID`) REFERENCES `Project` (`ProjectID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT IGNORE INTO `parameter_type_category` (Name, Type)
VALUES ('Project Parameters', 'Metavars');

-- Add channel delimiter, taken from events.json to DB
INSERT IGNORE INTO parameter_type (Name, Type, Description, SourceFrom, Queryable, IsFile) VALUES
('ChannelDelimiter', 'text', 'Channel name separator', 'parameter_project', 1, 0);

INSERT INTO parameter_type_category_rel (ParameterTypeID, ParameterTypeCategoryID)
SELECT pt.ParameterTypeID, ptc.ParameterTypeCategoryID
FROM parameter_type pt, parameter_type_category ptc
WHERE ptc.Name='Project Parameters' AND pt.Name IN ('ChannelDelimiter');


121 changes: 121 additions & 0 deletions SQL/New_patches/2025-09-29_hed_endorsement.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
-- Add TaggedBy column (user FK). NULL signifies it came with the dataset
ALTER TABLE physiological_task_event_hed_rel
ADD COLUMN TaggedBy int(10) unsigned DEFAULT NULL;
ALTER TABLE bids_event_dataset_mapping
ADD COLUMN TaggedBy int(10) unsigned DEFAULT NULL;
ALTER TABLE bids_event_file_mapping
ADD COLUMN TaggedBy int(10) unsigned DEFAULT NULL;
-- ADD FK constraint
ALTER TABLE physiological_task_event_hed_rel
ADD CONSTRAINT `FK_pte_tagged_by_user`
FOREIGN KEY (`TaggedBy`) REFERENCES `users` (`ID`);
ALTER TABLE bids_event_dataset_mapping
ADD CONSTRAINT `FK_bed_tagged_by_user`
FOREIGN KEY (`TaggedBy`) REFERENCES `users` (`ID`);
ALTER TABLE bids_event_file_mapping
ADD CONSTRAINT `FK_bef_tagged_by_user`
FOREIGN KEY (`TaggedBy`) REFERENCES `users` (`ID`);

-- Create `hed_tag_endorsement` table
CREATE TABLE `hed_tag_endorsement` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`HEDRelID` int(10) unsigned NOT NULL, -- TODO: Manually handle ON DELETE CASCADE
`HEDTable` enum(
'physiological_task_event_hed_rel',
'bids_event_dataset_mapping',
'bids_event_file_mapping'
) NOT NULL,
`EndorsedBy` int(10) unsigned NOT NULL,
`EndorsementStatus` enum(
'Endorsed',
'Caveat',
'Comment'
) NOT NULL,
`EndorsementComment` TEXT DEFAULT NULL,
`EndorsedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastUpdate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
CONSTRAINT `FK_endorsed_by_user`
FOREIGN KEY (`EndorsedBy`) REFERENCES `users` (`ID`) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Create `hed_tag_endorsement_history` table
CREATE TABLE `hed_tag_endorsement_history` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`EndorsementID` int(10) unsigned NOT NULL,
`Action` enum(
'INSERT',
'UPDATE',
'DELETE'
) NOT NULL,
`HEDRelID` int(10) unsigned NOT NULL,
`HEDTable` enum(
'physiological_task_event_hed_rel',
'bids_event_dataset_mapping',
'bids_event_file_mapping'
) NOT NULL,
`EndorsedBy` int(10) unsigned NOT NULL,
`EndorsementStatus` enum(
'Endorsed',
'Caveat',
'Comment'
) NOT NULL,
`EndorsementComment` TEXT DEFAULT NULL,
`EndorsedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
CONSTRAINT `FK_endorsement_id`
FOREIGN KEY (`EndorsementID`) REFERENCES `hed_tag_endorsement` (`ID`) ON UPDATE CASCADE,
CONSTRAINT `FK_endorsed_by_user_history`
FOREIGN KEY (`EndorsedBy`) REFERENCES `users` (`ID`) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Create `hed_tag_history` table
CREATE TABLE `hed_tag_history` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`HEDTableID` int(10) unsigned NOT NULL,
`HEDTable` enum(
'physiological_task_event_hed_rel',
'bids_event_dataset_mapping',
'bids_event_file_mapping'
) NOT NULL,
`HEDReferenceID` int(10) unsigned NOT NULL, -- PhysiologicalTaskEventID, ProjectID, EventFileID
`TaggedBy` int(10) unsigned DEFAULT NULL,
`PropertyName` varchar(50) DEFAULT NULL,
`PropertyValue` varchar(255) DEFAULT NULL,
`HEDTagID` int(10) unsigned DEFAULT NULL, -- Reference to hed_schema_nodes.ID. Can be null to only add parentheses
`TagValue` TEXT NULL,
`Description` TEXT NULL,
`HasPairing` BOOLEAN DEFAULT FALSE, -- Is grouped with #AdditionalMembers# members
`PairRelID` int(10) unsigned NULL, -- The `ID` of right side of the pair
`AdditionalMembers` int(10) unsigned DEFAULT 0,
`ModificationType` enum('insert', 'update', 'delete') NOT NULL,
`ModifiedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
CONSTRAINT `FK_hed_tagged_by_history`
FOREIGN KEY (`TaggedBy`) REFERENCES `users` (`ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Create `physiological_task_event_history` table
CREATE TABLE `physiological_task_event_history` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`PhysiologicalTaskEventID` int(10) unsigned NOT NULL,
`PhysiologicalFileID` int(10) unsigned NOT NULL,
`EventFileID` int(10) unsigned NOT NULL,
`InsertTime` timestamp NOT NULL,
`Onset` decimal(11,6) DEFAULT NULL,
`Duration` decimal(11,6) DEFAULT NULL,
`Channel` TEXT DEFAULT NULL,
`EventCode` int(10) DEFAULT NULL,
`EventValue` varchar(255) DEFAULT NULL,
`EventSample` decimal(11,6) DEFAULT NULL,
`EventType` varchar(50) DEFAULT NULL,
`TrialType` varchar(255) DEFAULT NULL,
`ResponseTime` time DEFAULT NULL,
`ModifiedBy` int(10) unsigned DEFAULT NULL,
`ModificationType` enum('insert', 'update', 'delete') NOT NULL,
`ModifiedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
CONSTRAINT `FK_physiological_task_event_modified_by_history`
FOREIGN KEY (`ModifiedBy`) REFERENCES `users` (`ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

6 changes: 5 additions & 1 deletion jsx/DataTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,11 @@ class DataTable extends Component {
<th key={'th_col_' + colIndex} onClick={() => {
this.setSortColumn(i);
}}>
{this.props.fields[i].label}
{
this.props.fields[i].custom_label
? this.props.fields[i].custom_label
: this.props.fields[i].label
}
</th>
);
}
Expand Down
2 changes: 1 addition & 1 deletion jsx/Filter.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ function Filter(props) {
* @param {string} value - the name of the form element
*/
const onFieldUpdate = (name, value) => {
const {fields} = JSON.parse(JSON.stringify(props));
const {fields} = props;
const type = fields
.find((field) => (field.filter||{}).name == name).filter.type;
const exactMatch = (!(type === 'text' || type === 'date'
Expand Down
4 changes: 2 additions & 2 deletions jsx/Panel.d.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import {ReactNode} from 'react';
import {ReactInstance, ReactNode} from 'react';

type PanelProps = {
initCollapsed?: boolean
collapsed?: boolean
parentId?: string
id?: string
height?: string
title?: string
title?: ReactNode | object
class?: string
children: ReactNode
views?: object
Expand Down
3 changes: 1 addition & 2 deletions jsx/Panel.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ Panel.propTypes = {
parentId: PropTypes.string,
id: PropTypes.string,
height: PropTypes.string,
title: PropTypes.string,
title: PropTypes.object,
class: PropTypes.string,
children: PropTypes.node,
views: PropTypes.array,
Expand All @@ -153,7 +153,6 @@ Panel.propTypes = {
bold: PropTypes.bool,
panelSize: PropTypes.string,
style: PropTypes.object,
children: PropTypes.node,
};
Panel.defaultProps = {
initCollapsed: false,
Expand Down
Loading
Loading